OverviewFilesCommitsIssuesDocsReleasesPeers

hypercore-kb commits / 970e94c

skills/ap-bridge: route on what it now covers, and un-stale the deploy section
Two things flagged while adding the `updated` finding. DESCRIPTION. The loader indexes on it, and it listed only the M0→M3 surface — so a search for reproject, OTA, media, or the Update trap would not route here, which is precisely when someone needs it most. Now names the control surface, reproject, and the Mastodon `updated` trap, with an explicit "read before touching AP delivery, edits, media, or deploying". DEPLOY SECTION. It predated 0.0.2 and read as though deploys were still a manual stop/install/start. Now records that they are OTA, verified twice hands-off — and the one-off exception worth knowing: the 0.0.1→0.0.2 hop itself needed a manual restart because the OLD code had no handler for the sidecar to push to. Any app gaining a control surface for the first time has the same one-off. Also folded in three deploy facts learned today that were nowhere: - the vendor list is DERIVED from package.json's file: deps, with the ~10-day silent-failure story that motivated it - the declare-deps guard checks the DECLARATION, not disk presence, since a hoisted transitive dep passes the latter — the very bug it exists to catch (bare-os was waved through). Dynamic import() is still invisible. - ⚠ a UDS path is capped near 107 bytes; a long AP_SOCK fails to bind with "invalid argument" and the control surface degrades SILENTLY while HTTP keeps serving. Cost me a false negative during the 0.0.2 smoke test. Stale test count corrected 70/254 -> 81/275. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
970e94cfa9ef866dd5af7c5e062087b60bb94f4a
by plankatron <fleeky@gmail.com> · 2026-08-06T00:27:14.000Z

Changed files (1) +22 -3

.claude/skills/ap-bridge/SKILL.md +22 -3
……@@ -1,6 +1,6 @@
11---
22name: ap-bridge
3description: ActivityPub as a PROJECTION of the same canonical atproto record bytes — pure-JS RSA + HTTP Signatures (cavage-12) under Bare, WebFinger/actor, record→AS2, inbox Follow→Accept, firehose-driven delivery. Live at ap.7rnx.net.
3description: ActivityPub as a PROJECTION of the same canonical atproto record bytes — pure-JS RSA + HTTP Signatures (cavage-12) under Bare, WebFinger/actor, record→AS2, inbox Follow→Accept, firehose-driven delivery. Also the OTA/control surface, `reproject` backfill, and the ⛔ Mastodon trap that an `Update` without an `updated` timestamp is silently discarded (2xx, no edit, no media re-fetch). Read before touching AP delivery, edits, media/attachments, or deploying ap-bridge. Live at ap.7rnx.net.
44category: project
55priority: high
66location: hyper-fleeky/ap-bridge
……@@ -11,7 +11,7 @@ updated: 2026-08-05
1111
1212**v0.0.4** (M0→M3 shipped 2026-08-01; control surface + OTA 0.0.2, `reproject` 0.0.3, `updated` fix 0.0.4), runtime **Bare**, pgh app `ap-bridge`,
1313port **3400**, live at `https://ap.7rnx.net` (vhost → stortron:3400).
1470 tests / 254 asserts, all offline.
1481 tests / 275 asserts, all offline.
1515
1616## ★ The thesis: ActivityPub is a projection, not a bridge
1717
……@@ -261,8 +261,27 @@ because sibling repos had **unpushed commits the outbox depended on**; and
261261`pgh publish` refusing because `npm install brittle` re-resolved the tree and deleted
262262the vendored siblings (`removed 1194 packages`).
263263
264★ **The vendor list is DERIVED from `package.json`'s `file:` deps (0.0.2)** — never
265hardcoded. atproto-bridge kept it in three hardcoded places, one drifted when a sibling
266was added, and `pgh publish` then failed on every build for ~10 days SILENTLY (a failed
267publish records no version, so `pgh deploy log` simply shows nothing newer). Adding
268`hyper-svc` for the control surface picked it up automatically.
269
270⚠ The declare-deps guard checks the **declaration**, not `[ -d node_modules/$m ]` — disk
271presence passes for anything hoisted in transitively, which is exactly the bug it exists
272to catch. `bare-os` was undeclared and the old check waved it through. It still only sees
273static `from '…'` imports, so a dynamic `await import()` remains invisible to it.
274
275**Deploys are OTA since 0.0.2 — no manual stop/install/start.** `pgh publish` → the
276sidecar installs → `release-ready` → exit 75 → supervisor respawns. Verified twice
277hands-off (0.0.3 and 0.0.4). The one exception was the 0.0.1→0.0.2 hop itself: the old
278code had no handler for the sidecar to push to, so that upgrade needed a manual restart.
279Any app being given a control surface for the first time has the same one-off.
280
264281Deploy-shape gotchas: `readiness` takes **`port`, not `url`**; a missing `pgh.upgrade`
265means OTA can never work; `b4a`/`bare-fs` must be declared.
282means OTA can never work; `b4a`/`bare-fs`/`bare-os` must be declared. ⚠ A UDS path is
283capped near **107 bytes** — a long `AP_SOCK` fails to bind with `invalid argument`, and
284the control surface then degrades silently to "unavailable" while HTTP keeps serving.
266285
267286## Boot-order gotcha
268287