Repository navigation
Implementation E2E ownership misses actual plugin MCP receipts #5267
Description
Implementation E2E ownership misses actual plugin MCP receipts
Problem and impact
The #5255 implementation E2E collector does not recognize the actual plugin-prefixed MCP tool names or the structured result metadata present in retained Claude/MiniMax transcripts. It emits an empty branch list and claimed:false after successful claim and publication. Its managed-session discovery also misses two workers proven by paired root-tool receipts when their log index parent fields are empty, yielding root-only concurrency evidence.
This prevents trustworthy teardown and capacity commissioning. The live measurement reports peak_sessions:1; it is not an accepted full-pipeline peak. In run 1 coverage correctly fails on additional native-agent lifecycle gaps, but that rejection does not repair the missing branch/worker ownership evidence. In both runs the newly published branches had to be proven and removed independently of the empty ownership manifests.
Provenance and observed evidence
- Run 38170521660, attempt 1 and run 38170536595, attempt 1.
- Both tested replay commit
959603ece0ba5f1bc5f81cf6551a0545cf36bc16, containing develop53ab68d2472153bf5667fce48f25913369527d8eand fixes Keep managed lineage runtime state invisible to Git #5261–Register runtime-state classification in acceptance policy #5264. The auditedscripts/e2e/e2e_sessions.pyis identical at the resolved local Add seeded sandbox implementation E2E validation #5255 headc995db4ec40423476638d3b76612c9c754f110f7. The implementation-specific harness is PR/replay code; do not assume it already exists on develop. - Artifact names:
e2e-implementation-38170521660-1(ID11714355385) ande2e-implementation-38170536595-1(ID11714301140). - Fixed sandbox issue TalonT-Org/autoskillit-e2e-sandbox#1, unchanged base
d6c143d2494488deeb6680d7d5cf2e55e3e01732.
Run 1 root transcript: out/transcripts/-workspace-sandbox/2292658a-34cf-44a0-a0b1-f7a20218874b.jsonl.
| Records | Actual root call/result evidence |
|---|---|
| 61–62 | mcp__plugin_autoskillit_autoskillit__claim_and_resolve_issue returned success:true, claimed:true for sandbox issue 1. |
| 66–67 | mcp__plugin_autoskillit_autoskillit__create_and_publish_branch returned branch e2e-implementation-fixture-normalize-whitespace/1-3. |
| 88–89, 93–94 | run_skill returned planning worker 8ef8f993-8caa-47dd-83b0-26f9e5b51139, success:true; complete_run_skill_result acknowledged its receipt. |
| 547–548, 552–553 | run_skill returned dry-walkthrough worker 54f18144-1188-45d7-a392-17b4529f721e, success:false; acknowledgement succeeded. Ownership of a launched worker does not depend on its task succeeding. |
These records store machine-readable replies in row.mcpMeta.structuredContent.result as a JSON string. Their tool_result.content is human-oriented text headed with the tool name, not JSON. The index and summaries contain both managed workers with the same dispatch ID 4666c3fd-486f-4ce1-b51f-9d9d660a5560, but parent_session_id/caller_session_id are empty at the relevant managed-session level. out/session-events.jsonl records both workers' session endpoints.
Nevertheless, out/ownership.json has branches:[], claimed:false, only the root transcript, and violations:[]. out/session-concurrency.json has managed_session_ids:[] and only the root in owned_session_ids. Run 2 likewise has an empty branch manifest despite publication of .../1-4 at root transcript record 62.
The two new branches were subsequently deleted independently; pre-existing .../1 and .../1-2 refs were preserved. Do not use their current absence to dispute the successful publication receipts.
Deterministic investigator reproduction, no model rerun required
Download run 1's retained evidence into the repository temp directory:
mkdir -p .autoskillit/temp/investigate/e2e-ownership-repro
gh run download 38170521660 --repo TalonT-Org/AutoSkillit \
--name e2e-implementation-38170521660-1 \
--dir .autoskillit/temp/investigate/e2e-ownership-reproFrom a checkout containing the pinned implementation harness, run this read-only probe against that artifact. It calls the actual collector functions and changes only a deep-copied transcript's namespace for the second check; no source or live data is edited:
import copy
import json
import sys
from pathlib import Path
sys.path.insert(0, str(Path("scripts/e2e").resolve()))
import e2e_sessions as collector
t = Path(".autoskillit/temp/investigate/e2e-ownership-repro/out/transcripts/"
"-workspace-sandbox/2292658a-34cf-44a0-a0b1-f7a20218874b.jsonl")
violations = []
print("actual pairs:", len(collector._transcript_tool_pairs(t, "probe", violations)))
print("actual violations:", violations)
pending, paired, violations = {}, [], []
for n, line in enumerate(t.read_text().splitlines(), 1):
original = json.loads(line)
row = copy.deepcopy(original)
blocks = row.get("message", row).get("content", [])
if isinstance(blocks, list):
for b in blocks:
if b.get("type") == "tool_use":
b["name"] = b.get("name", "").replace(
"mcp__plugin_autoskillit_autoskillit__", "mcp__autoskillit__", 1)
collector._pair_record(row, n, "probe", pending, paired, violations)
if n in (62, 67, 89, 548):
receipt = json.loads(original["mcpMeta"]["structuredContent"]["result"])
print("metadata", n, {k: receipt[k] for k in
("merge_target", "session_id", "success", "claimed") if k in receipt})
print("namespace-only normalization:", [(name, result is None)
for name, inputs, result, is_error in paired])Verified output from the unchanged collector:
actual pairs: 0
actual violations: []
metadata 62 {'success': True, 'claimed': True}
metadata 67 {'merge_target': 'e2e-implementation-fixture-normalize-whitespace/1-3'}
metadata 89 {'session_id': '8ef8f993-8caa-47dd-83b0-26f9e5b51139', 'success': True}
metadata 548 {'session_id': '54f18144-1188-45d7-a392-17b4529f721e', 'success': False}
namespace-only normalization: [('claim_and_resolve_issue', True), ('create_and_publish_branch', True)]
For managed ownership, inspect logs/sessions.jsonl, each worker's summary.json execution identity, and out/session-events.jsonl alongside the paired root receipts. Downloaded files retain container paths; blindly rerunning full discovery against those nonexistent host paths introduces a separate path-remapping artifact. The transcript-pair probe above avoids that problem.
Source mechanism
- _remember_tool_use removes only
mcp__autoskillit__, then allows onlyclaim_and_resolve_issueandcreate_and_publish_branch. The actualmcp__plugin_autoskillit_autoskillit__names are discarded without a violation. - _pair_record parses only the tool-result block's
content. It ignores the row's structured metadata, so namespace normalization alone still loses these real replies. - _discover_owned / _add_linked_descendants rely on index/summary parent links and do not use paired managed launch/acknowledgement receipts to prove ownership. Empty parent fields cause both workers to be skipped. The branch-pair helper's allowlist is separate from this managed discovery path; merely expanding that allowlist does not fix managed ownership.
- Ownership collection then derives claims and branches from the already-filtered pairs and selected transcripts.
Parent investigation personally read the cited source and actual receipts, ran the deterministic probe, and checked that the relevant files have no diff between the replay commit and resolved local PR head.
Expected correction and focused validation
Collect ownership from supported real transcript namespaces and paired machine-readable tool receipts. Establish managed-worker ownership from authoritative launch/acknowledgement evidence when parent-link fields are unavailable, or report incomplete ownership explicitly. Never adopt unrelated sessions merely because they share a dispatch ID or are temporally nearby. Keep conservative peak rejection when lifecycle evidence is missing; repair ownership independently of final L3 availability.
Add a focused fixture using the actual plugin-prefix plus mcpMeta.structuredContent.result shape: prove the claimed issue and published branch are collected, and that both successful and failed launched workers are accounted for without borrowing unrelated sessions. Validate teardown against the proven branch after a failed run. Existing synthetic ownership/coverage tests did not expose this payload mismatch. Run the configured task test-local-gate.
Limits, separate observations, and deduplication
Run 1's final model output at transcript record 679 used %%L3_RESULT::...%%, while the shipped prompt and parser require ---l3-result::<dispatch_id>--- and its matching end sentinel. The valid L3 done marker does not make that payload valid. The parser correctly rejected it; this ticket does not allege a parser bug or explain why the model emitted that wrapper.
The raw cause of the root's unmatched native SubagentStop (a610a4bda1f28ca35, blank agent type, no retained start/transcript) is not established. The E2E installer registers lifecycle events without matchers, so this evidence does not establish a core .+ hook-matcher defect. Fixing the confirmed receipt/ownership loss may still leave that separate native lifecycle gap to investigate.
No exact open duplicate was found for the plugin namespace/metadata loss. #5233 is the parent feature request, and #5255 is its commissioning PR; #5258/#5259 concern different production failures already repaired. Classification: bug; recipe:remediation; high confidence. Full commissioning and a measured capacity remain pending.
Implementation and integration status — 2026-10-13
The reported ownership defect is implemented in PR #5269, merged at 4adccdb95438fae4b996fb01add9d6d6dcd8855a into the parent PR #5255 branch. This issue remains OPEN because the parent branch is not merged into its base yet; it does not mean the collector fix is missing. Do not repeat the implementation solely on the basis of the historical reproduction above.
Parent #5255 is now published at 93457f16ecc30249799c02084c20f41d9cd88455, includes current develop 381afb4e59cc23acf4ca9ace7a7644b75e6e7b14 and tracker fix #5268, and is MERGEABLE on GitHub. The exact combined code passed pre-commit run --all-files and the configured task test-local-gate with 54,919 passed, 810 skipped, 29 xfailed. The original worktree and development environment have been refreshed.
The parent personally checked the merged collector's real-wire-shape fixtures, paired plugin metadata handling, claim/branch proof, managed worker ownership, and conservative replay failure signals. The captured old run accounts for both managed workers and has replay peak five, while its unmatched native stop still fails lifecycle coverage. This historical replay peak is not a newly accepted live commissioning measurement.
Fresh implementation verification is running at the published SHA in run 38431354139, with run 38431393443 queued for the same seed and SHA. Automatic canary 38430896515 passed. Full implementation CI, teardown, and complete live concurrency acceptance remain pending; no successful commissioning is claimed yet.
Completion evidence and separate follow-up — 2026-10-13
The #5269 implementation is present in parent #5255 at 93457f16ecc30249799c02084c20f41d9cd88455. Run 38431354139 correctly collected the published branch, claimed issue, and eight managed workers without ownership violations. This ticket's ownership defect is repaired; its OPEN state reflects the still-unmerged parent PR, whose body contains Fixes #5267.
The new lifecycle capture-scope defect is tracked separately in #5271, targeting impl-issue-5233-20261008-implementation. Runtime reopen defect #5270 targets develop. Neither is a claim that this ownership repair is missing or must be redone.
Activity
fix(e2e): recover ownership evidence and reconcile sandbox branches (#…