Skip to content

Wave-2 phase-0 records: X17 interim installs, install plan, client-configuration map and templates, skills, K4 guard and handbook - #659

Merged
seathatflowsinourveins merged 23 commits into
mainfrom
foundation/new-wsl-wave2-records-20261003
Oct 3, 2026
Merged

seathatflowsinourveins merged 23 commits into
mainfrom
foundation/new-wsl-wave2-records-20261003

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Oct 3, 2026 •

Copy link
Copy Markdown
Collaborator

Scope

  • What this PR changes, in one or two sentences: the repository records for wave 2's phase 0 on the new WSL distribution: the X17 interim-install mechanism and its rows, the install plan, the client-configuration map and templates, the skills manifest, and the K4 guard and currency-notice items, each cited at the pins the wave-2 dossiers and rulings give. Nothing here runs on a host; every new install row is UNRUN.
  • Base commit: 4ced2923063db6a6dcafa9f25af5ee05a4153c75 (origin/main). The branch was built on Layer consensus of 2026-10-02 in the manifest, plan and handbook (89 slots), and the WSL scope of the two-host decision #620's pre-merge head fd111e59a748 and rebased after Layer consensus of 2026-10-02 in the manifest, plan and handbook (89 slots), and the WSL scope of the two-host decision #620 merged: its nine content commits applied without conflict, and its two manifests/evidence.json commits were replaced by one last commit under the hot-file protocol (10 commits; 75 files, +5310/-1118).
  • Lane: lane:foundation
  • Owned paths touched: adoption/ (new-wsl/ map, instruction sources and templates/*.additions.*; the Claude settings, Codex config and Codex AGENTS templates; skills/manifest.json and skills/lifecycle.md; platforms/linux-wsl2-new-distro.md; scaffold/AGENTS.md; hooks/claude/SHA256SUMS), blueprints/runtime-workers/skills/, blueprints/convergence-practice/wsl-new-distro-image-20261001/experiment.json, catalogs/landscape/skills-lifecycle.json, five records under docs/decisions/, docs/new-wsl-handbook.md and .json, docs/secret-storage.md, evidence/artifacts/ (new-wsl-definitive-defaults-20261001/, new-wsl-install-plan-20261002/, new-wsl-layer-consensus-20261002/, new-wsl-handbook-20261001/receipt.json), examples/claude-native/CLAUDE.md, recipes/README.md, scripts/ (build_new_wsl_handbook.py, currency_due.py, skills_status.py, hooks/secret_path_guard.py), tools/adoption/ (new_wsl_client_config.py, install_skills.py, codex_home.py), tools/research/, tools/sota-convergence/landscape-sweep/, 16 test modules, and manifests/evidence.json (hot file, last commit only).

Items (the phase-0 brief, following the wave-2 synthesis's phase 0, 0.1 to 0.5):

  1. X17 mechanism (0.1). assemble_manifest.py gains amendment 3 (check_batch(), apply_interims(); an interim is written to the row's own interim field, outside PROTECTED) with an exception to the no-install rule. Interim installs on memory-owner (ai-memory 2.5.2 at 127.0.0.1:29374, zero-LLM, local embedder), code-search (semble 0.6.1, model pinned) and context-supply (context-mode 1.0.169), each on the owner's decision of 2026-10-03; a new statusline row (claude-hud 0.10.0 plus the Codex footer); amendments on credential-custody (custody change 15) and credential-guard (custody change 11). playwright-cli keeps its hold; the local-model rows are untouched. The layer-consensus record gains the wave-2 batch with its hashed record, evidence/artifacts/new-wsl-layer-consensus-20261002/wave2-records.json.
  2. Install plan (0.2). The three interim rows and the statusline row, all UNRUN; research-harnesses (DeerFlow as the embedded DeerFlowClient with uv sync --locked and no Compose, service or port; GPT Researcher through tools/research/gpt_researcher.sh with a keyless committed configuration and a fail-closed preflight); tobi-qmd (qmd change 16); gpt-gateway (EMBED_WS_PROXY_PORT=21131 and plain NAME=value lines, gateway change 12); the skills rows delegate to tools/adoption/install_skills.py (skills change 7); X1-X3 notes. install.sh refuses an interim install while consensus.json wave2.acknowledgements_owed names a family, and check_plan.py fails a plan whose interim function skips that gate. ai-memory's own install-hooks --agent codex --apply writes its seven Codex hooks once, and the post-install check reads them back.
  3. Client-configuration map and templates (0.3). semble (per-client SEMBLE_CACHE_LOCATION, SEMBLE_MODEL_NAME on the pinned snapshot, approval mode and exact-name allow rules in the authorization class), the statusline (the claude-hud marketplace and setup.mjs command as overrides, statusLine keep_existing, Codex [tui] status_line), the six context-mode [hooks.state] entries, Codex inherit = "none" with its set table (including XDG_RUNTIME_DIR and DOCKER_HOST), ai-memory at the host file's AI_MEMORY_URL, and the instruction lines (context-mode lane, semble, GPT Researcher, messaging). At --apply the builder adds one [[skills.config]] name rule per remote plugin skill and an off switch per plugin MCP server, writing enabled = false on each remote plugin table it touches. The new-distribution keys (inherit = "none" with its set table, both semble servers, semble's Claude allow rules and ai-memory's Codex approval mode) live in adoption/new-wsl/templates/*.additions.*, which only tools/adoption/new_wsl_client_config.py reads; the shared templates carry only what every host gets (the retired skills set off, the Codex rule that turns off the bundled skill-installer by path, the Codex [tui] status_line footer and the instruction lines). A real --apply refuses while acknowledgements are owed.
  4. Skills manifest (0.4). grill-me, improve-codebase-architecture and semgrep retired; agent-browser held; skill-creator a Claude-Code-only copy; no playwright-cli row while the browser hold stays. install_skills.py and skills_status.py learn the held state and the agents and copy fields; the Codex template disables the bundled skill-installer by path.
  5. Guard and due items (0.5). K4 covers 21128 (the new distribution's single-port gateway, which takes 20128's permit rows) and 21129 (its live-dashboard WebSocket, which takes none, so every covered /api/ request to it refuses). currency_due.py gains a fifth count, host_alerts, from the backup and restore-check status records and the user manager's unit properties.
  6. Regeneration and registration. The handbook (docs/new-wsl-handbook.md and .json with its receipt) and the decision records' tables are regenerated by their own generators and check current on this base; the changed files are registered in manifests/evidence.json by the hot-file protocol (52 entries re-registered, wave2-records.json added, none removed).

Not in this PR: wave-2 r3's 1.8 installed-state comparison and strip (hooks as a multiset of complete definitions, kept entries bound on nine fields, an owned-key file, refusals that exit 2, and the preregistered controls) are not in this PR. They come in a follow-up client-wiring-check PR, and the 1.8 gate waits for it.

Residuals:

  • tests.test_secret_path_guard test_host_profile_copy_is_verbatim fails: this PR changes scripts/hooks/secret_path_guard.py (K4 for 21128/21129), and the installed user-scope guard is still the earlier copy. It passes after tools/adoption/install_claude_profile.py --only guard once this merges.
  • Full-suite failures not caused by this branch: tests.test_windows_terminal_defaults (test_the_installed_client_knows_no_notification_type_without_a_decision), tests.test_order_throughput (test_cli_refuses_live_base_url_from_env_file_without_network, an error) and tests.test_gpt6_family_tiering_20260926 (the SIGTERM test, test_sigterm_records_the_running_call_as_interrupted_without_counting_it). Each module fails with that one test at this head and with the same test on origin/main 4ced29230. The full suite itself ran before the rebase (9847 tests); it was not rerun after it.
  • XDG_RUNTIME_DIR and DOCKER_HOST are now rendered only by the builder's additions file, adoption/new-wsl/templates/codex.config.additions.toml; the shared Codex template carries neither.
  • ai-memory's Codex hook trust waits for the 2.5.2 read-back: the recorded hashes come from ai-memory 2.4.x on another host, and the 2.5.2 hashes are read back through codex app-server hooks/list on the destination.
  • Port 21131 (EMBED_WS_PROXY_PORT) is outside the guard: K4 covers 21128 and 21129 only.
  • The context-mode cache-heal hook is left unwired (X11): the plugin writes it and the file it runs.

SOTA sources

Each pin is the one the wave-2 dossiers and rulings give (hashed in evidence/artifacts/new-wsl-layer-consensus-20261002/wave2-records.json); nothing was installed from them in this PR.

Evidence-class table

List each material claim with its evidence class. Classes: native_proven
(actual execution on a host, receipt retained), local_integration,
synthetic (fixture), source_review. Never label a claim a class stronger
than what was actually run.

Claim Evidence class Command / receipt
Each new row, map entry and template pin matches its upstream source (ai-memory 2.5.2, semble 0.6.1, context-mode 1.0.169, claude-hud 0.10.0, GPT Researcher, DeerFlow, qmd, OmniRoute) source_review Pinned source reads cited in the commits and records; evidence/artifacts/new-wsl-layer-consensus-20261002/wave2-records.json
Codex 0.160.0 behavior the builder relies on ([tui] status_line, remote plugin enabled default, long-command polling) and the Claude Code plugin, status-line and permission rules source_review Codex rust-v0.160.0 files and the code.claude.com pages above; not confirmed live
The X17 mechanism admits only the owner-lifted interim rows and refuses the rest; the manifest is current local_integration assemble_manifest.py --check (0), controls.py (0), tests.test_new_wsl_definitive_defaults
Install-plan rows, commands and acceptance entries agree, and the acknowledgement gate is wired into each interim install local_integration check_plan.py (0: 70 rows, 85 commands, 62 acceptance entries); bash -n install.sh, accept.sh (0); the plan is UNRUN on any host
The builder renders and checks the map, the templates and the new-distribution additions local_integration new_wsl_client_config.py --check (0); tests.test_new_wsl_client_config
Skills manifest states (retired, held, Claude-only copy) local_integration tests.test_skills_manifest
K4 covers 21128 and 21129 local_integration tests.test_secret_path_guard (K4 tests pass, two adapter self-tests skipped; the installed host copy is not refreshed)
The handbook and the record tables are current local_integration build_new_wsl_handbook.py --check (0), render_tables.py --check (0)
Evidence registration and the recorded experiments are consistent local_integration validate.py (0), validate_convergence.py --all-recorded (0, 26 records valid)

No claim here is native_proven: nothing in this PR ran on the destination distribution or on any other host.

Local commands run

Run from the repository root at b6828c7da on 4ced29230, each with TMPDIR set to a private scratch directory and nice -n 19:

$ python3 -B evidence/artifacts/new-wsl-definitive-defaults-20261001/assemble_manifest.py --check
exit 0: definitive-manifest.json is current
$ python3 -B evidence/artifacts/new-wsl-definitive-defaults-20261001/controls.py
exit 0: all files restored
$ python3 -B evidence/artifacts/new-wsl-install-plan-20261002/check_plan.py
exit 0: OK: 70 rows: 42 installed by default, 3 measurement-only, 25 not installed; 85 commands and 62 acceptance entries agree with the scripts
$ bash -n evidence/artifacts/new-wsl-install-plan-20261002/install.sh && bash -n evidence/artifacts/new-wsl-install-plan-20261002/accept.sh
exit 0
$ python3 -B scripts/build_new_wsl_handbook.py --check
exit 0: {"status": "passed"} (docs/new-wsl-handbook.json 51db6bc4..., docs/new-wsl-handbook.md c642b643...)
$ python3 -B tools/adoption/new_wsl_client_config.py --check
exit 0: check passed
$ python3 -B -m unittest -v tests.test_new_wsl_definitive_defaults tests.test_new_wsl_handbook tests.test_new_wsl_profile tests.test_new_wsl_client_config tests.test_skills_manifest tests.test_secret_path_guard
exit 1: Ran 422 tests; FAILED (failures=1, skipped=2)
  the one failure: test_secret_path_guard.SecretPathGuardTests.test_host_profile_copy_is_verbatim (installed host guard copy; see Residuals)
  skipped: K4GuardTests.test_k4_oracle_adapter_identity_count, K4GuardTests.test_k4_reference_adapter_selftest ("scratch adapter supplied by the permanent-test mutation driver")
$ python3 -B scripts/validate.py
exit 0: {"components": 69, "hashed_files": 9421, "profiles": 4, "receipts": 187, "status": "passed"}
$ python3 -B scripts/validate_convergence.py --all-recorded --root . --json
exit 0: "valid": true, 26 records, none invalid

Rebase and registration (hot-file protocol, docs/lanes.md):

$ python3 -B evidence/artifacts/new-wsl-definitive-defaults-20261001/render_tables.py --check docs/decisions/2026-10-01-new-wsl-definitive-defaults.md
exit 0: the record's tables are current
$ python3 -c '<host_receipts.register_file for each path>' <53 paths>
exit 0: 52 entries re-registered, 1 added (wave2-records.json), none removed
$ python3 scripts/component_matrix.py --write
exit 0: unchanged
$ python3 scripts/new_host_grand_list.py --write
exit 0: unchanged
$ gitleaks git --log-opts="origin/main..HEAD" --no-banner --redact .
exit 0: 10 commits scanned, no leaks found

Attribution of the full-suite failures:

$ python3 -B -m unittest tests.test_landscape_sweep_skills
exit 0: Ran 110 tests, OK (skipped=40)
$ python3 -B -m unittest tests.test_windows_terminal_defaults        # at this head and at origin/main 4ced29230
exit 1 at both: test_the_installed_client_knows_no_notification_type_without_a_decision
$ python3 -B -m unittest tests.test_order_throughput                  # at this head and at origin/main 4ced29230
exit 1 at both: ERROR test_cli_refuses_live_base_url_from_env_file_without_network
$ python3 -B -m unittest tests.test_gpt6_family_tiering_20260926      # at this head and at origin/main 4ced29230
exit 1 at both: test_sigterm_records_the_running_call_as_interrupted_without_counting_it

Decision record

Path to the dated decision record for this change (if any), naming the
evidence, alternatives considered and the comparison that would overturn it:

  • docs/decisions/2026-10-02-new-wsl-layer-consensus.md: the Wave 2 batch, its acknowledgements and the owner's decision of 2026-10-03; hashed record evidence/artifacts/new-wsl-layer-consensus-20261002/wave2-records.json.
  • docs/decisions/2026-10-01-new-wsl-definitive-defaults.md: amendment 3, interim installs on rows whose decided default installs nothing (X17).
  • docs/decisions/2026-10-02-new-wsl-client-configuration.md: the phase 0.3 addendum and its regenerated tables.
  • docs/decisions/2026-09-30-session-currency-notice.md: dated addendum for host_alerts.
  • docs/decisions/2026-09-25-skills-trial-and-usage.md: dated addendum retiring grill-me, improve-codebase-architecture and semgrep.

Host evidence

None in this PR: no file under evidence/hosts/ is added or changed.

Refresh onto main after #647 (2026-10-03)

Checklist

  • New/changed GitHub Actions are pinned to a full commit SHA with a
    version comment (no floating tags). (No workflow changed.)
  • New/changed workflows declare top-level permissions: contents: read
    (or a narrower, explicitly justified addition). (No workflow changed.)
  • No secrets are printed, logged or committed; no new required secret was
    added without a documented owner. (gitleaks: 10 commits, no leaks; the GPT Researcher configuration is keyless.)
  • No new paid hosting, subscription or billing surface was introduced.
  • Peer-owned untracked files and worktrees were preserved (not deleted,
    moved or overwritten).

🤖 Generated with Claude Code

@seathatflowsinourveins seathatflowsinourveins added the lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers label Oct 3, 2026
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-03T12:29:34.332568Z b6828c7 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b6828c7da2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread tools/adoption/install_skills.py Resolved
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Root exact-head FINDINGS: three P2 source defects after the requested Astra/max source read.

Head b6828c7, base/captured main 4ced292. Fresh native API guard13:01:14 confirms this head OPEN/non-draft. Consequential trigger:75 changed paths, including15 executable files governing default authority, install order, client configuration and acceptance. Root independently checked the deciding original Git blobs after the reader returned. These are static source findings, without executing the counterexamples.

  1. Owner-decision mention is insufficient authority for an interim. relayed_decision checks a matching date and whether the slot or repository basename appears anywhere in prose; apply_interims then treats that as owner authority. The unchanged hashed owner_decisions[0] keeps the browser hold and mentions crawl4ai as a candidate to measure. A structurally valid playwright-cli interim naming that repository can satisfy the mention check against the same record/date. Bind authority to explicit affirmative actions and exact authorized slot/repository pairs. The committed head contains no such browser interim, and the acknowledgement/install gates still refuse execution; the defect is in source admission.

  2. Existing empty skill-rule arrays silently lose disable rules. With valid existing TOML [skills] and config = [], is_table_array returns false. plan_merge then retains an ordinary conflict rather than appending rules or reaching the inline-array refusal. After acknowledgements are satisfied, this can leave the requested skill-installer/remote-plugin disable rules absent while apply reports conflicts kept. Treat the empty existing list as a rule-list case and refuse unsupported inline text extension, or explicitly refuse it. The remote-plugin message also reports “turned off” before writing; call the rules planned until write/read-back succeeds. The deferred1.8 strip operation need not be implemented to fix this.

  3. The copy smoke check does not establish Claude-only placement. installed_skill_dir selects Claude's folder for global copy entries, but classify_skill can return ok for matching pinned bytes/lock without rejecting a Claude symlink or a shared same-name directory. --check-only returns that success, and the plan smoke check uses it. The separate status reader rejects both layouts. Require a real Claude directory and absence of the shared same-name directory before ok; return nonzero for incompatible placement. No automatic deletion is needed.

Source consistency is accepted separately:9420→9421 registry rows, no removals, all53 changed/added bindings match actual head blobs within the75-path delta;187 receipts and26 convergence records unchanged. Historical decisions remain separate from interims; selection-only records do not establish installed state. Both acknowledgements, CI, destination hook comparisons, loaded plugins and section1.8 remain held. Reported422-test/9847-test runs and their guard-copy failure/skips are retained as prior reports, without new root execution. Timeout1500 covers the research CLI invocation, not setup/preflight, and has no kill-after deadline.

Custody: frozen manifest45742B/SHA256 15002b686d9c7ec88d1c1e890c00c6a508aa645c878c36021653c8337969fe99;27 verified Git blobs and actual75-path diff984518B/SHA256 6ccacb553ee3f063fc1c70bc8251dab82e9dfbbe4de639ea921641ab19c31703 unchanged after reading. Native review exit0;34 outer reader commands0. Three nested immutable curl fetches returned6/DNS failure (GPT Researcher0957c301 cli.py/config.py and semble24497845 cli.py); those failures and upstream-native compatibility unknowns are retained. Focused source excerpts recovered truncated displays. Final12849B/SHA256 d91056f62b96455e516a19fdbe98372db5aef7ba06a21e1a529c6eb4807eea2d; events1082376B/SHA256 db6865dd205870e98116142fc00983472c21959edea2d2f977bab85d4bf9b5b4; stderr0B. Requested gpt-6-astra/max used keyless OmniRoute20128; delivered model/effort/account identity is unattested. Terminal native CLI counters, counted once: input2887384, cached-input2668160, cache-write0, output25937, reasoning11369. Cache/reasoning subsets are non-additive; provider-complete usage is unknown. No installation, comparison, private credential/auth read or native-sign-in change was performed.

Please hand back the exact repair head for a bounded three-finding source reread. Root leaves Claude-owned files with their owner.

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Root source recovery following the three-P2 verdict, at the same head b6828c7, base 4ced292.

The three immutable upstream URLs that returned curl6/DNS during the requested Astra read were recovered independently through native GitHub API originals. Six API calls0 and all six decoded Git identities/SHA256 bindings were root-verified. This is source recovery; the original DNS failures remain in custody.

No unsupported flag or CONFIG_PATH interface was found in this narrow pinned source comparison. Actual loaded environment, route/model delivery, zero embedding calls, Semble model/cache loading and installation remain unqualified. GPT Researcher's CLI calls load_dotenv, so env-i at invocation is not by itself complete loaded-environment evidence. The wrapper's1500-second timeout covers its CLI invocation; it does not bound setup/preflight or add kill-after.

This recovery does not change any of the three P2 findings, acknowledgements or section1.8 holds, and did not run an install, test or model task. Custody manifest9088B/SHA256 9aaa7e7226a1baeab5a3fe8976e5a8f5c30c49223edffef571c25affba9b0a08; original packet CODEX-PR659-UPSTREAM-20261003T130204Z. Recovered original Git blobs: CLI2be97d4301a6f6e36fe7f523c45915791195abc4, config81868d22694dfe752b366a8440271aeb36b8fb17, Semble CLI2770236b8c7ca14ffe983c714d76d36736ba34d8.

@seathatflowsinourveins
seathatflowsinourveins force-pushed the foundation/new-wsl-wave2-records-20261003 branch from b6828c7 to 42c43b3 Compare October 3, 2026 13:53
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

SOURCE ACCEPT WITH INTEGRATION NOTE — exact head 42c43b36e5d925928d2b6bd0d8377bb9312d1544, nineteen-file repair delta from b6828c7da29b80ca66bf01b1aeaaf95af8f97c83. This clears the three introduced P2 source findings in the previous Astra read within the repaired scope.

The assembler authority predicate now requires an affirmative install/use action for the exact slot/repository. Existing published grants do not authorize browser installation. The config planner includes existing empty config=[] in rule planning; the text writer explicitly refuses inline arrays before writing, and the progress message correctly says planned. The copy-placement predicate detects Claude symlinks and shared same-name entries, including dangling links; misplaced refuses before add/remove and returns nonzero. These are bounded source closures; locally authored negative controls are not promoted into upstream/native installation acceptance.

Root independently checked all52 original observation stream bindings (50native0, two expected ancestry native1),39 complete native Git source byte/OID identities, and13 registered changed-context bindings. The unchanged75-path PR roster contains19 modified repair paths with no additions/deletions in the head-to-head delta. Executable source coverage retains the four changed contexts and11 unchanged original/OID contexts from the prior read. The packet separately retains its recovered processing IndexError1; original raw tool-result custody for that processing error is explicitly unavailable. The previous primary-source recovery remains historical source evidence, with its original DNS failures retained.

Integration note: native final guard14:35:31UTC reports this same OPEN/non-draft head and base/current-main59f8. Native tree/history checks separately show merge-base4ced, with main and b682 not ancestors of this head; their expected exit1 results remain retained. All9420 current-main registry members/order and187 receipts/26 convergence records remain present. Against the complete75-path roster, the sole foreign head/current-main registry difference is validate.yml's old binding: a6ecc9…/37871bytes versus main 91c2f9…/38354bytes. This snapshot difference does not by itself prove a misbinding at the branch head, future deletion, or an incorrect native three-way merge. Observe the actual integration preserving both current workflow bytes and their matching binding; no mandatory rebase or blocking-cause inference is made here.

No new native client/configuration/skill installation, tests, provider/model run, freeze/default qualification or required-CI acceptance in this read. Claude-owned paths were not edited by root.

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

native-agent-stack-f9: cross-family convergence result (2026-10-03; two GPT-6 Astra and two Claude Opus votes) for two install-plan rows that the daily report shows behind upstream.

  • inspect-ai (0.3.273 → 0.3.276). Change it only through a two-family amend_rows entry for that slot, after this PR and New WSL local models: settle the generation and embedding slots by their preregistered measurement #647 merge and before Prepare eight runtime jobs with pinned sources and daily freshness #633 freezes.
    • Edit install-plan.json:1568,1572,1584,1593,1599, install.sh:314-315 and accept.sh:395.
    • Also update the acknowledgement list (tests/test_new_wsl_definitive_defaults.py:811-813), the generated tables (:894) and the decision record's mention of inspect-ai (:900-901).
    • Regenerate the handbook with its receipt hashes (tests/test_new_wsl_handbook.py:1269-1286).
    • Acceptance: upstream behaviour tests, not inspect --version.
  • agent-runtime-worker (OpenHands v1.50.1 → v1.51.0). Hold. The consensus amend_rows entry names 1.50.1 as the frozen comparison baseline, and the fact oracle is bound to 1e1390ac.
  • What's mine: this is a recorded disposition for each row. No change is requested in this PR.

Scout and others added 16 commits October 3, 2026 12:18
…installs nothing (X17)

The layer-consensus record gains a wave-2 batch (2026-10-03) with its own hashed record
(wave2-records.json: the wave-2 dossiers, GPT checks and rulings the repository cites, from
run wf_18aa601f-b71, journal sha256 5f904de2..., synthesis sha256 3b512613...), its rule text
(amendment 3 and its exception to the no-install rule) and the acknowledgements it still owes.

- assemble_manifest.py: check_batch() and apply_interims(); an interim is written to the row's
  own `interim` field, outside PROTECTED; the decision rule gains amendment 3, the manifest
  gains no_install_rule_exception, consensus_wave2 and counts.interim.
- Rows: interim installs on memory-owner (ai-memory 2.5.2, 127.0.0.1:29374, zero-LLM, local
  embedder), code-search (semble 0.6.1, model pinned) and context-supply (context-mode 1.0.169),
  each on the owner's decision of 2026-10-03; an added statusline row (claude-hud 0.10.0 plus
  the Codex footer); amendments on credential-custody (custody change 15) and credential-guard
  (custody change 11). playwright-cli keeps its hold; the local-model rows are untouched.
- check_plan.py and new_wsl_client_config.py read the interim (installs, slot_verdict).
- Tests and controls: five interim tests, 8 refusal controls and 1 label control (49 killed).

The install plan rows, the handbook and the client configuration follow in later commits of
this branch; check_plan.py, the handbook check and the client-config check fail at this commit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
… rows

Install plan (evidence/artifacts/new-wsl-install-plan-20261002/):
- memory-owner (ai-memory 2.5.2, 127.0.0.1:29374, local embedder), code-search (semble 0.6.1 with
  the model pinned to a local snapshot) and context-supply (context-mode 1.0.169: Claude plugin
  with the stats.json-only compare gate, Codex plugin at --ref 6f0cc684, verified npm tarball)
  install as interim rows; statusline (claude-hud 0.10.0) is added. All UNRUN.
- research-harnesses: DeerFlow as the embedded DeerFlowClient (uv sync --locked; no Compose,
  service or port), GPT Researcher through tools/research/gpt_researcher.sh (research changes
  2-5, 9, 18; synthesis X18), with a keyless committed configuration and a fail-closed preflight.
- tobi-qmd: needs.gpu true, config paths, an after-provisioning check (qmd change 16).
- gpt-gateway: EMBED_WS_PROXY_PORT=21131 and plain NAME=value lines (gateway change 12); X1-X3
  notes on the observability rows and the gateway row.
- The three skills rows delegate to tools/adoption/install_skills.py (skills change 7).

Skills (skills changes 1, 3, 6): grill-me, improve-codebase-architecture and semgrep retired
(dated addendum, template off, runtime-worker reuse entries and coverage removed); agent-browser
held; skill-creator a Claude-Code-only copy. install_skills.py and skills_status.py learn the
held state and the agents/copy fields, with tests. The Codex template disables the bundled
skill-installer by path.

check_plan.py passes (70 rows). The client configuration, the handbook and the evidence
registration follow; their checks still fail at this commit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
… lines and builder fixes

Phase 0.3 of the wave-2 synthesis (sha256 3b512613...), with the rulings it cites:
- Map: semble (Claude and Codex entries, per-client SEMBLE_CACHE_LOCATION, SEMBLE_MODEL_NAME on the pinned snapshot,
  approval mode and two exact-name allow rules in the authorization class; code-search changes 2-5), the statusline
  row (claude-hud v0.10.0 marketplace and the setup.mjs command at 75683c6d as overrides, statusLine keep_existing;
  Codex [tui] status_line; usage changes 3-5, 8, 9), the six context-mode [hooks.state] entries (context change 9),
  Codex inherit = "none" with its set table (custody change 7), ai-memory at the host file's AI_MEMORY_URL (X5).
  The cache-heal hook stays unwired (the plugin writes it; X11). rtk, headroom and SocratiCode stay slot entries.
- Builder: AI_MEMORY_BIN from the plan's memory-owner link (render_config.py would derive the 2.4.1 pin path); host
  values filled in an MCP override; the verify step skips http servers; agent gaps count a wired plugin's tools and
  skills (context change 14); an allow rule already present counts as the same; labels name the Codex profile and
  allow rules; the default authorization line names approval modes and allow rules. codex_home.py gains
  --keep-hook-trust so a new Codex home and a merge end the same.
- Instruction lines in both sources (context-mode lane, semble, GPT Researcher, messaging; Codex lines after their own
  marker), blocks regenerated; the Claude template's word baseline re-recorded with the reason.
- Tests and records follow: client-config tests (145), the decision record's addendum and regenerated tables, and the
  shared suites the templates and the earlier skills commit touched (install profile, worker lane, scaffold, landscape
  sweep, recipe, docs consistency).

validate.py still fails on manifests/evidence.json registration, and the handbook check on the wave-2 consensus row;
both follow on this branch.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ains host alerts

Phase 0.5 of the wave-2 synthesis:
- K4 (custody change 11): 21128, the new WSL distribution's single-port gateway, takes 20128's permit rows; 21129, its
  live-dashboard WebSocket, takes none, so every covered /api/ request to it refuses. The ports join K4_GW_HEAD,
  K4_GW_FIND and the gateway anchors (2112 beside 2012), so interpreter code that names only a 2112x port is read too.
  Tests: the frozen matrix rows and the refused-port set, and destination cases (/api/providers/client on curl, wget,
  xh, node and Python; /v1 allowed). adoption/hooks/claude/SHA256SUMS carries the new hash. This host's installed
  guard differs until install_claude_profile.py --only guard runs, so test_host_profile_copy_is_verbatim fails here.
- currency_due.py (lifecycle change 7): a fifth count, host_alerts, from the backup and restore-check status records
  (change 8's last_success/last_attempt shape; failed or partial, overdue past 48 h or 8 days, unreadable) and from the
  user manager's unit properties (an enabled stage-2 unit or dagu.service that is failed or inactive). A host without
  the record or the unit has no alert; a user manager that cannot be asked is coverage. Tests and a dated addendum to
  docs/decisions/2026-09-30-session-currency-notice.md.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
- scripts/build_new_wsl_handbook.py: consensus_slots() reads the layer-consensus record's wave2.add_rows (the statusline
  row) beside its first batch; the counts check mirrors the producer's interim count (amendment 3; present when the
  manifest records consensus_wave2); a waiting row that carries an interim install shows it in the Install column
  beside its decided default's reason, and the inventory sentence names how many do.
- docs/new-wsl-handbook.md and .json regenerated; evidence/artifacts/new-wsl-handbook-20261001/receipt.json carries the
  new generator and output digests (the profile and the inventory are unchanged).
- tests/test_new_wsl_handbook.py: 90 rows and six consensus rows, amendments from both batches, and the interim display.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
- docs/secret-storage.md: the gateway matrix the guard's docstring names follows K4_GW_ROWS (21128 takes 20128's rows;
  21129 none; wave-2 custody ruling, change 11).
- catalogs/landscape/skills-lifecycle.json: the installed lists follow adoption/skills/manifest.json after the wave-2
  skills ruling retired grill-me, improve-codebase-architecture and semgrep (changes 1 and 3): the design-intake task
  has no installed skill, codebase-design alone serves architecture, and the security task names the custom static
  rules as unowned; checked_at stays the sweep's date. tests/test_landscape_sweep_skills.py: no pinned skill keeps a
  listing other than on, so only the Codex flag kind is stated today.
- tests/test_windows_terminal_defaults.py: [tui] status_line joins the pinned keys after its upstream check
  (Tui.properties.status_line in codex-rs/core/config.schema.json at rust-v0.160.0; the six ids are StatusLineItem
  variants of codex-rs/tui/src/bottom_pane/status_line_setup.rs at that tag).
- blueprints/convergence-practice/wsl-new-distro-image-20261001/experiment.json carries the new hashes of the recipe and
  its test, both changed on this branch, as PR #608 did for the same two inputs.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…hell policy, remote plugin rules, apply gate

Review of the wave-2 records branch, 2026-10-03 (one repair round):

- Blocking (custody change 7, synthesis X12): Codex shells under inherit = "none" now get XDG_RUNTIME_DIR
  (/run/user/<uid> of the user the builder runs as, [email protected](5)) and DOCKER_HOST
  (unix://${XDG_RUNTIME_DIR}/docker.sock, wired through the container-engine slot); a render test holds both.
- New-distribution keys leave the shared templates: inherit = "none" with its set table, both semble servers,
  semble's Claude allow rules and ai-memory's Codex approval mode move to adoption/new-wsl/templates/*.additions.*,
  which only tools/adoption/new_wsl_client_config.py reads (template_data merges them; a key both define is refused).
  codex.config.template.toml, claude-user.json, the Claude settings template and bootstrap.md step 4a are again what
  every other host renders, so decision 5 of 2026-09-26-codex-worker-lane.md stands unamended there.
- Messaging change 1: the Codex instruction block runs the research script and the courier as long commands
  (yield_time_ms 30000, then write_stdin polls with empty chars until the process exits; codex-rs rust-v0.160.0
  unified_exec/mod.rs L73-77, shell_spec.rs L117-154); blocks regenerated, top-rule hash and word count updated.
- Skills change 5: --apply reads the account's remote plugin cache and adds one [[skills.config]] name rule per
  plugin skill (<manifest name>:<frontmatter name>, as Codex qualifies it) and an off switch per plugin MCP server
  (map piece step/codex-remote-plugin-rules); arrays of tables are written as [[...]] items and the merge adds the
  render's rules a file lacks after its own, refusing an inline array.
- Code-search change 1: a real --apply refuses while consensus.json wave2.acknowledgements_owed names a family and
  the render wires an interim install; a dry run says so.
- Map entry for ai-memory's Codex hook trust and recipes/README.md:145 amended for the X10 route.
- Record tables and counts regenerated (385 pieces).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ontext-mode auto-update check, wave-2 docs

Review of the wave-2 records branch, 2026-10-03 (one repair round):

- Code-search change 1 gate: install.sh's interim_acknowledged reads wave2.acknowledgements_owed from
  consensus.json with jq and refuses while it names a family; each interim row's install function calls it first,
  and check_plan.py fails a plan whose interim function does not. Recorded in the layer-consensus record, Wave 2.
- memory-owner (memory changes 12-13, synthesis X10/X11): ai-memory's own `install-hooks --agent codex --apply`
  writes its seven Codex hooks once (the X11 exception: the builder writes no ~/.codex/hooks.json); the post-install
  check reads the seven events back from hooks.json (ai-memory 7580b74d docs/install.md L118-121, L593-595;
  install_hooks.rs L2071-2093; render_shared.rs L907-915). The row note no longer forbids it; trust per X10.
- context-supply (context change 17): the notes say why the default-head route stays behind the compare gate, and
  the acceptance checks that marketplace auto-update is off (code.claude.com/docs/en/plugins/loading).
- The assembler resolves an owner decision's relayed_by in the hashed record it names and requires the entry to
  name the slot or the owner, dated as the authority; the browser hold is enforced by the record.
- Tests: check_plan.py mutations (interim not installed, owner not the interim's, gate missing) and the gate itself
  against scratch consensus files; six new assembler refusals.
- SOURCES.md, README.md and VALIDATION.md gain Wave 2 sections; counts are 70/42/3/25; the OmniRoute env line is
  exported with set -a; the DeerFlow Compose route is marked superseded.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
… shape for both acknowledgement gates

- with_remote_plugin_rules writes enabled = false on each remote plugin table it touches. Read at rust-v0.160.0: a
  local [plugins."<id>"] table defaults enabled to true (config/src/types.rs L1004-1006), a local entry the synced
  remote list lacks stays as configured (core-plugins/src/loader.rs merge_configured_plugins_with_remote_installed),
  and load_plugin loads an enabled entry whose bundle is cached, so a table with only the MCP server switch would turn
  on a cached plugin the account no longer installs. Docstring and the client-configuration record now say so.
- install.sh's interim_acknowledged refuses a list holding an empty name, as owed_acknowledgements does; the bash test
  covers the same inputs as the builder's ({} and [""] added).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
… and repository pairs its record lists

The Codex root lane's source read of b6828c7 (finding 1, P2): relayed_decision took a mention of the slot or the
repository's last part anywhere in the relayed decision's text for the owner's authority, so a browser interim for
crawl4ai, which owner_decisions[0] names only as a candidate the kept browser hold measures first, was admitted.

- wave2-records.json: each owner_decisions entry gains `authorizes`, the exact slot and repository pairs its decision
  installs or puts to use, under the decision's own verb (memory-owner akitaonrails/ai-memory and code-search
  MinishLab/semble by `install` in [0]; context-supply mksglu/context-mode by `use` in [1]); the method says the
  coordinator structures it and that a kept hold is in no list. Its sha256 moves to c091152f... in consensus.json's
  four references; definitive-manifest.json and the handbook are regenerated (hash fields only), and the handbook
  receipt's two output digests follow them (generator, profile and inventory unchanged).
- assemble_manifest.py relayed_decision: after the mention and before the date check, the entry must list the
  interim's slot and repository (norm) under an action in AUTHORIZING_ACTIONS ("install", "use").
- Tests: two refusal cases in test_the_assembler_refuses_an_interim_outside_the_rule (crawl4ai on playwright-cli; an
  authorized repository in another authorized slot) and test_an_owner_decision_authorizes_only_the_exact_pairs_its_
  record_lists (each recorded interim is a listed pair; the old input refused; scratch-record grants missing, of
  another action, slot or repository refused; the unchanged entry admitted). controls.py gains the crawl4ai case.
  Negative control: the b6828c7 assembler accepts both new inputs (run once against its blob).
- The layer-consensus decision record and the consensus folder's README state the rule.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ule list, refused as inline, never a kept conflict

The Codex root lane's source read of b6828c7 (finding 2, P2): with a valid existing `[skills] config = []`,
is_table_array([]) is false, so plan_merge kept the render's skill-installer and remote-plugin disable rules out as an
ordinary conflict and the step ended `merged with conflicts kept` without them.

- plan_merge: an existing empty list counts as a rule list, so the render's rules are planned as appends after the
  file's own (none), not as a conflict. TOML writes an empty array only inline and TOML 1.0 forbids adding [[...]]
  items to a statically defined array, even an empty one, so merge_toml_text reaches its existing inline-array
  refusal and nothing is written; the message adds that removing the empty key is enough. is_table_array is
  unchanged, so the writer still writes an empty list as `key = []`.
- The remote-plugin line says the rules and off switches are planned and in place once the codex-config step has
  written and read them back, instead of "turned off" before any write.
- Test test_an_existing_rule_list_gains_the_rules_or_is_refused_and_an_empty_one_is_never_kept_as_a_conflict: the
  plan for the empty and the non-empty list (appends, no conflict, the merged list), the empty file refused with the
  file unchanged and no conflict reported, the same file without the key gaining both rules, and a non-empty array of
  tables extended after its own rule with every line kept. Negative control: against the b6828c7 blob the empty plan
  is a conflict with no appends and the apply exits 0 without the rules.
- The usage text and the client-configuration decision record say so.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…wn folder with no shared same-name entry

The Codex root lane's source read of b6828c7 (finding 3, P2): classify_skill returned ok for a global copy entry from
the pinned SKILL.md bytes and the lock entry alone, so --check-only, which the install plan's smoke check runs, passed
a Claude entry that is a link onto the shared folder, or a real copy beside a same-name entry in ~/.agents/skills,
where Codex loads skills; scripts/skills_status.py fails both layouts.

- copy_placement_problem: the Claude entry must not be a link, and the shared canonical folder must hold no entry of
  the name (os.path.lexists, as skills_status.py reads it). classify_skill returns 'misplaced' for either, before the
  lock and bytes are read.
- process_skill refuses 'misplaced' in every mode (--check-only, --dry-run and --force included), names the path and
  the condition, runs no add or remove and deletes nothing; the exit status is 1.
- Test test_a_copy_is_ok_only_as_claude_codes_own_folder_with_no_shared_entry: the same pinned bytes and lock entry in
  four layouts; a real Claude folder is ok (the positive control); a link, a shared same-name folder and a dangling
  shared link are misplaced in all four modes with the home unchanged and no add or remove. Negative control: against
  the b6828c7 blob all twelve misplaced subcases return ok with exit 0.
- The module docstring, the --check-only help, adoption/skills/lifecycle.md and the skills decision record's wave-2
  addendum say so.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ollows the Codex home

Review thread "Resolve the bundled skill path from CODEX_HOME" (chatgpt-codex-connector on b6828c7): the rule
path = "${HOME}/.codex/skills/.system/skill-installer/SKILL.md" missed Codex's bundled copy wherever the Codex home is
not ~/.codex. codex_home.py (L250) writes the rendered config into $CODEX_HOME/config.toml when CODEX_HOME is set
(apply_codex_lane.py L457 resolves the same home), and bootstrap-linux.sh (L994-995) runs codex_home.py without
--codex-home, so on such a host the bundled skill-installer stayed on. new_wsl_client_config.py refuses CODEX_HOME for a real run (L1951-1955) and writes
<home>/.codex (L1981), so the new distribution's route was not affected.

- adoption/templates/codex.config.template.toml: path = "skills/.system/skill-installer/SKILL.md". Codex installs its
  bundled skills in <Codex home>/skills/.system (openai/codex rust-v0.160.0 codex-rs/skills/src/lib.rs L62-69) and
  resolves a relative path in the user config.toml against that file's folder (config/src/loader/mod.rs L557,
  L573-582, L1424-1445; utils/absolute-path/src/lib.rs L392-405). The same functions are at rust-v0.159.3 and
  rust-v0.155.1 (loader L584, L609, L1443 there). scripts/skills_status.py codex_rule_path already models this
  resolution. No new render placeholder: render_config.py, the host value files and the bootstrap are unchanged.
- tests/test_render_config.py test_the_bundled_skill_installer_rule_follows_the_codex_home: the rendered rule is
  relative and resolves under ~/.codex and under another Codex home. Planted negative: the earlier absolute form,
  resolved the same way, misses the other home (checked against this branch's previous template: False).
- tests/test_new_wsl_client_config.py: the three applied-config expectations take the relative rule.

Local probe (this host, codex-cli 0.159.3, the Linux pin; app-server skills/list with a scratch HOME and a scratch
CODEX_HOME that is not HOME/.codex, one rule in its config.toml; output not retained as a receipt):
  no rule                          -> skill-installer enabled true
  path = "skills/.system/..."      -> enabled false (and false with CODEX_HOME unset, config in HOME/.codex)
  path = "<HOME>/.codex/skills/..." -> enabled true (the reported defect)
The destination pins 0.160.0, whose files above are the same functions; that version was not run.

Caveat: when a whole user config.toml fails ConfigToml typing, the loader keeps it unresolved (loader L1430-1433)
and skill_config_rules_from_stack then skips that file's [[skills.config]] rules as invalid (skills_config.rs
L163-168); an absolute rule does not depend on that typing.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…terval 5, accept the configured command

Review thread "Run claude-hud setup before wiring its copied launcher" (chatgpt-codex-connector on b6828c7): the
statusline row stopped after the plugin install, but the status line the client configuration renders,
'<mise node>' '<config dir>/plugins/claude-hud/statusline.mjs' (adoption/new-wsl/client-config-map.json L205), names
the launcher that only upstream's helper copies there (jarrodwatts/claude-hud@75683c6d scripts/setup.mjs L69-80), and
the acceptance ran the cached scripts/statusline.mjs directly, so it passed while Claude Code's configured status line
had no file to run. The wave-2 usage ruling (wave2-records.json, layers.analytics-statusline, changes 3 and 4) already
says automation runs the helper without prompts; the row's notes left it to a step outside the plan.

- install.sh statusline() and install-plan.json commands: two commands after the plugin install. (1) In the one cached
  0.10.0 (refused with none, or with 0.10.0 in two marketplaces), under the first of bun and node on PATH
  (commands/setup.md L24; mise's Node here), `setup.mjs inspect --shell posix`, then `install --shell posix`
  (setup.md L35 and L58): install copies the launcher, backs up settings.json and writes statusLine (setup.mjs
  L69-101). (2) refreshInterval 5 when the statusLine has none (code.claude.com statusline.md L69): setup.mjs keeps
  earlier statusLine keys only when they were claude-hud's (L94), and the client configuration's apply keeps a
  statusLine the file has (keep_existing), so nothing else would add it. Written to the real file behind a link, its
  mode kept, through a temporary file in the same folder.
- accept.sh and install-plan.json acceptance: the configured statusLine.command, run through bash as Claude Code runs
  it (setup.md L10), with upstream's sample input (L72) must print two lines; statusLine.type command,
  refreshInterval 5, the command naming the copied launcher, that copy equal to 0.10.0's scripts/statusline.mjs and
  one cached version. The name check sits in the last [[ ]], so it does not rest on errexit.
- Row notes, README.md, SOURCES.md and VALIDATION.md (check_plan.py: 87 commands, 62 acceptance entries); the plan's
  and owners.json's revised_at_utc.
- tests/test_new_wsl_definitive_defaults.py StatuslineInstallAndAcceptance runs the row's own strings with a scratch
  HOME, links to the system tools and a stand-in runtime: the helper's calls and its three refusals; refreshInterval
  added only when absent, through a link, mode kept; the acceptance passes the wired state and fails each planted
  condition (the copied launcher missing, no or another refreshInterval, another version's copy, a second cached
  version, a command that runs the cached launcher). Negative control: on the missing-copy fixture the acceptance as it
  was (this branch before the change) exits 0; the new one exits 2.

Not run: upstream's helper and launcher, and anything on a distribution; the row stays UNRUN.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…the relative path

Follows e622dcb (the rule follows the Codex home): ListingBudgetTemplateTests read the template's one
[[skills.config]] rule as the earlier ${HOME}/.codex/... string, and the acceptance run of the seven unittest modules
failed it (1 of 502). It now expects path = "skills/.system/skill-installer/SKILL.md" and names the test that resolves
it under any Codex home.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…le protocol)

The branch's last commit, by docs/lanes.md's hot-file protocol, on origin/main ecea286: main's manifest, with the
54 files this branch changes that main's manifest lists re-registered through host_receipts.register_file, and the
branch's one new evidence file, evidence/artifacts/new-wsl-layer-consensus-20261002/wave2-records.json, registered (55
entries; no entry removed; receipts[] and convergence_records[] as main has them). It replaces 42c43b3 (the same
registration on 4ced292, before the two review repairs), so the manifest change sits in the last commit only. Against
42c43b3's set, two entries are new: adoption/skills/lifecycle.md (main's manifest lists it now) and
tests/test_render_config.py (changed by the review repair).

main's files[] at ecea286 is out of order at one entry (docs/decisions/2026-10-03-omniroute-sdk-worker-0160.md after
docs/decisions/2026-10-03-retire-pr320-loki-denominator-host-receipts.md; read from origin/main's file), and
scripts/validate.py refused this registration for it ("files[] must be sorted by path"); scripts/evidence_manifest.py
--write sorted it, moving that one entry and changing no entry's fields.

component_matrix.py and new_host_grand_list.py were rewritten and are unchanged. validate.py passed (9498 hashed files,
191 receipts).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@seathatflowsinourveins
seathatflowsinourveins force-pushed the foundation/new-wsl-wave2-records-20261003 branch from 42c43b3 to 99a2e3c Compare October 3, 2026 16:45
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Exact-head FINDINGS on 99a2e3c635b14cc3d33f762c685769e749b87458, from accepted 42c43b36e5d925928d2b6bd0d8377bb9312d1544, against main/base ecea28654a835fff2cc3651bab77ca0e46b9bec5.

P2 — the HUD installer and acceptance disagree about an existing refresh interval. install.sh:331 sets five seconds only when the value is absent. The pinned upstream helper preserves existing HUD keys. An existing interval of three therefore survives installation, but accept.sh:362 requires exactly five and rejects the resulting configuration.

The committed fixtures confirm both halves of this source counterexample: the install test preserves three and expects exit 0, while the acceptance test rejects three. Align the acceptance check with the recorded “five when absent” preservation contract, and cover the installed configuration passing through acceptance. This finding was established from source; I did not execute a fixture or read/write any client configuration.

The original three connector concerns otherwise have a bounded repair path: the misplaced skill-copy refusal is unchanged from the accepted head; HUD setup now invokes the maintained helper and tests the configured copied launcher; the Codex rule uses a relative skill path, supported by the pinned config-directory resolution. The relative-path change is source-supported; the owner-reported scratch native read and destination qualification were not independently executed in this review.

Custody: I verified 30 complete repository originals, eight pinned upstream originals and all 46 native stream pairs. There were 45 native exits 0 and one retained malformed GraphQL query exit 1, followed by its corrected capture. The delta has 79 exact main carries and 14 owned modifications; 62 other paths retain their accepted Git identities. Foreign Git identities and 9,443 foreign registry row values, 191 receipts, 29 convergence records and unowned metadata are preserved. The identified adjacent decision-row swap is the explicitly accepted #666 normalization. The client-config test is unregistered at old, main and new; no new omission is introduced. Recheck actual-main preservation/sortedness and required current-head gates at landing. Source findings do not supply native installation or lifecycle acceptance.

Scout and others added 2 commits October 3, 2026 13:31
…, any positive integer

Review of 99a2e3c (P2): install.sh adds refreshInterval 5 only when absent, and
claude-hud's helper keeps an earlier claude-hud statusLine with its keys
(jarrodwatts/claude-hud@75683c6d scripts/setup.mjs L94), so an earlier 3 survives
installation, while accept.sh required exactly 5 and rejected that configuration.

- accept.sh and the row's acceptance command in install-plan.json: the interval
  check takes a present integer of at least 1, the type and minimum of
  statusLine.refreshInterval in the settings schema the Claude Code settings page
  names (SchemaStore/schemastore@de76181a src/schemas/json/claude-code-settings.json
  L2454; code.claude.com/docs/en/statusline.md L69, "The minimum is 1"). It still
  fails an absent, non-numeric, zero or negative value. The copied-launcher,
  version, single-cache and command-names-the-copy checks are unchanged.
- tests: install then acceptance on one scratch home pass with 5 added when absent
  and with an earlier 3 kept byte-identical; the planted negatives now cover an
  absent, non-numeric, quoted, zero, negative and fractional interval, with the
  four other planted conditions kept; a negative control runs the exact-5 check
  from 99a2e3c on the same run (exit 1 for the kept 3, 0 for the added 5).
- install-plan.json notes, VALIDATION.md and SOURCES.md state the acceptance
  requirement as a positive integer; README.md describes only the install (5 when
  absent) and is unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…json (hot-file protocol)

Re-registered with host_receipts.register_file, in place, sorted order kept:
the install plan's accept.sh, install-plan.json, SOURCES.md and VALIDATION.md,
and tests/test_new_wsl_definitive_defaults.py. component_matrix.py --check and
new_host_grand_list.py --check pass, so neither report is rewritten.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

SOURCE ACCEPT at 2f5d8b0103185017cd4372289ef554a3b7534331 for the bounded repair of root P2 finding 5971506565. Root reused the accepted unchanged prior sources and independently read the complete 99a2e3c635b14cc3d33f762c685769e749b87458 → this head delta.

Acceptance at line 362 and the plan's matching command now take an integer refresh interval of at least 1. They preserve the installed earlier value instead of requiring exactly 5. This matches the unchanged claude-hud installer preservation rule and the newly bound SchemaStore type/minimum. Schema/source consistency is not a new installed-client test.

The fixtures exercise the install steps and acceptance on the same scratch home, with planted helper writes and a stand-in runtime: absent interval becomes 5; existing 3 remains 3 and passes. The old exact-five predicate is retained as a negative control rejecting preserved 3. Invalid/missing intervals, launcher mismatch/missing copy, a second cached version and the cached-launcher route remain negative cases. Root verified the AST outside StatuslineInstallAndAcceptance is unchanged. These are locally authored fixtures, not upstream/native host acceptance; owner-reported six passing fixtures and prior failure/skip evidence remain reports, and no test was rerun here.

Root independently bound all 48 capsule files, all six complete current source Git/SHA originals, the prior originals/unchanged installer and the new complete pinned schema. All 13 retained native capture stream pairs are exact and returned 0. The plan JSON changes only the statusline acceptance command and notes. Registry roster/order remains 9,498 rows with exactly five matching payload rehashes; 191 receipts and 29 convergence records are unchanged. All 9,443 foreign main row values/memberships are preserved. The inherited two-row sorting difference from main is the already reviewed #666 normalization, not a new repair deletion or rewrite.

At the dated 17:50:56Z gate observation, base/main is ecea28654a835fff2cc3651bab77ca0e46b9bec5; six required checks passed, Linux validation was IN_PROGRESS and macOS was QUEUED. This source verdict closes the named P2; it does not claim completed CI, NativeStack2604 installation or any new model/default measurement.

…otocol)

#647 settled local-generation-model and embedding-model by their preregistered
measurement; this branch adds the wave-2 records, interim installs, statusline
and the client-configuration map. Both survive. 15 paths conflicted.

Regenerated with the repository's generators, not hand-merged:
- definitive-manifest.json: evidence/artifacts/new-wsl-definitive-defaults-20261001/assemble_manifest.py
  (90 slots, 31 definitive, installed 59, interim 3; by_state resolved 23,
  measurement 6, split 5; consensus 6), then --check.
- docs/decisions/2026-10-01-new-wsl-definitive-defaults.md: its only conflict was
  inside the generated tables; render_tables.py --write, then --check.
- docs/new-wsl-handbook.json and .md: scripts/build_new_wsl_handbook.py --write.
- evidence/artifacts/new-wsl-handbook-20261001/receipt.json: no generator writes
  it; the two output digests come from the builder's own digest function (as
  --write printed them); generator, profile and inventory were unchanged.

Hand-merged, keeping both sides:
- install.sh: both header notes; both functions (interim_acknowledged,
  model_server_answers); --list takes this branch's code-search line and main's
  embedding-model line; the dispatch loops take this branch's selected lists and
  main's named-only list (local-generation-model, embedding-model).
- accept.sh: both header notes; the skipped-slot loop drops all five rows that
  now install (code-search, memory-owner, context-supply, embedding-model,
  local-generation-model), in plan order.
- install-plan.json, owners.json: revised_at_utc set to the merge's time
  (2026-10-03T18:26:54Z); the plan's status keeps main's sentence, then this
  branch's. Rows auto-merged (disjoint: 13 rows here, 3 there).
- README.md: counts from the merged plan (70 rows: 44 installed, 42 by the
  default run with three interims and two only when named, 3 measurement-only,
  23 not installed; post_install 28/15/1, service 10, after sign-in 7; route
  counts with model-server 2); the default-run rule keeps the interim clause
  and main's named-only sentence.
- README.md, SOURCES.md, VALIDATION.md: both new sections, in the order written
  (the local-model sections first written 05:25Z, wave 2 at 10:16Z), which
  VALIDATION's opening line requires. VALIDATION's opening line now says 70
  rows and names the Wave 2 section, and Wave 2's checks list records the
  merged plan's check_plan.py line.
- tests/test_new_wsl_client_config.py: 44 planned rows.
- tests/test_new_wsl_definitive_defaults.py: the merged counts above; both
  sides' test classes (StatuslineInstallAndAcceptance; LocalModelAcceptance,
  ModelServerGuard).

manifests/evidence.json: 54a96ff's copy (git checkout --theirs), then
host_receipts.register_file for the branch's 55 registered files (17 of them
re-hashed by this merge); receipts[] and convergence_records[] are main's.
component_matrix.py --write and new_host_grand_list.py --write change nothing;
scripts/validate.py passes (9542 hashed files).

check_plan.py: OK: 70 rows: 44 installed (42 by the default run, 2 only when
named), 3 measurement-only, 23 not installed; 94 commands and 66 acceptance
entries agree with the scripts. bash -n install.sh and accept.sh: exit 0.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Codex root — FINDINGS at 06f6259f7d9e3199283523c883de9559c20cd7f5, bounded CI/source-carry review. Historical failure belongs to 2f5d8b0103185017cd4372289ef554a3b7534331: run 37141171758, job 111255745857. Its complete native CI artifact reports 10,003 tests, four failures and 1,331 skips. I am not attributing that result to the refreshed head or claiming its new checks have finished.

  1. Three positive statusline fixture cases remain unresolved in source. The historical refresh-interval 5/1/3 cases returned 1 with empty stderr. At the reviewed head, the complete StatuslineInstallAndAcceptance class is unchanged apart from its location (current test); the complete claude-hud owner row also carries. Its acceptance predicate compares the wc -l count using string == 1. Padded output such as 1 fails that predicate despite one installed version. Apple's pinned wc implementation supplies a width-seven line-count format; the actual runner's wc build/output was not recorded, so this is a source-supported explanation, not a measured macOS reproduction. Please make the exact-one check numeric or explicitly normalize the count, retain the other acceptance conditions, and regenerate its bound plan/runner evidence. The selected maintained integration source remains claude-hud setup at 75683c6.

  2. The scrubbed research fixture still lacks its timer dependency. The historical result is literal exit 127, env: timeout: No such file or directory. The complete wrapper, fixture and workflow are byte-identical to the failed head. The child PATH is /usr/bin:/bin; line 91 invokes bare timeout, while the fixture provisions Python/config/CLI but no timer. Resolve and qualify the supported timer explicitly for the scrubbed child and fixture, preserving the watchdog and environment isolation. A parent PATH change alone cannot supply it inside this child.

  3. Actual merge preservation still needs its final check. Against captured main cac8700ba914950266272347468bff7ad630a4bf, all 9,487 foreign registry paths keep their projected order and all 193 receipts/29 convergence records are exact, but three foreign tuples differ: docs/community-native-practice.md, docs/harness-defaults.md, docs/token-session-handbook.md. This is a branch snapshot gap, not evidence of deletion in a future merge. Under the disjoint-drift rule, verify the actual prospective merge tree preserves those current-main tuples and payloads before landing; no automatic rebase is requested.

Root independently verified 52 captured native acquisitions (all exit 0), 104 original stream bindings, 38 complete changed/overlapping Git bodies, the ten old/current CI-source identities, the complete statusline class/owner-row equality and full foreign-registry projection. Private source custody: CODEX-PR659-06F-DELTA-20261003-ww4w29lb/manifest-CODEX-v1.json, SHA256 6f481cfc6f561aea9da85e5566c530d59657a2704a3c99ccb2665ec829297818. The original failing run and failed acquisition/recovery records remain retained. No new macOS test, provider/model run, installation, default qualification or Claude-owned edit was performed by this review.

Scout and others added 3 commits October 3, 2026 15:42
…, as BSD wc pads it

Codex root review of 06f6259, finding 1 (macOS CI run 37141171758, job
111255745857, at 2f5d8b0: the wired state with refreshInterval 5, 1 and 3
exited 1 with an empty stderr). The acceptance compared the `wc -l` count of
cached claude-hud versions with the string `1`; BSD and macOS wc print the
count as " %7ju" (apple-oss-distributions/text_cmds@592aaf8a wc/wc.c
L214-215), so one installed version read "       1" and failed.

- accept.sh (statusline, L385) and the row's acceptance command in
  install-plan.json: `"$versions" -eq 1`, an arithmetic comparison inside
  [[ ]], instead of `== 1`. The other conditions are unchanged. The other
  `wc -l` counts in these files were already numeric and are unchanged:
  `"$lines" -ge 2` (statusline) and `"$refs" -ge 5` (research-harnesses,
  after_sign_in); install.sh has none. The check's comment cites wc.c.
- tests: a stand-in wc that counts with the system one and prints the bare
  (GNU) or the padded (BSD) format; the acceptance passes the wired state
  with refreshInterval 5, 1 and 3 in both formats and fails a second cached
  version in both. Negative control: the string check as it was at 06f6259
  passes the bare count and fails the padded one.
- SOURCES.md and VALIDATION.md record the source and the checks. No macOS
  host ran these; the padded format is the stand-in's.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…losed without one

Codex root review of 06f6259, finding 2 (macOS CI run 37141171758: exit
127, "env: timeout: No such file or directory"). gpt_researcher.sh ran a
bare `timeout` inside its env -i child, whose PATH is /usr/bin:/bin; macOS
has no timeout there, and a parent PATH change cannot reach that child.

- gpt_researcher.sh: the timer is resolved in the parent, before the run
  directory and the scrub, with `type -P` (a PATH search for an executable
  file only): GNU coreutils' timeout, else gtimeout, the name Homebrew's
  coreutils gives it on macOS; a relative result is anchored to $PWD. The
  scrubbed child runs it by absolute path with the same 1500 seconds; the
  child's environment and PATH are unchanged. With neither timer, the
  research run stops with exit 1 and a message naming both, after the
  preflight and before the CLI starts; --preflight-only needs no timer.
- tests/test_research_entry.py: the fixture finds the host timer the same
  way and puts first on the wrapper's PATH a `timeout` that records its
  arguments and runs that timer; the run test checks the CLI ran under it,
  by absolute path, with 1500. It skips, with the reason stated, only where
  no supported timer exists: the GitHub runner image of the macos-15 label
  lists no coreutils, timeout or gtimeout (actions/runner-images README.md
  L34 at a99056ad; images/macos/macos-15-arm64-Readme.md at f95c0c79 and
  images/macos/macos-15-Readme.md at 07cc2190). Negative control: with a
  PATH of only bash, env, dirname, date and install, the run exits 1, not
  127, names the missing timer, and the CLI never starts.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…(hot-file protocol)

Re-registered with scripts/host_receipts.register_file, on the branch's own
registry: the install plan's accept.sh, install-plan.json, SOURCES.md and
VALIDATION.md, and tests/test_new_wsl_definitive_defaults.py (sha256 and
bytes only; files[] stays sorted and unique, 9,542 paths).
tools/research/gpt_researcher.sh and tests/test_research_entry.py were not
in files[] and stay unregistered.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Codex root verdict: SOURCE ACCEPT for the reviewed repair at exact head 297ac5b9bb8bab37fa25585ab700eab0a79357a1, against captured main 463a57b983eec540ae90eb45c2b1a7c6fc469aed.

The earlier source findings are closed at this head:

  • HUD count: accept.sh L375–389 compares the count numerically (-eq 1). The plugin, version, byte comparison, settings and refresh-interval conditions remain. The relevant pinned sources remain claude-hud 75683c6 and Apple wc 592aaf8. Source inspection and local fixtures are separate from a native macOS run.
  • Research timer: gpt_researcher.sh L35–107 resolves an executable timeout or gtimeout, anchors a relative result before changing directories or scrubbing the environment, and refuses research execution when neither exists. The configuration preflight and 1500-second timer remain distinct. The positive fixture can skip without a timer; that does not establish macOS runtime acceptance.
  • Source carry: native prospective merge against the captured main exited 0, producing tree 32f399140d32734d433c8ba71452acec940796b6. Root independently derived the complete original tree and registry comparisons: all 75 owned nonregistry payload identities match this head; unrelated Git mode/type/OID memberships match main; all 9,508 foreign registry rows retain their content and order; receipts, convergence records and other non-file metadata match main. The resulting registry has 9,563 sorted unique rows. Five changed registered payload bindings match full original bytes; the two unregistered source/test surfaces are declared separately. The raw head's older main-only rows are not treated as deletions.

This closes the source repairs in the earlier 06f findings. I read all changed source originals and independently verified the captured full Git bodies, rather than treating the owner's audit booleans as acceptance.

The historical failing run remains retained. At the repair packet's 19:58Z snapshot, six required checks passed and Linux/macOS validation were still running. Any later CI result needs its own exact-head evidence; the source verdict does not assert a current pass or a new NativeStack2604 install. Runtime host acceptance, upstream test execution and locally authored fixtures retain their separate evidence classes. This review edited no Claude-lane file, client configuration, native sign-in or install state.

Only manifests/evidence.json conflicted: main's registry taken, the 55 PR-owned
rows re-registered with host_receipts.register_file. Two PR-owned files also
changed on main (#649) and merged without conflict: build_args.py and
tests/test_landscape_sweep_harness.py; their rows carry the merged content.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Codex root MERGE FINDINGS / HOLD for head 297ac5b9bb8bab37fa25585ab700eab0a79357a1 against current observed main 6112d14d40f741855f0b961124d98939daaad00e.

All eight required checks are SUCCESS at the 20:25Z native GitHub snapshot, bound to this exact head and GitHub Actions app15368; macOS finished at20:18:06Z. The source repairs remain accepted. Their independently verified native prospective carry was for main463, which is now the parent of #649's actual merge 6112d14.

Fresh native git merge-tree --write-tree --messages -z for exact main611/head297 returned exit 1. Root checked the complete original output: the sole conflicting path is manifests/evidence.json. The first field 6e36f1f5e72f170585640b51257cc97400c5c67e is a conflicted tree and establishes no unrelated-preservation result. Original stdout/stderr and returned exit remain retained. The supported recipe is upstream Git v2.43.0 merge-tree. GitHub DIRTY is a separate observation.

Handoff for the manifest/PR owner: reconcile the shared registry against exact new main, preserving the new-main foreign rows/order, receipts/convergence metadata and reviewed owned payload bindings. Publish the resulting exact head and full original delta for a bounded carry review. The numeric HUD and executable timer fixes need no repeated architecture judgment if their bytes stay unchanged. Root edits none of the Claude-lane paths.

Green checks and prior source acceptance remain distinct from a mergeable current pair and actual NativeStack2604 runtime acceptance. No active-input exception, relock, lock relocation, install, sign-in, default transition or workload was performed by this review.

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Exact-head Codex SOURCE CARRY ACCEPT WITH RETAINED RESIDUALS on 3e3a7c43f441acb2c356875193acad70aadd9af2, against main 6112d14d40f741855f0b961124d98939daaad00e.

All 75 owned branch patches retain exactly the same ordered added/removed lines as reviewed 297ac5b9bb8bab37fa25585ab700eab0a79357a1; 73 payload Git memberships are unchanged. The two moved payloads, tools/sota-convergence/landscape-sweep/build_args.py and tests/test_landscape_sweep_harness.py, incorporate main #649's additions while preserving the reviewed branch patches. I checked their complete old/new/main bodies and Git bindings, rather than assuming their OIDs unchanged. The prior numeric HUD/executable research-timer repair verdict carries, including its native-host test/skip and prerequisite-versus-CLI limits. No new branch behavior was found in this bounded delta.

The prior main611 conflict is repaired for this exact pair: native prospective merge-tree returned 0, tree d7c0ced6d63f09d32fbdf62b1748937189590dff, equal to the new head's complete tree. From full originals I independently verified all 75 owned memberships, 10,196 foreign Git memberships, 9,509 foreign registry rows and order, and every nonfiles field, including 193 receipts/29 convergence records. Complete API/Git rosters agree. All 55 registered payload bindings match; 20 unregistered paths retain their previously reviewed status. The older297/main611 exit1 remains retained; its conflict findings are superseded for this new pair only.

Source custody: 50 native acquisitions/prospective commands all exit0; all 100 full original streams, 10 changed captured blobs plus the reused full main registry, and five commit objects independently checked. Source/prospective acceptance does not establish required current-head CI or an actual merge. No tests, provider/model experiment, service/configuration change, freeze, default selection or merge were performed by this review. Existing failed conditions and host/provider qualification limits remain intact.

This verdict follows the user's original goal and assumes no CC/fallback task authority. No Claude-owned paths or credential/auth files/values were edited/read/copied. Owner independent-family conditions remain separate from this source carry.

@seathatflowsinourveins
seathatflowsinourveins merged commit ee4ece2 into main Oct 3, 2026
25 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the foundation/new-wsl-wave2-records-20261003 branch October 3, 2026 21:43
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Actual landing source ACCEPT for #659: accepted head 3e3a7c43f441acb2c356875193acad70aadd9af2 landed as ee4ece2e849af6689e005b9ec7b786f331d867bb, whose actual sole parent is 3bf53936a4598933a07284007266864d08da7b58.

I independently checked the actual parent/landed/accepted Git trees and full registries. All 75 landed payload membership tuples equal the previously accepted exact head. All 10,196 foreign Git memberships, 9,509 full foreign registry rows in order, and every non-files registry field are preserved. The 55 changed registration rows equal the accepted head; the 20 unregistered payload paths retain their prior status. The 21:49:00Z public observation reports the merge at 21:43:46Z and all eight required contexts passing.

This verifies landed source carry. Host application, NativeStack2604 installation, actual model delivery, both comparison measurements and complete SDK role qualification retain their existing gates. Root ran no tests, merge, install or runtime trial. A failed initial private shared-clone locator (exit128) and its successful bounded recovery are retained alongside complete Git captures.

seathatflowsinourveins pushed a commit that referenced this pull request Oct 4, 2026
…k is regenerated on top of main's #659 version (only this PR's research-state.json input-hash line) and the receipt's two output hashes are refreshed by hand (standing ACK); registry carries main's rows plus the owned bindings

Conflicts: evidence/artifacts/new-wsl-handbook-20261001/receipt.json and
manifests/evidence.json only.

- receipt.json, docs/new-wsl-handbook.md, docs/new-wsl-handbook.json:
  main's copies, then only `python3 scripts/build_new_wsl_handbook.py
  --write` (exit 0). Against main the outputs differ only in the
  catalogs/landscape/research-state.json input-hash line; that file is the
  only one of the generator's 38 sources this PR changes. The receipt's two
  `outputs` hash lines were refreshed by hand to the regenerated files'
  sha256 (json dbe33bcd..., md 79030729...); nothing else in the receipt
  changed.
- docs/harness-defaults.md: auto-merged; main's three 2026-10-03
  anti-pattern rows land at the table top and #641's two rows keep their
  accepted position below main's #648 row, byte-identical to the
  ACCEPTed head's +/- lines.
- manifests/evidence.json: main's copy with the ten owned files
  re-registered through host_receipts.register_file (hot-file protocol).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
seathatflowsinourveins pushed a commit that referenced this pull request Oct 4, 2026
After main's #659 the user template carries [[skills.config]], an array of
tables. This PR's strict-config native test re-emits the rendered template
through emit_toml to register a working fixture Serena, and the writer wrote
the list as JSON objects, which Codex rejects ("Error loading config.toml",
line 17 column 18); main's own copy of the test writes the rendered text
directly, so the failure appeared only on the merge of main into this branch.

The writer now emits a list of tables as [[...]] blocks after the table's
key-value pairs. A structural guard round-trips the rendered user template and
a nested case through emit_toml: failing first against the unchanged writer
(Ran 1, FAILED errors=2), passing after (Ran 1, OK); the native test passes
again against codex-cli 0.159.3 (Ran 1, OK).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
seathatflowsinourveins pushed a commit that referenced this pull request Oct 4, 2026
Refresh onto main e7c297e (20 commits after 1f5a791, through #665), by the
round-4 method and the hot-file protocol (docs/lanes.md):

- .gitattributes: both sides kept. Main's codex-client-check entry comes first, then this branch's two
  exec-help entries at the end. No pattern repeats or contradicts another.
- docs/new-wsl-handbook.{md,json} and the handbook receipt: main's copies (#659) are the base, then
  python3 scripts/build_new_wsl_handbook.py --write. In the receipt only profile_sha256 and the two outputs
  hashes change, to this branch's profile and the regenerated files. generator_sha256 stays main's a78239b6...,
  which is the hash of the unchanged generator.
- manifests/evidence.json: main's copy, with this branch's receipts[] row runtime-sdk-20261003 appended. The two
  grand-list outputs are re-registered by new_host_grand_list.py --write, and this branch's other 85 files by
  host_receipts.register_file from the merged tree. Main's 9,658 other rows are unchanged and in main's order.
- manifests/stack.json and observability/grand-dashboard/state.json: main has not changed them since
  1f5a791, so this branch's copies stand.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
seathatflowsinourveins added a commit that referenced this pull request Oct 4, 2026
* fix(codex): require Serena before the worker's first turn

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* chore(evidence): register the Serena startup port

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix(codex): repair round on the Serena startup port after independent review

Port #436's lane-home key-filter assertion and comment; record the driver's
cleanup deviation, the control-profile hashes, the open model_reasoning_summary
knob and the dated rebase resolution; cite mod.rs:4343-4346; document the
dry run's required-serena read-back; reflow two broken sentences.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* chore(evidence): re-register the Serena startup port after the repair round

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Codex lane: read back Serena's effective enabled and required; qualify the first-turn promise (P2 on #674)

Codex waits only for MCP servers whose effective enabled and required are both
true (openai/codex@a956835d, rust-v0.160.0:
codex-rs/codex-mcp/src/connection_manager.rs:270-275), and a permitted cached
start-up satisfies the wait without a live connection
(connection_manager/required.rs:29-35). Both files are byte-identical at
rust-v0.159.3.

- apply_codex_lane.py: the read-back records Serena's effective enabled and
  disabled_reason (codex -p stack-worker mcp get --json, cli/src/mcp_cmd.rs:
  970-983) and its effective required and startup_readiness, derived from
  config/read's layers plus the installed profile at precedence 21, because no
  command that takes --profile prints them (cli/src/main.rs:1861-1885).
  Validation fails on any recorded lookup error, on a missing read-back, and
  unless Serena is effectively enabled and required; an unreadable source
  reports "unknown" and fails. Existing checks are unchanged.
- Template comment and recipe line: promise only what Codex guarantees, and
  name what lifts the wait (inherited enabled = false, project config, -c).
  The template stays TOML-equal.
- Tests: SerenaReadbackTests (8 tests: inherited enabled = false, required
  missing, recorded lookup error, layer precedence, a failed config/read);
  failing first against the unchanged script (Ran 8, FAILED failures=14),
  passing after (Ran 8, OK). The fake codex now waits only for enabled
  required servers, can fail a named lookup, and can report extra layers.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Registry: re-register the four files of the P2 repair (last commit, hot-file protocol)

host_receipts.register_file for adoption/templates/codex.stack-worker.config.toml,
recipes/README.md, tests/test_codex_worker_lane.py and
tools/adoption/apply_codex_lane.py. component_matrix.py --write and
new_host_grand_list.py --write changed nothing; validate.py and
evidence_manifest.py --check pass (9,564 files). Only these four files[] rows
changed; receipts[] and convergence_records[] are unchanged, and no
convergence record pins a changed path.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Worker-lane tests: emit arrays of tables in the fixture TOML writer

After main's #659 the user template carries [[skills.config]], an array of
tables. This PR's strict-config native test re-emits the rendered template
through emit_toml to register a working fixture Serena, and the writer wrote
the list as JSON objects, which Codex rejects ("Error loading config.toml",
line 17 column 18); main's own copy of the test writes the rendered text
directly, so the failure appeared only on the merge of main into this branch.

The writer now emits a list of tables as [[...]] blocks after the table's
key-value pairs. A structural guard round-trips the rendered user template and
a nested case through emit_toml: failing first against the unchanged writer
(Ran 1, FAILED errors=2), passing after (Ran 1, OK); the native test passes
again against codex-cli 0.159.3 (Ran 1, OK).

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Registry: re-register the worker-lane tests after the fixture writer fix (last commit)

host_receipts.register_file for tests/test_codex_worker_lane.py; the two
--write generators changed nothing; validate.py and evidence_manifest.py
--check pass (9,692 files). Only that files[] row changed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* New-WSL client config: expectations for Serena's required key (B1, owner Option 2)

The configuration owner approved updating the two expectations, not the code,
and the coordinator ACKed it on 2026-10-04. With this branch's
mcp_servers.serena.required = true merged, the checker counts one more piece,
codex/stack-worker/mcp_servers.serena.required, wired through slot:serena.

- docs/decisions/2026-10-02-new-wsl-client-configuration.md: Decision 2's
  counts become the measured (386, 294, 200, 94, 80, 41, 39, 12), and one dated
  2026-10-04 sentence says why they moved. Decision 14's phrase quotes
  authorization 12 and 80 not wired, which did not move.
- tests/test_new_wsl_client_config.py: the rendered stack-worker serena table
  is {"startup_timeout_sec": 60, "required": True}.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Serena startup port: record the 0.160.0 rerun after #626 (receipt block, addendum resolution)

The pinned codex-cli 0.160.0 (adoption/pins-linux-x86_64.json, wrapper and
linux-x64 tarballs matched by SHA-256 and SHA-512, vendored binary
12eb3e81...) ran in a scratch prefix; the host's default codex stayed 0.159.3.

- CodexIntegrationTests: exit 0, Ran 12, OK (skipped=1, the opt-in trial).
- The preregistered startup trial: exit 0; selection A holds (3/3 delayed
  starts expose Serena, 3/3 failed starts fail before any request).
- Scratch checks (a) parse, (b) fail closed on a nonexistent command and
  (c) the real Serena transport the config template renders returned the
  same results under 0.160.0 and 0.159.3. (b) carries negative controls
  without required = true on the same nonexistent command: they get past
  MCP startup (a completed loopback turn, or the model call on the default
  provider with no credentials), while required = true exits 1 with only
  the required-server error, also when the provider requires auth.

evidence/receipts/codex-serena-startup-port-20261003.json gains the dated
rerun_0160_20261004 block (local_integration, no provider execution, no host
apply) and two appended residual notes; residuals[8] (the driver's
process-group kill) and [9] (a real --dry-run) stay open. The addendum gets a
dated Resolution 2026-10-04 paragraph. No earlier text changed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Registry: re-register the eight PR-owned files on main 6af8e55 (last commit, hot-file protocol)

main's manifests/evidence.json (taken in the merge) plus register_file for
the seven changed files main already lists and the new receipt. The other
9,871 rows and the receipts and convergence_records sections equal main's,
in main's order. component_matrix.py --check and new_host_grand_list.py
--check pass, so neither report needed --write. The two B1 files are not
listed in main's manifest and are not registered.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Registry: re-register the eight PR-owned files on main b629b5b (last commit, hot-file protocol)

main's manifests/evidence.json (taken in the merge) plus register_file for
the seven changed files main already lists and the new receipt. The other
9,874 rows and the receipts and convergence_records sections equal main's,
in main's order. component_matrix.py --check and new_host_grand_list.py
--check pass, so neither report needed --write. The two B1 files are not
listed in main's manifest and are not registered.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: Scout <scout@local>
Co-authored-by: Claude Opus 5.5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant