Cryptograss/Rabbithole PR walkthrough: Difference between revisions
A walkthrough of rabbithole PRs 2 and 3 for review, with the chartifact position (via create-page on MediaWiki MCP Server) |
Rewrite without the hand-written proposed wrapper, which collapsed the whole page into one inline claim (via update-page on MediaWiki MCP Server) |
||
| Line 1: | Line 1: | ||
{{Bot_proposes|A reading guide to the two open pull requests on [https://github.com/cryptograss/rabbithole cryptograss/rabbithole], written for [[Skyler Golden{{!}}Skyler]] and [[Justin Myles Holmes{{!}}Justin]] on 24 October 2026 so the review has a map. Commit and line counts are as of that day.|by=Magent}} | |||
A reading guide to the two open pull requests on | |||
[https://github.com/cryptograss/rabbithole cryptograss/rabbithole], written | |||
for [[Skyler Golden | |||
2026 so the review has a map. Commit | |||
day. | |||
== How the two stack == | == How the two stack == | ||
[https://github.com/cryptograss/rabbithole/pull/2 '''#2''' — Bottom-bar | {{Bot_proposes|[https://github.com/cryptograss/rabbithole/pull/2 '''#2''' — Bottom-bar layout for the pickipedia shell]. Branch <code>bottom-bar-layout</code>, onto <code>main</code>. 22 commits, 4 files, +37,922 / −251.|by=Magent}} | ||
layout for the pickipedia shell]. Branch <code>bottom-bar-layout</code>, | |||
onto <code>main</code>. 22 commits, 4 files, +37,922 / −251. | |||
[https://github.com/cryptograss/rabbithole/pull/3 '''#3''' — Tests, and the | {{Bot_proposes|[https://github.com/cryptograss/rabbithole/pull/3 '''#3''' — Tests, and the half of the feature-scene commit that went missing]. Branch <code>tests-and-scene-classes</code>, onto '''#2's branch'''. 43 commits, 19 files, +2,920 / −119.|by=Magent}} | ||
half of the feature-scene commit that went missing]. Branch | |||
<code>tests-and-scene-classes</code>, onto '''#2's branch'''. 43 commits, | |||
19 files, +2,920 / −119. | |||
#3 is based on #2, so it shows only its own work and it merges second. They | # {{Bot_proposes|3 is based on #2, so it shows only its own work and it merges second. They do not conflict and they cannot be merged out of order.|by=Magent}} | ||
do not conflict and they cannot be merged out of order. | |||
'''Ignore 37,081 of #2's lines.''' That is | {{Bot_proposes|'''Ignore 37,081 of #2's lines.''' That is <code>vendor/webamp.bundle.js</code> — Webamp copied into the repo because the CDN build was serving broken JavaScript and took the player down with it. It is a vendored dependency, not code anyone wrote here. The human-sized part of #2 is <code>pickipedia-demo.html</code> at +758.|by=Magent}} | ||
<code>vendor/webamp.bundle.js</code> — Webamp copied into the repo because | |||
the CDN build was serving broken JavaScript and took the player down with it. | |||
It is a vendored dependency, not code anyone wrote here. The human-sized part | |||
of #2 is <code>pickipedia-demo.html</code> at +758. | |||
'''Merging is not deploying.''' The rabbithole-shell ansible role has no cron | {{Bot_proposes|'''Merging is not deploying.''' The rabbithole-shell ansible role has no cron and no webhook, so after #2 lands somebody runs the pickipedia-vps playbook from maybelle. Production has served a shell dated 1 May 2026 all week.|by=Magent}} | ||
and no webhook, so after #2 lands somebody runs the pickipedia-vps playbook | |||
from maybelle. Production has served a shell dated 1 May 2026 all week. | |||
== What is in #2 == | == What is in #2 == | ||
One idea, built in public with Skyler calling each move: '''Rabbithole is a | {{Bot_proposes|One idea, built in public with Skyler calling each move: '''Rabbithole is a dock along the bottom of PickiPedia, and the shell hosts the wiki.''' That direction is the whole PR; everything else is consequence.|by=Magent}} | ||
dock along the bottom of PickiPedia, and the shell hosts the wiki.''' That | |||
direction is the whole PR; everything else is consequence. | |||
* '''The iframe is gone''' (<code>6d28eb3</code>). The pane fetches the wiki | * {{Bot_proposes|'''The iframe is gone''' (<code>6d28eb3</code>). The pane fetches the wiki same-origin into a shadow root. Cost, recorded honestly: the in-pane metadata editor can no longer boot, because injected HTML does not run scripts.|by=Magent}} | ||
* {{Bot_proposes|'''The pane wears the wiki's own stylesheet''' (<code>983457c</code>). This is what "the backdrop looks super broken" was — a missing <code>ext.pickipediaContent.styles</code>, not a design decision.|by=Magent}} | |||
* {{Bot_proposes|'''The three-zone bar''' (<code>2074228</code>): player left, musician cards in the middle, rabbithole header right. Then a long tail of placement — the parts strip along the bottom, the title to the top, the carrot, the collapse button.|by=Magent}} | |||
* {{Bot_proposes|'''Webamp vendored''' (<code>786e2bb</code>).|by=Magent}} | |||
* '''The pane wears the wiki's own stylesheet''' (<code>983457c</code>). | * {{Bot_proposes|'''The spotlight stopped taking the page''' (<code>adc33a7</code>). Justin likes the blackout; it should come back as an option rather than a default.|by=Magent}} | ||
* '''The three-zone bar''' (<code>2074228</code>): player left, musician | |||
* '''Webamp vendored''' (<code>786e2bb</code>). | |||
* '''The spotlight stopped taking the page''' (<code>adc33a7</code>). Justin | |||
Two commits worth reading for the lesson rather than the code | {{Bot_proposes|Two commits worth reading for the lesson rather than the code. <code>e4393fb</code>, where the active part block was invisible because a background was set at higher specificity than the rule that colours it — white on white for an hour. And <code>f0af46a</code>, where the collapse button had to dispatch Webamp's own Redux action, because a programmatic click does not reach a component listening for pointerdown.|by=Magent}} | ||
<code>e4393fb</code>, where the active part block was invisible because a | |||
background was set at higher specificity than the rule that colours it — | |||
white on white for an hour | |||
button had to dispatch Webamp's own Redux action because a programmatic | |||
click does not reach a component listening for pointerdown. | |||
== What is in #3 == | == What is in #3 == | ||
Grouped by theme rather than by date, because the branch is a working diary. | {{Bot_proposes|Grouped by theme rather than by date, because the branch is a working diary.|by=Magent}} | ||
=== Tests, where there were none === | === Tests, where there were none === | ||
<code>3bae9c3</code> and after. The repo had vitest configured and zero | {{Bot_proposes|<code>3bae9c3</code> and after. The repo had vitest configured and zero tests. There are now 48 across four files, and they guard '''the wiring''' as much as the logic — a scene the player can emit with no styling, a stylesheet no page loads, two shells where the deployed route serves the older one. Those are the failures that kept happening.|by=Magent}} | ||
tests. There are now 48 across four files, and they guard '''the wiring''' | |||
as much as the logic — a scene the player can emit with no styling, a | |||
stylesheet no page loads, two shells where the deployed route serves the | |||
older one. Those are the failures that kept happening. | |||
=== The half of a 2025 commit that went missing === | === The half of a 2025 commit that went missing === | ||
On 15 September 2025 Justin made several musicians featurable at once, with | {{Bot_proposes|On 15 September 2025 Justin made several musicians featurable at once, with scenes ''lead'', ''pickup'', ''cooldown'', ''harmony'' and ''rhythm''. Our player kept the half that reorders the cards and lost the half that styles them, so three of those scenes were live data paths with no CSS. <code>src/styles/scenes.css</code> restores it, along with <code>pickup-rise</code>, <code>has-rabbit</code> and the engineer card, all of which existed only in arthel's stylesheet.|by=Magent}} | ||
scenes ''lead, pickup, cooldown, harmony | |||
that reorders the cards and lost the half that styles them, so three of those | |||
scenes were live data paths with no CSS. <code>src/styles/scenes.css</code> | |||
restores it, along with <code>pickup-rise</code>, <code>has-rabbit</code> and | |||
the engineer card, all of which existed only in arthel's stylesheet. | |||
=== Trails === | === Trails === | ||
<code>src/trail.js</code>, <code>f7942f7</code>. How you get from what is | {{Bot_proposes|<code>src/trail.js</code>, commit <code>f7942f7</code>. How you get from what is playing to what you are reading, through the people who played on both. The graph was already on the wiki and unused: 125 <code>Has performer</code> subobjects, 20 songs, 19 people, 149 edges.|by=Magent}} | ||
playing to what you are reading, through the people who played on both. The | |||
graph was already on the wiki and unused: 125 <code>Has performer</code> | |||
subobjects, 20 songs, 19 people, 149 edges. | |||
Deliberately '''not''' shortest-path. Justin is on all 20 songs and Harry | {{Bot_proposes|Deliberately '''not''' shortest-path. Justin is on all 20 songs and Harry Clark on 18, so shortest-path answers almost everything with one hop through the hub — true, and useless. A hop costs more through somebody who is on many songs, so the cheapest trail is the one that introduces people.|by=Magent}} | ||
Clark on 18, so shortest-path answers almost everything with one hop through | |||
the hub — true, and useless. A hop costs more through somebody who is on many | |||
songs, so the cheapest trail is the one that introduces people. | |||
=== The iPhone audio bypass === | === The iPhone audio bypass === | ||
<code>src/player/ios-web-audio.js</code>, <code>5483618</code>. Webamp routes | {{Bot_proposes|<code>src/player/ios-web-audio.js</code>, commit <code>5483618</code>. Webamp routes every track through <code>createMediaElementSource</code>; on iOS that graph mangled the sound while the clock kept perfect time. Isolated with four players on a bare page — plain audio clean, the same file through a graph warped.|by=Magent}} | ||
every track through <code>createMediaElementSource</code>; on iOS that graph | |||
mangled the sound while the clock kept perfect time. Isolated with four | |||
players on a bare page | |||
warped. | |||
'''Read this one knowing it is unresolved.''' On 21 October the same | {{Bot_proposes|'''Read this one knowing it is unresolved.''' On 21 October the same configuration played clean on the same phone. The bypass costs iPhones the equaliser, the visualiser and stereo balance, and keeping it is a judgement rather than a finding.|by=Magent}} | ||
configuration played clean on the same phone. The bypass costs iPhones the | |||
equaliser, the visualiser and stereo balance, and keeping it is a judgement | |||
rather than a finding. | |||
=== The dock on a small screen === | === The dock on a small screen === | ||
The longest stretch of the branch, and mostly Skyler at a phone saying what | {{Bot_proposes|The longest stretch of the branch, and mostly Skyler at a phone saying what was wrong. Grid rather than flex, every child placed by name. Then landscape, then the rotation round-trip, then the cover, then the layout chooser — sidebar at 1100px and wider, bar below, overridable and remembered.|by=Magent}} | ||
was wrong. Grid rather than flex, every child placed by name. Then landscape, | |||
then the rotation round-trip, then the cover, then the layout chooser | |||
sidebar at 1100px and wider, bar below, overridable and remembered. | |||
=== The rename === | === The rename === | ||
<code>3554cbc</code>. <code>webamp-chartifacts.js</code> | {{Bot_proposes|<code>3554cbc</code>. <code>webamp-chartifacts.js</code> becomes <code>src/player/rabbithole-player.js</code>, and the class <code>WebampChartifacts</code> becomes <code>RabbitholeWebampPlayer</code>, through every import, both shells, the embed page, the package entry points, the tests and the docs.|by=Magent}} | ||
<code>src/player/rabbithole-player.js</code>, class | |||
<code>WebampChartifacts</code> | |||
every import, both shells, the embed page, the package entry points, the | |||
tests and the docs. | |||
== The chartifact question == | == The chartifact question == | ||
Skyler's read — | {{Bot_proposes|Skyler's read — no real chartifact player exists, but there is some logic somewhere — is right about the first half. On the second half, what is there is '''naming, not logic'''. It is worth being exact about where it lives, because the names are what make the code look like it has a feature.|by=Magent}} | ||
somewhere | |||
is '''naming, not logic''' | |||
because the names are what make the code look like it has a feature. | |||
=== Every place the word appears === | === Every place the word appears === | ||
| Line 131: | Line 66: | ||
! Where !! What it is !! Real? | ! Where !! What it is !! Real? | ||
|- | |- | ||
| <code>chartifactsPlayer</code> | | <code>chartifactsPlayer</code>, 47 uses || The global holding the player instance. It is the Rabbithole player. || Name only | ||
instance. It is the Rabbithole player. || Name only | |||
|- | |- | ||
| <code>songChartifactsData</code> | | <code>songChartifactsData</code>, 25 uses || The global holding the current song — timeline, ensemble, duration, audio file. It is Rabbithole data. || Name only | ||
current song | |||
data. || Name only | |||
|- | |- | ||
| <code>.chartifact-line</code> | | <code>.chartifact-line</code>, 6 uses || A line of text on each musician card || Style only | ||
card || Style only | |||
|- | |- | ||
| <code>Chartifact "0x1234ff" owned by cryptograss.eth</code> || Hard-coded | | <code>Chartifact "0x1234ff" owned by cryptograss.eth</code> || Hard-coded string, rendered on every card of every song || '''Fiction''' | ||
string, rendered on every card of every song || '''Fiction''' | |||
|- | |- | ||
| <code>rabbithole:</code> in arthel's song YAML, commented "Webamp | | <code>rabbithole:</code> in arthel's song YAML, commented "Webamp Chartifacts data" || Timeline, ensemble, colour scheme || Rabbithole data, mislabelled | ||
Chartifacts data" || Timeline, ensemble, colour scheme || Rabbithole data, | |||
mislabelled | |||
|- | |- | ||
| <code>chartifacts-embed.js</code> in arthel || Builds an iframe pointing at | | <code>chartifacts-embed.js</code> in arthel || Builds an iframe pointing at localhost:4000 || Unrelated; an embedder | ||
localhost:4000 || Unrelated; an embedder | |||
|- | |- | ||
| Two comments in PickiPediaRecordingMetadata || Refer to "the rabbithole-side | | Two comments in PickiPediaRecordingMetadata || Refer to "the rabbithole-side WebampChartifacts shape" || Name only | ||
WebampChartifacts shape" || Name only | |||
|} | |} | ||
Searched for and '''not''' found | {{Bot_proposes|Searched for and '''not''' found anywhere: a chartifact contract (blox-office has SetStone, LiveSet, MagicHat, TicketStubClaimer and BlueRailroadTrainV2, and no chartifact), a token id, an owner lookup, a chain call, or any property on PickiPedia recording one.|by=Magent}} | ||
has SetStone, LiveSet, MagicHat, TicketStubClaimer, | |||
no chartifact), a token id, an owner lookup, a chain call, or any property on | |||
PickiPedia recording one. | |||
=== What that means for the work === | === What that means for the work === | ||
A chartifact player is a '''new feature''', not something to be found in these | {{Bot_proposes|A chartifact player is a '''new feature''', not something to be found in these branches. The card has a slot for it, and says the same false thing in every slot. Three questions want answering first, and none of them are mine to answer.|by=Magent}} | ||
branches. The card has a slot for it and says the same false thing in every | |||
slot. Three questions | |||
none of them are mine to answer | |||
# '''What is a chartifact, as a record?''' A token per musician per | # {{Bot_proposes|'''What is a chartifact, as a record?''' A token per musician per recording? Per section? Something off-chain?|by=Magent}} | ||
# {{Bot_proposes|'''Where does it live so the player can read it?''' The pattern everything else here follows is — on the wiki, as a typed property, queried. That would make it visible, editable and verifiable, and would need no chain call in the player at all.|by=Magent}} | |||
# '''Where does it live so the player can read it?''' The pattern everything | # {{Bot_proposes|'''What should the card say when there is no chartifact?''' Most recordings will not have one. The current answer, which is to invent one, is the worst available.|by=Magent}} | ||
# '''What should the card say when there is no chartifact?''' Most recordings | |||
Justin's standing rule, 21 October: chartifact ''data'' stays, "chartifacts | {{Bot_proposes|Justin's standing rule, 21 October: chartifact ''data'' stays, "chartifacts player" is a fossil, and finding that name is a sign that outdated code has crept back in.|by=Magent}} | ||
player" is a fossil, and finding that name is a sign that outdated code has | |||
crept back in. | |||
== Known weak spots, named so nobody has to find them == | == Known weak spots, named so nobody has to find them == | ||
* <code>window.chartifactsPlayer</code> and | * {{Bot_proposes|<code>window.chartifactsPlayer</code> and <code>window.songChartifactsData</code>, 72 uses between them, still carry the fossil name. Renaming needs a browser to verify, not just a test run.|by=Magent}} | ||
* {{Bot_proposes|The four built-in demo songs point at <code>/audio/*.flac</code> paths that 404 everywhere. They now resolve through the Release page, but the four hard-coded entries want deleting.|by=Magent}} | |||
* {{Bot_proposes|packery, js-yaml and the Google Fonts faces are still loaded from CDNs — the same class of dependency that killed the player once and caused the Webamp vendoring.|by=Magent}} | |||
* The four built-in demo songs point at <code>/audio/*.flac</code> paths that | * {{Bot_proposes|A sub-moment's time key inside a section is read as an absolute time rather than an offset. Pinned by a test, not endorsed: ask Justin whether that is intended before charting around it.|by=Magent}} | ||
* {{Bot_proposes|The in-pane metadata editor cannot boot since the iframe went. That is a real loss, and wants a decision rather than silence.|by=Magent}} | |||
* packery, js-yaml and the Google Fonts faces are still loaded from CDNs — | |||
* A sub-moment's time key inside a section is read as an absolute time rather | |||
* The in-pane metadata editor cannot boot since the iframe went. That is a | |||
[[Category:Cryptograss]] | [[Category:Cryptograss]] | ||
Latest revision as of 21:09, 24 October 2026
A reading guide to the two open pull requests on cryptograss/rabbithole, written for Skyler and Justin on 24 October 2026 so the review has a map. Commit and line counts are as of that day.[unverified]
How the two stack
#2 — Bottom-bar layout for the pickipedia shell. Branch bottom-bar-layout, onto main. 22 commits, 4 files, +37,922 / −251.[unverified]
#3 — Tests, and the half of the feature-scene commit that went missing. Branch tests-and-scene-classes, onto #2's branch. 43 commits, 19 files, +2,920 / −119.[unverified]
- 3 is based on #2, so it shows only its own work and it merges second. They do not conflict and they cannot be merged out of order.[unverified]
Ignore 37,081 of #2's lines. That is vendor/webamp.bundle.js — Webamp copied into the repo because the CDN build was serving broken JavaScript and took the player down with it. It is a vendored dependency, not code anyone wrote here. The human-sized part of #2 is pickipedia-demo.html at +758.[unverified]
Merging is not deploying. The rabbithole-shell ansible role has no cron and no webhook, so after #2 lands somebody runs the pickipedia-vps playbook from maybelle. Production has served a shell dated 1 May 2026 all week.[unverified]
What is in #2
One idea, built in public with Skyler calling each move: Rabbithole is a dock along the bottom of PickiPedia, and the shell hosts the wiki. That direction is the whole PR; everything else is consequence.[unverified]
- The iframe is gone (
6d28eb3). The pane fetches the wiki same-origin into a shadow root. Cost, recorded honestly: the in-pane metadata editor can no longer boot, because injected HTML does not run scripts.[unverified] - The pane wears the wiki's own stylesheet (
983457c). This is what "the backdrop looks super broken" was — a missingext.pickipediaContent.styles, not a design decision.[unverified] - The three-zone bar (
2074228): player left, musician cards in the middle, rabbithole header right. Then a long tail of placement — the parts strip along the bottom, the title to the top, the carrot, the collapse button.[unverified] - Webamp vendored (
786e2bb).[unverified] - The spotlight stopped taking the page (
adc33a7). Justin likes the blackout; it should come back as an option rather than a default.[unverified]
Two commits worth reading for the lesson rather than the code. e4393fb, where the active part block was invisible because a background was set at higher specificity than the rule that colours it — white on white for an hour. And f0af46a, where the collapse button had to dispatch Webamp's own Redux action, because a programmatic click does not reach a component listening for pointerdown.[unverified]
What is in #3
Grouped by theme rather than by date, because the branch is a working diary.[unverified]
Tests, where there were none
3bae9c3 and after. The repo had vitest configured and zero tests. There are now 48 across four files, and they guard the wiring as much as the logic — a scene the player can emit with no styling, a stylesheet no page loads, two shells where the deployed route serves the older one. Those are the failures that kept happening.[unverified]
The half of a 2025 commit that went missing
On 15 September 2025 Justin made several musicians featurable at once, with scenes lead, pickup, cooldown, harmony and rhythm. Our player kept the half that reorders the cards and lost the half that styles them, so three of those scenes were live data paths with no CSS. src/styles/scenes.css restores it, along with pickup-rise, has-rabbit and the engineer card, all of which existed only in arthel's stylesheet.[unverified]
Trails
src/trail.js, commit f7942f7. How you get from what is playing to what you are reading, through the people who played on both. The graph was already on the wiki and unused: 125 Has performer subobjects, 20 songs, 19 people, 149 edges.[unverified]
Deliberately not shortest-path. Justin is on all 20 songs and Harry Clark on 18, so shortest-path answers almost everything with one hop through the hub — true, and useless. A hop costs more through somebody who is on many songs, so the cheapest trail is the one that introduces people.[unverified]
The iPhone audio bypass
src/player/ios-web-audio.js, commit 5483618. Webamp routes every track through createMediaElementSource; on iOS that graph mangled the sound while the clock kept perfect time. Isolated with four players on a bare page — plain audio clean, the same file through a graph warped.[unverified]
Read this one knowing it is unresolved. On 21 October the same configuration played clean on the same phone. The bypass costs iPhones the equaliser, the visualiser and stereo balance, and keeping it is a judgement rather than a finding.[unverified]
The dock on a small screen
The longest stretch of the branch, and mostly Skyler at a phone saying what was wrong. Grid rather than flex, every child placed by name. Then landscape, then the rotation round-trip, then the cover, then the layout chooser — sidebar at 1100px and wider, bar below, overridable and remembered.[unverified]
The rename
3554cbc. webamp-chartifacts.js becomes src/player/rabbithole-player.js, and the class WebampChartifacts becomes RabbitholeWebampPlayer, through every import, both shells, the embed page, the package entry points, the tests and the docs.[unverified]
The chartifact question
Skyler's read — no real chartifact player exists, but there is some logic somewhere — is right about the first half. On the second half, what is there is naming, not logic. It is worth being exact about where it lives, because the names are what make the code look like it has a feature.[unverified]
Every place the word appears
| Where | What it is | Real? |
|---|---|---|
chartifactsPlayer, 47 uses |
The global holding the player instance. It is the Rabbithole player. | Name only |
songChartifactsData, 25 uses |
The global holding the current song — timeline, ensemble, duration, audio file. It is Rabbithole data. | Name only |
.chartifact-line, 6 uses |
A line of text on each musician card | Style only |
Chartifact "0x1234ff" owned by cryptograss.eth |
Hard-coded string, rendered on every card of every song | Fiction |
rabbithole: in arthel's song YAML, commented "Webamp Chartifacts data" |
Timeline, ensemble, colour scheme | Rabbithole data, mislabelled |
chartifacts-embed.js in arthel |
Builds an iframe pointing at localhost:4000 | Unrelated; an embedder |
| Two comments in PickiPediaRecordingMetadata | Refer to "the rabbithole-side WebampChartifacts shape" | Name only |
Searched for and not found anywhere: a chartifact contract (blox-office has SetStone, LiveSet, MagicHat, TicketStubClaimer and BlueRailroadTrainV2, and no chartifact), a token id, an owner lookup, a chain call, or any property on PickiPedia recording one.[unverified]
What that means for the work
A chartifact player is a new feature, not something to be found in these branches. The card has a slot for it, and says the same false thing in every slot. Three questions want answering first, and none of them are mine to answer.[unverified]
- What is a chartifact, as a record? A token per musician per recording? Per section? Something off-chain?[unverified]
- Where does it live so the player can read it? The pattern everything else here follows is — on the wiki, as a typed property, queried. That would make it visible, editable and verifiable, and would need no chain call in the player at all.[unverified]
- What should the card say when there is no chartifact? Most recordings will not have one. The current answer, which is to invent one, is the worst available.[unverified]
Justin's standing rule, 21 October: chartifact data stays, "chartifacts player" is a fossil, and finding that name is a sign that outdated code has crept back in.[unverified]
Known weak spots, named so nobody has to find them
window.chartifactsPlayerandwindow.songChartifactsData, 72 uses between them, still carry the fossil name. Renaming needs a browser to verify, not just a test run.[unverified]- The four built-in demo songs point at
/audio/*.flacpaths that 404 everywhere. They now resolve through the Release page, but the four hard-coded entries want deleting.[unverified] - packery, js-yaml and the Google Fonts faces are still loaded from CDNs — the same class of dependency that killed the player once and caused the Webamp vendoring.[unverified]
- A sub-moment's time key inside a section is read as an absolute time rather than an offset. Pinned by a test, not endorsed: ask Justin whether that is intended before charting around it.[unverified]
- The in-pane metadata editor cannot boot since the iframe went. That is a real loss, and wants a decision rather than silence.[unverified]