96 lines
17 KiB
Markdown
96 lines
17 KiB
Markdown
# Todos
|
||
|
||
## Fast-browser development readiness
|
||
|
||
Status: **validated native-Linux integrated acceptance complete; final offline recheck passed** (2026-09-20). The original M1 visible-cleanup failure is preserved as historical evidence. The root-first cookie experiment, immediate-popup flow, full M1/development matrix, managed CLI scenarios, assertion path, and latest deadline gate passed with cleanup and empty process/port census. Linux-only supervision and non-atomic PID identity proof remain explicit constraints, and no SIGTERM guarantee of universal all-app durability is claimed. The compact public `fast_browser_control` surface and runtime cleanup/navigation/lane/evidence fixes passed the validated scope. Remote GitHub CI was not run; automatic CI remains configured and equivalent managed-CLI live validation passed locally. Exact historical validation results remain in the validator-owned live-validation documentation. See [fast-browser-development-readiness.md](fast-browser-development-readiness.md) and [fast-browser-live-validation.md](fast-browser-live-validation.md); provider-reliability follow-up remains open.
|
||
|
||
### Final native-Linux validation checkpoint (2026-09-20)
|
||
|
||
Typecheck passed. Full-repository offline validation: **805 total, 803 passed, 2 skipped**. Fast-browser TypeScript: **222 total, 220 passed, 2 skipped**. Pinned Python 3.12.13: **42/42 passed**. Packaging: **4/4**, links **8/8**, package contents **36 entries**, and tracked/untracked whitespace checks clean. `imports:check` was not run because it requires private network access. Remote GitHub CI was not run; no remote CI execution claim is made. All live gates passed, including the latest deadline rerun, which naturally exited `1` after 3090 ms with `retry=never` and `mutationState=not_attempted`, explicit private unavailable evidence, cleanup passed, and empty process/port census.
|
||
|
||
## Confirm the minimal Chromium launch baseline after reload
|
||
|
||
During the cancelled Evebot test, the managed visible `/usr/bin/chromium` launches crashed twice with SIGSEGV (coredump records PIDs 2579240 and 2580031). A user-confirmed successful diagnostic used a fresh profile, only the user-data/CDP/no-first-run/no-default-browser-check flags, and preserved desktop environment including XDG_SESSION_TYPE. Named-profile work adopts that minimal baseline for both setup and automation (without CDP for setup). Verify the integrated launcher after reload; the individual cause among removed flags/environment differences is not yet isolated. Do not assume Chromium itself is broken or claim EVE accepts automated login.
|
||
|
||
Also preserve a bounded, non-secret exit reason for recently closed session IDs: after the SIGSEGV, `fast_browser_observe` reported only `Unknown browser session`, requiring an OS crash-log check to distinguish a crash from an ownership/lifetime bug.
|
||
|
||
The same test exposed generic startup errors hiding the actual no-approved-tab condition. Fixed the Python worker to return sanitized startup errors through bounded IPC; it can now report web origins only, without URL paths/query tokens. The app was redirecting to a Pangolin gateway, which the user then disabled. The Characters page was reached, but no character connection or asset-value query occurred before the user cancelled.
|
||
|
||
## Live-validate isolated Vivaldi/Chromium test sessions after reload
|
||
|
||
The new session launcher and unattended adapter are being regression-tested offline; the earlier real Chrome demo tested the original attach-only, UI-approved implementation. After loading the new extension contract, run two simultaneous isolated sessions against the disposable login fixture, including headless mode and configured Vivaldi where installed. Verify separate profiles/endpoints, independent login state and cleanup, and no credential values in result traces or JEV requests. Do not treat fake-process tests as evidence that a particular installed browser build supports every launch flag. Do not bypass the old loaded tool's approval contract to run this check.
|
||
|
||
## Add a Firefox backend to fast-browser
|
||
|
||
Explicitly deferred by the user while Vivaldi/Chrome/Chromium configuration and isolated sessions are implemented. Firefox is not compatible with the current CDP/browser-harness backend; add and test a separate backend rather than silently substituting Chromium. Preserve per-session isolation, headless operation and the existing bounded-run contract.
|
||
|
||
## Investigate interrupted subagent WebSocket recovery
|
||
|
||
During the `feat/fast-browser` prototype on 2026-09-18–19, the `browser-bridge` Pi worker failed after 12m21s with `WebSocket error` / provider auto-retry exhausted. Four implementation/test files were present but no completion report was delivered. The parent resumed the same named session with `subagent_message` and reviewed the partial artifacts rather than assuming they were finished. The resumed worker failed again after 8m41s with the same error; the parent then finished the bridge directly and added missing lifecycle/real-adapter contract tests. Reproduce provider-stream interruption after file writes; verify durable failure reporting, same-session resume, and preservation of uncommitted work. This is an orchestration/provider failure, not a browser/JEV inference failure; no live browser or JEV call was involved.
|
||
|
||
The `fast-browser-settings` worker later hit the same provider error after 13m40s while implementing config/TUI changes. Its partial files were retained and the parent sent a same-session resume with explicit file ownership and offline-validation instructions. This recurrence also occurred without a live browser/provider test call.
|
||
|
||
On 2026-09-19, `fb-transport-evidence` failed after 6m02s with provider `WebSocket error` / auto-retry exhausted. Main resumed the same agent to preserve partial work. The incident is **recovered with a code/test handoff**: wire/details/parent-abort and artifact-store fixes were delivered with 19 targeted TypeScript plus 35 Python tests passing. The underlying provider-reliability follow-up remains open.
|
||
|
||
A subsequent `fb-scenarios-ci` run failed after 23m08s with WebSocket close 1011 / auto-retry exhausted. Main resumed the same session while preserving partial work. The incident is **recovered with a concrete CLI code/test handoff**: tab-reference parsing/static validation/resolution and closed/missing checks, popup JSON coverage, 20 focused tests, typecheck, and all `--check` examples passed. At that historical checkpoint, scenario commands/hooks/reports handoff was still being finalized and tab references remained pending live/review validation; the later native-Linux acceptance gate superseded that checkpoint. The underlying provider-reliability follow-up remains open.
|
||
|
||
A later `fb-runtime-tools` run failed after 25m57s with provider `WebSocket error` / auto-retry exhausted. Main resumed the same session while preserving partial runtime/tools work. The incident is **recovered with a code/test handoff**: runtime factory/tools/controller fixes were delivered with 48 targeted tests plus bridge coverage passing. The underlying provider-reliability follow-up remains open.
|
||
|
||
A later `fb-browser-lifecycle-fix` run failed after 38m07s with provider `WebSocket error` / retries exhausted. Main resumed the existing agent while preserving the partial shutdown fix. This historical incident is superseded by the recovered lifecycle handoff below; preserve it as incident history rather than current status. The earlier transport/runtime recoveries are backed by concrete test handoffs.
|
||
|
||
The original M1 visible-cleanup run failed closed and preserved `/tmp/fast-browser-live-validation-5HvmBr`; the validator safely terminated all 11 verified owned processes, left no target-profile processes, and preserved `evidence/owned-process-cleanup.json` as historical evidence. PID/helper safety independently cleared. The root-first cookie experiment, full M1/development matrix, managed scenarios, assertion path, and latest deadline rerun passed with complete cleanup and empty process/port census. The deadline rerun naturally exited `1` after 3090 ms with `retry=never` and `mutationState=not_attempted`, explicit private unavailable evidence, and no retry. The old lifecycle assertion failure is closed. Linux-only supervision and non-atomic PID identity proof remain constraints; no SIGTERM guarantee of universal all-app durability is claimed. Task 13 runtime cleanup/navigation/lane/evidence fixes and Task 14 CLI report/formatter/cleanup/session/artifact-redaction fixes passed the validated native-Linux gate. Provider WebSocket failures from lifecycle-fix, lifecycle-review, and runtime URL-fix work remain under the existing provider-reliability TODO; the runtime owner has resumed the narrow-URL fix.
|
||
|
||
A related artifact-store test attempted `chmod /tmp` and hit permission denied. This is **fixed in source/tests** using private owned child roots; no chmod of shared parents or sandbox bypass is allowed, and independent review found no remaining chmod issue.
|
||
|
||
Task 12 Python evidence privacy is complete: independent reproductions and six real-development cases pass the privacy review; no buffered-event blocker remains. Timeout-evidence producer and CLI privacy are independently cleared with explicit unavailable/partial metadata, bounded independent capture, and no reopen/retry. Recent-exit diagnostics are implemented/unit-tested with safe known-closed-ID reasons, 30-second TTL, 32-entry cap, sanitized output, and unknown expired IDs; no public history API exists. Exact historical/live results remain in the validator-owned live-validation documentation.
|
||
|
||
## Retire the Bash cwd compatibility override after a usable Pi upgrade
|
||
|
||
Pi 0.85.0 corrects built-in tools that captured the process directory instead of using the live execution `ctx.cwd`, but it still does not declare or honor a per-call `cwd` argument. Its public `@earendil-works/pi-coding-agent` entry point also imports `@earendil-works/pi-server` without declaring that runtime dependency, so importing the package after a normal Bun install fails with `ERR_MODULE_NOT_FOUND`. Keep `@jbcode/pi-bash-cwd` until an upstream release exposes equivalent validated per-call cwd behavior and loads cleanly for extension consumers. Then verify the hidden-worktree root, nested-package, relative-path, and fail-before-execution cases against the built-in tool before removing the override package.
|
||
|
||
## Canonicalize symlinked Pi npm install roots
|
||
|
||
Publishing `@jbcode/pi-interactive-subagents@3.7.4` exposed a Pi package-manager failure when `~/.pi` resolves through `/home/jb/data/.home-dotdirs/.pi`. Pi 0.84.4 invoked npm 12.0.2 with `--prefix /home/jb/.pi/agent/npm` from the repository cwd. npm rewrote the lockfile root as `file:../../../data/.home-dotdirs/.pi/agent/npm`, recursively duplicated that path until the lock contained 12,576 entries and 18 MB of data, and then failed with `ENOENT` during reification. Canonicalizing the npm root, regenerating both lockfiles from that directory, and installing once restored the 124-entry lock and all configured packages. Update Pi's npm package execution to use the canonical install root as its cwd, add a symlinked-agent-directory regression test, and ensure interrupted installs terminate their package-manager children before another reconciliation begins.
|
||
|
||
## Make `pi-links` checks work from linked worktrees
|
||
|
||
A Slice 0 `node scripts/pi-links.mjs prune --dry-run` from `.worktrees/nono-dynamic-permissions-slice-zero-direct` exited 2 and classified every active link into the primary checkout as an outside-repository conflict. The tool anchors ownership to the current worktree root, while active links correctly target the primary repository checkout. Teach check and dry-run planning to recognize canonical checkouts sharing the same Git common directory without broadening stale-link deletion to unrelated repositories. Add linked-worktree fixtures before changing prune behavior. Until fixed, run host reconciliation only from the integrated primary checkout.
|
||
|
||
## Harden Nono 0.74 command-policy and resolved-policy diagnostics
|
||
|
||
Slice 1 found two Nono 0.74 limitations while building behavioral policy proofs. First, command-policy startup fails with `path must be shorter than SUN_LEN` when Nono creates its supervisor socket beneath a moderately long isolated `TMPDIR` such as `/tmp/nono-slice-one-*/sessions/personal/tmp`. Before broker profiles activate command policies, reproduce the maximum safe path, then have the launcher select a private short socket root or confirm an upstream fix. Second, `nono profile show --json` omits resolved `environment`, `command_policies`, `network.connect_port`, and `network.custom_credentials` fields even though strict validation and live enforcement accept them. Do not treat resolved JSON as complete evidence for these capabilities; retain behavioral `nono run` and `nono why --command` proofs until the output is complete and regression-tested.
|
||
|
||
## Replace `workflow` with a skill-based orchestrator
|
||
|
||
The repository-managed `develop-workflow` skill replaces the brittle legacy engine under [ADR 0006](adr/0006-skill-led-development-workflow-04SEP2026.md), with risk-based automation now defined by [ADR 0008](adr/0008-risk-based-development-workflow-07OCT2026.md). Validate the parent-owned plan, isolated worktree, scoped approval boundaries, proportionate verification, independent review, ownership, and recoverable evidence through native Pi primitives. Keep this TODO open until all twelve fresh-session scenarios and three real-change pilots pass, interpreting old scenario expectations under the superseding policy: clear routine work is autonomous, declared disposable targets use standing authority, one reviewer covers both axes, and valid verification evidence is reused. Policy walkthroughs are not execution-pilot evidence. The legacy implementations were archived separately with explicit approval to waive the retirement prerequisite under [ADR 0007](adr/0007-archive-legacy-workflows-05SEP2026.md); archival does not establish validation success.
|
||
|
||
## Support finished-session resume for Claude CLI subagents
|
||
|
||
`subagent_message` can steer a running Claude CLI pane, but a completed Claude launch has no Pi session file and cannot use the existing finished-session resume path. Store the Claude session identifier and original sandbox metadata in the parent registry, then resume with Claude's native session mechanism while retaining the original name and fire-and-forget result delivery. Until implemented, keep the README's finished-session contract explicitly limited to Pi-backed subagents.
|
||
|
||
## Investigate transient concurrent NeMo benchmark failures
|
||
|
||
During Dictate Phase 0 on 26AUG2026, repeated overlapping throwaway benchmark processes produced two one-off failures in the external `/srv/data/tools/parakeet-v3/.venv` environment:
|
||
|
||
1. `ASRModel.restore_from()` raised `MemoryError` while OmegaConf rebuilt `joint.vocabulary`. The exact clean/noisy/silence harness passed on its immediate rerun.
|
||
2. A later production-adapter check raised `ValueError: bad marshal data (invalid reference)` while importing `torch._tensor`. An immediate standalone `import torch` succeeded, and the cached `_tensor.cpython-312.pyc` passed `marshal.loads()`.
|
||
|
||
The production service serializes model loading and inference and therefore does not intentionally launch concurrent NeMo processes. Before treating concurrent workers as supported, build a repeatable cold-load stress loop, monitor process and cgroup memory, disable bytecode writes, and determine whether the failures come from NeMo/OmegaConf resource pressure or concurrent access to the external environment's bytecode cache.
|
||
|
||
## Repair nono self-diagnosis after terminal path drift
|
||
|
||
During Dictate waveform testing on 26AUG2026, every Unix socket `bind()` in `services/dictate/tests/test_unix_server.py` failed with `EACCES` or `EPERM`, including when `TMPDIR` pointed inside the repository worktree. The required diagnostic also failed:
|
||
|
||
```text
|
||
$ nono why --self --path /tmp --op readwrite
|
||
nono: Configuration parse error: sandbox state path drifted at reload: serialized resolved=/dev/pts/15, actual resolved=/dev/null
|
||
```
|
||
|
||
Reproduce in a non-interactive or reloaded Pi session, determine whether `/dev/pts/*` should be serialized by identity rather than resolved path, and make `nono why --self` report the active policy even after the controlling terminal changes. Also verify whether the Pi profile intentionally denies `AF_UNIX` socket creation in otherwise writable paths; the Dictate service loop tests need local throwaway sockets.
|
||
|
||
## Reuse the verified Dictate model during reinstall
|
||
|
||
The protocol-v2 reinstall on 26AUG2026 attempted to download the pinned model again even though the exact model already existed under `~/.local/share/pi-dictate/models/`. The sandbox correctly blocked unapproved access to `huggingface.co`, so installation had to be repeated with the installed model passed explicitly through `--model-source`.
|
||
|
||
Teach `services/dictate/install.sh` to checksum an existing model first and keep it when it matches `MODEL_SHA256`. Download only when the model is absent or invalid, while preserving the current atomic temporary-file replacement for new model sources.
|