finish role melds: re-earn the eight evaluation records #240

Open
opened 2026-08-07 01:02:08 +00:00 by coilyco-ops · 4 comments
Member

Follow-up to #231. The meld primitive and the doctrine extraction are implemented and pushed to meld/231-shared-role-melds (commit 6b22254). 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 whole go test ./... suite except one gate.

Red, correctly: TestLatestScoredResultsMatchCurrentPacks fails for all eight packs in evaluations/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

  1. Run the eight *-codex.yaml packs against the melded roles, driver at commodity/medium, fresh session per case, case prompt verbatim, raw response preserved.
  2. Score every case in a separate frontier/high reviewer session, one evidence sentence per criterion.
  3. Commit the refreshed records with provenance pointing at #231 and this issue.

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.md contains 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 isolated HOME where 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:

  1. One role, broken pack versus fixed pack, isolated HOME. Does the driver read the bundle at all?
  2. Same role, with and without the host global CLAUDE.md. How much is ambient?
  3. Decide whether packs stay an assembled mirror or derive from the verified bundle.
  4. Re-earn all eight once, under the corrected methodology.

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.

Follow-up to #231. The meld primitive and the doctrine extraction are implemented and pushed to `meld/231-shared-role-melds` (commit `6b22254`). 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 whole `go test ./...` suite except one gate. Red, correctly: `TestLatestScoredResultsMatchCurrentPacks` fails for all eight packs in `evaluations/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 1. Run the eight `*-codex.yaml` packs against the melded roles, driver at `commodity`/`medium`, fresh session per case, case prompt verbatim, raw response preserved. 2. Score every case in a separate `frontier`/`high` reviewer session, one evidence sentence per criterion. 3. Commit the refreshed records with provenance pointing at #231 and this issue. ## 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.md` contains 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 isolated `HOME` where 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: 1. One role, broken pack versus fixed pack, isolated `HOME`. Does the driver read the bundle at all? 2. Same role, with and without the host global `CLAUDE.md`. How much is ambient? 3. Decide whether packs stay an assembled mirror or derive from the verified bundle. 4. Re-earn all eight once, under the corrected methodology. 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.
Author
Member

Executable driver landed, first model-arm pilot run

Branch evals/240-model-arms (1b90504) adds scripts/evaluation_driver.py and scripts/evaluation_reviewer.py, documented in docs/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 frozen name:model:effort, so repeating --arm holds 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: ai and engineer frontier lanes

18 cases per arm, 36 driver runs, no retries, no failures. Reviewer claude-opus-5 at high effort.

  • opus-5 high: 17/18 pass, 143/150 points, median 57s, median 694 words, $12.46
  • sonnet-5 medium: 10/18 pass, 113/150 points, median 13s, median 209 words, $5.08

Criterion means separate the arms where the contract is hardest. mission-fit 1.94 against 1.50, operating-method 2.00 against 1.38, ownership-and-completion 1.88 against 1.44, authority-and-escalation 1.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-ownership fails 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.md sat 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, acompose repoints 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. --home is implemented and ready for whatever route resolves the credential.

Next

  1. Resolve the isolated-home credential route, then re-run the pilot with --home to measure how much of the pass rate is ambient rather than composed.
  2. Decide whether the checkpoint-ownership case is a case-specification or policy-source defect before re-earning the eight records.
  3. Independent review still required. The pilot was run and summarized by the AI Engineer seat and has not been accepted by QA.
## Executable driver landed, first model-arm pilot run Branch `evals/240-model-arms` (`1b90504`) adds `scripts/evaluation_driver.py` and `scripts/evaluation_reviewer.py`, documented in `docs/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 frozen `name:model:effort`, so repeating `--arm` holds 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: `ai` and `engineer` frontier lanes 18 cases per arm, 36 driver runs, no retries, no failures. Reviewer `claude-opus-5` at high effort. * opus-5 high: 17/18 pass, 143/150 points, median 57s, median 694 words, $12.46 * sonnet-5 medium: 10/18 pass, 113/150 points, median 13s, median 209 words, $5.08 Criterion means separate the arms where the contract is hardest. `mission-fit` 1.94 against 1.50, `operating-method` 2.00 against 1.38, `ownership-and-completion` 1.88 against 1.44, `authority-and-escalation` 1.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-ownership` fails 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.md` sat 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, `acompose` repoints 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. `--home` is implemented and ready for whatever route resolves the credential. ## Next 1. Resolve the isolated-home credential route, then re-run the pilot with `--home` to measure how much of the pass rate is ambient rather than composed. 2. Decide whether the checkpoint-ownership case is a case-specification or policy-source defect before re-earning the eight records. 3. Independent review still required. The pilot was run and summarized by the AI Engineer seat and has not been accepted by QA.
Author
Member

Decision record

Decision: Kai accepts preserving the legacy Agent Compose path for one migration cycle.

Dependencies (ordered):

  1. AOS-owned contract revision
  2. Engineer-owned consumer migration
  3. Engineer-owned Core Roster revision

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 against main as 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.

## Decision record **Decision:** Kai accepts preserving the legacy Agent Compose path for one migration cycle. **Dependencies (ordered):** 1. AOS-owned contract revision 2. Engineer-owned consumer migration 3. Engineer-owned Core Roster revision **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 against `main` as 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.
Author
Member

The decision record above (comment 49591) is eval output, not a decision.

It was written by an evaluation driver session running the director case frontier-communication-decision-record-ownership at 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-melds is not mergeable against main is 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 c862e46 on evals/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 its tool_policy, and the 67-case run above is stamped as unsealed.

**The decision record above ([comment 49591](https://forgejo.coilysiren.me/coilyco-flight-deck/agent-compose/issues/240#issuecomment-49591)) is eval output, not a decision.** It was written by an evaluation driver session running the `director` case `frontier-communication-decision-record-ownership` at 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-melds` is not mergeable against `main` is 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 `c862e46` on `evals/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 its `tool_policy`, and the 67-case run above is stamped as unsealed.
Author
Member

Heads up from the strats to exec role rename that just landed on main (e5c3b93).

The record set this issue re-earns changed shape slightly:

  • evaluations/latest/strats-codex.yaml is now evaluations/latest/exec-codex.yaml, with role: exec. Its recorded answers, scores, and provenance are untouched. Only the filename and the role field moved, because Build rejects a result whose role no longer exists.
  • The frontier-adjacent-strats-boundary and commodity-adjacent-strats-boundary case ids in director-codex.yaml and creator-codex.yaml are now adjacent-exec-boundary, following the live scenario they answered.
  • evaluations/pilot and evaluations/baseline keep the strats spelling. 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/main worktree 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.

Heads up from the `strats` to `exec` role rename that just landed on main (e5c3b93). The record set this issue re-earns changed shape slightly: * `evaluations/latest/strats-codex.yaml` is now `evaluations/latest/exec-codex.yaml`, with `role: exec`. Its recorded answers, scores, and provenance are untouched. Only the filename and the `role` field moved, because `Build` rejects a result whose role no longer exists. * The `frontier-adjacent-strats-boundary` and `commodity-adjacent-strats-boundary` case ids in `director-codex.yaml` and `creator-codex.yaml` are now `adjacent-exec-boundary`, following the live scenario they answered. * `evaluations/pilot` and `evaluations/baseline` keep the `strats` spelling. 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/main` worktree 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.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/agent-compose#240
No description provided.