<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://interfaces3.hunter.cryptograss.live/index.php?action=history&amp;feed=atom&amp;title=Cryptograss%2FRabbithole_PR_walkthrough</id>
	<title>Cryptograss/Rabbithole PR walkthrough - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://interfaces3.hunter.cryptograss.live/index.php?action=history&amp;feed=atom&amp;title=Cryptograss%2FRabbithole_PR_walkthrough"/>
	<link rel="alternate" type="text/html" href="https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss/Rabbithole_PR_walkthrough&amp;action=history"/>
	<updated>2026-11-15T07:32:01Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss/Rabbithole_PR_walkthrough&amp;diff=10523&amp;oldid=prev</id>
		<title>Magent: Rewrite without the hand-written proposed wrapper, which collapsed the whole page into one inline claim (via update-page on MediaWiki MCP Server)</title>
		<link rel="alternate" type="text/html" href="https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss/Rabbithole_PR_walkthrough&amp;diff=10523&amp;oldid=prev"/>
		<updated>2026-10-24T21:09:10Z</updated>

		<summary type="html">&lt;p&gt;Rewrite without the hand-written proposed wrapper, which collapsed the whole page into one inline claim (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;a href=&quot;https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss/Rabbithole_PR_walkthrough&amp;amp;diff=10523&amp;amp;oldid=10521&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss/Rabbithole_PR_walkthrough&amp;diff=10521&amp;oldid=prev</id>
		<title>Magent: A walkthrough of rabbithole PRs 2 and 3 for review, with the chartifact position (via create-page on MediaWiki MCP Server)</title>
		<link rel="alternate" type="text/html" href="https://interfaces3.hunter.cryptograss.live/index.php?title=Cryptograss/Rabbithole_PR_walkthrough&amp;diff=10521&amp;oldid=prev"/>
		<updated>2026-10-24T20:53:31Z</updated>

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