Files
archy/.planning/WINDOWS.md
T
archipelagoandClaude Opus 5 5a21b58f69 docs(security): record what actually closed :8334, and what it does not prove
The node is closed and verified 401 with origin-scoped CORS. But an
unrelated bitcoin-ui rebuild at 18:36 cleared the stale conf before the
reconcile fix was deployed at 19:06, so the 401 proves a05956c4's
template and NOT the delivery path f6b5245b adds.

Window 14 closed (exposure gone, verified). Window 15 opened for the
delivery path, which is deployed but never exercised — bitcoin-ui is
still in the uninstall marker, so this node depends on that untested
path the next time its config has to change.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 19:19:29 -04:00

15 KiB

schema_version, open_count, waived_count, fixed_count, total_count, last_updated
schema_version open_count waived_count fixed_count total_count last_updated
1 12 0 3 15 2026-08-02T23:16:04.510Z

Broken Windows Ledger

Cross-phase defect register. /gsd-ship blocks while open_count > 0. Waive with gsd-tools windows waive <id> "<reason>" (reason required). Mark fixed with gsd-tools windows fixed <id>.

id phase kind file line description status reason recorded_at resolved_at
1 02 deviation neode-ui/src/stores/cloud.ts CloudFolder.vue's file listing cache lacks a TTL gate in cloudStore.navigate() — always re-issues the RPC on revisit (paints from cache instantly first, but still refetches unconditionally). Needs a TTL check added to navigate() to fully satisfy 'no new RPC within TTL'. open 2026-07-30T12:25:22.301Z
2 02 deviation neode-ui/src/views/Home.vue Wallet/send flow (SendBitcoinModal.vue via Home.vue) named by 02-FINDINGS.md as owned by 02-03 (worst-ranked revisit, 2607ms) but not in 02-03-PLAN.md's files_modified — reported as an unplanned-item gap, not converted. Cause is pure client-side remount cost (0 RPC), not a caching problem. open 2026-07-30T12:25:22.450Z
3 02 deviation neode-ui/src/views/PeerFiles.vue 02-03-PLAN.md assumed PeerFiles.vue already used useCachedResource; it actually uses the raw resources store directly (correctly per-item-keyed) with no TTL gate and the same loading/refreshing conflation bug fixed in OpenWrtGateway.vue this plan. Left untouched (out of files_modified scope) — candidate for the same fix in a future plan. open 2026-07-30T12:25:22.605Z
4 02 deviation neode-ui/src/views/Chat.vue AIUI-side D-14 commit (900c0b9, branch feat/d14-embed-defaults in local clone /home/archipelago/Projects/AIUI, based on development) is NOT pushed upstream to git.tx1138.com/lfg2025/AIUI — anonymous push returned 403 Forbidden. neode-ui's two new query params (chatExpanded, mobileChat) are inert no-ops against any currently-deployed AIUI build until a maintainer with push rights merges and it is rebuilt/redeployed. 02-08 (deploy) or the user must resolve push access. fixed 2026-07-30T22:37:25.565Z 2026-07-30T22:37:44.642Z
5 09 unrun-verify botfight/e2e/signup-bot.spec.ts pnpm test:e2e -- e2e/signup-bot.spec.ts not run: local backend dev port 9100 is occupied by the live archi-dev-box botfights container (podman, 42h uptime) needed for tomorrow's demo — could not free it to run a local dev server. Task-level automated verify (vue-tsc + grep sweep) passed; vitest server suite passed with only pre-existing unrelated flaky failures. open 2026-07-31T02:35:00.391Z
6 02 deviation neode-ui/src/views/Discover.vue Discover revisit-ms regression (1083->1257->1453ms across 3 runs), confirmed phase-2-caused split-signal client-side render cost, not fixed (deploy blocked this session) open 2026-07-31T10:56:26.089Z
7 02 deviation neode-ui/src/views/Server.vue Server revisit-ms regression (738->849->1239ms across 3 runs) despite confirmed instance survival and improved RPC count; confirmed phase-2-caused split-signal cost, not fixed (deploy blocked this session) open 2026-07-31T10:56:26.305Z
8 02 deviation neode-ui/src/views/web5/Web5.vue Web5 revisit-ms regression (566->709->1329ms, zero overlap across 3 runs) despite confirmed instance survival; confirmed phase-2-caused split-signal cost, not fixed (deploy blocked this session) open 2026-07-31T10:56:26.570Z
9 02 deviation neode-ui/src/views/AppDetails.vue AppDetails revisit-ms regression (1204->1510->2668ms across 3 runs); confirmed phase-2-caused split-signal cost, not fixed (deploy blocked this session) open 2026-07-31T10:56:26.751Z
10 02 deviation neode-ui/src/views/server/OpenWrtGateway.vue OpenWrtGateway revisit-ms regression (663.5->1148->1460ms across 3 runs); confirmed phase-2-caused split-signal cost, not fixed (deploy blocked this session) open 2026-07-31T10:56:26.933Z
11 10 unrun-verify docs/security/KEY-02-FLEET-ROTATION.md C-3 FAILED: archipelago-1, archy-x250-beta and archipelago share all three SSH host keys; the first two also share their TLS private key. Not rotated — needs an operator-driven --apply --yes per node. open 2026-08-02T19:07:39.861Z
12 10 unrun-verify scripts/security/host-secrets-audit.sh Rotation never exercised on real hardware: that 'systemctl reload ssh' keeps the operator's own forked session alive is proven only by design, not by observation. Needs --apply --yes on one disposable node from a session the operator is willing to lose. open 2026-08-02T19:07:40.217Z
13 10 unrun-verify core/archipelago/src/api/rpc/system/handlers.rs system.stats host_secrets never observed on a real node — proven against the file contract in unit tests only. Needs a build carrying 10-04 deployed to the dev pair, then a system.stats call. fixed 2026-08-02T19:07:40.522Z 2026-08-02T23:00:30.894Z
14 10 unrun-verify core/archipelago/src/container/prod_orchestrator.rs LIVE EXPOSURE on archi-dev-box: archy-bitcoin-ui (systemd/Quadlet-owned, user-uninstalled marker set) still serves unauthenticated POST /bitcoin-rpc/ on 0.0.0.0:8334 with Access-Control-Allow-Origin *, reaching Bitcoin Core RPC through a credential-injecting proxy. Verified live 2026-08-02 (returned a real block height with no cookies). Code fix committed f6b5245b but NOT deployed: closing it needs the new binary on the node plus an archy-bitcoin-ui restart. archy-electrs-ui is in the same uninstalled-but-running state (static UI only, no credential proxy). Operator-gated; no node touched. fixed 2026-08-02T22:44:15.215Z 2026-08-02T23:16:04.071Z
15 10 unrun-verify core/archipelago/src/container/prod_orchestrator.rs The f6b5245b reconcile fix is DEPLOYED on archi-dev-box (binary installed 19:06, running) but NEVER EXERCISED on hardware: the state it repairs (uninstall marker + Quadlet-running + stale config) stopped existing here at 18:36, when a separate rebuild of bitcoin-ui rendered the fixed conf and restarted the container. So :8334 returning 401 proves a05956c4's template, NOT the reconcile path that is supposed to deliver it. archy-electrs-ui still carries the marker+running shape and could exercise it, but has no rendered config to rewrite. Needs a node that still has a stale bitcoin-ui conf, or a deliberately re-staled one. open 2026-08-02T23:16:04.510Z
[
  {
    "id": 1,
    "kind": "deviation",
    "phase": "02",
    "file": "neode-ui/src/stores/cloud.ts",
    "line": null,
    "description": "CloudFolder.vue's file listing cache lacks a TTL gate in cloudStore.navigate() — always re-issues the RPC on revisit (paints from cache instantly first, but still refetches unconditionally). Needs a TTL check added to navigate() to fully satisfy 'no new RPC within TTL'.",
    "status": "open",
    "reason": "",
    "recorded_at": "2026-07-30T12:25:22.301Z",
    "resolved_at": null
  },
  {
    "id": 2,
    "kind": "deviation",
    "phase": "02",
    "file": "neode-ui/src/views/Home.vue",
    "line": null,
    "description": "Wallet/send flow (SendBitcoinModal.vue via Home.vue) named by 02-FINDINGS.md as owned by 02-03 (worst-ranked revisit, 2607ms) but not in 02-03-PLAN.md's files_modified — reported as an unplanned-item gap, not converted. Cause is pure client-side remount cost (0 RPC), not a caching problem.",
    "status": "open",
    "reason": "",
    "recorded_at": "2026-07-30T12:25:22.450Z",
    "resolved_at": null
  },
  {
    "id": 3,
    "kind": "deviation",
    "phase": "02",
    "file": "neode-ui/src/views/PeerFiles.vue",
    "line": null,
    "description": "02-03-PLAN.md assumed PeerFiles.vue already used useCachedResource; it actually uses the raw resources store directly (correctly per-item-keyed) with no TTL gate and the same loading/refreshing conflation bug fixed in OpenWrtGateway.vue this plan. Left untouched (out of files_modified scope) — candidate for the same fix in a future plan.",
    "status": "open",
    "reason": "",
    "recorded_at": "2026-07-30T12:25:22.605Z",
    "resolved_at": null
  },
  {
    "id": 4,
    "kind": "deviation",
    "phase": "02",
    "file": "neode-ui/src/views/Chat.vue",
    "line": null,
    "description": "AIUI-side D-14 commit (900c0b9, branch feat/d14-embed-defaults in local clone /home/archipelago/Projects/AIUI, based on development) is NOT pushed upstream to git.tx1138.com/lfg2025/AIUI — anonymous push returned 403 Forbidden. neode-ui's two new query params (chatExpanded, mobileChat) are inert no-ops against any currently-deployed AIUI build until a maintainer with push rights merges and it is rebuilt/redeployed. 02-08 (deploy) or the user must resolve push access.",
    "status": "fixed",
    "reason": "",
    "recorded_at": "2026-07-30T22:37:25.565Z",
    "resolved_at": "2026-07-30T22:37:44.642Z"
  },
  {
    "id": 5,
    "kind": "unrun-verify",
    "phase": "09",
    "file": "botfight/e2e/signup-bot.spec.ts",
    "line": null,
    "description": "pnpm test:e2e -- e2e/signup-bot.spec.ts not run: local backend dev port 9100 is occupied by the live archi-dev-box botfights container (podman, 42h uptime) needed for tomorrow's demo — could not free it to run a local dev server. Task-level automated verify (vue-tsc + grep sweep) passed; vitest server suite passed with only pre-existing unrelated flaky failures.",
    "status": "open",
    "reason": "",
    "recorded_at": "2026-07-31T02:35:00.391Z",
    "resolved_at": null
  },
  {
    "id": 6,
    "kind": "deviation",
    "phase": "02",
    "file": "neode-ui/src/views/Discover.vue",
    "line": null,
    "description": "Discover revisit-ms regression (1083->1257->1453ms across 3 runs), confirmed phase-2-caused split-signal client-side render cost, not fixed (deploy blocked this session)",
    "status": "open",
    "reason": "",
    "recorded_at": "2026-07-31T10:56:26.089Z",
    "resolved_at": null
  },
  {
    "id": 7,
    "kind": "deviation",
    "phase": "02",
    "file": "neode-ui/src/views/Server.vue",
    "line": null,
    "description": "Server revisit-ms regression (738->849->1239ms across 3 runs) despite confirmed instance survival and improved RPC count; confirmed phase-2-caused split-signal cost, not fixed (deploy blocked this session)",
    "status": "open",
    "reason": "",
    "recorded_at": "2026-07-31T10:56:26.305Z",
    "resolved_at": null
  },
  {
    "id": 8,
    "kind": "deviation",
    "phase": "02",
    "file": "neode-ui/src/views/web5/Web5.vue",
    "line": null,
    "description": "Web5 revisit-ms regression (566->709->1329ms, zero overlap across 3 runs) despite confirmed instance survival; confirmed phase-2-caused split-signal cost, not fixed (deploy blocked this session)",
    "status": "open",
    "reason": "",
    "recorded_at": "2026-07-31T10:56:26.570Z",
    "resolved_at": null
  },
  {
    "id": 9,
    "kind": "deviation",
    "phase": "02",
    "file": "neode-ui/src/views/AppDetails.vue",
    "line": null,
    "description": "AppDetails revisit-ms regression (1204->1510->2668ms across 3 runs); confirmed phase-2-caused split-signal cost, not fixed (deploy blocked this session)",
    "status": "open",
    "reason": "",
    "recorded_at": "2026-07-31T10:56:26.751Z",
    "resolved_at": null
  },
  {
    "id": 10,
    "kind": "deviation",
    "phase": "02",
    "file": "neode-ui/src/views/server/OpenWrtGateway.vue",
    "line": null,
    "description": "OpenWrtGateway revisit-ms regression (663.5->1148->1460ms across 3 runs); confirmed phase-2-caused split-signal cost, not fixed (deploy blocked this session)",
    "status": "open",
    "reason": "",
    "recorded_at": "2026-07-31T10:56:26.933Z",
    "resolved_at": null
  },
  {
    "id": 11,
    "kind": "unrun-verify",
    "phase": "10",
    "file": "docs/security/KEY-02-FLEET-ROTATION.md",
    "line": null,
    "description": "C-3 FAILED: archipelago-1, archy-x250-beta and archipelago share all three SSH host keys; the first two also share their TLS private key. Not rotated — needs an operator-driven --apply --yes per node.",
    "status": "open",
    "reason": "",
    "recorded_at": "2026-08-02T19:07:39.861Z",
    "resolved_at": null
  },
  {
    "id": 12,
    "kind": "unrun-verify",
    "phase": "10",
    "file": "scripts/security/host-secrets-audit.sh",
    "line": null,
    "description": "Rotation never exercised on real hardware: that 'systemctl reload ssh' keeps the operator's own forked session alive is proven only by design, not by observation. Needs --apply --yes on one disposable node from a session the operator is willing to lose.",
    "status": "open",
    "reason": "",
    "recorded_at": "2026-08-02T19:07:40.217Z",
    "resolved_at": null
  },
  {
    "id": 13,
    "kind": "unrun-verify",
    "phase": "10",
    "file": "core/archipelago/src/api/rpc/system/handlers.rs",
    "line": null,
    "description": "system.stats host_secrets never observed on a real node — proven against the file contract in unit tests only. Needs a build carrying 10-04 deployed to the dev pair, then a system.stats call.",
    "status": "fixed",
    "reason": "",
    "recorded_at": "2026-08-02T19:07:40.522Z",
    "resolved_at": "2026-08-02T23:00:30.894Z"
  },
  {
    "id": 14,
    "kind": "unrun-verify",
    "phase": "10",
    "file": "core/archipelago/src/container/prod_orchestrator.rs",
    "line": null,
    "description": "LIVE EXPOSURE on archi-dev-box: archy-bitcoin-ui (systemd/Quadlet-owned, user-uninstalled marker set) still serves unauthenticated POST /bitcoin-rpc/ on 0.0.0.0:8334 with Access-Control-Allow-Origin *, reaching Bitcoin Core RPC through a credential-injecting proxy. Verified live 2026-08-02 (returned a real block height with no cookies). Code fix committed f6b5245b but NOT deployed: closing it needs the new binary on the node plus an archy-bitcoin-ui restart. archy-electrs-ui is in the same uninstalled-but-running state (static UI only, no credential proxy). Operator-gated; no node touched.",
    "status": "fixed",
    "reason": "",
    "recorded_at": "2026-08-02T22:44:15.215Z",
    "resolved_at": "2026-08-02T23:16:04.071Z"
  },
  {
    "id": 15,
    "kind": "unrun-verify",
    "phase": "10",
    "file": "core/archipelago/src/container/prod_orchestrator.rs",
    "line": null,
    "description": "The f6b5245b reconcile fix is DEPLOYED on archi-dev-box (binary installed 19:06, running) but NEVER EXERCISED on hardware: the state it repairs (uninstall marker + Quadlet-running + stale config) stopped existing here at 18:36, when a separate rebuild of bitcoin-ui rendered the fixed conf and restarted the container. So :8334 returning 401 proves a05956c4's template, NOT the reconcile path that is supposed to deliver it. archy-electrs-ui still carries the marker+running shape and could exercise it, but has no rendered config to rewrite. Needs a node that still has a stale bitcoin-ui conf, or a deliberately re-staled one.",
    "status": "open",
    "reason": "",
    "recorded_at": "2026-08-02T23:16:04.510Z",
    "resolved_at": null
  }
]