fix(vocabulary): close the nine drift items that needed a decision - #959
Open
drewstone wants to merge 5 commits into
Open
fix(vocabulary): close the nine drift items that needed a decision#959drewstone wants to merge 5 commits into
drewstone wants to merge 5 commits into
Conversation
The bridge reasoning check read a private copy of the cli-bridge effort map and the copy was stale. It expected codex to apply `minimal` for `none` and `high` for `xhigh` and `ultracode`; cli-bridge 0.3.0 applies `none`, `xhigh` and `ultra`. A mismatch throws, so three of the seven rungs refused a legitimate codex run. Its default arm asserted the canonical rung for eleven more harnesses whose receipts carry `applied: null`, refusing those too. Both halves now read `nativeReasoningControl` from @tangle-network/agent-interface 1.6.0, the same table the bridge argv builders read. The two test fakes echoed the same stale map, which is why the drift survived; each now transcribes cli-bridge instead. An in-process worker is no longer journaled as a sandbox sibling: the two loop trace types carry `in-process`, and `PlacementInfo` maps it to `local`. A cost or latency breakdown split by placement counted every local run in the sandbox bucket. `ImproveSurface` is derived from `AgentImprovementSurface`, so what `improve()` produces is a subset of what a proposal can name by construction. `improvementSurfaceValues` gains the rollout-policy value, and `opaqueProfileSlice` stops folding the same extension into `agent-profile`, which would have reported two changed surfaces for one edit. One `PursuitStatus` replaces `PursuitRunStatus` and `PursuitNodeStatus`: they disagreed on the word for a failure in the same file, so joining run rows to node rows split one failure population into two. `down` wins because the journal writes it. Deleted: `Restart` and `SpawnOpts.restart`, which the supervisor dropped silently while the keyed-spawn contract already owns retry; `restartCount`, which nothing could increment and which replay overwrote with 0 anyway; `CoderReview.recommendation`, which promised traces the delegate has no run id to emit and which selection never read; `UsageClass`, whose declaration was its only occurrence. `memory-store.provision` narrows to the one backend anything names. `ResearchSource` is deduped rather than deleted: it has a live reader through `DelegationArgs`. `interactive-session-not-started` is kept and documented: it is the Executor port's vocabulary, and its first-party emitter is #773, blocked upstream. Closes #954
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes the nine items in #954. The decision for each, with its evidence, is recorded in this comment; this pull request is that record executed. One pull request rather than nine because each would need its own version bump and fixture regeneration, and each rebase would invalidate the next.
Three of the nine turned out different from filed. Those corrections are called out below.
Behaviour changes
The bridge reasoning check now reads one owner, and it was refusing live runs.
expectedBridgeAppliedReasoningexpected codex to applyminimalfornoneandhighfor bothxhighandultracode. cli-bridge 0.3.0 appliesnone,xhighandultra— its own comment records why: "Codex CLI 0.147.0 accepts the canonical values directly." The values are compared atruntime.ts:3582and a mismatch throwsValidationError, so three of the seven rungs refused a legitimate codex run. Thedefaultarm asserted the canonical rung for eleven more harnesses, none of which plumbs a thinking flag — their receipts carryapplied: null, so those runs were refused too. Both halves are gone: the check now callsnativeReasoningControlfrom@tangle-network/agent-interface1.6.0, the same table the cli-bridge argv builders read (tangle-network/agent-sdk#243).An in-process worker is no longer recorded as a sandbox sibling.
LoopSandboxPlacement.kindandLoopIterationDispatchPayload.placementcarry'in-process', and the in-process executor returns it. Both are@stable, so this is a deliberate widening: a cost or latency breakdown split by placement was counting every local worktree-CLI iteration in the sandbox bucket, which is a wrong number rather than a missing one.placementInfoFromLoopPlacementfolded everything non-fleetintosandbox;PlacementInfo.kindalready admits'local', which is where in-process belongs.improve()can no longer produce a surface a proposal cannot name.ImproveSurfaceis nowExclude<AgentImprovementSurface, 'knowledge'>, so the subset relation holds by construction. agent-interface 1.6.0 addsrollout-policyto the proposal vocabulary. Two sites fell out of deriving the type:improvementSurfaceValuesmust now produce a rollout-policy value (it readsstructuralRolloutPolicyFromProfile, the same accessorimprove()uses), andopaqueProfileSlicefoldedprofile.extensions— where the rollout policy lives — into theagent-profilesurface, so one rollout-policy edit would have reported two changed surfaces. The slice now excludes that key.One word for a failed projection row.
PursuitRunStatussaidfailedandPursuitNodeStatussaiddown, in the same file, so a consumer joining run rows to node rows onstatussplit one failure population into two. Both are replaced by one exportedPursuitStatus = 'running' | 'done' | 'down'.downwins because it is the journal's own word — a settlement is journaled askind: 'down'— and three of the four downstream copies already used it. Theagent.runhook payload still spells a failurefailedand is still read that way; what changed is what the projection writes.Deletions
Restart,SpawnOpts.restart, andrestartCount. A caller could writescope.spawn({ restart: 'permanent' })and the supervisor dropped it silently. Implementing restart was the alternative and it is the wrong one: the retry story already has an owner. A keyed spawn is idempotent per key, and a key whose prior attempt settleddownspawns fresh and says so (prior.state: 'retried' | 'lost').restartCountgoes with it because nothing could ever increment it — and it was deader than filed:replaySpawnTreehard-coded it to0at all three of its own settlement sites, overwriting whatever a journal carried.CoderReview.recommendation. Its docstring promised traces. The delegate has no run id to emit aloop.decisionwith, and the reviewer runs after the kernel's loop has finalized, so there is no iteration trace to attach to — the promise was unkeepable at that call site, not merely unkept. The field also adds nothing actionable: selection readsapprovedandreadiness, andship/approve-with-nitsare bothapproved: truewhilechanges-requested/rejectare bothapproved: false.notesis now documented as the one field a caller sees.UsageClass. Its declaration was its only occurrence anywhere.UsageSplitalready carries the same idea as two named number fields.Two of the three
memory-storeprovisions.provisionis'sqlite'alone — the only value the codebase or its test ever names.Dedupe
ResearchSourcehas one owner.src/profiles/researcher.tsdeclares it;src/mcp/types.tsimports and re-exports it, the direction it already imports forCoderTaskand the UI-auditor types. Both public entry points still name the type.Corrections to #954
defaultarm — the codex mapping inside the switch is stale against cli-bridge 0.3.0 and refuses three of seven rungs today.ResearchSourceclaim is wrong. It is not dead:DelegateResearchArgs.sourcesreads it, andDelegateResearchArgsis a live member ofDelegationArgs, the task queue's dispatch union (task-queue.ts:59), with its own test. OnlyUsageClasswas dead. Dedupe, not deletion.interactive-session-not-startedis theExecutorPORT's vocabulary:Scope.interactivekeeps whatever reason an executor's owninteractive()returns (scope.ts:1327), so an executor implemented outside this package can emit it today, and deleting it would break those — the same reasoning that savedSpawnEvent.cancelledfrom the refuted list. No first-party executor emits it because exactly one executor implementsinteractive()at all; the sandbox arm doing so is feat(execution): expose exact interactive session attachment #773, blocked upstream on a Sandbox SDK method absent in 0.31. The member's docstring now says both.memory-storearm with a namedCapabilityNotAdmittedError, so aneo4jmanifest was never quietly provisioned. Only the type over-promised.Verification
pnpm run typecheck,pnpm run lint,pnpm run check:version-bump,pnpm run check:testing-fixtureandpnpm run docs:checkpass. Targeted suites for every touched area pass.Four failures in
src/improvement/improve.test.tsreproduce identically on an unmodifiedorigin/maincheckout of this machine (git-worktree fixtures on macOS); they are not from this change. Linux CI is the authority.Follow-up
primeThinkingLevelin@tangle-network/agent-profile-materializemaps the same ladder onto the prime fork's--thinkingrungs. The two agree today and were verified value by value, but they are two owners of one fact; collapsing them is tangle-network/agent-dev-container#6136. Nothing reads a prime materialization receipt today — the prime backend never callsprofileExecutionIdentity— so no check depends on it.