docs: resume artifact for the fix→deploy→test loop

Everything needed to continue cold: the loop protocol with real deploy and
verify commands, the ordered work list with each item's evidence, Phase 13's
exact remaining state (13-15 only, check 4 passed on-device), and the traps
that cost time tonight — verify on the node not from source, rustls does not
check key/cert pairing, build-aiui.sh hangs after succeeding, AIUI needs
VITE_BASE_PATH=/aiui/.

STATE.md's stopped_at now points at it, so /gsd-resume-work lands correctly.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-08-06 19:10:59 -04:00
co-authored by Claude Opus 5
parent 5f343f5ef9
commit 11aa276f58
2 changed files with 100 additions and 3 deletions
+89
View File
@@ -0,0 +1,89 @@
# RESUME — 2026-08-06 night. Fix → deploy → test → fix, in a loop.
Start here. Read this, then `.planning/MEDIA-AND-INDEEHUB-SCOPE.md` (the evidence), then
`.planning/todos/pending/2026-08-06-open-operational-tasks.md` (everything else open).
Branch `gsd/phase-13-...` @ `5f343f5e`+, merged with `main`. Working tree clean, pushed.
## The loop the operator asked for
For each item below, in order:
1. Fix on the phase branch. Small, focused commit.
2. Build: `cd core && CARGO_INCREMENTAL=0 cargo build --release -p archipelago` (~7-8 min)
and/or `cd neode-ui && npm run build`, `bash scripts/build-aiui.sh`.
3. Deploy to archi-dev-box (it IS this box — hostname `archi-dev-box`, also `archi-thinkpad`,
LAN `192.168.63.240`, Tailscale `100.69.68.39`):
- frontend: `sudo rsync -a --exclude 'aiui/' --exclude 'archipelago-runtime/' web/dist/neode-ui/ /opt/archipelago/web-ui/`
- AIUI: `sudo rsync -a --delete aiui/packages/app/dist/ /opt/archipelago/web-ui/aiui/`
- binary: `sudo cp -f /usr/local/bin/archipelago /opt/archipelago/rollback/archipelago.bak && sudo install -m 755 core/target/release/archipelago /usr/local/bin/archipelago && sudo systemctl restart archipelago`
4. **Test live with curl before asking the operator to look.** Restarting the daemon does
NOT kill containers — verified: they live in `/user.slice`, the service cgroup holds 3 PIDs.
5. Verify the built bundle actually contains the change (`grep` the dist) — builds no-op silently.
6. Commit, push (`git push gitea-ai HEAD`), then loop.
**Do not report a fix as done without a live check on the node.** Two bugs tonight only
appeared on deployment: nginx edits went into the ISO template not the running config
(`/etc/nginx/sites-enabled/archipelago`), and the TLS key was root-only while the daemon runs
as `archipelago`.
## Ordered work list
### 1. Gate vs app-owned auth (fleet-wide) — HALF DONE
Done + deployed + verified: credential-less allowlist, `manifest.json` 401→200, root and
`/api/auth/*` still 401 (`is_credentialless_public_path`, exact match only, 2 tests).
**Remaining:** the app's own `/api/auth/*` is still intercepted, so IndeeHub cannot establish
its Nostr session. Needs a session-aware rule: once a VALID gate session exists, proxy the
app's auth endpoints through instead of challenging. Security-critical — justify in code.
### 2. AI Data Access grants → node-side (unblocks everything AI)
`aiPermissions.ts` uses `localStorage` (`archipelago-ai-permissions`), which is PER-ORIGIN.
A node has many origins, so grants vanish when you switch address/device. Move behind an RPC,
localStorage as offline fallback, migrate existing local grants. This is what made a films
search look broken.
### 3. Content-card parser (the "idiotic responses")
`updatePanelFromText` in `useContentPanel.ts` pairs title *n* with description *n-1* and
promotes section headers ("Documentaries:") to titles. The model's prose was CORRECT.
Fix the pairing + exclude headers; the real answer is structured model output, not regex.
### 4. IndeeHub (needs 1 and 2 first)
- Content source: films are `projects`, `GET /api/projects` via its nginx on :7778.
Public count on this node is **0**. Port 4000 is not host-mapped. `/graphql` is the SPA.
- Private films need a **Nostr session** (`/api/projects/private` says Cognito is disabled).
- `/relay` is 502 **direct on loopback** — IndeeHub's own nginx can't reach its relay
container. Independent of the gate. Fix separately.
### 5. Node-side Nostr signer — the highest-leverage piece
Collapses IndeeHub's private auth, the app-auth half of item 1, and Phase C's zaps into one
design, with keys out of the browser and the model (the phase's non-negotiable). Precedent:
`nostr-provider.js` already built for BotFights. **Research from AIUI's seed/history and the
Nostr-first ethos before designing** — operator instruction.
### 6. Operator's late asks
Cmd/Ctrl+K → "search with AIUI" must open the EXPANDED chat with the query actually sent and
answered. More mock content types. Performance across the content path. Audit all ten
`AIContextCategory` values in `fetchAndSanitize` for real coverage, not stubs.
### 7. Loose ends observed
`/api/app-catalog` → 502 repeatedly · AIUI web search blocked by CSP (confirms 13-09: the
web-search setting must drive the CSP node-side) · `Failed to scroll to index N` in
ChatWindow · `strfry.png`/`.svg` 404.
## Phase 13 GSD state
14/15 plans done. **13-15 only** — device-close, `autonomous: false`, blocking human-verify.
Check 4 (CSP boundary) **PASSED on-device tonight**: BLOCKED in the AIUI frame, GOT 200 from
top. Checks 1, 2, 3 still need the operator in a browser; check 2's peer/owned half now has
code behind it but this node has no film content.
Resume with `/gsd-resume-work`, or `/gsd-plan-phase --research-phase 13` for the research pass.
## Traps that cost time tonight — do not repeat
- Verify on the NODE, not from source (nginx template vs `/etc/nginx/sites-enabled/`).
- rustls does NOT check that a key matches its certificate — the explicit pairing check in
`appgate/tls.rs` is load-bearing, not redundant.
- `build-aiui.sh` hangs after a successful build; the dist is complete — kill by PID/timeout.
- AIUI must build with `VITE_BASE_PATH=/aiui/` or you get a black page.
- Never `rm -rf /opt/archipelago/web-ui/*` — it destroys `aiui/`.
- The `.planning` dirs on `main` and the phase branch diverge; merge before deploying both.
+11 -3
View File
@@ -5,7 +5,7 @@ milestone_name: milestone
current_phase: 13
current_phase_name: aiui-functional-conversational-node-control-and-content-surf
status: executing
stopped_at: "13-14 COMPLETE 2026-08-06 (14/15). ONLY 13-15 REMAINS (device-close, autonomous:false, blocking human-verify). archi-dev-box runs the current merged stack (binary 2d10b710-era + history replay + persona fix; neode-ui + AIUI deployed, live-chunk verified). Grants apps+system. 13-15 needs FOUR browser checks by the operator — see .planning/todos/pending/2026-08-06-open-operational-tasks.md for the exact list plus every open non-phase task and the follow-on phase proposal. Known gaps to RECORD not fix: music view (D-13 independent), Routstr live paid request, E-09 naive-user study."
stopped_at: "2026-08-06 night. READ .planning/RESUME-2026-08-06-media-loop.md FIRST — it carries the fix→deploy→test loop, the ordered work list, and the deploy/test commands. Evidence in .planning/MEDIA-AND-INDEEHUB-SCOPE.md. Phase: 14/15, ONLY 13-15 left (device-close, blocking human-verify); its CHECK 4 (CSP boundary) PASSED on-device tonight — BLOCKED in the AIUI frame, GOT 200 from top. Checks 1/2/3 still need the operator. Deployed+verified on archi-dev-box tonight: IndeeHub gate regression fixed (manifest.json 401->200, root and /api/auth/* still 401), content-grid sequence guard, owned+peer scopes, per-scope permission logging, warm-up app status, scheme-following app frames, per-node CA + Settings flow, app-port TLS alongside HTTP on one socket. NEXT, in order: (1) gate must proxy an app's own /api/auth/* once a valid session exists, (2) move AI Data Access grants node-side out of per-origin localStorage, (3) fix the content-card parser pairing title n with description n-1, (4) IndeeHub, (5) node-side Nostr signer — the highest-leverage piece."
last_updated: "2026-08-06T18:07:49.641Z"
last_activity: 2026-08-06
last_activity_desc: 13-14 complete (18-case adversarial eval harness EV-01..EV-18, ScriptedBackend-driven, offline/zero-footprint; E-02 confirmation-copy sign-off operator-approved with three verbatim dialog texts; E-09 naive-user comprehension study recorded as an open residual, not run)
@@ -230,8 +230,16 @@ The 5x lifecycle gate was NOT run.
## Session Continuity
Last session: 2026-08-06T18:07:49.600Z
Stopped at: 13-14 COMPLETE 2026-08-06, next 13-15 device-close
Last session: 2026-08-06 (resumed)
Stopped at: Session resumed 2026-08-06 via /gsd-resume-work. Tree clean, in sync with
gitea-ai @ 7bb09ffe. 13-14 COMPLETE (14/15), next 13-15 device-close — BLOCKED on four
operator browser checks (list in .planning/todos/pending/2026-08-06-open-operational-tasks.md,
which also carries the four non-phase node/infra tasks and the follow-on A/B/C proposal).
Awaiting operator choice between: (a) run the four checks and close 13-15/the phase,
(b) start follow-on Phase B (web-search setting derives the CSP, node-side), (c) take a
node/infra task (app-gate iframe login decision, Starting-vs-Unreachable, .228 frontend).
NOTE: .planning/HANDOFF.json + .planning/.continue-here.md are STALE (phase 09, 2026-08-02,
fully reconciled) and should not be read as live resume context.
Prior (13-12) stop note, retained for history: Completed 13-12-PLAN.md (D-10 untrusted-content boundary, G-B1/G-B2 cloud-egress screen, G-B3 read-only-loop rate limit + owner notices).
`assistant::` tests incl. `approval_nonce_binds_to_exact_action` individually; dispatcher.rs