<?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=VersionControl%3APRs%2Fmaybelle-config%2F298</id>
	<title>VersionControl:PRs/maybelle-config/298 - 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=VersionControl%3APRs%2Fmaybelle-config%2F298"/>
	<link rel="alternate" type="text/html" href="https://interfaces3.hunter.cryptograss.live/index.php?title=VersionControl:PRs/maybelle-config/298&amp;action=history"/>
	<updated>2026-11-15T07:47:28Z</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=VersionControl:PRs/maybelle-config/298&amp;diff=15857&amp;oldid=prev</id>
		<title>DrivingThatTrain: cryptograss/maybelle-config#298, as GitHub has it</title>
		<link rel="alternate" type="text/html" href="https://interfaces3.hunter.cryptograss.live/index.php?title=VersionControl:PRs/maybelle-config/298&amp;diff=15857&amp;oldid=prev"/>
		<updated>2026-11-10T16:27:36Z</updated>

		<summary type="html">&lt;p&gt;cryptograss/maybelle-config#298, as GitHub has it&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:27, 10 November 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l5&quot;&gt;Line 5:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 5:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|url=https://github.com/cryptograss/maybelle-config/pull/298&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|url=https://github.com/cryptograss/maybelle-config/pull/298&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|author=magent-cryptograss&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|author=magent-cryptograss&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|state=&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;open&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|state=&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;merged&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|base=production&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|base=production&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|branch=magent/resdtp-releases&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|branch=magent/resdtp-releases&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|opened=2026-11-09 18:32:00&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|opened=2026-11-09 18:32:00&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|pushed=2026-11-09 18:31:01&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|pushed=2026-11-09 18:31:01&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|merged=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|merged=&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;2026-11-10 16:27:30&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|closed=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|closed=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|worked_on_by=magent, with skyler (testing on an iphone 17), justin&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|worked_on_by=magent, with skyler (testing on an iphone 17), justin&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>DrivingThatTrain</name></author>
	</entry>
	<entry>
		<id>https://interfaces3.hunter.cryptograss.live/index.php?title=VersionControl:PRs/maybelle-config/298&amp;diff=15634&amp;oldid=prev</id>
		<title>DrivingThatTrain: cryptograss/maybelle-config#298, as GitHub has it</title>
		<link rel="alternate" type="text/html" href="https://interfaces3.hunter.cryptograss.live/index.php?title=VersionControl:PRs/maybelle-config/298&amp;diff=15634&amp;oldid=prev"/>
		<updated>2026-11-09T18:32:05Z</updated>

		<summary type="html">&lt;p&gt;cryptograss/maybelle-config#298, as GitHub has it&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{PR&lt;br /&gt;
|repo=maybelle-config&lt;br /&gt;
|number=298&lt;br /&gt;
|title=delivery-kid: /enrich/repackage, so the 26 older video releases play on iPhones&lt;br /&gt;
|url=https://github.com/cryptograss/maybelle-config/pull/298&lt;br /&gt;
|author=magent-cryptograss&lt;br /&gt;
|state=open&lt;br /&gt;
|base=production&lt;br /&gt;
|branch=magent/resdtp-releases&lt;br /&gt;
|opened=2026-11-09 18:32:00&lt;br /&gt;
|pushed=2026-11-09 18:31:01&lt;br /&gt;
|merged=&lt;br /&gt;
|closed=&lt;br /&gt;
|worked_on_by=magent, with skyler (testing on an iphone 17), justin&lt;br /&gt;
|moods=uploads-and-embeds&lt;br /&gt;
|deploy=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre class=&amp;quot;pr-body&amp;quot;&amp;gt;## Why&lt;br /&gt;
&lt;br /&gt;
#297 stops new encodes writing the empty `sdtp` box that iPhone Safari refuses. 26 video Releases were published before it and still have one. Justin, in #uploads-and-embeds: redo them all; a new CID is fine.&lt;br /&gt;
&lt;br /&gt;
## What&lt;br /&gt;
&lt;br /&gt;
`POST /enrich/repackage {&amp;quot;cid&amp;quot;: ..., &amp;quot;dry_run&amp;quot;: false}` (API key, like `/enrich/torrent`), in its own routes file so it doesn&amp;#039;t collide with #290.&lt;br /&gt;
&lt;br /&gt;
Inside the IPFS node, through MFS (`services/repackage.py`):&lt;br /&gt;
1. Find every `stream_*/init*.mp4` and remove any empty `sdtp` (the same code as #297, split into `drop_empty_sdtp_bytes`).&lt;br /&gt;
2. `files/cp` the release by reference, `files/write` only the fixed init segments, plus `metadata.json` with `repackaged_from: &amp;amp;lt;old CID&amp;amp;gt;`.&lt;br /&gt;
3. `files/stat` for the new CID, `pin/add` it, remove the MFS scratch copy.&lt;br /&gt;
&lt;br /&gt;
Nothing is downloaded, re-added or re-encoded, so the 1.4 GB release costs about as much as a short clip. The old CID stays pinned. There&amp;#039;s no timestamp in what&amp;#039;s written, so the same release always gives the same new CID: running it twice pins nothing new.&lt;br /&gt;
&lt;br /&gt;
## Checked&lt;br /&gt;
&lt;br /&gt;
- **Against a real kubo 0.43** (a throwaway offline container on hunter), on a release built from `QmbYnW…`&amp;#039;s own 360p files: the new init segment is byte-identical to test 18, the one Skyler&amp;#039;s iPhone played. Every media segment and the audio rendition keep the same blocks. Both CIDs are pinned, the MFS scratch copy is gone, and a second run gives the same CID.&lt;br /&gt;
- That run caught a bug the first fake didn&amp;#039;t: kubo reads a `/` in the multipart filename as a directory. Fixed, and the test&amp;#039;s fake kubo now refuses it the same way.&lt;br /&gt;
- 149 delivery-kid tests pass (5 new in `tests/test_repackage.py`). The endpoint answers 401 without a key. Merges cleanly with #290.&lt;br /&gt;
- Not checked: on delivery-kid itself.&lt;br /&gt;
&lt;br /&gt;
## After deploy&lt;br /&gt;
&lt;br /&gt;
1. With the API key, dry run first, then for real:&lt;br /&gt;
   ```&lt;br /&gt;
   for c in $(cat sdtp26.txt); do curl -s -X POST https://delivery-kid.cryptograss.live/enrich/repackage -H &amp;quot;X-API-Key: $KEY&amp;quot; -H &amp;#039;Content-Type: application/json&amp;#039; -d &amp;quot;{\&amp;quot;cid\&amp;quot;:\&amp;quot;$c\&amp;quot;,\&amp;quot;dry_run\&amp;quot;:true}&amp;quot;; echo; done&lt;br /&gt;
   ```&lt;br /&gt;
2. Move each `Release:&amp;amp;lt;old&amp;amp;gt;` to `Release:&amp;amp;lt;new&amp;amp;gt;`, keeping its history; the old title redirects. 24 of them have a `bittorrent_infohash` for the old bytes. That field has to go, so the Blue Railroad job makes a torrent of the new ones.&lt;br /&gt;
3. Unpin the old CIDs once the pages have moved.&lt;br /&gt;
&lt;br /&gt;
The 26 (every Release whose video init segment has the box; the other 18 video Releases have none):&lt;br /&gt;
    QmPTDWdthu1ZMtJwr5KHehXBk7X3FrLsA8wxdqnoX9LeW9&lt;br /&gt;
    QmRpqcstuYx2yhZ5TjXdVHSUefwDGrPoe65sNTkuNUGkqz&lt;br /&gt;
    QmRxSwLvRjsDP8p7gitKP1rg9cExUahDudU2dr2Z8kMzFi&lt;br /&gt;
    QmSAeiTZ2gMUYPfF9p8kj5ApuKohSgEru3RzRBBc82o8xS&lt;br /&gt;
    QmSGrjxtHayqBhJMxWKVFuLP55YT3QxkVLzGmpYycqg6tF&lt;br /&gt;
    QmTrp8gYj4tiHFcovJoe26FzeN3NMULZWkVg3cW7NBdAbF&lt;br /&gt;
    QmTx3csugrGr5twKXmwQi5okCr1MWaBJfQNj1Vde9TwZim&lt;br /&gt;
    QmU2rS8zrVcGPL2tz7jhKE6KdNj5mAy7FMFpY9iX9x54ms&lt;br /&gt;
    QmUQwnWJMcwMGkVSo45XLwiqWZg8esLnecSzFCwdASDvNg&lt;br /&gt;
    QmV583L78ruF7KpdmhZC8p5rYPBSkbPcTYjA31P22q3grJ&lt;br /&gt;
    QmVJG32Xewr62X1dSg8wtQrwyYMsEhSD1ujXZVTrXfpXam&lt;br /&gt;
    QmVYU5wNxPMUMjiDJAuYuKYeQPNdANnf8weFNrY2u4JQ1i&lt;br /&gt;
    QmW14popPbxcgj39UQ5XPPb3yKbjPgRUV3FeXk85fSqzJ6&lt;br /&gt;
    QmYacRRA9WjdwwvbcmF8ujYZDvBN9n5m39atTSmoX4fWV1&lt;br /&gt;
    QmZLS8LUoJvjDvVLdan7R8FGYWSCTs3vo2jw6H943e4WpU&lt;br /&gt;
    QmZSLe6SkfRB65DdyYeQFVyF1L6p7pFbyk1t4TCV65o4pB&lt;br /&gt;
    QmZXZ4iTtBUi5HZmLVBfHde6PESnezj2K2QYixbTMNCYgk&lt;br /&gt;
    QmZerxBKPBcTd39xvv5xYG7Kdw2FGVVW4SZCet7XdPPvWR&lt;br /&gt;
    Qmaj8XBvuYohG9aot5fDrwgPiDFxC2r8pYfDZxvNurfNKh&lt;br /&gt;
    QmbBrpe8U8cxgkf24bteRATQ9Td1RrEdCz7RJM3a3bRBCj&lt;br /&gt;
    QmbYnW2BpVxwvJZDE3e4iaJcH3xn1QDugRZuofuv1JDkJg&lt;br /&gt;
    QmdGoubKAb5f8aE5czYTxCUUmAbE7FgbLTLGwun88ZtSpw&lt;br /&gt;
    QmdgxqVbPpLu1Rp8Sn46BqQzRbbpnwrYG3X2FTFfUVGDvQ&lt;br /&gt;
    QmdyjTo2M4WYSHUbRy5odkj8vfgAwKumAcXD59gmc8PmFE&lt;br /&gt;
    QmeN1JDvkE1JnJWqT9rAaPcafLpBtGLy6oVkwZYBjG7qhH&lt;br /&gt;
    Qmet33eDDm8p2rHciP1k9HVoQwmoAYT9ePn1zy7CnbumoZ&lt;br /&gt;
&lt;br /&gt;
Redeploy delivery-kid.&lt;br /&gt;
Worked on by: magent, with Skyler (testing on an iPhone 17) and Justin, in #uploads-and-embeds&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>DrivingThatTrain</name></author>
	</entry>
</feed>