Handoff carries the peer-files correction, the podman-lifecycle trap, the concurrent-agent warning, and the release-binary drift that blocks the ISO. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
55 lines
8.6 KiB
JSON
55 lines
8.6 KiB
JSON
{
|
|
"version": "1.0",
|
|
"timestamp": "2026-08-07T10:02:11.548Z",
|
|
"phase": "13",
|
|
"phase_name": "aiui-functional-conversational-node-control-and-content-surf",
|
|
"phase_dir": ".planning/phases/13-aiui-functional-conversational-node-control-and-content-surf",
|
|
"plan": 15,
|
|
"task": 6,
|
|
"total_tasks": 17,
|
|
"status": "paused",
|
|
"note": "Task ids below are the OPERATOR's 17-item demo list (see .planning/RESUME-2026-08-07-aiui-surfaces.md), not 13-XX plan tasks. Phase 13's own GSD plans are 14/15 done with only 13-15 (device-close) open.",
|
|
"completed_tasks": [
|
|
{"id": 1, "name": "Unify AI Data Access toggles with assistant tool grants", "status": "done", "commit": "55155f2d"},
|
|
{"id": 5, "name": "Cap content.browse-all-peers, rebuilt as Cloud's fan-out", "status": "done", "commit": "75919a20"},
|
|
{"id": 12, "name": "Node certificate settings section container/layout", "status": "done", "commit": "75919a20"},
|
|
{"id": 16, "name": "Populate the content surface for own shared content + rich chat previews", "status": "done", "commit": "9abc1623,b1c5d138", "evidence": "browser: chat:response surfaces=1 songs:2 images:13; heading '13 Images'"},
|
|
{"id": 15, "name": "Content-surface stale title", "status": "done", "commit": "9abc1623", "evidence": "browser: 'Loading...' during turn, '13 Images' after", "caveat": "header-OVERLAP half never reproduced at 1600x950; check a narrow/mobile viewport"},
|
|
{"id": 6, "name": "Settings link when a permission is ungranted", "status": "in_progress", "commit": "9abc1623", "progress": "node refused_categories + broker event + Teleported chrome banner all landed and typecheck clean; NEVER seen in a browser"},
|
|
{"id": 9, "name": "Answer with content + context surfaces, not JUST prose", "status": "in_progress", "commit": "b1c5d138", "progress": "content turns verified in browser; system/network/bitcoin turns still prose-only because only content_list/apps_list are surface-producing"},
|
|
{"id": 10, "name": "AIUI slow background image + console noise", "status": "in_progress", "commit": "b1c5d138", "progress": "web-search CSP spam and its 403 fixed; wavlake/itunes CSP block, 3x403, 2x402, 502, 404, sw.js SSL all still present; slow background image not investigated"}
|
|
],
|
|
"remaining_tasks": [
|
|
{"id": 2, "name": "Verify AI grants persist across refresh through the real UI path", "status": "not_started"},
|
|
{"id": 3, "name": "Add app_install / app_uninstall tools behind the confirm gate", "status": "not_started"},
|
|
{"id": 4, "name": "!archy / !ai over mesh must action commands with text responses", "status": "not_started"},
|
|
{"id": 7, "name": "App lifecycle defects (fedimint guardian, BTCPay wipe-reinstall, disappearing apps, chown postgres-btcpay)", "status": "not_started"},
|
|
{"id": 8, "name": "LND UI + filebrowser 401s (session passthrough on node-owned *-ui apps)", "status": "not_started", "hint": "the 3x403 still in the AIUI console may be this same family"},
|
|
{"id": 11, "name": "Cmd/Ctrl+K carries the query into the expanded chat", "status": "not_started", "hint": "whole path read and appears correctly wired incl. cold-frame buffer; REPRODUCE IN A BROWSER before editing code"},
|
|
{"id": 13, "name": "Serve HTTPS dynamically on EVERY address alongside Tailscale", "status": "not_started"},
|
|
{"id": 14, "name": "Nostr signer + service worker over HTTPS", "status": "not_started"},
|
|
{"id": 17, "name": "Cut a clean ISO for the demo (UNBUNDLED=1)", "status": "blocked", "blocked_by": "release binary predates the install.rs SearXNG seed fix"}
|
|
],
|
|
"blockers": [
|
|
{"description": "core/target/release/archipelago and the deployed /usr/local/bin/archipelago were both built BEFORE the install.rs SearXNG seed fix (c810b514). They carry every surface/peer fix (verified live) but not the SearXNG one.", "type": "technical", "workaround": "cd core && CARGO_INCREMENTAL=0 cargo build --release -p archipelago (~9 min), verify with: strings core/target/release/archipelago | grep -A2 'limiter: false' should show the formats lines, then redeploy. MUST clear before task 17 (ISO)."},
|
|
{"description": "Existing fleet nodes still have SearXNG JSON disabled — c810b514 only fixes what NEW installs get. Every existing node's AIUI web search returns 403.", "type": "external", "workaround": "Add search.formats [html, json] to /var/lib/archipelago/searxng/settings.yml on each node and restart the app. archi-dev-box is already repaired."},
|
|
{"description": "A concurrent agent is committing to the same branch (1eb75a1e, a7368b8b, 9cf1c122 — a full AIUI security/mission assessment with 6 HIGH/MED findings S1-S6). Stage by path only; never git add -A.", "type": "external", "workaround": "Read .planning/phases/13-.../ASSESSMENT-FIX-PLAN-2026-08-07.md before the next wave; its findings partly overlap tasks 8 and 10."}
|
|
],
|
|
"async_jobs": [],
|
|
"human_actions_pending": [
|
|
{"action": "Operator device-close for 13-15 check 2 (film content displayed on the surface)", "context": "The old holdout reason was 'no film content exists on this node'. That premise is now stale: peer content demonstrably reaches the surface and the images bucket renders the node's own catalogue. Re-test before asking again.", "blocking": true},
|
|
{"action": "Decide whether system/network/bitcoin turns deserve context surfaces (task 9 remainder)", "context": "Only content_list and apps_list are surface-producing tools today.", "blocking": false}
|
|
],
|
|
"decisions": [
|
|
{"decision": "Capture surfaces RAW in loop_::execute_tool's Ok(v) arm, BEFORE wrap_tool_result_if_untrusted", "rationale": "The untrusted boundary exists to stop peer-authored text being read as instructions by the MODEL. This copy goes to a renderer that treats every field as inert data and never re-enters the prompt; wrapping it would leave the UI parsing delimiter noise instead of JSON.", "phase": "13"},
|
|
{"decision": "Gate chat surfaces on media/files in the broker as well as node-side", "rationale": "Mirrors handleContentRequest — this channel carries node data into the iframe, so it is a consent surface and is checked in the host rather than trusting the node's grant check to be the only one. Dropping surfaces never drops the prose answer.", "phase": "13"},
|
|
{"decision": "Archy tabs outrank regex-inferred tabs, ordered by bucket size", "rationale": "setArchyContent put the node grids up and updatePanelFromText then replaced the bar, landing on an AI Brief with the real grid unreachable. Size ordering because a 13-photo/2-track answer opened on Songs and titled itself '2 Songs'.", "phase": "13"},
|
|
{"decision": "Skip client-side web search entirely when embedded in Archy", "rationale": "streamViaArchy sends only the user's text, so the system prompt those results were folded into is never transmitted. It cost a round trip and a CSP console error per turn while its output provably reached no model. Web search for the embedded path belongs node-side with the other tools.", "phase": "13"},
|
|
{"decision": "Keep SearXNG rather than replace it", "rationale": "Operator suspected poor results. Measured live after the JSON fix: 28 results for 'bitcoin halving' from Brave (20) + DuckDuckGo (8). Google self-suspends and Startpage CAPTCHAs, normal for self-hosted and cheap given Brave's independent index. The 403 was the whole problem.", "phase": "13"},
|
|
{"decision": "browse-all-peers accumulates per batch with a between-batch deadline, no outer timeout", "rationale": "Every future is already bounded by PER_PEER_TIMEOUT, so an outer timeout can only discard completed work — which is the exact bug being fixed.", "phase": "13"}
|
|
],
|
|
"uncommitted_files": ["neode-ui/shot.tmp.mjs (untracked Playwright driver — deliberately not committed; recreate from the recipe in the resume doc if deleted)"],
|
|
"next_action": "Rebuild the release binary (CARGO_INCREMENTAL=0 cargo build --release -p archipelago) to clear the ISO blocker, and while it builds verify task 6's permission banner in a browser by revoking the media grant and asking for content.",
|
|
"context_notes": "This box IS archi-dev-box, so everything is testable locally. The session's method was: read code, form a hypothesis, then PROVE it against the live node before changing anything — that is what overturned the previous session's 'peers have no content' conclusion (the operator flagged it as wrong, and they were right: two code bugs produced a number that looked like a fleet outage). Authenticated RPC goes through nginx on 443, NOT ports 7777/8101. The Playwright driver at neode-ui/shot.tmp.mjs installs an addInitScript probe that logs every chat:response with its bucket counts — that probe is what proved the surface pipeline end to end, and it is the fastest way to re-verify after any change."
|
|
}
|