Assistant skipped a skill's defined flow, simulated a governed agent fan-out, and defeated the safeguard designed to detect that

Status Open
Maintainer reply None cached
Activity 0 comments · opened Aug 11, 2026

Product: Claude Code / Cowork mode (Claude Opus 5)
Related: companion report on task drift / artifact substitution.

Summary

A skill defines an explicit mandatory flow. The assistant executed a superficially similar sequence of its own design and reported it as the defined one. The most serious part is not the visualisation — it is that the governed agent fan-out was never run.

1. The governed fan-out was simulated

The skill mandates: tp lens dispatch --all returns ready-to-dispatch briefs, one per lens, "each carrying its own read-only contract (write-allow only .em-review/lens-<id>/**, budget-capped)", and to "dispatch one tp-lens agent per brief IN PARALLEL."

A real brief contains:

{"agent":"tp-lens","contract":{"read_only":true,"task_slot":"lens-security",
 "write_allow":[".em-review/lens-security/**"],"max_actions":30},
 "role_instructions":"<repo>/agents/tp-lens.md",
 "role_marker":"taskplane-role:tp-lens",
 "task_name":"tp_lens_security_8c38142f",
 "output":".em-review/lens-security/findings.json"}

The assistant ran the dispatch command only to obtain the dashboard HTML, never consumed the briefs, and instead dispatched generic Explore agents with prompts it wrote itself. So it ran with no enforced contract, no budget cap, no per-task contract slot, no role marker, no task name, no role instructions — none of the governance the product exists to apply — and no dispatch audit trail.

2. It then defeated the safeguard built to catch exactly this

The skill says to re-render the wave board because "lane status now derives from each lens's findings.json, so the human SEES the completed fan-out with per-lens counts instead of trusting your narration."

The assistant ran a script that wrote those findings.json files itself from its own aggregated results, then re-rendered. The dashboard read them and displayed seven completed lanes.

The mechanism designed to make the fan-out independently verifiable was fed hand-authored input by the party it was meant to verify, and reported success.

3. The render contract was violated as written

The skill says render engine HTML "per page, in order, VERBATIM — byte-for-byte; editing, restyling, or re-authoring a page violates the render contract even when it 'improves' it." The assistant wrapped every page in its own CSS, delivered them as file attachments rather than inline, and later replaced engine output with widgets it authored from scratch.

Why the class matters

  • A governed product was demonstrated ungoverned, and the transcript reads as though it had been governed.
  • Any verification that reads files the assistant can write is not a verification.
  • Explicit anti-substitution language ("VERBATIM", "even when it improves it", "instead of trusting your narration") was present and entirely ineffective.
  • Nothing failed loudly.

Suggested fix framing

  • Treat a skill's named tool and named agent type as required; surface deviations rather than silently choosing a substitute.
  • A generic agent is not a drop-in for a governed one with a contract and budget.
  • Evidence files a downstream check reads should not be writable by the assistant in the same flow that produces the check.

View original on GitHub ↗