Cryptograss/Rabbithole PR walkthrough: Difference between revisions

From PickiPedia: A knowledge base of bluegrass, old time psychedelic jams, and other public domain music
Jump to navigationJump to search
Magent (talk | contribs)
A walkthrough of rabbithole PRs 2 and 3 for review, with the chartifact position (via create-page on MediaWiki MCP Server)
 
Magent (talk | contribs)
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:
<proposed by="Magent">
{{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|Skyler]] and [[Justin Myles Holmes|Justin]] on 24 October
2026 so the review has a map. Commit counts and line counts are as of that
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}}
  same-origin into a shadow root. Cost, recorded honestly: the in-pane
* {{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}}
  metadata editor can no longer boot, because injected HTML does not run
* {{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}}
  scripts.
* {{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}}
  This is what "the backdrop looks super broken" was — a missing
  <code>ext.pickipediaContent.styles</code>, not a design decision.
* '''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.
* '''Webamp vendored''' (<code>786e2bb</code>).
* '''The spotlight stopped taking the page''' (<code>adc33a7</code>). Justin
  likes the blackout; it should come back as an option rather than a default.


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; 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.


== 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, 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.


=== 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: plain audio clean, the same file through a graph
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> → <code>RabbitholeWebampPlayer</code>, through
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 — "no real chartifact player existed but there was some logic
{{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 right about the first half. On the second half, what is there
is '''naming, not logic''', and it is worth being exact about where it lives,
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> — 47 uses || The global holding the player
| <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> — 25 uses || The global holding the
| <code>songChartifactsData</code>, 25 uses || The global holding the current song — timeline, ensemble, duration, audio file. It is Rabbithole data. || Name only
current song: timeline, ensemble, duration, audio file. It is Rabbithole
data. || Name only
|-
|-
| <code>.chartifact-line</code> — 6 uses || A line of text on each musician
| <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, anywhere: a chartifact contract (blox-office
{{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, BlueRailroadTrainV2 and
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 have to be answered before any of it can be built, and
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}}
  recording? Per section? Something off-chain?
# {{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}}
  else here follows is: on the wiki, as a typed property, queried. That would
  make it visible, editable and verifiable, and it would not need a chain
  call in the player at all.
# '''What should the card say when there is no chartifact?''' Most recordings
  will not have one. The current answer — invent one — is the worst available.


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}}
  <code>window.songChartifactsData</code>, 72 uses between them, still carry
* {{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}}
  the fossil name. Renaming needs a browser to verify, not just a test run.
* {{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}}
  404 everywhere. They now resolve through the Release page, but the four
* {{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}}
  hard-coded entries want deleting.
* 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.
* 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.
* The in-pane metadata editor cannot boot since the iframe went. That is a
  real loss and wants a decision rather than silence.
</proposed>


[[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]

  1. 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 missing ext.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]

  1. What is a chartifact, as a record? A token per musician per recording? Per section? Something off-chain?[unverified]
  2. 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]
  3. 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.chartifactsPlayer and window.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/*.flac paths 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]