J382: forget retired-unreachable hosts (D369) #435
Open
opened 2026-11-08 18:44:30 +00:00 by kayg
·
37 comments
No Branch/Tag specified
main
j444b-d381-key-wins-flood
j470b-server-mesh-rejoin
mesh-compat-382
j461b-macos-utun-reader-thread
j475b-remove-host-motion
fix-reconnect-new-link
j481-d380
dev
j479-mesh-soak
fix/j476-host-facts
j475-motion-pill-split
j470-mac-node-join
root-upgrade-d376
j474-review-merge
latency-targets-120hz
nightly-suite-shards
gotatun-pin-j469
macos-utun-reader-thread
fix-flood-echo-stall
wip/j416
motion-fast-ease-out
mesh-addhost-j259
takeover-close-terminals-d368
kbd-instant-followups
fix-trust-key-double-click
nightly-suite-partial-report
appwin-icons-j207
rusqlite-slice1
swipe-content-first-d374
mesh-mtu-381
addhost-instant-open
glass-contrast-d365-mock
glass-contrast-d365
signout-followups-442
fix-startup-toast-red
research-gotatun-matrix-j317
themes-sync-j304
fix-load-flakes
fix-nix-zig-patch
fix-compute01-browser-baseline
ratchet-size-baseline-419
predict-auto-d130
revoke-coverage-d367
nightly-suite-queue-timeout
nightly-browser-suite
fix-rustsec-2026-0459
fonts-ioskeley-obel
log-retention-d375
fix-kbd-no-anim-427
fix-dev-red-specs-2
takeover-proof-305-j205
wip/j410-server-pump
ui-consistency-d372
fix-osc52-clipboard
libghostty-vt-1.0
forget-retired-host-d369
j404-merge-426
fix-setup-lock-race
fix-touch-select-426
revoke-access-report-ui
fix-predictive-echo-specs
fix-selinux-agent-exec
wip/j395-checkpoint2
wip/j395
j391-review-scratch
ui-consistency-j195-deferred-rebased
fix-rustc-paths-421
decisions-wording-341
fix-install-suite-red
fix-dev-rtt-specs
fix-pending-removal-align
fix-privileged-skip
fix-install-suite-404
review-j368
mesh-dns-j254
revoke-access-report-d356b
revoke-privilege-round5
fix-removal-confirm
review-j360
gotatun-rotation-367
deps-refresh-340
review-j354
review-J351
review-j350
addhost-takeover-d359
revoke-report-items-347
revoke-end-sessions-d362
review-j348
size-mesh-ssh-346
size-trim-337
revoke-access-diff-d356
j259-pre-rebase-b06c5a6
j305-ended-at-start-spec
addhost-sudo-consent
fix-layout-real-specs-411
fix-shell-open-411
fix-console-hosts-373
fix-shell-exit
fuzz-host-name-353
fix-host-details-410
macos-filter-j197
research-gotatun-tricks
revoke-p3-j216l
stale-state-pill
revoke-followups-j216k
revoke-progress-j216e
backup/macos01-20261106/lume/j197
backup/macos01-20261106/lume/appwin-icons-j207-stash0
backup/macos01-20261106/claude/stash-0
backup/macos01-20261106/claude/stash-1
backup/macos01-20261106/claude/J80-macos-s1
backup/macos01-20261106/claude/J80
backup/macos01-20261106/claude/J80-slice1-20261102
backup/macos01-20261106/claude/J16b-appwin-on-dev
backup/macos01-20261106/claude/appwin-launch-idle-146
backup/macos01-20261106/claude/J80-s1-run
wip/j259
trust-285-p3c
runtime-lock-j216f
mesh-ssh-p3-j175
tun-proof-p3b
trust-285-p3
terminal-polish-j271
tun-proof-p3
ssh-install-flakes-j216i
fuzz-fixes-j264
trust-285-a
trust-285-b
restart-oversized-fixture-j198
backup/macos01-20261106/lume/appwin-icons-j207
restart-bound-j216h
up-preflight-p3-j198
backup/macos01-20261106/lume/j251
up-preflight-j198
wip/up-preflight-j198-j245-p2
wip/up-preflight-j198-j245-p1
agent-fsync-offloop-j196
wip/up-preflight-j198-j245
settings-offscreen-j231
wip/up-preflight-j198-j226-inspection
wip/j103f
themes-j206
wip/up-preflight-j198-j226
flakes-j216c
backup/macos01-20261106/claude/j197
flakes-j216b
backup/macos01-20261106/claude/j197-red
wip/up-preflight-j198-review
flakes-j216
backup/macos01-20261106/claude/appwin-icons-j207
engineering-j208b
appwin-mock-j209
toast-stack-j165
engineering-j208
decisions-d351
decisions-d350
decisions-d349
appearance-presets-mock-j129
decisions-d348
docs-audit-spec
doc-coverage-baseline-raise
decisions-d347
decisions-d346b
decisions-d346
j88h-profile
ui-consistency-j195-deferred
ui-consistency-j195
engineering-practices-j194
preferred-login-ui-j166
signin-pools-263-j174
macos-node-265-s1
decisions-d345
decisions-d344
proxy-cgroup-j164
verify-quick-fuzz-329
proxy-start-io-j168
timing-flakes-j163
up-263-s1
mcp-events-j147
verify-quick-fuzz-j158
proxy-p3-j159
agent-resource-j157-detect
wip/j103d-final
remote-cancel-hang-j155
proxy-traefik-281-j62d
j149-verify-quick
proxy-traefik-281-j62b
j150-drop-unnamed
wip/j79d-red-r4
wip/j103d-d332
rootless-toast-j142
wip/j103d-head
wip/j103d
j125c-mcp
macos-build-j136
backup/macos01-20261106/claude/j136
wip/j79d-red-cli
wip/j79d-red-server
j121-link-liveness
j118c-tracer-failures
wip/j79c-head
release-desktop-j131
j124c-signed-macos
wip/j79c-red-p3
wip/j79c-red-p23
wip/j79c-red-p22
merge-j128-check
perf-deferred-j128
sidebar-toggle-260
j127-shortcut-changed-dot
j125-mcp
j118-tracer-failures
j126-account-summary
settings-sections-mock-j92
j120-pinch-lock
sidebar-292
backup/macos01-20261106/claude/j120
taste-2026-11-03
row-actions-242-215
backup/macos01-20261106/claude/stash-0-untracked
backup/macos01-20261106/claude/J80-265-s1-run
backup/macos01-20261106/claude/J80-macos-s1-20261102
j112-canvas-commands
ui-no-overshoot-scroll
fix-recovery-restart
backup/macos01-20261106/claude/stash-1-untracked
taste-2026-11-02
size-baseline-ratchet
machine-cards-structure-j108
j109-boot-copy-mockups
fix-dev-red
wip/up-263-s1
j95b-settings-rows
proxy-traefik-281
j95-option-rows
docs-human-j91
docs-keys-palette
fix-flood-1013-270-j38d
mesh-ssh-s1
mesh-ssh-s0
addhost-d291-tunnel
test-stability-load
mesh-relay-220
repro-296
shim-thp-off-24
mesh-pins-258-v2
mesh-dns
signin-d311-merged
docs-pages
ui-size-283
fix-ui-batch-specs
wip/j12b-edge-update
gate-on-arm
fix-rename-sync-293
trust-285-j60b
fix-focus-ring-clip
integ-ui-1101
edge-update-v2
signin-d311
taste-2026-11-01
layout-per-tab-250
ui-approved-splitopt-224
ui-approved-splitopt-224-on-dev
icon-text-centre-282
ui-approved-189-212-216
research-reverse-proxy
transfer-budget-320
review-mesh-pins-258-r2
sidebar-pill-259
review-mesh-relay-220
wip/j12-edge-update-v2
nix-package
status-crash-loop-237
fix-dev-test-failures
fix-fixture-socket-path
wip/mesh-relay-220-pre-dev-advance-rebase
fix-canvas-side-clip
research-head-to-head
frosted-real-256
review-mesh-pins-258
wip/mesh-relay-220-pre-final-rebase
review-layout-per-tab-250-r2
broad-suite-triage
nix-devshell
review-status-crash-loop-237-r3
wip/nix-devshell-pre-p3
taste-frosted-real
wip/code-serve-demo-2026-10-30
wip/code-serve-glass-2026-10-30
wip/code-serve-clusters-2026-10-30
wip/code-merge-release94-dev-2026-10-30
wip/rproxy-delta-scratch-2026-10-30
wip/stale-note-257-staged-2026-10-30
wip/d241-size-staged-2026-10-30
review-broad-suite-207
wip/mesh-pins-258-pre-split
wip/mesh-relay-220-pre-rebase
mesh-measure-220
plan-211-update
review-edge-autoupdate-r3
perf24-reconnect
review-stale-note-r2
release-prod-live
d241-shell-marker
review-mesh-pins-server-258
review-revocation-r3
review-setup-token-r2
review-sync-journal-r3
wip/review-mesh-pins-258-prune-review-1995fee46
frosted-scroll-256
sync-journal-r3
revocation-per-account-wip
review-tokio-asyncfd-0386
review-sync-p3s
wip/stash-8by64-stash0-2026-10-30
mesh-drag-r2
setup-token-data-wip
release-9-4
auth-busy-1013
mesh-view-overlap
sync-p3s
review-auth-busy-wake
review-readd-r8-wip
mesh-drag-bounds
audit-auth-93
app-windows-stream-start
review-authority-cap-r3
app-windows-r7-measure
readd-minimal-r6
readd-minimal-r5
app-windows-r7-soak
readd-minimal-r4
app-windows-r7
app-windows-r6
readd-minimal-r3
readd-minimal-r2
readd-minimal
merge-release8-dev
review-busy-page-liveness-r2
review-busy-page-liveness
mesh-view-trim
review-authority-read-retry-r2
review-remove-uninstall-r2
release-retry-reattach
release-retry
review-remove-uninstall
review-authority-read-retry
app-windows-ship
mesh-autoswitch-p2
mesh-ssh
mesh-relay
mesh-macos-node
screen-and-control
session-labels
review-real-logins-r5
review-real-logins-r4
review-real-logins-r3
shim-memory-r2
review-real-logins-r2
shim-memory
shadow-addhost-instant
shadow-real-logins
shadow-same-session-flood
shadow-prod-perf-fix
hosts-from-server
app-windows-real
app-windows-transport
release-prod-6w
mesh-policy-verify
quiet-close-toast
dev-merge-r4
review-mesh-agent-transport
review-app-windows-transport
settings-roundtrip
review-release-pipeline-r4
mesh-agent-transport
ended-strip-fix
review-audit-ca-update-d244
settings-rows
phone-width
signout-clear
fix-restart-tests
dev-merge-rp
signer-hardening
review-audit-ca-update
terminal-fidelity
review-audit-ca-update-wip
mesh-integrate
review-mesh-agent-transport-515d3712
review-mesh-dataplane-feec1988
mesh-dataplane
signout
research-canvas-node
wip/review-renderer-cost
wip/review-terminal-fidelity
padlock-glyph
review-release-pipeline-2e95b689
phone-polish
sidebar-polish
inbox-generic
review-mesh-dataplane-378d4055
prod-batch
ui-inbox
ui-ca-unlock
ui-machine-sections
review-mesh-dataplane-a5f744fb
tls-session-prod
session-bounds-prod
fix-dead-session
session-bounds
tls-session
palette-polish
shortcuts-d222
research-appmeta
phone-gutter
ui-centre-button
wip/ui-centre-button
wip/tls-session
review-addhost-breakit
ui-platform
renderer-cost
remote-agents
mesh-api
ssh-bootstrap
prod-hotfix2
prod-fixes
review-remote-agents
review-mesh-dataplane
session-life
research-browser
review-mesh-api
research-capture
review-mesh-api-round3
review-mesh-api-round1
gate-stability
review-gate-stability
review-relay-direct
review-mesh-api-findings
proto-sessions
font-picker
proto-addhost
proto-windows
mesh-core
latency-gate
research-bsd
research-discovery
keytray-mods
mock-core
ui-tweaks
fix-motion-sel
fix-motion
integrate2
fix-robust
t-web
t-server
vt-ghostty
fix-snap-echo
t-web-auth
review-vt2
t-agent
lane-protocol
lane-shim
lane-auth
s1-base
s1-contracts
s1-workspace
No results found.
No labels
launch-qa
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/infraternal#435
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implements D369, referencing #347. Branch: forget-retired-host-d369. Base:
a894dd8773.Plan (estimate 3 hours): add red server state/auth/audit tests and production browser coverage; implement owner-only Forget using existing removal records, hosts:write API and CLI/MCP adapters; run focused tests, browser screenshots on dev-02, quick and compute01 fast gates. No production writes, merges or deployment. Pending questions go here for the orchestrator.
Started J382 on forget-retired-host-d369, base
a894dd8773. Finding: remote_inventory.rs derives retired-unreachable from an unconfirmed remote_login_cleanup row and no currently unrevoked valid certificate. remote_hosts is the security denial ledger, referenced by certificates and sessions, so Forget will retain a revoked host tombstone, remove removal/outbox/bootstrap rows, and preserve the removal details in an append-only mesh_audit event. This avoids deleting certificate denial history or needing a migration. Existing remote.host.remove is exposed via shared actions, hosted CLI and MCP; Forget needs matching adapters with hosts:write and a required API dry run.Red tests are written in auth/remote_removal_tests.rs and test/forget-retired-host.spec.ts, plus shared-action scope and CLI syntax regressions. Browser plugin is not available; using the repository's Playwright production-build workflow on dev-02 as requested. Flow: pending inventory row -> expired cleanup certificate -> Forget confirmation -> Keep or Forget -> row disappears. dev-02 red run is queued (one slot); compute01 red queue was stopped by its recorded PID so this job cannot hold two slots concurrently. Evidence roots: ~/j382-evidence on each VM. Target stays at ~/worktrees/j382/target (J155 satisfied without an external target).
Progress: the focused palette ownership/state test failed as intended: expected canvas:forgethost:, received undefined (dev-02 ~/j382-evidence/red-unit.log). UI wiring now extends the existing row and shared confirmation, with no new styling. Production browser red remains first in dev-02's slot queue. Local branch fast-forwarded to origin/dev
9965911c8a, which includes the #432 install-suite fix; final gates will use this or a newer dev base. Backend implementation remains unchanged pending its red route tests.Production browser red confirmed in all 4 requested viewport/theme combinations: expected Forget, received the retired-unreachable status row with data-action empty. Evidence: dev-02 ~/j382-evidence/red-browser.log and red-browser/playwright/*/error-context.md. The subsequent green browser run was stopped by PID before a slot was granted, to prioritize the server red run and avoid holding two slots. Added real-router API coverage for hosts:read rejection, required dry-run review, replay refusal and completed audit. Orchestrator: once the branch is ready, the common brief requires real test-server proof; please arrange a test-server deployment for that proof if desired. This job will not swap binaries or deploy. Production remains untouched.
Server red proof: 0 passed, 4 failed as expected on the missing Forget routes/catalogue (compute01 ~/.cache/codex-scratch/j382/evidence/red-server.log). Implemented a writer-locked Forget transaction with owner and state rechecks, full removal-detail archival in mesh_audit, permanent revoked host/certificate history, deletion of removal/login-cleanup/bootstrap/retirement-intent rows, and atomic API audit completion. Browser authority uses the existing 15-minute admin window; API authority uses hosts:write plus the existing single-use review. No machine command is sent. The existing bounded removal admission also keeps commit/publication alive across HTTP cancellation. Green server plus CLI red run is queued. Evidence is now under the repository-required ~/.cache/codex-scratch/j382/evidence on both VMs; ~/j382-evidence is a compatibility symlink.
Finding during implementation review: remote_inventory.rs computes retired-unreachable from an unconfirmed remote_login_cleanup row and certificate expiry, without requiring remote_host_removals. The current Forget query's inner join to remote_host_removals would therefore reject an inventory row that the new UI offers Forget on (for example an abandoned setup's cleanup). Added forget_retired_host_without_removal_record_matches_inventory to the pending focused run before changing that query. Eligibility should follow the task's exact retired-unreachable state rule, archive the old removal when present, and preserve all earlier audit records in either case. This keeps the existing palette row actionable rather than introducing a second eligibility model.
J382 progress: frontend unit red/green and all four production-browser red cases are recorded. Backend implementation is present; the focused server/CLI run is queued on compute01 (PID 33925), currently behind four earlier requests. Both VM slot statuses checked; dev-02 also has a longer queue. No gate has run yet. Local uncommitted source is backed up at ~/.cache/codex-scratch/j382/work-in-progress.patch and the browser spec beside it. VM worktrees are ~/worktrees/j382, one target each. Next: observe focused results, finish CLI/MCP, production-browser green/screenshots, quick and compute01 fast. No push, merge or deployment performed.
Updated all three J382 checkouts by fast-forward to origin/dev
8e664e6b7(only the #341 DECISIONS wording update beyond the prior9965911c8base). The focused run is now first in compute01's queue; dev-02 remains busy with a longer queue. T3 shared browser fallback checked: preview_status reports unavailable, and preview_open reports missing browser libraries. Production browser specs will continue with repository Playwright on dev-02 only.Focused result (compute01 ~/.cache/codex-scratch/j382/evidence/green-server-red-cli.log): CLI red is 0 passed / 1 failed, exit 101, InvalidSubcommand("forget"), as expected. Server result is 4 passed / 1 failed, exit 101: only forget_retired_host_without_removal_record_matches_inventory fails, 403 vs expected 200. Owner/state/admin-window, audit/denial retention, and real API scope/review/audit tests pass. Now fixing eligibility to match inventory exactly (optional removal snapshot, required unconfirmed cleanup and no valid certificate) and adding hosts forget to the existing hosted registry/review helper.
J382 checkpoint: the expected server regression and missing CLI command are now implemented. Cheap D345 preflight passes:
diff docs: ok (merge base 8e664e6b7ada)(compute01 ~/.cache/codex-scratch/j382/evidence/docs-preflight.log). Quick plus focused green is queued as PID 929726, log ~/.cache/codex-scratch/j382/evidence/quick-focused-green.log; it has not acquired a slot yet. Build capacity is currently blocking green/gate/browser evidence. The earlier focused run demonstrated 4 server tests pass and only the newly added inventory-state regression fails, and the CLI command red fails for InvalidSubcommand. Both checkouts remain available for the orchestrator; no commit, push, merge or deployment has occurred. Local source backup refreshed at ~/.cache/codex-scratch/j382/work-in-progress.patch. I am continuing to wait in the foreground.Focused green confirmed on compute01 (quick-focused-green.log): all five Forget server tests pass (FOCUSED_SERVER_EXIT=0), including the no-removal-record regression, owner/state/admin-window checks with a 14-minute-old approval, audit/denial retention, and the real API router scope/review/audit test. CLI green: 1 passed, 0 failed (FOCUSED_CLI_EXIT=0). Quick stopped only on four new test literals missing numeric separators (604800 → 604_800); corrected and synced, and quick is being rerun. These were owned lint failures, not an unrelated baseline red. No browser green or fast result yet.
J382 raw evidence attachments. The focused server and CLI tests are green; the initial quick run failed on four test numeric literals, corrected for the queued rerun. Production browser green and fast are still outstanding.
red-server.log
green-server-red-cli.log
quick-focused-green.log
red-unit.log
green-unit.log
red-browser.log
J382 checkpoint: quick rerun PID 1446547 is first in compute01's queue after ~32 minutes; no new result yet (quick-green.log). Focused green receipts and all initial red logs are attached in comment 87625. Server tests: 5 passed; CLI: 1 passed. The test literals reported by quick are corrected. Browser spec now includes TASTE's 375x667 ink/paper checks in addition to 1440x900 and 393x852, with horizontal and vertical containment checks; no browser green has run yet. Local source backups are ~/.cache/codex-scratch/j382/work-in-progress.patch and forget-retired-host.spec.ts; both VM worktrees have current source. No commit/push/merge/deploy. Still waiting in the foreground; fast and production browser screenshots remain outstanding.
Quick passed all rows (QUICK_EXIT=0), including workspace clippy, changed package units, bin-only units (218 passed, 15 ignored), UI literal checks and tracer typecheck. Artifact: compute01 ~/.cache/codex-scratch/j382/evidence/quick-green.log. Fast-forwarded all checkouts to origin/dev
0a5432d2c, which includes the #421 fix and #430 frontend corrections, without overlap with this slice. Committed the logical D369 slice asbf0bb8d5a2on forget-retired-host-d369. Both VM checkouts are clean at that exact commit, transferred via bundle; nothing pushed. The final fast run is queued on compute01, log fast.log; browser green follows on dev-02 only. The browser queue is still long (roughly ten older requests), so final gates are being qualified first while the Rust target is warm. The test-server deployment/proof request remains outstanding; no deployment performed by this job.Quick pre-check passed on the feature source before the upstream-only fast-forward to
0a5432d2cand commitbf0bb8d5a2. This is the pre-check, not the final gate. Summary verbatim; raw receipt attached.quick-green.log
J382 checkpoint: final fast is actively running on compute01 at
bf0bb8d5a2(PID 2227726, ~/.cache/codex-scratch/j382/evidence/fast.log). It has reached full workspace integration tests after compile-out, clippy, helper and manifest checks; no failure marker has appeared so far. This is not a final gate result. Quick's full passing summary and raw log are attached in comment 87702. The initial three-hour estimate has been exceeded largely by shared build queues; scope is unchanged. Browser green/screenshots remain to run on dev-02 after this slot is released. Branch is committed and available in the control worktree and as the same clean head on both VMs; no push, merge or deployment.J382 qualification checkpoint: fast remains active in static builds on compute01 (PID 2227726), after workspace tests and privileged integration passed. x86 artifact: 28,213,456 bytes, +5,795,200 versus the gate's recorded baseline (not a feature-only delta). Preserved at compute01 ~/.cache/codex-scratch/j382/artifacts/infraternal-x86_64-linux-musl, SHA256 bec423509be1bbce1650a4eaa2cbc3559e03534a92748b0b1cb3b4ac6f1e3204. Arm artifact/final table pending. Browser green is prepared for dev-02 after this slot is released, covering six viewport/theme combinations and existing pending-removal regression. No second slot held.
Orchestrator handoff request remains: deploy this exact head
bf0bb8d5a2to the test server when qualified, then arrange real-server D369 proof and independent screenshot review. This job does not deploy; production remains untouched. Branch is committed locally and as an identical clean head on both build VMs, with a recoverable bundle at control ~/.cache/codex-scratch/j382/feature.bundle. No push/merge/deploy.J382 final fast passed on compute01 at
bf0bb8d5a2. Verbatim Rust gate summary:The full receipt includes the subsequent passing compiler, startup cleanup, vendor checksum, tracer transfer-budget and TypeScript protocol checks (50 pass, 0 fail). No unrelated-red exemption used.
Static receipts: x86 28,213,456 bytes, delta +5,795,200; arm 25,340,880 bytes, delta +4,887,600. These deltas compare the gate's recorded baselines, not an isolated feature-vs-dev build. Both have no PT_INTERP. Preserved artifacts on compute01 under ~/.cache/codex-scratch/j382/artifacts/. SHA256 x86 bec423509be1bbce1650a4eaa2cbc3559e03534a92748b0b1cb3b4ac6f1e3204; arm 2717a9d928fa221bededc752f4b2597e98b248f64d759f33bf9c10a0b3943886.
Browser green is queued on dev-02, launcher PID 622822, log ~/.cache/codex-scratch/j382/evidence/browser-green.log. No other own queued/running work. Real-test-server proof and independent visual review remain outstanding. No push/merge/deploy.
fast.log
Queue finding for orchestrator: dev-02 browser launcher PID 622822 remains queued. Read-only
build-slot --statusreports slot 1 held by PID 421828 (INFRATERNAL_FUZZ_SLOT_READYstdin holder, elapsed 2h29m), slots 2 and 3 free, yet the oldest live queued request PID 471771 is ~1h50m old and no request advances. Free disk 96G versus 40G floor. I have not changed slots, touched another job's processes, or bypassed the launcher. Browser run remains queued behind these requests; please inspect queue/holder health if appropriate. Fast already passed, full receipt attached in comment 87837.J382 implementation handoff, qualification blocked (not fully done).
Branch:
forget-retired-host-d369Head:
bf0bb8d5a296908fe2b8d7b803397c9a41895d24Base:
origin/dev0a5432d2c.D369 implementation is one atomic commit: owner-only retired-unreachable Forget; transaction retains permanent audit and certificate denial history, tombstones inventory and cancels pending removal/cleanup/bootstrap delivery; same 15-minute admin window; shared
hosts:writecatalogue and CLI support; existing palette row and UI confirmation reused. No command is sent to the machine.Confirmation title:
Forget <name>?Effect: “Remove this host from the list and stop its pending cleanup. Keep the audit record. This does not touch the machine itself or uninstall infraternal from it.”
Buttons:
Forget,Keep.Red/green evidence attached in comment 87625: initial server red, inventory missing-removal-row red, CLI red, server green (5 passed), CLI green (1 passed), frontend unit red/green (2 passed), production-browser red (4 expected failures). Final browser spec adds six viewport/theme cases (1440×900, 393×852, 375×667; ink/paper; DPR2) and checks alignment, viewport containment, Keep, Forget and nonowner state.
Quick verbatim (pre-check, feature source before upstream-only fast-forward):
Fast on compute01 at the committed head, verbatim:
Subsequent compiler/startup/checksum/tracer/protocol phases also passed (full raw log in comment 87837; protocol 50 pass, 0 fail). No #421/#432 or other unrelated-red exemption used.
Static artifacts and hashes are recorded in comment 87837 and preserved on compute01 under
~/.cache/codex-scratch/j382/artifacts/. x86 28,213,456 bytes (+5,795,200 recorded-baseline delta), arm 25,340,880 (+4,887,600). These are not isolated feature costs.BLOCKERS: browser green and screenshots were not produced. Dev-02 scheduler did not advance older requests (~2 hours), despite reporting free slots; queue finding in comment 87844. After ~9 minutes with no advance, stopped only own queued launcher PID 622822 before slot acquisition and confirmed its ticket removed. Attached browser log explicitly says
QUEUE_STOPPED_BEFORE_SLOT; it is not a passing browser receipt. The saved rerun script is dev-02/home/claude/j382-browser-green.sh, through build-slot + nix as before. Real-test-server deployment/proof also awaits orchestrator action; request in comment 87828. Independent visual review awaits green screenshots. Please complete those before merge.All checkouts are clean at the same commit. Nothing pushed, merged, deployed or closed; production untouched. Recoverable bundle: control
~/.cache/codex-scratch/j382/feature.bundle. Own target directories and short test-state root are being removed; logs/artifacts remain. No own build/browser/server run remains queued or running after cleanup.browser-green.log
Cleanup confirmed: both VM
~/worktrees/j382/targetdirectories removed, compute01/home/claude/.cache/j382-stateremoved; both VM worktrees and the control worktree clean atbf0bb8d5a2. Browser port 4822 has no listener. Queue launcher/ticket removed before acquisition, and fast exited. Logs and qualified static artifacts preserved outside targets. No own background task remains.J396 (reviewer) started on #435. Reviewing
forget-retired-host-d369@bf0bb8d5a2merged with origin/dev0a5432d2cin a scratch worktree. Plan: read server/API/CLI/UI diff, then J382's browser specs +pending-host-removal.spec.tson a production build (1440x900 and 393x852, ink and paper) andscripts/verify quickon dev-02. No merge, no deploy.J396 interim (static review done, browser proof still queued).
Browser queue blocker (dev-02). My launcher is PID 633636 (log
~/.cache/codex-scratch/j396/browser.log), position 6 with slots 2 and 3 free. Cause, from evidence:~/infraternal-ops/build-slotwas rewritten at 22:34 UTC (new script re-readsslotsevery turn). The three waiters started before that (PIDs 471771 @21:16, 518843 @21:54, 553498 @22:24) still run the old in-memory loop, and the head of the FIFO (471771) is not taking the free slots, so everyone behind it waits. This matches J382's note in 87844. I'm not touching other jobs' PIDs. The orchestrator or maintainer needs to stop those three stale waiters (they will then re-queue on the new script) or I wait for slot 1 (held by the fuzz job, 2h41m old) to free.Static findings so far (head
bf0bb8d5a2, dev0a5432d2calready an ancestor):u.owner=1 AND h.owner_id=?), state recheck inside the writer transaction (forget_recordafter theUPDATE remote_hosts SET revoked_at=revoked_atlock), admin window rechecked in the same transaction (fresh_session_tx),hosts:writekey rechecked in-transaction, review token required for key calls (DryRun::Required, tests cover scope, missing review, stale review after a new certificate, replay). A host that gets a valid certificate between review and commit is refused.quiescefence held across commit.remote_login_cleanuprow whenrevoked_atis set; the DELETE loop runs after the UPDATE so the net result is no pending obligation. Themesh_auditrow with the removal details (detail_json) is written before the deletes.forget_hostmaps every commit-time refusal (host reconnected, no longer retired-unreachable, admin window lapsed) to HTTP 403, and the CLI'sstatus_failureturns 403 into the "invalid API key" diagnostic. A key that is fine gets told its key is wrong, exactly in the race the task asked about. Suggest a distinct status for "host is no longer retired-unreachable" (409 or 404) with CLI text such as "This host is no longer retired and unreachable, so nothing was forgotten." (crates/infraternal-server/src/api_actions.rsforget_host,crates/infraternal/src/cli/api_actions.rs:684). Same pattern exists for removal, but Forget makes it a normal case.crates/infraternal-server/src/remote_removal.rsforget_publish:remote_host_removalsis deleted, so the removal's own history survives only asdetail_jsoninmesh_audit(retained, but a different table). Acceptable if D369's "audit record" meansmesh_audit/api_action_audit; worth one sentence in the module doc.apps/tracer/src/canvas/context.ts: thelabel()doc says "Whether the signed-in account can manage its hosts" but it returns the registry label string or undefined./remote/hosts/forgethas no server-side review step (the confirmation is the client's). Fine under D339 (admin window is the authority), noting it for the record.J396 final review of
forget-retired-host-d369@bf0bb8d5a2(origin/dev0a5432d2cis an ancestor, nothing to merge).Verdict: REQUEST CHANGES (one P1 on the proof, one P2 on error wording; the feature itself looks correct).
Gate results
scripts/verify quickon dev-02 at the reviewed head: all 13 rows PASS,QUICK_EXIT=0(~/.cache/codex-scratch/j396/quick.log). Run because the task asked for it; the brief normally forbids reviewers from running it.pending-host-removal.spec.ts, production build, 1440/393/375 x ink/paper: 6 passed (~/.cache/codex-scratch/j396/browser.log).forget-retired-host.spec.tsas committed: 6 failed, 0 passed (90 s timeout each; same log). Single-case rerun with trace names the line:forget-retired-host.spec.ts:96,page.locator("#palette-input").fill(...)"element is not visible" (~/.cache/codex-scratch/j396/one.log, trace inevidence2/).spec-reload-wait.patch, attached): 6 passed (1.9m) (three.log). The fix: setpush = undefinedbeforepage.reload()andawait expect.poll(() => Boolean(push), {timeout:20000}).toBe(true)after it, as the first load does. Without it the palette hotkey is pressed before the reloaded app has subscribed.Findings
apps/tracer/test/forget-retired-host.spec.ts:94-96: the committed spec fails in all 6 viewport/theme cases (no ready wait afterpage.reload()). J382's hand-off said browser green was blocked by the queue, so this was never run. The row, confirmation, Keep, Forget and removed-row assertions before line 94 all pass; only the final non-owner check fails. Apply the patch; no product change needed.crates/infraternal-server/src/api_actions.rsforget_host+crates/infraternal/src/cli/api_actions.rs:684: every commit-time refusal (host reconnected so it is no longer retired-unreachable, review stale, window lapsed) is HTTP 403, which the CLI prints as the invalid-API-key diagnostic. A valid key is told it is invalid in exactly the reconnect race. Return a distinct status (409/404) and CLI text like "This host is no longer retired and unreachable, so nothing was forgotten."remote_removal.rsforget_publish:remote_host_removalsis deleted; its details survive only inmesh_audit.detail_json. Say so in the module doc.context.ts:label()doc says "Whether the signed-in account can manage its hosts" but it returns the registry label string or undefined./remote/hosts/forgethas no server-side review step (client confirmation only). Within D339 (admin window is the authority); noted only.Checked and fine
hosts:writekey rechecked in-transaction; review token required for key calls (tests: wrong scope 403, no review 400, stale review after a new certificate 403, replay 400). A reconnect that issues a valid certificate before commit is refused; after commitrevoked_atis set.quiescefence held across commit.mesh_audit+api_action_auditwritten in the same transaction; cleanup, removal, bootstrap and retirement-intent rows cancelled after the retirement trigger re-inserts its cleanup row, so no obligation remains.FORGETaction inheritshosts:write, no fresh passkey, dry run required; CLIhosts forgetwith--dry-run/--yes; success text "The host was forgotten here. The machine itself was not changed."mountConfirmTipfrom packages/ui, no new component. Alignment checks (icon/label centre line, title/effect left edge, containment) pass.Screenshots (production build, 2x):
~/.cache/codex-scratch/j396/evidence/forget-host/{1440,393,375}-{ink,paper}-{row,confirmation}.pngon dev-02; four attached below.Cleanup: no J396 process remains; target dir
~/.cache/codex-scratch/j396/targetand the VM worktree~/worktrees/j396are being left for the reaper (logs and evidence kept). No merge, no deploy, nothing pushed.Queue note: dev-02's slots were free while old waiters (PIDs 471771, 518843, 553498, started before the 22:34 UTC rewrite of
build-slot) sat at the head; it cleared by itself about 00:00 UTC.Verdict: REQUEST CHANGES. Reviewed SHA:
bf0bb8d5a2. Gates: quick PASS (13/13); pending-host-removal 6/6 PASS; forget-retired-host 0/6 as committed, 6/6 with the attached two-line patch.J382 review-fix start. Fetched origin/forget-retired-host-d369 at
bf0bb8d5a2; clean local/VM worktrees. Read J396 final review 87958 and downloaded its spec-reload-wait.patch. Plan: apply the subscription-ready wait; add red server/CLI regression coverage for commit-time state refusal, then return 409 and accurate CLI wording; fix the two docs and retired row glyph/hint; run production browser spec three times on dev-02, quick then fast on compute01; atomic commits pushed to this branch only, no merge/deploy. Estimate 2 hours plus shared queues/cold builds. Latest origin/dev is44e80ccc5e; upstream changes are test-double/terminal-spec fixes. Will incorporate before the final gate per brief. Evidence will be under ~/.cache/codex-scratch/j382/evidence/review-fixes/. No new library or engine choices.Review-fix checkpoint: pushed
91f414cdb(J396 subscription-ready patch) andd76c97792(module/label docs, × glyph, shorter unreachable hint). UI unit red/green on dev-02: old glyph yields 1 pass / 1 expected fail; fixed row yields 2 pass / 0 fail, 18 assertions. Receipts: j382-evidence/review-fixes/{red-row,green-row}.log. Browser spec now also asserts the hint fits untruncated.The state/CLI regressions are queued on compute01, PID 299997, log j382-evidence/review-fixes/red-state.log. They require 409 after certificate renewal and the requested CLI message, retaining 403's shared key diagnostic. No product fix applied until those reds run.
T3 preview status is unavailable; corrected blank-tab open failed with "This host is missing libraries T3's browser needs (libnspr4.so, libnss3.so, ...)". Using requested dev-02 repository Playwright production-build checks. No preview tab opened.
Correction to the first plan comment: keeping the reviewed branch base and not integrating origin/dev, in accordance with this follow-up's "Don't merge". Current upstream changes are unrelated test-only fixes; final gates will report their actual result without assuming exemptions.
J382 crash-safety checkpoint:
d76c97792has the final reload and P3 fixes; pushed WIP regression checkpoint on top while the cold red build remains active. Compute01 PID 299997 now owns a slot and is compiling the server test binary (observed active rustc ~1 CPU, ~3 GB RSS). No test result yet; log j382-evidence/review-fixes/red-state.log, sole target ~/worktrees/j382/target. Red source patch saved at control ~/.cache/codex-scratch/j382/evidence/review-fixes/red-state.patch. Will amend this WIP into the single P2 fix after observed red and focused green, preserving the two prior atomic commits. Browser repetition script prepared on dev-02; not queued while this slot is held. No merge/deploy.J382 P2 reds observed on compute01 (WIP regression source atop
d76c97792): server 0 passed / 1 failed, expected 409 but received 403 after certificate renewal; CLI 0 passed / 1 failed, generic Failed instead of the state-refusal path. RED_SERVER_EXIT=101, RED_CLI_EXIT=101. Full receipt and reproducible red patch attached.Fix prepared: distinguish an ineligible Forget selection from authority denial; map only that target conflict to 409, keep 403 for key authorization, and keep a dry-run ineligible target at 404. The CLI message is scoped to the Forget action path, leaving auth diagnostics and other actions unchanged. Focused green follows through build-slot; no merge/deploy.
red-state.log
red-state.patch
red-row.log
green-row.log
J382 P2 focused green: 5 server tests passed; 8 hosted CLI tests passed, 1 existing shipping-root test ignored. GREEN_SERVER_EXIT=0, GREEN_CLI_EXIT=0. Receipt attached. The server reconnect conflict keeps the host live and creates no successful mesh Forget audit; scope/review, ownership/admin-window and successful audit-retention tests pass too.
Amended the marked regression checkpoint into the atomic P2 fix and pushed
c5331ede2b. Final history has three review-fix commits:91f414cdb(reload wait),d76c97792(P3 docs/row),c5331ede2(state refusal). A first exact-lease push was refused because I used the wrong full WIP SHA; verified the actual remote still pointed to my WIP and retried with its exact SHA. No concurrent changes overwritten.Both build VMs are being synced to the clean final head. Three production-browser repetitions now queued on dev-02; logs/evidence under j382-evidence/review-fixes/browser-{1,2,3} and browser-all.log. Quick and final fast follow on compute01. No merge/deploy.
green-state.log
Production browser finding at
c5331ede2: 2 desktop cases passed, all 4 phone cases failed the new untruncated-hint assertion. The shorter wording alone is insufficient because the generic palette title keeps priority. No reload timeout occurred in the passed desktop cases. Raw red receipt attached.Pushed atomic follow-up
150397c50: only Forget rows let their title yield and reserve the short unreachable hint width; all other rows retain the existing layout. This implements the owner's explicit alternative "let the title yield" without a new component. Both VM checkouts are being fast-forwarded; the three requested production runs restart from repetition 1 at the new head. New receipts: dev-02 j382-evidence/review-fixes/final-browser/. The failed run is not counted as a green repetition. Quick and fast follow at the final head; no merge/deploy.red-phone-hint.log
J382 review-fix browser proof at pushed head
150397c506184e816cd5a4ad931f7544c06e36d1. Three fresh production-build invocations on dev-02, one Playwright worker and no retries: 6/6, 6/6, and 12/12 (the last includes 6 pending-host-removal cases). Thus Forget passes 18/18, existing pending removal passes 6/6. 1440×900, 393×852 and 375×667, ink and paper, DPR 2. Reload subscription readiness, full hint fit, and icon/text alignment assertions passed. All 12 final row/confirmation screenshots attached for independent review; inspected at 2× without claiming final visual approval.Quick is queued on compute01 (launcher PID 1894144), then fast will run there. Both VM queues were occupied when checked. New gate logs:
~/.cache/codex-scratch/j382/evidence/review-fixes/{quick,fast}.log; these qualify the review-fix head, not the earlier feature receipts. No merge or deployment. Test-server proof still awaits the orchestrator deployment already requested on this issue.browser-all.log
browser-1.log
browser-2.log
browser-3.log
1440-ink-confirmation.png
1440-ink-row.png
1440-paper-confirmation.png
1440-paper-row.png
375-ink-confirmation.png
375-ink-row.png
375-paper-confirmation.png
375-paper-row.png
393-ink-confirmation.png
393-ink-row.png
393-paper-confirmation.png
393-paper-row.png
J382 gate queue update: the final-head quick run remains queued on compute01 (PID 1894144, queued at 03:33 UTC / 09:03 IST). Last status showed five active slots and queue position six. Browser and focused red/green receipts are already attached. No new code or deployments while waiting. I will wait for quick, then queue fast separately so this job holds at most one slot.
Queue routing update: dev-02 now has only one queued job versus six on compute01. Stopped my compute01 quick launcher by its recorded PID 1894144 before it acquired a slot, confirmed it exited, and moved quick to dev-02 with CARGO_INCREMENTAL=0 / three build jobs. Fast remains required on compute01. This preserves the one-slot-per-job rule and follows the brief's shorter-queue routing.
Quick found three missing D345 comments on existing CLI items touched by the diff: post_json_inner, the tests module, and expired_or_revoked_key_uses_the_shared_d303_diagnostic. Added documentation in atomic pushed commit
5917e18a6; focused diff-doc checker now passes. The change adds comments only, so all three browser runs at150397c50still exercise the final behavior. Rerunning full quick on dev-02, where two slots are now free. Initial quick failure preserved inreview-fixes/quick-doc-red.log.J382 quick passed at pushed final head
5917e18a68f04c13adee490ccf4f58df71ff6b46on dev-02. Verbatim summary below; complete log and preceding doc-check red attached. The only change after the three green production browser runs is three Rust doc comments.Fast is now queued on compute01 (launcher PID 2257259), as requested, after checking both VMs and preflighting the exact Nix Cargo launcher. Dev-02 target and private fixture state have been removed; receipts remain. No merge or deployment.
quick.log
quick-doc-red.log
J382 fast acquired compute01 slot 1/5 after about 27 minutes queued. Running at
5917e18a68f04c13adee490ccf4f58df71ff6b46; launcher PID 2257259; log~/.cache/codex-scratch/j382/evidence/review-fixes/fast.log. Quick and three production browser runs are green and attached above. This is the only active J382 slot; no merge/deploy.Head
59b60c5c64(5917e18a6+ merge of origin/dev966c52e07, clean merge, pushed).scripts/verify fast on compute01 via build-slot (exit 0, FAST_EXIT=0):
forget-retired-host.spec.ts on a production build on dev-02 (aarch64), 3 runs, the spec covers 1440x900, 393x852 and a 375 phone width, ink and paper: 6/6 passed in each run (1.7m each).
Note: my first spec launch exited 127 (bun not on PATH outside nix develop); relaunched inside nix develop. The earlier J382 fast run at
5917e18a6died with ENOSPC when compute01 briefly filled; this is the rerun on the merged head. Logs: fast.log, spec-run-{1,2,3}.log on the control host under ~/.cache/codex-scratch/j382c/evidence/. No merge, no deploy.