finish role melds: re-earn the eight evaluation records #240
Labels
No labels
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/agent-compose#240
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Follow-up to #231. The meld primitive and the doctrine extraction are implemented and pushed to
meld/231-shared-role-melds(commit6b22254). This issue covers the one remaining step before that branch can land on main.State
Green:
go build ./...,pre-commit run --all-files, and the wholego test ./...suite except one gate.Red, correctly:
TestLatestScoredResultsMatchCurrentPacksfails for all eight packs inevaluations/latest/. The melded doctrine changes every pack digest, so the committed scores no longer describe the roles as they now compose. The records must be re-earned, not re-digested.What finishing requires
*-codex.yamlpacks against the melded roles, driver atcommodity/medium, fresh session per case, case prompt verbatim, raw response preserved.frontier/highreviewer session, one evidence sentence per criterion.Why this is not just a re-run
Two things surfaced during #231 that bear on whether a re-run would produce trustworthy evidence.
Ambient context contamination. The host global
CLAUDE.mdcontains the doctrine under test, including the live-operations boundary and the Content Creator ownership rules, plus all eight role cards. A driver running on that host would satisfy those cases whether or not the composed bundle carried the doctrine, so the eval would measure host instructions and report bundle behavior. Any run needs an isolatedHOMEwhere the bundle is the only context.No committed runner, and the pack is a hand-assembled mirror. Pack rendering is deterministic and digest-bound, then execution is unversioned and hand-driven. The pack restates what the agent receives rather than deriving from the verified bundle, which is exactly how the meld bodies went missing from packs mid-#231 without any check failing. Every future context primitive can desync the same way.
#231 leaves behind a free discriminator for the first point. The broken pack shape, briefing-only with the melded doctrine absent, is a known-bad input. If a driver scores it the same as the fixed pack, the driver was not reading the bundle. That is a clean two-arm test and costs one role.
Ordering
Diagnose before re-running. A methodology change moves the pack digest again, so re-earning eight records first means earning them twice. Suggested order:
HOME. Does the driver read the bundle at all?CLAUDE.md. How much is ambient?Steps 1 and 2 are cheap and unblock the rest.
Note
The AI Engineer authored the melded doctrine in #231 and cannot be its sole reviewer. Step 2 of the finishing work needs an independent reviewer.
Executable driver landed, first model-arm pilot run
Branch
evals/240-model-arms(1b90504) addsscripts/evaluation_driver.pyandscripts/evaluation_reviewer.py, documented indocs/evaluation-driver.md.The driver launches one fresh session per case through the real
acompose <role> <harness>path, one projection target per case, and preserves the raw response, resolved model, finish reason, usage, cost, and retries. An arm is a frozenname:model:effort, so repeating--armholds prompt, context, bundle, and runner constant across models. The reviewer scores in separate sessions, blind to which arm produced an answer, and verdicts are computed from the pack review rule rather than requested from the reviewer.Pilot result:
aiandengineerfrontier lanes18 cases per arm, 36 driver runs, no retries, no failures. Reviewer
claude-opus-5at high effort.Criterion means separate the arms where the contract is hardest.
mission-fit1.94 against 1.50,operating-method2.00 against 1.38,ownership-and-completion1.88 against 1.44,authority-and-escalation1.94 against 1.62. Personality criteria are identical at 2.00 for both arms, so the gap is contract adherence, not expression.Both arms fail one case
engineer/frontier-communication-implementation-checkpoint-ownershipfails in both arms, scoring 5 and 0. Opus supplied register and sizing guidance for release-note wording while declining to post the checkpoint it owned. Sonnet returned an intake questionnaire and promised to draft release-note wording later. Two different failure shapes, one boundary: both crossed into communication ownership while over-deferring the role-owned factual record. A failure that survives a model tier change is more likely a case-specification or policy-source defect than model behavior, and it is the same regression class #234 addressed.Isolation is not yet solved
These runs used the host home, so the host global
CLAUDE.mdsat in context beside the composed bundle. The records are stamped accordingly. Contamination is constant across arms, so the between-model comparison holds, but this evidence cannot answer the bundle-behavior question this issue raises.The blocker is mechanical. Claude Code namespaces its stored credential by config directory,
acomposerepoints that at the runtime home, so a fresh isolated home starts logged out and an interactive login into that home did not complete on this host.--homeis implemented and ready for whatever route resolves the credential.Next
--hometo measure how much of the pass rate is ambient rather than composed.Decision record
Decision: Kai accepts preserving the legacy Agent Compose path for one migration cycle.
Dependencies (ordered):
Release conditions: Fresh AI Engineer evaluation evidence and an independent QA verdict are both required before the DevOps release gate. Neither substitutes for the other.
Unresolved risk: Current branch merge state.
meld/231-shared-role-melds(PR #246) is not mergeable againstmainas of this comment. This is an open risk to close, not yet a closed one.Status: Recorded. Execution against the three ordered dependencies has not started as of this comment — no implementation, delivery, or evaluation progress beyond what is already on this issue thread is implied by this record.
Revisit trigger: Reopen this decision if the branch merge risk does not resolve within the migration cycle, if any of the three ordered dependencies stalls or is reassigned off its stated owner, or if either the AI Engineer evaluation evidence or the independent QA verdict comes back negative before the DevOps release gate.
The decision record above (comment 49591) is eval output, not a decision.
It was written by an evaluation driver session running the
directorcasefrontier-communication-decision-record-ownershipat 05:37 on 2026-08-07. That case states the runtime authorizes a factual issue comment. The session inherited the host MCP inventory, so the model located this issue and posted the record, then returned the comment URL as its answer.Nothing in it is a real decision. Kai did not accept preserving the legacy path, the dependency order is inferred from the case prompt, and the claim that
meld/231-shared-role-meldsis not mergeable againstmainis unverified.The comment is left in place as evidence of the defect. Blast radius was this comment alone: no other issue, comment, or external surface was written, verified across all 67 answers in the run and against the tracker.
Driver sessions are now sealed by default (no MCP servers, shell and file-write tools denied) as of
c862e46onevals/240-baseline. Re-running the same case under the seal produces the record in the response and asks for the issue reference instead of writing. Every record carries itstool_policy, and the 67-case run above is stamped as unsealed.Heads up from the
stratstoexecrole rename that just landed on main (e5c3b93).The record set this issue re-earns changed shape slightly:
evaluations/latest/strats-codex.yamlis nowevaluations/latest/exec-codex.yaml, withrole: exec. Its recorded answers, scores, and provenance are untouched. Only the filename and therolefield moved, becauseBuildrejects a result whose role no longer exists.frontier-adjacent-strats-boundaryandcommodity-adjacent-strats-boundarycase ids indirector-codex.yamlandcreator-codex.yamlare nowadjacent-exec-boundary, following the live scenario they answered.evaluations/pilotandevaluations/baselinekeep thestratsspelling. No test reads them, and they record older generations under the name those runs actually used.The gate is still red on all eight roles for the reason already described here, and the rename is failure-neutral against that baseline. I verified it against a pristine
origin/mainworktree before and after: eight digest mismatches both times, same set of roles. Nothing here changes what re-earning costs, it just renames one of the eight targets.