Repository navigation
feat(server): bounded environment preflight for provider launches - #11
Conversation
Complete E1's launch preflight: probe the Git executable the launch actually resolves for the required --path-format capability, detect an unexpected umbrella repository through effective Git identity (not folder name), bound the narrow root read, and surface findings. Blocker only when the resolved Git cannot start or lacks the capability while the session root is a repository; warn otherwise. Wired before the provider workspace read for both new sessions and recovery, with warnings surfaced through the existing thread-activity transport.
Add a disposable nested-repository fixture that exercises the real resolved Git executable and asserts the warning fires without writing to the root.
…y paths Add new-session and recovery integration coverage and a runner override seam. Only probe a real directory so missing/file workspaces still yield ProviderWorkspaceMissingError.
…al launch proof R1: resolve repository identity with plain `rev-parse --show-toplevel` / `--git-common-dir` (relative common dir resolved against the top level) and never require the optional `--path-format` flag merely to identify the root. The `--path-format` capability is now probed for context only and always warns; the unsupported "T3 Code 2.31.0+" wording is removed. Maintained GitVcsDriver already catches the optional index-reuse failure (~line 901) and rebuilds the temporary index, so a disposable Git that rejects `--path-format` still launches and captures a normal checkpoint (new real-Git regression). R2: the selected instance's configured executable start is exercised through the existing bounded provider spawn/error path (resolveSpawnCommand + real spawn), proving a missing configured executable returns a useful reason before any model work on both new-session and recovery/resume launches — reusing the adapter path instead of duplicating resolution logic. R3: the guard directory stat and the workspace-missing stat are bounded. Umbrella detection now uses exact normalized root identity plus explicit configuration (ServerConfig.cwd) with a canonicalizing realPath so /var vs /private/var aliases compare correctly; child enumeration/counting is removed. A live wall-clock test proves a hung resolved Git finishes within the documented budget and its child is cleaned up. R4: warning delivery keeps the existing thread-activity transport; new integration coverage launches a real configured dummy executable exactly once while the client receives the actionable warning. No push/merge/install. E1/E2 worktrees and unrelated work preserved.
… bound F1: add optional exact-root sharedSessionRoot ServerSettings key (empty/ordinary by default); treat only that exact configured root as shared instead of ServerConfig.cwd; resolve relative git --git-common-dir against the invocation cwd; tests for root/subdir/linked-worktree identity. F2: make Windows spawned-executable resolution asynchronous and interruptible (node:fs/promises) so the preflight bound can interrupt it; strengthen the hung-Git fixture to observe termination of the owned child and descendant PIDs. F3: replace the harmless --path-format warning with a bounded read-only git add --sparse capability check on sparse checkouts.
Carry startup launch-preflight warnings (found before any thread exists) through an in-memory Context.Reference inbox to the first provider session in the same exact root, reusing the existing thread-activity warning transport. No new persistent store, dashboard or settings edit.
…ent delivery - Gate git add --sparse applicability on the selected consumer/operation (OpenCode snapshots require it in ordinary Git repositories) instead of core.sparseCheckout alone; probe read-only with the selected provider env. - Thread the selected provider environment into the preflight so the probe inspects the actual Git the launch resolves, not the host default. - Deliver pre-thread startup notices through the production reporter; keep a pending notice until delivery succeeds and bound the inbox. - Extract the production launch-preflight reporter so server.ts and the acceptance test share one implementation. - Add A3 production-path integration test: real OrchestrationEngine + real subscription observes the launch.preflight activity.
Assert inheritance vs replacement through the real launch construction: the provider instance environment supplies PATH and the sentinel (replacement) while unrelated host variables are inherited, and the selected consumer is passed to the preflight.
…he production path The real configured Grok dummy provider launches exactly once while the production reporter delivers the early warning through a real engine subscription; a missing configured executable still fails before model work.
ENVCHK:P1 RESULTVerdicts: publication PASS; authenticated production WebSocket delivery PASS; browser rendering UNVERIFIED; native Windows UNVERIFIED; live installation NOT PERFORMED (out of scope). No source change was required; the published candidate is untouched. Exact identity
What changed beyond publicationNothing in the repository or the published ref. The only new artifact is one untracked test in the isolated worktree, Actual launch entry points invoking preflight (at
|
|
ENVCHK:MANAGER P1 accepted for publication/wire delivery; three concrete source repairs before final qualificationReviewed PR #11 and all 19 changed-file patches at exact head af3b9c4, with maintained main still f5d3fc6. A narrow independent helper reviewed LaunchPreflight.ts and its tests; the manager reviewed the remaining integration, startup, reporter/inbox, settings, shared resolver, and affected tests, plus the relevant provider runtime configuration paths. This is source review, not a manager rerun of Mac/Windows suites. P1 RESULT materially closes the missing production-wire evidence: actual The original acceptance allowed the production subscription OR rendered client. P1 meets that delivery boundary. DOM/browser rendering remains unobserved, but no separate browser-only gate or agent is added. The smoke test is currently untracked at: R1 — Incomplete checks are silently treated as clean/absent
Required: keep genuine absence distinct from timeout/permission/other failure. Emit a bounded actionable warning for an incomplete relevant check, preserving earlier findings and useful launch. Do not mislabel an unknown capability unsupported, or turn speculative risk into a blocker. Keep missing optional files silent. Surface the initial-cwd failure through the same production reporter. Reuse existing result codes/transport and retain cheap bounds. R2 — Equivalent physical paths produce incorrect Git-root guidanceRoot alone is realpathed at 268; commonDir is resolved lexically from the original invocation cwd at 563–574. Comparing The helper reproduced this branch using published path logic and node:path.posix on Linux with Mac alias strings; this is a pure-path reproduction, not native Mac filesystem execution. Required: consistent bounded identity handling for configured root/cwd, top-level and common directory. Preserve relative common-dir resolution against the invocation cwd. Test the actual message with equivalent path spellings and a genuinely external linked-worktree control. Failed canonicalization must remain unknown, not become affirmative external-repository guidance. Nested repository sessions must remain ordinary. R3 — Production consumer applicability disregards actual OpenCode configurationProviderService 585–604 hardcodes The selected OpenCode adapter passes serverUrl; a nonempty URL takes the external-server branch, without launching local OpenCode. Local PATH evidence cannot establish that external process's Git. Required: derive consumer applicability from the selected production instance/runtime facts, honoring known effective snapshot disablement and external-server ownership. Reuse existing configuration resolution. Do not build a config-discovery framework, recursively search config files, or add a network probe. Preserve default local OpenCode coverage in ordinary repositories and T3's own local Git/fallback behavior. Test settings-driven production construction; another helper test that manually supplies snapshotsEnabled:false does not cover this gap. Documentation/evidence correctionThe PR body says preflight never blocks and leaving sharedSessionRoot unset restores prior behavior. The code can emit git-startup-failed blockers and runs Git/filesystem preflight independent of shared-root opt-in. Correct these descriptions. Unsetting sharedSessionRoot disables that shared-root classification only; source/binary revert is the complete rollout rollback. Describe configured provider-executable failure separately from Git capability checks. CI build/test/check jobs were still queued at this refresh (run); label successes are not test acceptance. Next single writer: ENVCHK:E6The user's standing authority remains in force. No further permission request. This worker owns the narrow repairs and repeatable acceptance on existing #11. Independent final review/native qualification and subsequent landing/rollout remain manager-sequenced work. ENVCHK:E6 — complete fresh-session assignmentStatus: exact source published and production authenticated delivery accepted; R1–R3 require correction; native Windows and live rollout remain open. No merge or installed change by this manager. |
ENVCHK:E6 STARTFresh sole-writer session for the three manager review repairs on this PR. Read the complete manager review and the expanded ENVCHK:E6 assignment (#5866811056), the accepted P1 RESULT, current repository instructions, and applicant T3 lifecycle guidance. Refresh
Scope
Standing user authority remains in force. MACFIX, STALL, service lifecycle and packaging scopes are untouched. No merge, no installed-state change. Posting/reading back on this PR; hub backlink at #237. |
… identity R1: the bounded initial cwd stat, candidate metadata checks and the capability probe now surface one actionable warning when they fail or time out instead of reading as clean/absent. Genuine absence and missing optional files stay silent; total-budget expiry retains prior findings and is never reported clean. The initial cwd check moves into the single preflight implementation so its failure reaches the same production reporter. R2: canonicalize the configured root, top level and resolved common directory consistently so `/var` <-> `/private/var` alias spellings of the same physical root compare equal and give the local-metadata guidance. A canonicalization failure stays unknown instead of becoming affirmative external-repository guidance. Relative common-dir resolution against the invocation cwd and the external linked-worktree protection are retained.
…tings The consumer/operation is now resolved from ServerSettings.providerInstances instead of assuming `snapshotsEnabled: true` for every launch. For the selected OpenCode instance the effective OPENCODE_CONFIG_CONTENT snapshot setting decides whether `git add --sparse` is a provider requirement (an explicit `snapshot:false` suppresses it), and an instance pointed at an external OpenCode server no longer pretends the local Git is that server's Git. Non-OpenCode launches keep T3's own sparse-checkout fallback. Regression coverage drives the real settings/instance construction: consumer selection through the real ProviderService, and a controlled sparse-less Git detected through the real preflight runner on an ordinary repository with default local OpenCode snapshots.
Commit ENVCHK:P1's untracked authenticated production WebSocket smoke as repeatable source: a real `src/bin.ts serve` with isolated settings, supported desktop-bootstrap auth, and the real `orchestration.subscribeThread` client. It asserts the corrected `shared-root-git` warning reaches the subscription, the configured dummy provider starts exactly once, and a missing configured executable surfaces before model work. The prior hardcoded /tmp evidence write is removed; all state is fixture-owned and cleaned up.
ENVCHK:E6 RESULTR1, R2 and R3 are repaired on existing PR #11; P1's wire acceptance is committed as repeatable source and rerun on the corrected head. Original candidate Hub backlink: closura-agent-config#237 Exact identity / preservation
R1 — incomplete checks now warn, absence stays distinct
R2 — equivalent physical paths share identity handling
R3 — consumer applicability from production settings
Preserved and rerun wire acceptance
Commands / exits / timings (this session, macOS x86_64)
Native WindowsUNVERIFIED. Exact missing capability: this session is native macOS only ( CI / remaining gates
RollbackUnsetting |
|
ENVCHK:MANAGER E6 delta reviewed — preserve gains; one native Windows qualification/repair owner nextExact reviewed E6 head: 29a4cdc. Original V5/P1 af3b9c4 is preserved through three ordinary commits. E6 RESULT. The manager read the six-file E6 delta, full committed wire test, consumer helper and production call sites. One narrow independent helper reviewed the two LaunchPreflight files. This is source review; no manager rerun of native suites is claimed. Credit retained
Remaining production-path corrections (not a redesign)W1-A: preserve actual metadata errors through the production adapter. W1-B: incomplete relevant T3 sparse checks must also warn. W1-C: configured-root recognition must reach canonical identity. W1-D: honor the provider's supported inline configuration syntax. These are bounded completions of R1–R3. Do not restart the feature or create separate repair agents. Native Windows and repeatable acceptanceThe asynchronous Windows resolver in Several existing fixtures use The committed wire harness also needs its normal failure cleanup made suitable for this qualification: currently it kills the server in a scope finalizer without awaiting exit, removes state directories in the success body before that finalizer, and bounds only the WS phase (not the entire startup/auth/cleanup attempt). Reuse test support to bound the whole fixture, await owned-process exit, and clean on failure as well as success. Do not turn this into a service manager or use broad process-name killing. Main and release movedMaintained main is now 419f757 after merged release PR #5. The 38-file base delta does not overlap ENVCHK's changed files. Preserve the landed release work in the current qualification candidate through an ordinary base merge; preserve E6's history. Release v0.0.43 is published from 929b637, an older frozen binary source. It is not an ENVCHK build. Do not overwrite/restamp those artifacts or claim that release delivered this PR. Later ENVCHK packaging/rollout must use the accepted source through the existing release mechanism/owner. Current #11 CI build/test/check jobs are queued (run); label jobs are not source/test acceptance. Do not add runners or change CI policy for this task. MACFIX configuration updateUser policy handoff: Dev is the working root; Documents is archive-only. This updates this user's live target, not the product's generic ability to use a Documents folder.
No ENVCHK task is added to repair project selection or write to the Documents archive. MACFIX retains that closeout. Preserve Windows C:\Users\nullstack65\Desktop\projects as the configured non-Git shared root. ENVCHK:W1 — complete fresh native-Windows assignmentStatus: E6 gains preserved; four precise production-path completions and native Windows execution remain; wire acceptance is committed; no ENVCHK merge/install yet. Next user-run fresh worker: ENVCHK:W1. |
|
ENVCHK:MANAGER W1 completion reported; result not yet recoverable from GitHub — fresh W2 will recover once and continue the source workThe user reports that W1 completed. That report is accepted as a reason to look for its output; it is not a substitute for source/test evidence. Refreshed durable state
Handoff correctionMy W1 assignment made native Windows availability a prerequisite to proceeding with source repairs. W2 supersedes that entry requirement. It will make one bounded attempt to recover W1, preserve whatever was completed, and then finish the remaining portable source work on an available supported host. Native Windows is still required to claim native Windows qualification; an unavailable route must not prevent source progress or a durable RESULT. The manager runtime has no exposed T3/SSH/native Windows execution connector. I have not inspected the completed local T3 session or run native tests here. Supported recovery guidance, checked at current config masterThe helper's read-only review refreshed
ENVCHK:W2 — complete fresh recovery and implementation assignmentNext user-run worker: one fresh ENVCHK:W2. Recovery is a short first step; it must not become another round that leaves the source untouched solely because native Windows was unavailable. |
|
ENVCHK:W2 START Fresh coding-agent session on the Windows host (native). Posting START before executor discovery, per assignment. Assignment: ENVCHK:W2 — bounded W1 recovery (<=10 min) + finish the four production corrections + necessary launch-test portability/cleanup + native host qualification if available. One source writer, no helper implementation agents. Host / runtime identity (this environment):
Refreshed durable state (read back now):
Scope boundaries:
Proceeding to the bounded W1 recovery pass. |
ENVCHK:W2 — STARTIdentity: ENVCHK:W2 (fresh coding-agent session, single source writer). Predecessor role: ENVCHK:W1, recovered from GitHub and configured-instance state, never resumed. Actual execution location (verified, not assumed): macOS, Selected toolchain:
Refreshed durable state (this round):
Scope: one bounded W1 recovery pass (≤10 min, GitHub-first across configured Mac/Windows instances, no resume/mutation of any old session); preserve recoverable work; fresh isolated resident worktree from published source; ordinary merge of landed main only; complete the four production corrections W1-A/B/C/D plus the necessary launch-test portability/bounds/cleanup repair; run focused suites and the committed authenticated wire acceptance on this actual host; native Windows attempted only if an authorized native route exists, otherwise explicitly UNVERIFIED with the exact missing capability. Publish ordinary commits to #11 and a substantive ENVCHK:W2 RESULT with hub backlink. Boundaries (not in scope): no CI policy/runner changes (belongs to #12), no lifecycle/MACFIX/STALL/release scope, no installed-app/service/sync/repository mutation outside owned test fixtures, no model-backed provider launch, no indefinite wait on queued CI, no force push, no declaration of installed rollout. Hub backlink: https://github.com/nullStack65/closura-agent-config/pull/237 |
ENVCHK-1:WINREC — ENVCHK:W2 START (recovery continuation)I am taking the explicitly assigned recovery/finish pass for the settled/interrupted Windows thread Scope is limited to the already isolated native-Windows worktree Initial native readback over SSH to No source write or commit has occurred in this continuation. Final report will include predecessor/final head, recovered-vs-new diff, native commands/exits, provider/test/process cleanup, PR/hub readback, limitations, and rollback. |
ENVCHK-1:WINREC — ENVCHK:W2 RESULTOutcome: source recovery/continuation committed and pushed; native Windows qualification is UNVERIFIED because the recovered checkout’s platform dependency tree cannot start its test runner. No old T3 thread was resumed, interrupted, settled, deleted, or otherwise mutated. Identity and recovered-vs-new boundary
Completed source work
Native commands and results
Provider/process/CI state and rollback
Hub backlink: https://github.com/nullStack65/closura-agent-config/pull/237 |
The recovered W2 head left five touched files unformatted, so the repo's vp fmt --check gate failed on the branch. Formatting-only; no behavior change (a reflow in LaunchPreflight.ts, serverRuntimeStartup.ts, and server.ts, plus a missing trailing newline).
Replace the feature's ad-hoc regex JSONC stripping with the maintained jsonc-parser direct dependency, and remove the now-unused shared stripJsonComments/parseLenientJsonUnknown helpers. Preserves snapshot true/false/undefined semantics and the external-server branch.
Cleanup now confirms the captured server and captured fixture-owned stub PIDs have exited within a bounded window before removing fixture state, and fails clearly preserving state on a termination/confirmation timeout. Adds a focused normal + forced-timeout cleanup regression.
ENVCHK:E7 — RESULTOutcome: E7-1 and E7-2 are implemented, verified on the actual host, committed, and pushed with no force. Native Windows remains UNVERIFIED (exact missing capability below). No merge, install, packaging, CI/runner, callback/controller/service/queue, credential, or T3-database change was made, and no model/subagent/fallback was invoked.
Exact source identity
E7-1 — maintained JSONC parser
Edge coverage added/passing ( E7-2 — cleanup proves owned exit before state removal
Cleanup proof: after the wire run and the regression, observed 0 leftover Gates actually run (macOS 26.6.2 build 25G83, Darwin 25.6.0, x86_64; Node v25.6.0, pnpm 11.10.0, git 2.55.0)
Native Windows — UNVERIFIED (not fabricated)
Current CI state (owned by #12 / ENV-1; observed only)On Remaining gates
RollbackSource-only; no installed state changed. Ordinary inverse: Hub backlink: https://github.com/nullStack65/closura-agent-config/pull/237 |
ENVCHK:E7 INDEPENDENT REVIEW RESULTVerdict: PASS — the two E7 corrections satisfy the manager's E7-1/E7-2 requirements and preserve accepted W2 behavior. Exact reviewed head:
Coordination hub: https://github.com/nullStack65/closura-agent-config/pull/237 Findings (ordered by severity)
No blocking findings. E7-1 — maintained JSONC parser
E7-2 — cleanup proves owned exit before state removal
Commands actually run and outcomes (focused, non-mutating; native Intel macOS, Darwin, Node v25.6.0)
I did not run Implementation RESULT supportabilityThe E7 RESULT is supportable for E7-1 and E7-2: the focused unit, delivery, and wire suites and both changed-package typechecks pass at the exact committed head, and the E7-2 cleanup regression proves owned-exit-before-state-removal on this host. The only RESULT claim I did not independently reproduce is the full 5-file/72-test aggregate and the Windows matrix. Native Windows and CI boundaries
Remaining gates
|
ENVCHK:E7 WINDOWS RESULT — BLOCKEDVerdict: BLOCKED — source is preserved at the independently reviewed final head, but native Windows qualification did not reach test execution because the only filesystem volume lacks safe dependency-install headroom. No Windows PASS is claimed.
Exact native identity and source
Native execution evidence and projection failureThe exact Luna route was accepted by Windows T3, but T3 projected the turn as error after 18 seconds with:
That T3 error was not treated as the provider outcome. Read-only loopback reconciliation showed the accepted OpenCode session remained
The provider therefore was not duplicated or blindly replayed. T3's errored projection remains separate environment evidence; it is not proof that the underlying provider never ran. Dependency/headroom blocker and controlled safety repairAt the final head,
exited 1 before mutation because pnpm refused a non-TTY module purge. The provider then retried with ENVFIX aborted only provider session
No pnpm cache/store, source, Git history, another checkout, installed T3, or provider/session history was deleted. The target is reconstructible from the committed What is and is not qualified
Exact blocker and next ownerAn operator with existing authority over Rollback/recovery: source needs no rollback; the removed target was only the unusable partial generated dependency tree and is recoverable by supported install once headroom exists. |
|
ENVCHK:E7 WINDOWS SUCCESSOR RESULT — BLOCKED Linked predecessor: #11 (comment) The linked native Windows successor did not pass. It proved that the prior storage blocker is larger than the earlier estimate, then failed closed before any test execution.
Controlled recovery:
Disposition: the earlier “about 646 MB” blocker is superseded. A normal frozen install can exhaust more than the demonstrated 4.31 GB on this host. The next owner is an operator with existing Local receipts are retained under END ENVCHK E7 WINDOWS SUCCESSOR RESULT |
|
ENVCHK:E7 WINDOWS RETRY RESULT Verdict: BLOCKED. This was one native Windows retry at the exact reviewed head; no source, installed T3, provider settings, CI, callback/controller/service/queue, or other repository was changed. Coordination: PR237. Prior blockers: original Windows blocker, immediate predecessor blocker. Identity and preflight
Install evidence
Native execution environment captured
Matrix and review concerns
Current CI and next owner
END ENVCHK E7 WINDOWS RETRY RESULT |
ENVCHK:E7 WINDOWS RESUME RESULTVerdict: PASS for the bounded native Windows resume and closeout at the exact reviewed head. This turn made no source edit, commit, push, reset, rebase, cache deletion, junction rewrite, installed-T3/provider/database/service mutation, CI change, or retry beyond the one mandated install. Coordination: https://github.com/nullStack65/closura-agent-config/pull/237. Immediate prior retry: #11 (comment). Identity and prestate
Exactly one install
Tests and gates
Native matrix and review concerns
CI and remaining limits
Links: PR11 #11 · PR237 https://github.com/nullStack65/closura-agent-config/pull/237 END ENVCHK E7 WINDOWS RESUME RESULT |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
|
START — PR11 delivery resumed on Model/harness: gpt-6.1-sol delivery owner with bounded native gpt-6-luna verification and independent review. |
Mechanical snapshot only; not reviewed or accepted.
Preserve the transferred source snapshot, align the provider Git test seam, remove unused exports, and include current-main source updates. Cloud delivery: GPT-6.1 Sol owner with GPT-6 Luna implementation and independent technical review.
|
Cloud delivery STATUS / provisional RESULT Published candidate Repairs: distinguish provider Git from host checkpoint Git in override/fixture types; correct stale Codex sparse-checkout expectation to use healthy host Git; add focused host/provider capability separation regression; update A1/A2 fixtures to use providerGitEnvironment; remove four unused exports reported by CI. Distinct GPT-6 Luna technical review confirmed these fixes with no blocking defect; this is automated review, not a human vote. Validation: targeted lint passed; three selected Git separation/control tests passed; cached jsonc-parser3.3.1 was linked and consumer tests passed 6/6. Initial LaunchPreflight run: 37 passed, six subprocess tests failed because this cloud Node runtime returns spawnSync EPERM even with successful child status0/stdout. Delivery integration run: 3 passed, 5 failed under subprocess/runtime limitations. Final server typecheck had no TypeScript error diagnostics but exited1 on Effect diagnostics; it is not recorded as a pass. Normal exact-head CI remains required. Published-head predecessor CI run37616304095 genuinely failed unused exports, two delivery assertions and authenticated wire startup; it was not cancelled/pass. No Mac/Windows acceptance, installation, production-state effects, new credentials/grants or release success is claimed. PR remains draft until exact-head CI/review is assessed. For PR20 release consumption, qualification must use this lane's exact eventual merged source: fresh synthetic fixture roots; warning-only launch starts exactly once and delivers launch.preflight over authenticated orchestration subscription; missing selected executable errors before model work; unstartable host Git blocks only for repository root; host/provider Git separation; bounded read-only probes and captured fixture-owned process exit before cleanup. Native Mac/Windows artifact acceptance and compatible version/config rollback remain release-owner work, without backups. Owner/harness: GPT-6.1 Sol cloud task, native GPT-6 Luna implementation and independent review. Durable local STATUS/RESULT are kept under /workspace/work because the prescribed output mount is read-only in this executor. No manager callbacks or human review requests sent. |
…eptance Include main7a2b41e source and provision ThreadPostStartActivity in the real-engine acceptance harness. Format the changed preflight tests.
|
Cloud delivery update: head CI on predecessor5fbf7c2 completed: Test, Server2 (including authenticated wire smoke), Server3, Rust, Release Smoke and mobile native detection passed. Check passed unused-code gates then failed formatting in two changed test files; targeted formatter checks now pass. Server1 had exactly three A3 failures because its custom engine test composition omitted the new ThreadPostStartActivity service from current main. The test composition now supplies that layer as production runtime does; distinct Luna review found no duplicate engine or missing dependency. Other preflight assertions were repaired and passed in this CI run. Current-base server typecheck again has no |
|
Cloud delivery STATUS: published Independent GPT-6 Luna review found omitted-cwd launches bypassing preflight. New and recovered launches now resolve adapter defaults before guard/validation and pass that same cwd to the adapter: Codex/Claude-agent use process cwd, OpenCode uses server-config cwd; providers requiring explicit cwd retain that contract. Four focused default-cwd controls passed, including blocked recovery before adapter start and external OpenCode retaining local root checks while excluding remote provider Git. Full feature review and distinct combined-test review found no blocking defect; this is automated technical review, not a human vote. CI on predecessor ce9e904 passed general Test, all three Server shards (including authenticated wire acceptance), Rust and Release Smoke. Its Check failed solely on three PR11 Effect.provide warnings; those were fixed by composing layers, without changing severity or waiving checks. Final current-base server typecheck exits0; targeted formatting/lint/diff checks pass. New exact-head normal CI is required before merge. PR20 release qualification must additionally exercise omitted-cwd new/resumed launches using this lane’s exact eventual merged artifact. Native host acceptance remains separate and unclaimed; prior historical Windows evidence is preserved, not promoted to current-artifact acceptance. |
|
Integration correction: Published |
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configuration
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Cloud delivery RESULT — source landed by ordinary squash merge as Exact-head normal CI37630441181 passed Check (format/lint/unused-code/typecheck/build), general Test, all three Server shards, Rust, ReleaseSmoke and mobile fingerprint. No unresolved review threads, human votes fabricated, bypass/admin/settings changes, force push or branch deletion. Separate native GPT-6 Luna feature and integration reviews found no blocking defect. Postmerge checks are being observed; no runtime installation claim. PR20 release owner: consume exact merged source404501a06. Synthetic qualification must prove warning-only launch starts exactly once and delivers launch.preflight over authenticated orchestration subscription; selected configured executable failure before model work; unstartable host Git blocks only repository-root launches; host/provider Git separation; omitted-cwd new/recovered launches resolve Codex/Claude-agent process cwd and OpenCode server-config cwd, including external server retaining local root checks; bounded read-only probes and captured fixture-owned process exit before cleanup. Use an exact qualified native artifact and existing authorized host connection. Current Mac/Windows artifact acceptance and installation remain unexecuted in this Linux cloud lane; historical Windows evidence remains historical. Version/config rollback has no feature database migration; unset sharedSessionRoot only disables shared-root classification, full rollback is source/binary reversal. No backups or production data mutation. |
|
Final cloud STATUS / RESULT: PR11 source delivery complete. Ordinary squash PR20 release/runtime acceptance remains distinct from completed source landing: exact source404501a06 and synthetic requirements are in the preceding RESULT comment and PR body. Native current-artifact Mac/Windows acceptance/installation was not executed here; required remaining action is PR20 qualification of its exact release artifact through existing authorized host connections. No unattended wake or operational success is claimed. Durable cloud STATUS/RESULT updated under /workspace/work; prescribed output mount was unavailable/read-only. |
* feat: allow disabling AI-generated thread titles (#3) * feat(settings): allow disabling AI-generated thread titles Add an environment-wide generateThreadTitles server setting, default on. When off, T3 makes no title-generation LLM call: the first-turn generation, refinement, and manual regeneration paths all return early, leaving the deterministic first-prompt title in place. Manual regeneration still completes through the existing path so no spinner or titleRegeneration state is left pending. The setting is surfaced in Settings > General > Text generation, is searchable, and hides the per-thread Regenerate title action when off. Conversation inference and provider/agent rename behavior are untouched. * fix(settings): restore AI thread titles with global defaults Global "Restore default settings" omitted generateThreadTitles, so turning AI thread titles off and then restoring defaults reported success while leaving the setting false. Its default is true. Add it to the changed-setting labels, the changed-setting memo dependencies, and the restore updateSettings patch, matching the other server settings. Cover the hook with a focused regression test proving the false -> true reset and the changed label. * feat(usage): prove prompt, request, session, and PR usage attribution Public usage summaries aggregate by day/provider/model and the underlying UsageRecord rows differ per provider, so there is no single provider-request unit today. Add a pure projection that re-projects measured usage onto prompt, provider-request, native-session, and pull-request levels using only explicit existing bindings (provider_session_runtime resume cursors and imported transcripts) and existing thread/PR links. Granularity is asserted per source, never inferred: Claude exposes per-request identity, Grok per prompt, Codex only per turn. The projection reports unsupported levels as null instead of dividing a turn. A session linked to several PRs feeds a non-additive shared pool rather than being cloned onto each link, and a known session with no usage is missing (null), never zero. Adds the native request/message/prompt ids to UsageRecord and the v4 scan cache so they stay separate from dedupeKey. Model/harness: opencode-go/deepseek-v4.1-flash via opencode. * fix(usage): report absent request counts as null, not zero A known session with no measured usage reported equestCount: 0 while its quality was missing, which reads as a zero-request success. Return null unless the level's quality is measured or partial, so absence stays absent. Model/harness: opencode-go/deepseek-v4.1-flash via opencode. * test(usage): assert the allocation reconciliation invariant Adds the METRICS-M1 invariant sum(attributed PR totals) + shared + unallocated = distinct measured total, and records that the legacy projection_thread_sessions.provider_session_id columns are not written by the live projector. Model/harness: opencode-go/deepseek-v4.1-flash via opencode. * feat(release): add fork release pipeline with fork update isolation The fork inherited upstream's release.yml, which needs Blacksmith runners, production relay/Clerk/Cloudflare/Vercel credentials, and upstream npm publication, so the fork had no runnable release path. Update resolution also hardcoded pingdotgg/t3code for the release-index lookup, so t3 update and the install scripts could silently select upstream releases. - Add .github/workflows/fork-release.yml: builds one immutable SHA and explicit version into a Windows x64 installer with its matching Linux x64 WSL runtime, an Intel macOS DMG, and a Linux x64 runtime archive, reusing release-desktop.yml and the existing packaging scripts. GitHub-hosted standard runners only; build jobs are contents: read and publication is a separate write job behind an environment. - Default the shared release repository to nullStack65/t3code with a T3CODE_RELEASE_REPOSITORY override, closing the index gap in t3 update, the managed/pinned runtime, the SSH tunnel runtime, and the install scripts. - Add scripts/fork-release-version.ts: a tested fork version line that is strictly increasing, excludes preview/nightly identifiers, and never relies on SemVer build metadata. - Embed repository, full source SHA, version, and architecture in the desktop app and the CLI archive, and qualify checksums from final distributed bytes. - Ship unsigned macOS builds without an update feed: Squirrel.Mac cannot apply an unsigned update. * docs(release): document blocking WinGet pin for retained package identity * fix(release): bind source/provenance, freeze-and-promote candidates, gate runners * fix(usage): retain legacy cache history and record measurement presence A v3 scan cache is read instead of discarded, so measured records from deleted transcripts survive; v3 rows decode with native ids and presence explicitly unavailable and extant files are cold re-parsed to enrich them. Parsers record whether tokens were actually observed, and the occurrence-aware dedupe key moves to a shared seam reused by the scan. * fix(usage): reconcile attribution and prove persisted bindings Preserve orphan usage in an explicit bucket and reconcile attributed + shared + unallocated + orphan against the deduplicated input. Replace content-equality dedupe with a provider-namespaced declared key plus occurrence-aware scan identity, keeping unkeyed records uncertain and surfacing conflicts and snapshot replacement. Split identity, measurement, level support, and allocation; seed coverage from declared sources; retain per-model and cost provenance. Add a read-only extraction seam from provider_session_runtime and projection_thread_pull_requests. * fix(release): executable per-target candidate route, bound receipts, gated promotion Repair the release execution path so a pre-merge PR head can be built, verified, and frozen locally, and so acceptance binds to real artifacts. Candidate source vs public eligibility: - release-source.ts gains an explicit candidate mode that accepts a fork PR SHA reachable on the resolved fork remote; public mode keeps the on-main ancestry requirement. Neither fakes ancestry. - build-fork-candidate.ts resolves the writable fork remote explicitly (--fork-remote, default fork) instead of assuming origin is the fork. Per-target vs aggregate: - candidate-build-plan.ts separates build/stage/verify-one-platform from the aggregate freeze, aligns package versions, passes --build-version and --output-dir through to desktop packaging, and builds the Windows CLI ZIP. - build-fork-candidate.ts has --phase target|aggregate and binds source/repository/mode into child-process env; completed outputs are preserved with --keep-going. - stage-candidate-asset.ts stages a target's artifacts into the shared dir. Validation that means what it claims: - fork-release-manifest.ts binds each native target to its own artifact, rejects conflicting (FAIL beside PASS) and ambiguous acceptance, and inspects real packaged provenance (tarball/zip/NSIS) via candidate-provenance-inspect.ts. - verify-windows-installer.ts runs the real NSIS install to reach the embedded WSL payload and emits its provenance. CI/promotion handoff: - fork-release.yml authorizes on owner-configured runner variables before scheduling any build, selects source before installing dependencies with a dependency-free selector, builds the SEA under the pinned Node, promotes a frozen candidate by identity digest without rebuilding, provides a real native-receipt import job, adds actions:read for cross-run downloads, and asserts the required-reviewer approval rule. Process-level regression tests spawn the real entry points. 77 focused tests pass; typecheck, lint, and fmt are clean. * fix(release): per-target verification must not require the aggregate manifest A Linux-only build produced its archive and passed the no-ambient-Node smoke, then failed at the per-target verify step because the verifier demanded fork-release-manifest.json, which only exists after the aggregate freeze. Split verification so a single platform checks only its own assets and embedded provenance; the aggregate step still requires the manifest and the complete asset set. Adds a regression test that per-target verify passes without a manifest and fails for a wrong target. * fix(release): reach the real NSIS app payload for embedded-WSL verification electron-builder's installer is an NSIS wrapper whose app payload is the \/app-64.7z stream that nsis7z.dll unpacks at install time, yielding resources/wsl-runtime.tar.gz. Unpacking that stream exercises the real extraction layout without launching the Electron app (which must not touch a live machine). verify-windows-installer.ts and the provenance inspector now descend into that payload and fail closed when 7-Zip is absent. The Windows CLI ZIP target now builds the SEA exe first. * fix(release): installer provenance is the embedded WSL runtime The Windows installer's inspected provenance is the WSL runtime it embeds, which is a Linux runtime; label it as such instead of expecting win/x64. A Windows-only candidate may lack the standalone Linux archive, so the byte-equality check is skipped in per-target verification and enforced at aggregate where both are present. * fix(usage): finish measurement and cache correctness Classify usage fields by validity and provider completeness instead of property presence: an invalid value is invalid, a valid known subset is partial, and a nonzero total never implies a complete measurement. Make dedupe-key scope explicit. A source-local key is qualified by its native session; a global key reused under another session is incompatible ownership surfaced as a conflict. Cost and provenance are part of the observation, so a repriced record conflicts rather than silently deduping. Require the current identity format for a warm scan-cache hit so an unchanged legacy transcript is cold re-parsed once to enrich it, keeping deleted history and read-failure fallbacks. Carry the legacy identity-erased marker through to the projection so an erased native id is unavailable, not missing. * fix(release): inspect real desktop/DMG provenance and fail closed - Read the Windows desktop app's own build info from resources/app.asar in the real NSIS payload; keep it distinct from the embedded WSL runtime and the bundled server sidecar (a wrong-source desktop with a correct WSL archive now fails). - Inspect the Intel macOS DMG's app.asar on the native Mac (read-only hdiutil mount, 7-Zip HFS fallback elsewhere) and map the writer's actual packaging platform vocabulary ("mac") deliberately. - Require every selected packaged component's inspection: absent, unreadable, or unperformed required inspection is BLOCKED, not verified. Promotion consumes digest-bound native inspection evidence rather than trusting a self-consistent manifest. - Regression tests through the real verifier entry points, including a real DMG mount and a real tar.gz; retain the wrong-target/conflicting tests. * fix(release): carry digest-bound inspection evidence through the local route The per-target step now emits fork-inspection-evidence-<target>.json and the aggregate phase discovers and consumes those files, so a host that cannot open another platform's artifact (for example the Mac aggregate and the Windows NSIS payload) can still qualify the exact bytes a native host inspected. * fix(release): do not stage the optional arm64 DMG unless requested An Intel-only mac build failed at staging because candidateTargetAssets("mac") always demanded T3-Code-<v>-arm64.dmg. Thread includeMacosArm64 through the build plan and staging, and build the arm64 DMG only when it is explicitly requested. The Intel DMG itself already built; this only fixes the entry point. * fix(usage): preserve zero-total quality and refresh stale cache rows Retain eligible zero-total observations instead of dropping them before classification. Codex no longer returns null for a zero subtotal, and Grok no longer skips zero-total aggregate or per-model rows: a complete measured zero, a known-zero subset, and an all-invalid payload all reach the projection with their quality, while a container with no recognised token field is still no-usage. Grok per-model cost accounting now reduces the aggregate for every emitted ticked row, so an emitted zero-token row cannot double count. Treat missing completeness metadata as unasserted. The predecessor v4 writer emitted 15-field rows without it, and the decoder defaulted a non-legacy observed row to complete, silently promoting an unknown measurement. Missing completeness now decodes as partial, and the entry is marked qualityMetadata: "predecessor" so warm-cache acceptance and resume both require the current quality format. An extant file is cold re-parsed once; deleted and unreadable history is retained conservatively. Native-id availability is a separate axis from numeric freshness. Regressions cover Codex/Grok complete zero, partial zero, invalid, and valid-plus-invalid distinct events, the parser-to-projection path, a pinned predecessor fixture generated by the actual predecessor writer, and the service-seam refresh/restart/deleted/failed-read paths. * fix(usage): persist scan-cache predecessor freshness across restart The v4 codec rewrites every retained row to the current 18-field shape, so a predecessor entry (rows written before numeric quality metadata existed) decoded as `declared` after the first persist. A fallback entry kept while its transcript was temporarily unreadable was therefore promoted to current metadata on save; after a restart it was served warm (unchanged file) or resumed from its stale prefix (grown file), skipping the cold re-parse that asserts quality. Add a file-level `lq` provenance marker alongside the existing `li` legacy marker. Encode writes `lq: 1` for a predecessor entry; decode treats `lq === 1` as predecessor regardless of the rewritten row length. The marker is dropped only when a successful full parse replaces the entry, and a current parser's genuinely partial measurement (carrying its own completeness field) stays `declared`. Recovered from the M3E local worktree (uncommitted at reviewed head af70495); codec fix and codec/service regressions transferred unchanged in substance, plus an explicit stale-prefix resume regression. Refs: METRICS-1:M3F * feat(usage): retain durable model-canary attribution across resumes T3's single resume cursor lost earlier native sessions on a resume, fork, or model switch, so a thread could not say which models contributed. Add an append-only provider_session_history (migration 054, with a current-cursor backfill) written alongside the runtime upsert, and read it through usageAttributionSources as sessionHistory bindings. Add a content-free thread_route_events store (migration 055) for pre-execution route/experiment metadata: requested provider/model/effort captured at session start, task stratum, experiment/cohort, route event kind, manager/agent ids, and escalation reason. Actual values are derived from measured usage, never copied from the request. usageRouteAttribution composes the base projection with this view and keeps child sessions distinct. T3 carries the metadata only; agent-config remains the routing authority. No prompts, responses, code, or tool bodies are stored. * test(usage): prove the route view preserves M3D zero/invalid/cache quality Add regressions that the durable session-history route view cannot regress the #4 (METRICS-1:M3D) measurement/identity quality axes: - A: an explicit complete measured zero stays a measured zero, not missing; - B: an all-invalid eligible observation stays invalid, not missing and not a measured zero, and mirrors the base projection; - C: a predecessor v4 cache entry decodes as `predecessor` with `partial` completeness and the route view never promotes it to complete; - D: a history-only identity for a measurable provider stays usage=null and quality=null, never a fabricated measured zero. No production behavior changes; the M3D parser/cache files remain byte-identical to the restacked #4 head. * fix(release): stage the Windows resource monitor before the CLI archive The win plan's cli-archive step consumes <resourceMonitorDir>/win32-x64, but the local route only staged the Linux helper, so it failed with CliArchiveInputMissingError after the installer was built. Extract the staging into a tested lib, stage win32-x64/t3-resource-monitor.exe for the win target (mirroring the workflow's resource_key layout), and add clean-directory, path-with-spaces and missing-input regression tests. * fix(release): promotion cannot skip required packaged provenance --promote --skip-provenance-inspection passed requirePackagedProvenance through from inspectProvenance, so promotion could qualify bytes it never inspected. Force the provenance gate on for promotion; digest-bound inspection evidence still satisfies it when local extraction is skipped. Add a real-process regression covering blocked/no-evidence, evidence eligible, and wrong-digest rejected. * feat(release): executable local/draft promotion handoff without a CI run The workflow publish job only consumes a fork-release-candidate CI run, so with no authorized runner a locally frozen candidate could not reach publication. Add scripts/promote-fork-candidate.ts: it reuses verify-fork-candidate.ts --promote for the byte-level checks (complete assets, current hashes, receipts, digest-bound inspections, tag target, no-overwrite, version ordering, approval gate) and adds fork-main eligibility and candidate-specific approval. Default is a read-only dry run; --execute is gated on --approve of the exact frozen manifest sha256. --inspect-release does a read-only required-asset completeness check (real draft 395230248 is correctly BLOCKED: Windows installer + CLI ZIP absent). --preflight-json and --gh-bin/--gh-prefix let tests exercise publication against labeled fixtures/mocks. Documented in docs/operations/fork-release.md. * fix(usage): make durable attribution atomic, instance-aware, and conflict-safe Repair the ROUTE6-1:R4-REV-T3 review findings on #6: - P1-1 wrap runtime cursor + provider_session_history + thread_route_events in one sql.withTransaction so one accepted upsert is all-or-nothing. - P1-2 include a normalized non-null provider_instance_key in the history unique identity and expose provider-instance ids on the route session. - P1-3 mirror nativeSessionIdOf precedence in the 054 backfill (text-only, trimmed non-empty, resume -> threadId -> sessionId with fallthrough). - P2-4 stop double counting a session bound to two threads; pool it once in a route-view unallocated bucket and carry allocation/boundThreadIds. - P2-5 make the automatic request record monotonically enrichable with a surfaced selection_conflict instead of INSERT OR IGNORE. - P2-7 de-duplicate history input by canonical identity. - P2-8 bound escalation_reason to a low-cardinality slug. - scope declared event ids per thread so a shared id cannot suppress another thread's event. - add atomicity/enrichment/instance/backfill/reorder adversarial tests and refresh docs. * fix(release): require checksum/manifest metadata and distinguish failed reads - fork-promotion: tri-state GitHub reads (present/absent/unresolved) and publicationProbeFailures so an auth/permission/network/rate-limit failure is never treated as absence; checksum parsing/coverage, publication metadata and upload-readback validators. - releaseInventoryFailures also requires SHA256SUMS and the frozen manifest. - verify-fork-candidate --promote now fails when SHA256SUMS is missing instead of treating it as optional. * fix(release): verify the uploaded payload before finalizing a draft - promote-fork-candidate now runs draft -> upload -> readback -> byte-verify -> finalize with existing gh operations, enumerating the payload by name (build assets + SHA256SUMS + frozen manifest + available acceptance/evidence metadata) instead of a wildcard; a partial upload, changed byte, failed read or missing metadata never finalizes or reports success. - live probe confirms the fork remote and fetches fork/main before ancestry. - --simulate is required for --preflight-json and an offline mock transport, so a fixture can never drive the live publisher. - process tests drive the real entry point over a stateful offline fake GitHub transport and assert on the uploaded file contents and readback. - docs: describe the sequence, tri-state reads, and concrete source-preserving Windows commands that reuse assets 585058463/584947074. * fix(release): confirm final release identity/inventory and publish acceptance evidence V9-F1: the post-finalize confirmation accepted a valid JSON object that omitted or mistyped isDraft, carried the wrong tag/source, or had an empty asset list, and still reported "Published". Parse the real `gh release view --json` camelCase shape (distinct from the REST `gh api` shape), require an explicit boolean isDraft=false, the expected tagName and targetCommitish, and the complete expected asset inventory at the expected sizes; also require the post-upload readback to be the expected draft. Missing/wrong/partial confirmations now report an unconfirmed publication state instead of success, with no destructive rollback. V9-F2: `--inspection-evidence`/`--native-receipts` paths accepted by the verifier were not guaranteed to be in the published payload. Require each supplied path to be in the enumerated candidate-local payload under the canonical `fork-inspection-evidence*.json`/`fork-native-receipts.json` layout, and reject an external or non-canonical path before any GitHub mutation. No new import service. V9-F3: the fake `gh release view` transport now emits the real camelCase shape instead of REST snake_case, so the fixture can no longer hide F1, with negative cases for missing/non-boolean isDraft, wrong tag, wrong target, and empty inventory. V9-F4: `--simulate` refuses a live `gh` binary. Docs updated to the canonical evidence layout and the confirmation requirements. Preserves draft 395230248 and the Mac/Linux artifact bytes; artifact source is unchanged at 929b637. * ci: use hosted runners for fork checks (#17) * ci: use hosted runners for fork checks * ci: record fork runner portability receipt * ci: declare fork release operator entrypoints * fix(ci): keep internal metadata constants private * fix(ci): decouple provenance inspection from desktop build graph --------- Co-authored-by: business account <businessaccount@Crown-Rain-Gutters.local> * feat(contracts): add managed launch identity envelope (#18) * feat(contracts): add managed launch identity envelope * fix(contracts): harden managed identity comparison * feat(server): stamp managed provider host identity * test(contracts): use branded managed identity fixtures * test(server): isolate provider identity fixture --------- Co-authored-by: nullStack65 <nullStack65@users.noreply.github.com> * fix(auth): expose stable session subject (#16) * fix(auth): expose stable session subject * style(auth): format session identity test * test(server): encode environment auth state with schema --------- Co-authored-by: nullStack65 <nullStack65@users.noreply.github.com> * fix(codex): scope proxy model catalogs * fix(ci): use hosted runners for fork releases * Use synthetic disposable test data instead of real userdata snapshots * Remove conflicting real-userdata fixture permission * Link approved canonical human guide from T3 instructions * fix(server): reject incompatible callback routes before admission (#21) * fix(server): reject incompatible callback routes before admission * fix(server): preserve retained sessions on route rejection * fix(provider): guard cross-driver continuations only when resuming * fix(server): preflight effective callback route * fix(server): reconcile legacy callback session identity --------- Co-authored-by: nullStack65 <nullStack65@users.noreply.github.com> * fix(release): run SEA build through vp exec (#20) Co-authored-by: business account <businessaccount@Crown-Rain-Gutters.local> Co-authored-by: nullStack65 <nullStack65@users.noreply.github.com> * fix(server): restrict human reviewer routing to the owner (#22) * fix(server): disable formal PR review mutations * fix(server): silence reviewer denial lint warning * fix(server): route reviewer requests to the verified owner * fix(server): route reviewer requests through verified owner * test(server): cover reviewer routing authorization boundaries Adopts Luna test commit 3eaf0a1 and corrects the independent review finding about removal guidance. * fix(server): avoid manual fallback for other reviewer requests --------- Co-authored-by: nullStack65 <nullStack65@users.noreply.github.com> * fix(web): qualify silence during a running turn (#7) Add passive five-minute silence visibility with server observation ownership, stable client receipts, outstanding tool context and environment-scoped notifications. Includes independently reviewed receipt-key repairs and deterministic Shiki deadline regression tests. Current-base head 38cf4ed passed normal CI 37624249974 and 225 focused cloud tests. Installed/runtime acceptance remains separate for PR20's qualified artifact and approved Browser host; no installation claimed. * feat(service): Windows lifecycle integration candidate (SCM host + graceful stop) * chore(native): import accepted Windows SCM host helper from #8 7455a7b Imported verbatim from #8 (feat/windows-service-host-prototype-20260926) at 7455a7b. Original PR branch preserved; not merged there. * feat(service): import tested Stage A status candidate from #9 2273445 Imported verbatim from #9 (env1/r8-t3-service-status-20260927) at 2273445. Original PR branch preserved; not merged there. * feat(service): join whole-service stop to a child drain over launcher IPC A Windows SCM stop cannot deliver a graceful signal, so the launcher now asks its managed child to drain over the existing IPC channel and waits, bounded, for a stopped acknowledgement before its forced fallback. The child drives the same Effect-runtime interruption path as SIGTERM via process.emit, and acknowledges from a scope finalizer. POSIX keeps its signal-driven finalizer path. Author scope: ENV-1:R10-T3-LIFECYCLE Stage B. * fix(service): deliver host stop control to the launcher and require a real drain The SCM host only wrote the launcher's cleanup marker, which nothing read as control, and the launcher's child acknowledgement was emitted from a sibling finalizer and collapsed with exit/timeout/send-error, so an early ack could authorize a hard kill while resources were still draining. Add a private per-instance control request the host writes and the launcher watches, binds to its launch token and consumes before running Launcher.stop. Sequence the stop/stopped IPC messages by request id, acknowledge only a requested shutdown, and make requestGracefulChildStop wait for the child's real exit so an early acknowledgement never forces a kill. Author scope: ENV-1:R11-T3-LIFECYCLE. Rust host change is source-only here (no Rust toolchain on this macOS host); see the checkpoint RESULT for gates. * feat(service): bind t3 service install/status/restart/uninstall to the SCM host Add the Windows SCM adapter through BootService: a windowsManager and a pure windowsBootService module render the t3-windows-service-host.exe ImagePath and the sc.exe create/config/start/stop/delete steps, parse sc.exe queryex/qc honestly, and bind only an exact home/helper/runtime/account registration. Install/restart/uninstall refuse a foreign or unreachable registration and block on a missing helper or unqualified account instead of defaulting to LocalSystem; status keeps registration, start type and observed running state separate. Update the service docs to match. Author scope: ENV-1:R11-T3-LIFECYCLE. * test(service): run the launcher transitions with a portable scripted runtime Windows resolves the pinned runtime as t3.exe and cannot exec the Node shebang fixture the launcher tests stand up, so the whole launcher suite failed there. Add an explicit interpreter seam to the production Launcher (unset in production, which still spawns the native executable directly) and write the fixture at the platform executable path. The same Launcher transitions now run on every host; a focused test proves the interpreter path drives the real transitions rather than a launcher duplicate. * fix(service): bind SCM ownership to the real account and parse image paths losslessly W1 of the recovered R12 lifecycle work. Ownership of an existing `sc.exe` registration is now bound to the exact native `SERVICE_START_NAME`, helper, home, log and service name, and only requires the registered runtime to live under this home's `runtime/versions/<exact-version>` tree. A lossless Windows command-line splitter/quoting pair replaces the whitespace-collapsing image comparison, so a quoted path with spaces, an embedded quote or a trailing backslash is compared exactly and a genuinely different home is never adopted as ours. An owned older runtime is therefore upgraded rather than refused as a foreign registration. Absence is only the authoritative numeric `ERROR_SERVICE_DOES_NOT_EXIST` 1060; a localized or incidental 1060, an access-denied result or an unavailable code stays unknown and never authorizes create/delete. `running` now requires a positive `queryex` PID. Read-only status observes an installed SCM service by fixed name even when install-account input is absent, while mutation still refuses a missing/unqualified account instead of defaulting to LocalSystem. Author scope: ENV-1:R13-T3-LIFECYCLE (recovered from R12). * fix(service): observe bounded SCM transitions and separate registration from activation W2 of the recovered R12 lifecycle work. `sc.exe stop/start/delete` only accept a request; they do not report completed SCM state. Install, restart and uninstall now observe the authoritative `sc.exe queryex` state by bounded polling (30s production, overridable for tests) and never promote a timeout, a failed query or an unreachable SCM to a successful transition. A stop that is not confirmed STOPPED is not followed by a delete, restart or success claim, and an already stopped/absent target is idempotent without hiding errors. `install({start:false})` now creates or reconfigures the registration so a later start runs this version, while activation is gated separately on `start`. Obvious pending-update, downgrade and account prerequisites are validated before a running service is disturbed and rechecked after a confirmed stop. The restart flow keeps its truthful partial outcome instead of speculatively starting a second time. The real module and BootService drive these paths in tests, including a failed-stop uninstall and a still-pending deletion. Author scope: ENV-1:R13-T3-LIFECYCLE (recovered from R12). * fix(service): make private stop delivery atomic and prove the real managed drain W3 of the recovered R12 lifecycle work. The native host now publishes a stop request through a unique temp file, fsync, and rename, so the launcher's watcher never observes a partial document and a replacement is all-or-nothing. The launcher claims the request by renaming it to a private per-attempt path before decoding, with a single in-flight consumer, so overlapping polls cannot both act on one request and a request written during a poll is never deleted unread. Per-instance binding and private permissions are retained. A new launcher option forces the Windows IPC drain branch on another host so the production transition can be exercised. The regression loads the real `managedShutdownLayer` from the server source in the child, adds a delayed application finalizer, and proves the acknowledgement is only sent after the drain, never on the stop request. This complements the existing exit-authoritative waiting, which is retained. Author scope: ENV-1:R13-T3-LIFECYCLE (recovered from R12). * docs(service): align Windows SCM status, transitions and control with observed behavior Update the service documents to match the recovered lifecycle work: read-only status is selectable/observable without install credentials while mutation still requires a qualified account; ownership binds the actual `SERVICE_START_NAME` and an owned older runtime under the home's version tree; `sc.exe` start/stop/ delete are requests observed by bounded `queryex` polling; `install({start:false})` registers without activating; and control delivery is an atomic publish claimed by a single launcher consumer. Author scope: ENV-1:R13-T3-LIFECYCLE. * test(service): share SCM host argument vectors with the native parser A single vector file drives both the TypeScript adapter's ownership parser and the native configuration parser, so the published host invocation contract is checked against one set of vectors: inline --flag=value, last-wins duplicates, a .. path escape, an unsupported launch-mode flag, an unknown flag and a missing runtime. The native test asserts the effective home/runtime and the parse outcome; the adapter test (next commit) consumes the same rows. * fix(service): match native effective args and preserve stopped-service state Windows ownership now agrees with the native host's effective target. The registered ImagePath is resolved with the same rules the host applies - inline --flag=value accepted, a repeated flag last-wins - but a duplicate or unsupported token is refused, so a bound flag followed by another home/runtime can never qualify a different effective target. A registered --runtime must normalize (Windows rules, .. collapsed) to exactly <home>/runtime/versions/<exact-version>/t3.exe, and the registered program must be the helper beside that same runtime, so a real older package (helper beside its own runtime) is upgraded while a half-upgraded or escaped binding stays foreign. A stop is now idempotent without hiding failure: install/restart/uninstall probe the exact owned state first and issue no sc.exe stop for an already stopped/absent registration, and a stop error is tolerated only when a follow-up probe confirms the service is stopped. Install captures the exact launcher-owned state before rewriting it; a failed create/config restores the previous bytes, and a failed start after the registration changed reports an explicit BootServicePartialStateError instead of implying preservation. Focused tests cover the effective-argument parser, the shared TS/native vectors, old-layout ownership, stopped idempotence, a confirmed 1062, an unconfirmed stop failure, state restoration and explicit partial outcomes. * fix(service): validate Windows host in CI and clarify candidate guidance * fix(service): keep lifecycle implementation helpers private --------- Co-authored-by: env1-agent <agent@env1.local> Co-authored-by: env1-agent <env1-agent@example.com> Co-authored-by: business account <businessaccount@Crown-Rain-Gutters.local> Co-authored-by: nullStack65 <nullStack65@users.noreply.github.com> Co-authored-by: Kameron Smith <kameron.smith@closura.ai> * fix(server): fail opencode continuation when the resumed session is gone (#13) Fail requested OpenCode continuations on missing, unusable, or mismatched session identity without creating replacement sessions or replacing durable bindings. Preserve intentional new sessions, valid resumes, and directory-change forks. Retain the pinned receipt-gated Linux pilot handoff; repair stalled probe process-group termination with GNU timeout and a child-exit regression. Current-base head d165b89 passed 230 focused synthetic tests and normal CI37627003191 attempt2 (one isolated retry for an unchanged longstanding Git VCS fixture); fingerprint37627003188 green. Distinct GPT-6 Luna technical/integration reviews found no blockers. Model/harness: GPT-6.1 Sol delivery owner, native Codex Cloud; GPT-6 Luna investigation/implementation and independent review. Native installation and runtime acceptance remain separate for PR20 release owner. * feat(server): bounded environment preflight for provider launches (#11) Run bounded read-only environment preflight before explicit and adapter-default new/recovered provider launches. Separate host checkpoint Git from provider snapshot capabilities and deliver warning findings through authenticated thread activity. Preserve transferred source and current-base integration. Verified source tree05b1021435a52b3a7b25f6f1a365cf046b1a5995; normal CI37630441181 passed; independent automated technical review clear. Native artifact acceptance remains with shared release ownerPR20. * fix(release): carry native Intel DMG inspection evidence (#24) * fix(release): carry native Intel DMG inspection evidence * test(release): declare synchronous Node fixture boundary * fix(release): bundle jsonc parser through its ESM entry (#26) * fix(release): import receipts for the frozen candidate (#25) * feat(server): refuse unqualified typed Skill sessions * test(server): cover typed Skill default routing * test(server): type native admission fixtures * feat(server): refuse unqualified typed Skill sessions (#31) Register a reserved codex-typed-skills driver that refuses before candidate access or native capabilities. Preserve legacy Codex behavior and document the unsupported positive admission boundary. Validated by focused tests, independent source review with bounded final delta inspection, and normal CI38740482025 at source5a4c3bc6b3b939bfa7a32f1a5077cfac36cb6631. This source change does not qualify positive Skill activation or installed behavior; closura-agent-config#364 remains open. * fix(ci): require owner dispatch for production relay * docs(ops): scope relay rerun guard to current definition * fix(ci): require explicit owner admission for relay deployment (#32) Remove automatic relay deployment on source pushes. Require owner-driven manual admission bound to the reviewed current source and workflow SHA; preserve production credentials, environment and concurrency. Historical workflow replay remains a separately tracked operational limitation. * feat(server): bind Codex observations to process and turn lifecycle * fix(server): type native observation evidence and fixture codecs * fix(server): revoke Codex observations at notification ingress * feat(server): bind Codex observations to process and turn lifecycle (#33) Capture server-local Codex process, session and turn observations with private immutable handles, freshness checks and decoded-ingress invalidation. Preserve fail-closed typed Skill admission and explicit unknown authority and containment boundaries. Independent R2 executed 144 scoped tests and the three held-consumer regressions; exact-head normal CI passed. This source prerequisite does not qualify positive Skill activation, installation or live model behavior. * feat(server): consume canonical typed Skills for fresh Codex turns * test(server): preserve CLI fixture Node namespace calls * fix(server): fence governed turn submission after route drift * fix(server): bind typed Skills to task repository * fix(server): break typed Skill consumer import cycle * fix(server): revalidate Skill account and own candidate lifetimes * fix(server): fence late governed Skill readers before retirement * fix(server): share native child-reader admission signals * feat(server): resolve typed Skills for fresh Codex turns (#35) Land exact reviewed 2e4270c source. Independent R4 repaired-delta review and accepted exact-head CI succeeded; prior findings/history retained. Future hosted execution is paused at repository Actions plus workflow states pending ROOT-owned user-runner qualification. Opt-in source only; runtime source pin, enablement, unsupported activation modes and full issue364 acceptance remain separate. No deployed configuration or install change. * fix(server): observe account readiness before governed startup * feat(server): support governed Codex inputs on V2 runtime * fix(server): preserve governed revocation and restart prompts --------- Co-authored-by: nullStack65 <nullstack65@users.noreply.github.com> Co-authored-by: business account <businessaccount@Crown-Rain-Gutters.local> Co-authored-by: env1-agent <agent@env1.local> Co-authored-by: env1-agent <env1-agent@example.com> Co-authored-by: Kameron Smith <kameron.smith@closura.ai>
* feat: allow disabling AI-generated thread titles (#3) * feat(settings): allow disabling AI-generated thread titles Add an environment-wide generateThreadTitles server setting, default on. When off, T3 makes no title-generation LLM call: the first-turn generation, refinement, and manual regeneration paths all return early, leaving the deterministic first-prompt title in place. Manual regeneration still completes through the existing path so no spinner or titleRegeneration state is left pending. The setting is surfaced in Settings > General > Text generation, is searchable, and hides the per-thread Regenerate title action when off. Conversation inference and provider/agent rename behavior are untouched. * fix(settings): restore AI thread titles with global defaults Global "Restore default settings" omitted generateThreadTitles, so turning AI thread titles off and then restoring defaults reported success while leaving the setting false. Its default is true. Add it to the changed-setting labels, the changed-setting memo dependencies, and the restore updateSettings patch, matching the other server settings. Cover the hook with a focused regression test proving the false -> true reset and the changed label. * feat(usage): prove prompt, request, session, and PR usage attribution Public usage summaries aggregate by day/provider/model and the underlying UsageRecord rows differ per provider, so there is no single provider-request unit today. Add a pure projection that re-projects measured usage onto prompt, provider-request, native-session, and pull-request levels using only explicit existing bindings (provider_session_runtime resume cursors and imported transcripts) and existing thread/PR links. Granularity is asserted per source, never inferred: Claude exposes per-request identity, Grok per prompt, Codex only per turn. The projection reports unsupported levels as null instead of dividing a turn. A session linked to several PRs feeds a non-additive shared pool rather than being cloned onto each link, and a known session with no usage is missing (null), never zero. Adds the native request/message/prompt ids to UsageRecord and the v4 scan cache so they stay separate from dedupeKey. Model/harness: opencode-go/deepseek-v4.1-flash via opencode. * fix(usage): report absent request counts as null, not zero A known session with no measured usage reported equestCount: 0 while its quality was missing, which reads as a zero-request success. Return null unless the level's quality is measured or partial, so absence stays absent. Model/harness: opencode-go/deepseek-v4.1-flash via opencode. * test(usage): assert the allocation reconciliation invariant Adds the METRICS-M1 invariant sum(attributed PR totals) + shared + unallocated = distinct measured total, and records that the legacy projection_thread_sessions.provider_session_id columns are not written by the live projector. Model/harness: opencode-go/deepseek-v4.1-flash via opencode. * feat(release): add fork release pipeline with fork update isolation The fork inherited upstream's release.yml, which needs Blacksmith runners, production relay/Clerk/Cloudflare/Vercel credentials, and upstream npm publication, so the fork had no runnable release path. Update resolution also hardcoded pingdotgg/t3code for the release-index lookup, so t3 update and the install scripts could silently select upstream releases. - Add .github/workflows/fork-release.yml: builds one immutable SHA and explicit version into a Windows x64 installer with its matching Linux x64 WSL runtime, an Intel macOS DMG, and a Linux x64 runtime archive, reusing release-desktop.yml and the existing packaging scripts. GitHub-hosted standard runners only; build jobs are contents: read and publication is a separate write job behind an environment. - Default the shared release repository to nullStack65/t3code with a T3CODE_RELEASE_REPOSITORY override, closing the index gap in t3 update, the managed/pinned runtime, the SSH tunnel runtime, and the install scripts. - Add scripts/fork-release-version.ts: a tested fork version line that is strictly increasing, excludes preview/nightly identifiers, and never relies on SemVer build metadata. - Embed repository, full source SHA, version, and architecture in the desktop app and the CLI archive, and qualify checksums from final distributed bytes. - Ship unsigned macOS builds without an update feed: Squirrel.Mac cannot apply an unsigned update. * docs(release): document blocking WinGet pin for retained package identity * fix(release): bind source/provenance, freeze-and-promote candidates, gate runners * fix(usage): retain legacy cache history and record measurement presence A v3 scan cache is read instead of discarded, so measured records from deleted transcripts survive; v3 rows decode with native ids and presence explicitly unavailable and extant files are cold re-parsed to enrich them. Parsers record whether tokens were actually observed, and the occurrence-aware dedupe key moves to a shared seam reused by the scan. * fix(usage): reconcile attribution and prove persisted bindings Preserve orphan usage in an explicit bucket and reconcile attributed + shared + unallocated + orphan against the deduplicated input. Replace content-equality dedupe with a provider-namespaced declared key plus occurrence-aware scan identity, keeping unkeyed records uncertain and surfacing conflicts and snapshot replacement. Split identity, measurement, level support, and allocation; seed coverage from declared sources; retain per-model and cost provenance. Add a read-only extraction seam from provider_session_runtime and projection_thread_pull_requests. * fix(release): executable per-target candidate route, bound receipts, gated promotion Repair the release execution path so a pre-merge PR head can be built, verified, and frozen locally, and so acceptance binds to real artifacts. Candidate source vs public eligibility: - release-source.ts gains an explicit candidate mode that accepts a fork PR SHA reachable on the resolved fork remote; public mode keeps the on-main ancestry requirement. Neither fakes ancestry. - build-fork-candidate.ts resolves the writable fork remote explicitly (--fork-remote, default fork) instead of assuming origin is the fork. Per-target vs aggregate: - candidate-build-plan.ts separates build/stage/verify-one-platform from the aggregate freeze, aligns package versions, passes --build-version and --output-dir through to desktop packaging, and builds the Windows CLI ZIP. - build-fork-candidate.ts has --phase target|aggregate and binds source/repository/mode into child-process env; completed outputs are preserved with --keep-going. - stage-candidate-asset.ts stages a target's artifacts into the shared dir. Validation that means what it claims: - fork-release-manifest.ts binds each native target to its own artifact, rejects conflicting (FAIL beside PASS) and ambiguous acceptance, and inspects real packaged provenance (tarball/zip/NSIS) via candidate-provenance-inspect.ts. - verify-windows-installer.ts runs the real NSIS install to reach the embedded WSL payload and emits its provenance. CI/promotion handoff: - fork-release.yml authorizes on owner-configured runner variables before scheduling any build, selects source before installing dependencies with a dependency-free selector, builds the SEA under the pinned Node, promotes a frozen candidate by identity digest without rebuilding, provides a real native-receipt import job, adds actions:read for cross-run downloads, and asserts the required-reviewer approval rule. Process-level regression tests spawn the real entry points. 77 focused tests pass; typecheck, lint, and fmt are clean. * fix(release): per-target verification must not require the aggregate manifest A Linux-only build produced its archive and passed the no-ambient-Node smoke, then failed at the per-target verify step because the verifier demanded fork-release-manifest.json, which only exists after the aggregate freeze. Split verification so a single platform checks only its own assets and embedded provenance; the aggregate step still requires the manifest and the complete asset set. Adds a regression test that per-target verify passes without a manifest and fails for a wrong target. * fix(release): reach the real NSIS app payload for embedded-WSL verification electron-builder's installer is an NSIS wrapper whose app payload is the \/app-64.7z stream that nsis7z.dll unpacks at install time, yielding resources/wsl-runtime.tar.gz. Unpacking that stream exercises the real extraction layout without launching the Electron app (which must not touch a live machine). verify-windows-installer.ts and the provenance inspector now descend into that payload and fail closed when 7-Zip is absent. The Windows CLI ZIP target now builds the SEA exe first. * fix(release): installer provenance is the embedded WSL runtime The Windows installer's inspected provenance is the WSL runtime it embeds, which is a Linux runtime; label it as such instead of expecting win/x64. A Windows-only candidate may lack the standalone Linux archive, so the byte-equality check is skipped in per-target verification and enforced at aggregate where both are present. * fix(usage): finish measurement and cache correctness Classify usage fields by validity and provider completeness instead of property presence: an invalid value is invalid, a valid known subset is partial, and a nonzero total never implies a complete measurement. Make dedupe-key scope explicit. A source-local key is qualified by its native session; a global key reused under another session is incompatible ownership surfaced as a conflict. Cost and provenance are part of the observation, so a repriced record conflicts rather than silently deduping. Require the current identity format for a warm scan-cache hit so an unchanged legacy transcript is cold re-parsed once to enrich it, keeping deleted history and read-failure fallbacks. Carry the legacy identity-erased marker through to the projection so an erased native id is unavailable, not missing. * fix(release): inspect real desktop/DMG provenance and fail closed - Read the Windows desktop app's own build info from resources/app.asar in the real NSIS payload; keep it distinct from the embedded WSL runtime and the bundled server sidecar (a wrong-source desktop with a correct WSL archive now fails). - Inspect the Intel macOS DMG's app.asar on the native Mac (read-only hdiutil mount, 7-Zip HFS fallback elsewhere) and map the writer's actual packaging platform vocabulary ("mac") deliberately. - Require every selected packaged component's inspection: absent, unreadable, or unperformed required inspection is BLOCKED, not verified. Promotion consumes digest-bound native inspection evidence rather than trusting a self-consistent manifest. - Regression tests through the real verifier entry points, including a real DMG mount and a real tar.gz; retain the wrong-target/conflicting tests. * fix(release): carry digest-bound inspection evidence through the local route The per-target step now emits fork-inspection-evidence-<target>.json and the aggregate phase discovers and consumes those files, so a host that cannot open another platform's artifact (for example the Mac aggregate and the Windows NSIS payload) can still qualify the exact bytes a native host inspected. * fix(release): do not stage the optional arm64 DMG unless requested An Intel-only mac build failed at staging because candidateTargetAssets("mac") always demanded T3-Code-<v>-arm64.dmg. Thread includeMacosArm64 through the build plan and staging, and build the arm64 DMG only when it is explicitly requested. The Intel DMG itself already built; this only fixes the entry point. * fix(usage): preserve zero-total quality and refresh stale cache rows Retain eligible zero-total observations instead of dropping them before classification. Codex no longer returns null for a zero subtotal, and Grok no longer skips zero-total aggregate or per-model rows: a complete measured zero, a known-zero subset, and an all-invalid payload all reach the projection with their quality, while a container with no recognised token field is still no-usage. Grok per-model cost accounting now reduces the aggregate for every emitted ticked row, so an emitted zero-token row cannot double count. Treat missing completeness metadata as unasserted. The predecessor v4 writer emitted 15-field rows without it, and the decoder defaulted a non-legacy observed row to complete, silently promoting an unknown measurement. Missing completeness now decodes as partial, and the entry is marked qualityMetadata: "predecessor" so warm-cache acceptance and resume both require the current quality format. An extant file is cold re-parsed once; deleted and unreadable history is retained conservatively. Native-id availability is a separate axis from numeric freshness. Regressions cover Codex/Grok complete zero, partial zero, invalid, and valid-plus-invalid distinct events, the parser-to-projection path, a pinned predecessor fixture generated by the actual predecessor writer, and the service-seam refresh/restart/deleted/failed-read paths. * fix(usage): persist scan-cache predecessor freshness across restart The v4 codec rewrites every retained row to the current 18-field shape, so a predecessor entry (rows written before numeric quality metadata existed) decoded as `declared` after the first persist. A fallback entry kept while its transcript was temporarily unreadable was therefore promoted to current metadata on save; after a restart it was served warm (unchanged file) or resumed from its stale prefix (grown file), skipping the cold re-parse that asserts quality. Add a file-level `lq` provenance marker alongside the existing `li` legacy marker. Encode writes `lq: 1` for a predecessor entry; decode treats `lq === 1` as predecessor regardless of the rewritten row length. The marker is dropped only when a successful full parse replaces the entry, and a current parser's genuinely partial measurement (carrying its own completeness field) stays `declared`. Recovered from the M3E local worktree (uncommitted at reviewed head af70495); codec fix and codec/service regressions transferred unchanged in substance, plus an explicit stale-prefix resume regression. Refs: METRICS-1:M3F * feat(usage): retain durable model-canary attribution across resumes T3's single resume cursor lost earlier native sessions on a resume, fork, or model switch, so a thread could not say which models contributed. Add an append-only provider_session_history (migration 054, with a current-cursor backfill) written alongside the runtime upsert, and read it through usageAttributionSources as sessionHistory bindings. Add a content-free thread_route_events store (migration 055) for pre-execution route/experiment metadata: requested provider/model/effort captured at session start, task stratum, experiment/cohort, route event kind, manager/agent ids, and escalation reason. Actual values are derived from measured usage, never copied from the request. usageRouteAttribution composes the base projection with this view and keeps child sessions distinct. T3 carries the metadata only; agent-config remains the routing authority. No prompts, responses, code, or tool bodies are stored. * test(usage): prove the route view preserves M3D zero/invalid/cache quality Add regressions that the durable session-history route view cannot regress the #4 (METRICS-1:M3D) measurement/identity quality axes: - A: an explicit complete measured zero stays a measured zero, not missing; - B: an all-invalid eligible observation stays invalid, not missing and not a measured zero, and mirrors the base projection; - C: a predecessor v4 cache entry decodes as `predecessor` with `partial` completeness and the route view never promotes it to complete; - D: a history-only identity for a measurable provider stays usage=null and quality=null, never a fabricated measured zero. No production behavior changes; the M3D parser/cache files remain byte-identical to the restacked #4 head. * fix(release): stage the Windows resource monitor before the CLI archive The win plan's cli-archive step consumes <resourceMonitorDir>/win32-x64, but the local route only staged the Linux helper, so it failed with CliArchiveInputMissingError after the installer was built. Extract the staging into a tested lib, stage win32-x64/t3-resource-monitor.exe for the win target (mirroring the workflow's resource_key layout), and add clean-directory, path-with-spaces and missing-input regression tests. * fix(release): promotion cannot skip required packaged provenance --promote --skip-provenance-inspection passed requirePackagedProvenance through from inspectProvenance, so promotion could qualify bytes it never inspected. Force the provenance gate on for promotion; digest-bound inspection evidence still satisfies it when local extraction is skipped. Add a real-process regression covering blocked/no-evidence, evidence eligible, and wrong-digest rejected. * feat(release): executable local/draft promotion handoff without a CI run The workflow publish job only consumes a fork-release-candidate CI run, so with no authorized runner a locally frozen candidate could not reach publication. Add scripts/promote-fork-candidate.ts: it reuses verify-fork-candidate.ts --promote for the byte-level checks (complete assets, current hashes, receipts, digest-bound inspections, tag target, no-overwrite, version ordering, approval gate) and adds fork-main eligibility and candidate-specific approval. Default is a read-only dry run; --execute is gated on --approve of the exact frozen manifest sha256. --inspect-release does a read-only required-asset completeness check (real draft 395230248 is correctly BLOCKED: Windows installer + CLI ZIP absent). --preflight-json and --gh-bin/--gh-prefix let tests exercise publication against labeled fixtures/mocks. Documented in docs/operations/fork-release.md. * fix(usage): make durable attribution atomic, instance-aware, and conflict-safe Repair the ROUTE6-1:R4-REV-T3 review findings on #6: - P1-1 wrap runtime cursor + provider_session_history + thread_route_events in one sql.withTransaction so one accepted upsert is all-or-nothing. - P1-2 include a normalized non-null provider_instance_key in the history unique identity and expose provider-instance ids on the route session. - P1-3 mirror nativeSessionIdOf precedence in the 054 backfill (text-only, trimmed non-empty, resume -> threadId -> sessionId with fallthrough). - P2-4 stop double counting a session bound to two threads; pool it once in a route-view unallocated bucket and carry allocation/boundThreadIds. - P2-5 make the automatic request record monotonically enrichable with a surfaced selection_conflict instead of INSERT OR IGNORE. - P2-7 de-duplicate history input by canonical identity. - P2-8 bound escalation_reason to a low-cardinality slug. - scope declared event ids per thread so a shared id cannot suppress another thread's event. - add atomicity/enrichment/instance/backfill/reorder adversarial tests and refresh docs. * fix(release): require checksum/manifest metadata and distinguish failed reads - fork-promotion: tri-state GitHub reads (present/absent/unresolved) and publicationProbeFailures so an auth/permission/network/rate-limit failure is never treated as absence; checksum parsing/coverage, publication metadata and upload-readback validators. - releaseInventoryFailures also requires SHA256SUMS and the frozen manifest. - verify-fork-candidate --promote now fails when SHA256SUMS is missing instead of treating it as optional. * fix(release): verify the uploaded payload before finalizing a draft - promote-fork-candidate now runs draft -> upload -> readback -> byte-verify -> finalize with existing gh operations, enumerating the payload by name (build assets + SHA256SUMS + frozen manifest + available acceptance/evidence metadata) instead of a wildcard; a partial upload, changed byte, failed read or missing metadata never finalizes or reports success. - live probe confirms the fork remote and fetches fork/main before ancestry. - --simulate is required for --preflight-json and an offline mock transport, so a fixture can never drive the live publisher. - process tests drive the real entry point over a stateful offline fake GitHub transport and assert on the uploaded file contents and readback. - docs: describe the sequence, tri-state reads, and concrete source-preserving Windows commands that reuse assets 585058463/584947074. * fix(release): confirm final release identity/inventory and publish acceptance evidence V9-F1: the post-finalize confirmation accepted a valid JSON object that omitted or mistyped isDraft, carried the wrong tag/source, or had an empty asset list, and still reported "Published". Parse the real `gh release view --json` camelCase shape (distinct from the REST `gh api` shape), require an explicit boolean isDraft=false, the expected tagName and targetCommitish, and the complete expected asset inventory at the expected sizes; also require the post-upload readback to be the expected draft. Missing/wrong/partial confirmations now report an unconfirmed publication state instead of success, with no destructive rollback. V9-F2: `--inspection-evidence`/`--native-receipts` paths accepted by the verifier were not guaranteed to be in the published payload. Require each supplied path to be in the enumerated candidate-local payload under the canonical `fork-inspection-evidence*.json`/`fork-native-receipts.json` layout, and reject an external or non-canonical path before any GitHub mutation. No new import service. V9-F3: the fake `gh release view` transport now emits the real camelCase shape instead of REST snake_case, so the fixture can no longer hide F1, with negative cases for missing/non-boolean isDraft, wrong tag, wrong target, and empty inventory. V9-F4: `--simulate` refuses a live `gh` binary. Docs updated to the canonical evidence layout and the confirmation requirements. Preserves draft 395230248 and the Mac/Linux artifact bytes; artifact source is unchanged at 929b637. * ci: use hosted runners for fork checks (#17) * ci: use hosted runners for fork checks * ci: record fork runner portability receipt * ci: declare fork release operator entrypoints * fix(ci): keep internal metadata constants private * fix(ci): decouple provenance inspection from desktop build graph --------- Co-authored-by: business account <businessaccount@Crown-Rain-Gutters.local> * feat(contracts): add managed launch identity envelope (#18) * feat(contracts): add managed launch identity envelope * fix(contracts): harden managed identity comparison * feat(server): stamp managed provider host identity * test(contracts): use branded managed identity fixtures * test(server): isolate provider identity fixture --------- Co-authored-by: nullStack65 <nullStack65@users.noreply.github.com> * fix(auth): expose stable session subject (#16) * fix(auth): expose stable session subject * style(auth): format session identity test * test(server): encode environment auth state with schema --------- Co-authored-by: nullStack65 <nullStack65@users.noreply.github.com> * fix(codex): scope proxy model catalogs * fix(ci): use hosted runners for fork releases * Use synthetic disposable test data instead of real userdata snapshots * Remove conflicting real-userdata fixture permission * Link approved canonical human guide from T3 instructions * fix(server): reject incompatible callback routes before admission (#21) * fix(server): reject incompatible callback routes before admission * fix(server): preserve retained sessions on route rejection * fix(provider): guard cross-driver continuations only when resuming * fix(server): preflight effective callback route * fix(server): reconcile legacy callback session identity --------- Co-authored-by: nullStack65 <nullStack65@users.noreply.github.com> * fix(release): run SEA build through vp exec (#20) Co-authored-by: business account <businessaccount@Crown-Rain-Gutters.local> Co-authored-by: nullStack65 <nullStack65@users.noreply.github.com> * fix(server): restrict human reviewer routing to the owner (#22) * fix(server): disable formal PR review mutations * fix(server): silence reviewer denial lint warning * fix(server): route reviewer requests to the verified owner * fix(server): route reviewer requests through verified owner * test(server): cover reviewer routing authorization boundaries Adopts Luna test commit 3eaf0a1 and corrects the independent review finding about removal guidance. * fix(server): avoid manual fallback for other reviewer requests --------- Co-authored-by: nullStack65 <nullStack65@users.noreply.github.com> * fix(web): qualify silence during a running turn (#7) Add passive five-minute silence visibility with server observation ownership, stable client receipts, outstanding tool context and environment-scoped notifications. Includes independently reviewed receipt-key repairs and deterministic Shiki deadline regression tests. Current-base head 38cf4ed passed normal CI 37624249974 and 225 focused cloud tests. Installed/runtime acceptance remains separate for PR20's qualified artifact and approved Browser host; no installation claimed. * feat(service): Windows lifecycle integration candidate (SCM host + graceful stop) * chore(native): import accepted Windows SCM host helper from #8 7455a7b Imported verbatim from #8 (feat/windows-service-host-prototype-20260926) at 7455a7b. Original PR branch preserved; not merged there. * feat(service): import tested Stage A status candidate from #9 2273445 Imported verbatim from #9 (env1/r8-t3-service-status-20260927) at 2273445. Original PR branch preserved; not merged there. * feat(service): join whole-service stop to a child drain over launcher IPC A Windows SCM stop cannot deliver a graceful signal, so the launcher now asks its managed child to drain over the existing IPC channel and waits, bounded, for a stopped acknowledgement before its forced fallback. The child drives the same Effect-runtime interruption path as SIGTERM via process.emit, and acknowledges from a scope finalizer. POSIX keeps its signal-driven finalizer path. Author scope: ENV-1:R10-T3-LIFECYCLE Stage B. * fix(service): deliver host stop control to the launcher and require a real drain The SCM host only wrote the launcher's cleanup marker, which nothing read as control, and the launcher's child acknowledgement was emitted from a sibling finalizer and collapsed with exit/timeout/send-error, so an early ack could authorize a hard kill while resources were still draining. Add a private per-instance control request the host writes and the launcher watches, binds to its launch token and consumes before running Launcher.stop. Sequence the stop/stopped IPC messages by request id, acknowledge only a requested shutdown, and make requestGracefulChildStop wait for the child's real exit so an early acknowledgement never forces a kill. Author scope: ENV-1:R11-T3-LIFECYCLE. Rust host change is source-only here (no Rust toolchain on this macOS host); see the checkpoint RESULT for gates. * feat(service): bind t3 service install/status/restart/uninstall to the SCM host Add the Windows SCM adapter through BootService: a windowsManager and a pure windowsBootService module render the t3-windows-service-host.exe ImagePath and the sc.exe create/config/start/stop/delete steps, parse sc.exe queryex/qc honestly, and bind only an exact home/helper/runtime/account registration. Install/restart/uninstall refuse a foreign or unreachable registration and block on a missing helper or unqualified account instead of defaulting to LocalSystem; status keeps registration, start type and observed running state separate. Update the service docs to match. Author scope: ENV-1:R11-T3-LIFECYCLE. * test(service): run the launcher transitions with a portable scripted runtime Windows resolves the pinned runtime as t3.exe and cannot exec the Node shebang fixture the launcher tests stand up, so the whole launcher suite failed there. Add an explicit interpreter seam to the production Launcher (unset in production, which still spawns the native executable directly) and write the fixture at the platform executable path. The same Launcher transitions now run on every host; a focused test proves the interpreter path drives the real transitions rather than a launcher duplicate. * fix(service): bind SCM ownership to the real account and parse image paths losslessly W1 of the recovered R12 lifecycle work. Ownership of an existing `sc.exe` registration is now bound to the exact native `SERVICE_START_NAME`, helper, home, log and service name, and only requires the registered runtime to live under this home's `runtime/versions/<exact-version>` tree. A lossless Windows command-line splitter/quoting pair replaces the whitespace-collapsing image comparison, so a quoted path with spaces, an embedded quote or a trailing backslash is compared exactly and a genuinely different home is never adopted as ours. An owned older runtime is therefore upgraded rather than refused as a foreign registration. Absence is only the authoritative numeric `ERROR_SERVICE_DOES_NOT_EXIST` 1060; a localized or incidental 1060, an access-denied result or an unavailable code stays unknown and never authorizes create/delete. `running` now requires a positive `queryex` PID. Read-only status observes an installed SCM service by fixed name even when install-account input is absent, while mutation still refuses a missing/unqualified account instead of defaulting to LocalSystem. Author scope: ENV-1:R13-T3-LIFECYCLE (recovered from R12). * fix(service): observe bounded SCM transitions and separate registration from activation W2 of the recovered R12 lifecycle work. `sc.exe stop/start/delete` only accept a request; they do not report completed SCM state. Install, restart and uninstall now observe the authoritative `sc.exe queryex` state by bounded polling (30s production, overridable for tests) and never promote a timeout, a failed query or an unreachable SCM to a successful transition. A stop that is not confirmed STOPPED is not followed by a delete, restart or success claim, and an already stopped/absent target is idempotent without hiding errors. `install({start:false})` now creates or reconfigures the registration so a later start runs this version, while activation is gated separately on `start`. Obvious pending-update, downgrade and account prerequisites are validated before a running service is disturbed and rechecked after a confirmed stop. The restart flow keeps its truthful partial outcome instead of speculatively starting a second time. The real module and BootService drive these paths in tests, including a failed-stop uninstall and a still-pending deletion. Author scope: ENV-1:R13-T3-LIFECYCLE (recovered from R12). * fix(service): make private stop delivery atomic and prove the real managed drain W3 of the recovered R12 lifecycle work. The native host now publishes a stop request through a unique temp file, fsync, and rename, so the launcher's watcher never observes a partial document and a replacement is all-or-nothing. The launcher claims the request by renaming it to a private per-attempt path before decoding, with a single in-flight consumer, so overlapping polls cannot both act on one request and a request written during a poll is never deleted unread. Per-instance binding and private permissions are retained. A new launcher option forces the Windows IPC drain branch on another host so the production transition can be exercised. The regression loads the real `managedShutdownLayer` from the server source in the child, adds a delayed application finalizer, and proves the acknowledgement is only sent after the drain, never on the stop request. This complements the existing exit-authoritative waiting, which is retained. Author scope: ENV-1:R13-T3-LIFECYCLE (recovered from R12). * docs(service): align Windows SCM status, transitions and control with observed behavior Update the service documents to match the recovered lifecycle work: read-only status is selectable/observable without install credentials while mutation still requires a qualified account; ownership binds the actual `SERVICE_START_NAME` and an owned older runtime under the home's version tree; `sc.exe` start/stop/ delete are requests observed by bounded `queryex` polling; `install({start:false})` registers without activating; and control delivery is an atomic publish claimed by a single launcher consumer. Author scope: ENV-1:R13-T3-LIFECYCLE. * test(service): share SCM host argument vectors with the native parser A single vector file drives both the TypeScript adapter's ownership parser and the native configuration parser, so the published host invocation contract is checked against one set of vectors: inline --flag=value, last-wins duplicates, a .. path escape, an unsupported launch-mode flag, an unknown flag and a missing runtime. The native test asserts the effective home/runtime and the parse outcome; the adapter test (next commit) consumes the same rows. * fix(service): match native effective args and preserve stopped-service state Windows ownership now agrees with the native host's effective target. The registered ImagePath is resolved with the same rules the host applies - inline --flag=value accepted, a repeated flag last-wins - but a duplicate or unsupported token is refused, so a bound flag followed by another home/runtime can never qualify a different effective target. A registered --runtime must normalize (Windows rules, .. collapsed) to exactly <home>/runtime/versions/<exact-version>/t3.exe, and the registered program must be the helper beside that same runtime, so a real older package (helper beside its own runtime) is upgraded while a half-upgraded or escaped binding stays foreign. A stop is now idempotent without hiding failure: install/restart/uninstall probe the exact owned state first and issue no sc.exe stop for an already stopped/absent registration, and a stop error is tolerated only when a follow-up probe confirms the service is stopped. Install captures the exact launcher-owned state before rewriting it; a failed create/config restores the previous bytes, and a failed start after the registration changed reports an explicit BootServicePartialStateError instead of implying preservation. Focused tests cover the effective-argument parser, the shared TS/native vectors, old-layout ownership, stopped idempotence, a confirmed 1062, an unconfirmed stop failure, state restoration and explicit partial outcomes. * fix(service): validate Windows host in CI and clarify candidate guidance * fix(service): keep lifecycle implementation helpers private --------- Co-authored-by: env1-agent <agent@env1.local> Co-authored-by: env1-agent <env1-agent@example.com> Co-authored-by: business account <businessaccount@Crown-Rain-Gutters.local> Co-authored-by: nullStack65 <nullStack65@users.noreply.github.com> Co-authored-by: Kameron Smith <kameron.smith@closura.ai> * fix(server): fail opencode continuation when the resumed session is gone (#13) Fail requested OpenCode continuations on missing, unusable, or mismatched session identity without creating replacement sessions or replacing durable bindings. Preserve intentional new sessions, valid resumes, and directory-change forks. Retain the pinned receipt-gated Linux pilot handoff; repair stalled probe process-group termination with GNU timeout and a child-exit regression. Current-base head d165b89 passed 230 focused synthetic tests and normal CI37627003191 attempt2 (one isolated retry for an unchanged longstanding Git VCS fixture); fingerprint37627003188 green. Distinct GPT-6 Luna technical/integration reviews found no blockers. Model/harness: GPT-6.1 Sol delivery owner, native Codex Cloud; GPT-6 Luna investigation/implementation and independent review. Native installation and runtime acceptance remain separate for PR20 release owner. * feat(server): bounded environment preflight for provider launches (#11) Run bounded read-only environment preflight before explicit and adapter-default new/recovered provider launches. Separate host checkpoint Git from provider snapshot capabilities and deliver warning findings through authenticated thread activity. Preserve transferred source and current-base integration. Verified source tree05b1021435a52b3a7b25f6f1a365cf046b1a5995; normal CI37630441181 passed; independent automated technical review clear. Native artifact acceptance remains with shared release ownerPR20. * fix(release): carry native Intel DMG inspection evidence (#24) * fix(release): carry native Intel DMG inspection evidence * test(release): declare synchronous Node fixture boundary * fix(release): bundle jsonc parser through its ESM entry (#26) * fix(release): import receipts for the frozen candidate (#25) * feat(server): refuse unqualified typed Skill sessions * test(server): cover typed Skill default routing * test(server): type native admission fixtures * feat(server): refuse unqualified typed Skill sessions (#31) Register a reserved codex-typed-skills driver that refuses before candidate access or native capabilities. Preserve legacy Codex behavior and document the unsupported positive admission boundary. Validated by focused tests, independent source review with bounded final delta inspection, and normal CI38740482025 at source5a4c3bc6b3b939bfa7a32f1a5077cfac36cb6631. This source change does not qualify positive Skill activation or installed behavior; closura-agent-config#364 remains open. * fix(ci): require owner dispatch for production relay * docs(ops): scope relay rerun guard to current definition * fix(ci): require explicit owner admission for relay deployment (#32) Remove automatic relay deployment on source pushes. Require owner-driven manual admission bound to the reviewed current source and workflow SHA; preserve production credentials, environment and concurrency. Historical workflow replay remains a separately tracked operational limitation. * feat(server): bind Codex observations to process and turn lifecycle * fix(server): type native observation evidence and fixture codecs * fix(server): revoke Codex observations at notification ingress * feat(server): bind Codex observations to process and turn lifecycle (#33) Capture server-local Codex process, session and turn observations with private immutable handles, freshness checks and decoded-ingress invalidation. Preserve fail-closed typed Skill admission and explicit unknown authority and containment boundaries. Independent R2 executed 144 scoped tests and the three held-consumer regressions; exact-head normal CI passed. This source prerequisite does not qualify positive Skill activation, installation or live model behavior. * feat(server): consume canonical typed Skills for fresh Codex turns * test(server): preserve CLI fixture Node namespace calls * fix(server): fence governed turn submission after route drift * fix(server): bind typed Skills to task repository * fix(server): break typed Skill consumer import cycle * fix(server): revalidate Skill account and own candidate lifetimes * fix(server): fence late governed Skill readers before retirement * fix(server): share native child-reader admission signals * feat(server): resolve typed Skills for fresh Codex turns (#35) Land exact reviewed 2e4270c source. Independent R4 repaired-delta review and accepted exact-head CI succeeded; prior findings/history retained. Future hosted execution is paused at repository Actions plus workflow states pending ROOT-owned user-runner qualification. Opt-in source only; runtime source pin, enablement, unsupported activation modes and full issue364 acceptance remain separate. No deployed configuration or install change. * fix(server): observe account readiness before governed startup * feat(server): support governed Codex inputs on V2 runtime * fix(server): preserve governed revocation and restart prompts * fix(desktop): probe macOS native compilation before bundling * fix(desktop): force termination of stalled compile probes * test(desktop): use host context for process group coverage --------- Co-authored-by: nullStack65 <nullstack65@users.noreply.github.com> Co-authored-by: business account <businessaccount@Crown-Rain-Gutters.local> Co-authored-by: env1-agent <agent@env1.local> Co-authored-by: env1-agent <env1-agent@example.com> Co-authored-by: Kameron Smith <kameron.smith@closura.ai>
What this is
A bounded, read-only environment preflight that runs immediately before a provider session starts. It prevents a class of accidental-git damage: when a directory that is meant to be a shared session root is itself a Git work tree, every project created beneath it shares that one repository, so checkpoints and
git add --all --sparsefrom an OpenCode snapshot can commit unrelated projects into the umbrella repo. A second, narrower failure is a configured provider Git that does not support--sparse, which the OpenCode snapshot path assumes.The preflight surfaces findings to the user through the normal thread-activity transport (
kind: "launch.preflight"). It warns by default and does not block an otherwise-usable launch. One demonstrated exception is a real blocker: when the resolved Git cannot be started and the session root is itself a repository, T3 Code cannot checkpoint or resolve a worktree, so the launch is stopped withProviderLaunchPreflightBlockedError. The preflight's Git and filesystem checks run independently of the shared-root opt-in.Behavior
sharedSessionRootis empty. Every repository session — including the server's own cwd — is treated as a normal working directory; no shared-root finding is produced. Applicability is never inferred from a folder name, breadth, child repositories, or the mere presence of.git. The Git/filesystem checks still run.sharedSessionRootis set, and a provider session's cwd resolves to exactly that directory, the preflight checks for an accidental umbrella repository and reportsshared-root-git. A configured shared root is honored regardless of the backend's own working directory. Root, top level and common-directory identity are canonicalized consistently, so/var↔/private/varalias spellings of the same physical root give the local "move or retire.git" guidance; a genuinely external common directory (e.g. a linked worktree) stays safe, and an unresolved identity is reported as unknown rather than an affirmative external repository.OPENCODE_CONFIG_CONTENTleaves snapshots on reportsgit-sparse-add-unsupportedwhen the Git the launch resolves lacks--sparse, even in an ordinary repository. An explicit effectivesnapshot:falsesuppresses that provider-specific requirement, and an instance pointed at an external OpenCode server does not pretend the local Git is that server's Git. Non-OpenCode consumers keep T3's own sparse-checkout fallback.ProviderAdapterProcessErrorbefore any model work; the preflight does not silently convert that into a warning.Integration points
apps/server/src/environment/launchPreflightReporter.ts(new): production reporter, imported byapps/server/src/server.ts; appends athread.activity.append(kind: "launch.preflight",tone: "error") through the realOrchestrationEngine, so it reaches the same client subscription normal activities do.apps/server/src/provider/Layers/ProviderService.ts:guardProviderLaunchruns the bounded preflight against the exact session cwd and resolves the consumer throughresolveLaunchPreflightConsumer; warnings are delivered through the injected reporter, and pending startup notices are retained until delivery actually succeeds.apps/server/src/provider/launchPreflightConsumer.ts(new): resolves the selected consumer fromServerSettings.providerInstances(effectiveOPENCODE_CONFIG_CONTENTsnapshot setting and external-server ownership), reusing the runtime's own config resolution.apps/server/src/environment/LaunchPreflight.ts/LaunchPreflightWarningInbox.ts: single bounded probe implementation (max 16 notices/dir) and peek/clear inbox.packages/contracts/src/settings.ts: adds explicitsharedSessionRoot(server setting + patch).Runtime characteristics
git config --bool core.sparseCheckout,git add -h, no add/status/dry-run/snapshot; bounded stat/existence/read operations (32 KiB reads, 4 KiB subprocess output, owned-process cleanup, no late launch after timeout). The Git-checkout scan is identity-based, not a recursive scan; a plain directory is not flagged. Fixture-owned temp dirs are removed by each test; no installed-workstation state is touched.Current cloud candidate
56b4bc9af53996a73d326a46373d9bb491a8fce608dbb72de3b9adabb8f4d796accea4f1db6ec13905b1021435a52b3a7b25f6f1a365cf046b1a5995Evidence provenance
The underlying implementation and its focused suites (A1 applicability, A2 final-environment fixture, A3 backend delivery through a real
OrchestrationEnginesubscription + real dummy provider, E4 missing-executable/recovery) are V5 author evidence — see the V5 RESULT.P1 RESULT independently published the candidate and demonstrated authenticated production WebSocket delivery. Its untracked smoke is now committed as
apps/server/integration/envchkP1WireAcceptance.integration.test.tsand rerun on the corrected head29a4cdcdc: the corrected alias-awareshared-root-gitwarning, one successful dummy start, and the configured-executable error were all observed over the real authenticatedorchestration.subscribeThread.ENVCHK:E6 repaired R1–R3 (incomplete-check warnings, consistent identity handling, production-derived consumer) with focused failure-path and healthy controls. See the ENVCHK:E6 RESULT comment on this PR for exact commands, exits and timings.
Not claimed without execution: native Windows qualification (A4) and actual browser/rendered-client rendering remain UNVERIFIED. The production authenticated subscription (not DOM rendering) is the accepted delivery boundary.
Rollback
Unsetting
sharedSessionRootdisables only the shared-root classification; the Git and filesystem preflight still runs. The complete rollback is a source/binary revert of these commits, which restores prior behavior. Additive and opt-in for the shared-root check; no migration and no destructive filesystem operation.Model / harness
Current cloud delivery: GPT-6.1 Sol owner with native GPT-6 Luna implementation and independent technical review. Earlier author evidence below remains historical.
Dependency and cleanup provenance (ENVCHK:E7)
apps/servernow declaresjsonc-parser@^3.3.1as a direct runtime dependency (previously only transitive) and parsesOPENCODE_CONFIG_CONTENTwith it; the feature's ad-hoc regex helper and its shared exports were removed.packages/shared/src/schemaJson.tsis back to its pre-feature form.d3f205d13d228f0c6a4987bbcd7e20ecbda965ac; historical base:419f7574010c066a56974fc9e3ac0709a08efb33.Release acceptance
PR20 owns shared release/runtime qualification using this lane's exact eventual merged source. Exercise fresh synthetic roots, warning-only launch exactly once with authenticated
launch.preflightdelivery, configured-executable failure before model work, host/provider Git separation, unstartable host Git blocking repository launches, omitted-cwd new/recovery defaults, bounded read-only probes, and captured fixture-owned process exit before cleanup. Current native Mac/Windows artifact acceptance and installation are unclaimed. Rollback is compatible version/config reversal; this feature introduces no database migration.