Skip to content

fix(e2e): recover ownership evidence and reconcile sandbox branches - #5269

Merged
Trecek merged 19 commits into
impl-issue-5233-20261008-implementationfrom
impl-e2e-ownership-evidence-20261012
Oct 13, 2026
Merged

Trecek merged 19 commits into
impl-issue-5233-20261008-implementationfrom
impl-e2e-ownership-evidence-20261012

Conversation

@Trecek

@Trecek Trecek commented Oct 12, 2026

Copy link
Copy Markdown
Collaborator

Real E2E transcripts used the plugin MCP namespace and row-level structured replies, so the collector missed the claim, published branch, and launched workers. Teardown could then silently leave a branch behind when no PR or claim label remained.

This change decodes both canonical namespaces and authoritative structured receipts, adopts dispatch-valid workers through paired launch/acknowledgement/recovery receipts, and reports unexplained sessions. The harness records sandbox head refs before the run and after cleanup, preserving and failing cleanup for new branches without ownership proof. Sanitized captured CI evidence exercises ownership, concurrency, and teardown after a failed run.

Stacked on #5255, targeting impl-issue-5233-20261008-implementation, where the collector was introduced.

Validation:

  • All three phases passed pre-commit run --all-files and the configured task test-local-gate through the MCP test gate.
  • Final gate: 16,021 passed, 207 skipped, 12 xfailed.
  • All 15 planned mutation checks passed; temporary test selection was restored.
  • Captured replay adopts both workers and reports peak concurrency of five. The existing unmatched native stop still fails lifecycle coverage, as required.

Live GitHub head-ref listing will be confirmed by the first E2E run after merge.

Fixes #5267

Trecek and others added 19 commits October 13, 2026 08:10
)

Headless session records currently lack an explicit declaration of the
change being evaluated and its expected effect. Configure
`rollout.active` to attach `change_id`, an intentional UTC
`effective_at`, descriptive skills/backends/roles scope, and a required
nonblank `expected_effect` to Claude Code and Codex headless runs.

The executor captures the declaration and logical run start after final
launch admission, then preserves that snapshot through contract nudges,
terminal logging, and crash recovery. Summary and index records carry
the same marker; inactive runs write null and historical records without
markers remain readable. Session index schema 17 and trace enrollment
schema 3 carry the additions.

Documentation covers declaring predictions before cutover, retaining a
stable declaration across the observation window, and streaming
retained-index comparisons using exact parsed timestamps. Before/after
deltas prompt investigation and do not establish causality.

Validation passed:

- `pre-commit run --all-files`
- Configured `test_check` gate (`task test-local-gate`)
- Independent `task test-check`

Closes #4653.
Managed headless launches currently leave lineage records visible to
Git, so the clone gate can treat AutoSkillit's runtime state as user
changes and refuse a clean checkout. This change gives the existing
lineage namespace its own ignore marker, validates that marker before
creating record directories, and repairs missing markers when a store
operation reads an older namespace.

The temp directory and lineage store share the marker writer. Doctor and
the root guards share the marker predicate; committed project
directories are classified explicitly. Real-Git tests cover launch
cleanliness, legacy repair, dispatch state, and continued detection of
user edits. The static guard rejects unclassified `.autoskillit`
children in production source.

Related issue: #5258. This PR remains draft pending the maintainer-owned
policy registration.

## Validation

- `pre-commit run --all-files` passed before each commit.
- Manual real-Git probe: `before=[]`, `after=[]`; tracked ignore file
unchanged; doctor OK.
- Mutation checks rejected both literal-root and root-variable path
spellings; the temporary mutations were removed.
- Configured `test_check` (`task test-local-gate`) passed on
`068f570b6`: 47,307 passed, 610 skipped, 29 xfailed.
- The independent catalog row-count oracle is synchronized with the
added guard row.
- `core/io/io.py` measures 749 non-import lines against its 750-line
limit.

## Required before completion

A maintainer must add this prescribed entry to `POLICY_SURFACES` in
`tests/arch/_acceptance_policy_surfaces.py`, then rerun the configured
`test_check` gate after that policy change:

```python
PolicySurface(
    "tests/arch/test_autoskillit_root_children_registered.py",
    "_CLASSIFIED_ELSEWHERE",
    "int_map",
    default=0,
),
```

The verified plan explicitly reserves that file for human edits, so it
is unchanged in this PR. The post-merge E2E replay and PR #5255
commissioning remain operator-run checks. Separate follow-up trackers
should be linked before closing #5258; this PR does not close the issue
automatically.


## Audit response

The audit's blocking REQ-006 finding used physical lines (`wc -l`)
instead of the repository's defined budget count.
`tests/arch/_line_budget.py::count_budget_lines` excludes
import-statement spans, and `scripts/check_file_lengths.py` delegates to
that function.

| Revision | Physical lines | Excluded import lines | Enforced budget
lines |
|---|---:|---:|---:|
| Plan base `265f1e00e` | 766 | 23 | 743 |
| PR implementation | 772 | 23 | 749 |

The unchanged cap is 750 non-import lines. The plan's starting and final
budget counts were correct, and its stop-and-report condition was not
triggered. Direct `check_file(io.py)` returns no violation. No
exemption, counter/cap change, unrelated trim, or module split was
needed.

The three ODD test identifiers now exactly match the verified plan in
`6194da647`; their assertions and production behavior are unchanged. The
gated rerun found one additional integration omission: the independent
catalog-count oracle still expected the old table. `068f570b6`
synchronizes that oracle while retaining its strict equality assertion,
and the next full configured gate passed.

E-3 remains deferred for the reason stated in both the plan and audit:
it requires the post-merge integration state and operator-run E2E
commissioning. The human-owned policy registration above remains a
separate prerequisite; no official re-audit GO verdict or merge
completion is claimed.
)

Model-written plans could fail the sealed plan-set gate because the
planning templates did not show the required allocation grammar.
Rejected binds could then return empty feedback, causing a replan to
repeat the same mistake. Failed E2E runs also discarded the plans and
orchestrator transcripts needed to diagnose the rejection.

This change:

- Makes the make-plan and rectify templates conform to the actual
verifier, tests their worked examples, and tells dry-walkthrough to
preserve the form.
- Returns actionable feedback for every defective part and rejects
coverage-failure results with blank feedback, including empty-allocation
cases.
- Makes recipes use the producer's captured part list, documents
terminal failure dispositions, and guards the existing bounded replan
routes. Regenerates compiled recipes and derived hashes, and updates
measured delivery baselines without changing budget limits.
- Retains pipeline plans and Claude transcripts for unsuccessful E2E
runs, skips symlinks, records collection errors without changing the
verdict, and carries the evidence through existing redaction and upload
steps.

Validation: each phase independently passed the configured test_check
gate and pre-commit run --all-files. The final gate reported 50,558
passed, 609 skipped, and 29 xfailed. All three recipes validate
successfully with no new semantic findings; existing advisory findings
remain.

Related to #5259. The README documents the real-model bind check
required after merge and before CI commissioning; that operator check
has not been run. The original discarded MiniMax plans remain
unavailable.
Runtime launches could create or backfill `.autoskillit/.gitignore`,
turning AutoSkillit's own work into Git-visible changes. Init's
`.state.yaml` was also missing from the canonical ignore rules, and the
fleet diagnostic filter could erase a useful clone-gate failure merely
because it named the managed lineage directory.

This change separates runtime temp creation from explicit project setup.
Init and direct install maintain the canonical ignore file; temp
creation maintains only its own self-ignore marker. Init covers
`.state.yaml` before writing it, preserves existing state fields, and
leaves ignore files untouched when state validation fails. Fleet failure
reasons retain `bootstrap_clone`/`uncommitted_changes` while redacting
private paths and capture metadata; the raw L3 payload remains exact.

The root-child classification flags return to the integer-map format
required by the existing acceptance-policy reader. Regression coverage
exercises absent/stale tracked ignore files, real user edits,
zero-valued flags, state-write ordering, and
directory/record/mixed/private-only fleet reasons. The core gateway/stub
and existing snapshot are synchronized; the IO file remains within its
existing line budget.

## Validation

- `pre-commit run --all-files`: passed before each commit.
- Affected task-based checks: 331 passed, 1 skipped.
- Source-inventory guard checks: 39 passed.
- Configured `test_check` (`task test-local-gate`): 51,233 passed, 615
skipped, 29 xfailed on `5854498a6f980782aa0b9f883b1e90a282c7f8f3`.

## Completion requirements for #5258

This PR delivers the code fixes, including the three adjacent defects.
It does not close #5258 by itself.

- [ ] After this integer-map restoration lands in the trusted comparison
base, a maintainer registers `_CLASSIFIED_ELSEWHERE` in
`tests/arch/_acceptance_policy_surfaces.py` as `int_map` with
`default=0`, then runs the configured gate. The authority file is
intentionally untouched here. Adding the row against the current
set-shaped base would fail the policy parser's base comparison.
- [ ] Integrate the completed code and policy registration into #5255's
existing implementation scenario branch and run E-3 twice against the
unchanged sandbox seed. Both envelopes must clear `bootstrap_clone`
without `uncommitted_changes`; record actual run/attempt/head evidence
in #5258's body.
- [ ] Record completed code/policy/replay evidence in #5258 before
closing it. Full #5255 commissioning and its later #5259 allocation
blocker retain their separate acceptance criteria.

Refs #5258. No new tickets or review comments are created by this
change.
The runtime-state root classification map was restored in #5263, but it
was still absent from the acceptance-policy registry. Future additions
to its exemptions could therefore escape the policy comparison.

Register `_CLASSIFIED_ELSEWHERE` as an `int_map` with `default=0`. The
registration now compares against the dictionary-shaped base containing
#5263, preserving the existing policy reader and approval mechanism.

Validation: policy comparison against
`dbc689db57d3d847758ec08dd5bad31105f39730` and `pre-commit run
--all-files` passed. The configured MCP `test_check` (`task
test-local-gate`, conservative filtering) passed against that actual PR
base: 11,771 passed, 197 skipped, 12 xfailed on
`3a0a9f8eae7a4d84a7e14d8b0b899ea76b30bd07`.

The first gate compared against stale local `develop` at `0bf84f3`,
whose value still had the old set shape: 51,229 passed and one
policy-comparison test failed. The runner's comparison base was
temporarily pinned to the fetched, dictionary-shaped PR base for the
successful rerun, then restored. Both results are preserved locally.

Refs #5258. After merge, integrate the registered policy and runtime
repairs into the existing #5255 scenario branch, perform both E-3
replays against the unchanged seed, and record the actual
clone-admission evidence in #5258 before closing it. This PR supplies
the remaining policy entry; it does not claim the live replay has
already happened.
@Trecek
Trecek force-pushed the impl-e2e-ownership-evidence-20261012 branch from 9dcdff4 to 71b6b4e Compare October 13, 2026 15:17
@Trecek
Trecek merged commit 4adccdb into impl-issue-5233-20261008-implementation Oct 13, 2026
3 checks passed
@Trecek
Trecek deleted the impl-e2e-ownership-evidence-20261012 branch October 13, 2026 15:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant