Skip to content

Closed gates: four definition values that read as working and are not - #468

Merged
m2ux merged 1 commit into
workflowsfrom
workflow/optimisation-remediation
Aug 17, 2026
Merged

Closed gates: four definition values that read as working and are not#468
m2ux merged 1 commit into
workflowsfrom
workflow/optimisation-remediation

Conversation

@m2ux

@m2ux m2ux commented Aug 17, 2026

Copy link
Copy Markdown
Owner

Summary

Four definition defects an evaluation of the meta and work-package workflows found. Each is a gate or a value that reads as working and is not: a flag whose only writer sets the value it already defaults to, a lookup table missing a member of its own enum, a step that cannot act, and an audit technique naming arguments that do not exist.

The server side of the same work is #467, which adopts this corpus commit.

What happens today

A session-metrics revision that never runs. In meta, the terminal activity revises the session metrics when a flag says the client workflow completed. That flag defaults to false, and its only writer — the checkpoint option that sends the run back into the workflow — also sets it false. So the revision has never executed. Three separate files describe the session-trace and token-usage artifacts as drafts that revision rewrites; both have shipped as drafts in every run, and the activity's own stated outcome says otherwise.

A branch prefix two runs disagree about. The issue-type enum declares five categories: feature, bug, task, enhancement, epic. The prefix table maps four of them, leaves task and enhancement to be chosen between two prefixes with no rule for choosing, and names none for an epic. Separately, the prefix the composition step reads is not one of the technique's five declared inputs, nor a declared output, nor a step-local — it resolves to nothing. So an epic-typed work package reaches branch composition with no prefix, and whatever the agent supplies becomes part of the branch and pull-request identity, which the corpus itself states is expensive to change once a pull request is open.

A complex-problem path that cannot act. In work-package's post-implementation review, a simple problem binds the analysis workflow's structural-analysis technique inline. A complex one reaches a step declaring an empty action list, so nothing happens at all — the whole integration with the analysis workflow is inert, and the variable declared to carry its output has neither a producer nor a reader anywhere in the corpus.

An audit technique that would propagate a broken form. The workflow-design audit technique is the one place in the corpus that runs repository guards from protocol prose, so it is the example any convention would be built on. One step instructs a re-snapshot flag the binding guard does not have and has never had — classification there is a human verdict recorded in the triage register. Two more run guards with no corpus root, and a guard resolves its corpus as the explicit root, then an environment variable, then the server checkout's own copy. So an authoring run reviewing a worktree measured the server checkout instead, and reported a clean pass on the definitions under review.

The fix

Record reaching the end of the loop. The meta orchestrator sets the completion flag on a trailing control step gated on the pointer the activity loop exits by, so close-out can tell a completed run from one that stopped at the iteration bound. The checkpoint option that returns to the workflow still clears it, which now carries information.

Make the prefix table total, and give it a producer. Each of the five categories maps to one prefix the repository already uses — feat for feature, enhancement and an epic's own delivery branch, fix for a bug, chore for a task — with the reason stated per row. The prefix is a step-local the composition step reads. An unset category stops the step and reports, rather than being guessed, which is what the detection technique already says should happen.

Dispatch the child workflow. The complex path declares its trigger and binds the child-workflow dispatch, following the prism-audit activity that already dispatches the same child. The shared meta operation's caller-supplied session index is classified in the triage register against the rationale that operation's two other callers already use.

Name arguments that exist. The audit technique passes a corpus root to both guard invocations and says what an omitted one measures. The re-snapshot instruction is replaced by the triage register's three verdicts and the note that classification is a human judgement with no flag that bypasses it.

Scope of change

Four files: one meta activity, two work-package definitions, one workflow-design technique. 42 lines added, 12 removed. No new technique, no new variable, no schema change.

Acceptance criteria

  • All 27 guards pass, including binding fidelity, schema validation and the when-expression parser.
  • The full server test suite passes against this corpus: 1020 tests.
  • The six committed walk snapshots are re-recorded against this commit in the adopting pull request, with the corpus stamp bumped in the same commit.
  • The delivery-cost gate passes against a baseline re-recorded on this corpus commit.

Non-goals

The evaluation found 52 findings; this carries four of them. The definition work it deliberately leaves includes the four ordering defects in the two heaviest activities, batching the per-iteration checkpoint gates, giving the validation activity a language-neutral path, and completing the review-mode ambiguity assertion — the last being the largest definition blast radius in the set, at 85 references across 11 of 15 activities.

Investigation detail

Evaluation report and per-dimension analysis

🤖 Generated with Claude Code

The meta orchestrator records reaching the end of its client activity loop, so
close-out can tell a completed run from one that stopped at the iteration bound.
The flag that gate reads defaults to false and its only writer — the checkpoint
option that returns to the workflow — also sets it false, so the session-metrics
revision the terminal activity binds never executed. Three files document a
mid-run write of the trace and usage artifacts as a draft that revision rewrites;
both shipped as drafts in every run.

The branch-name prefix has a total mapping and a producer. The issue-type enum
declares five categories; the table mapped four, left task and enhancement to be
chosen between two prefixes with no rule, and named none for epic — so an
epic-typed work package reached branch composition and the prefix was invented,
which is a value two runs on the same epic disagree about. Each category now maps
to one prefix the repository already uses, with the reason stated per row, and the
prefix itself is a step-local the composition step reads rather than an unanchored
reference no declared input resolves.

The complex-problem path into the analysis workflow dispatches it. It was an
action step with an empty action list, so a complex work package ran the
structural-analysis technique inline on the simple path and nothing at all on its
own. It now declares the trigger and binds handle-sub-workflow, following the
prism-audit activity that already dispatches the same child.

The workflow-design audit technique names arguments that exist. One step
instructed a re-snapshot flag the binding guard does not have and has never had —
classification there is a human verdict in the triage register — and two guard
invocations passed no corpus root, so an authoring run reviewing a worktree
measured the server checkout instead and reported a clean pass on definitions it
never read.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@m2ux

m2ux commented Aug 17, 2026

Copy link
Copy Markdown
Owner Author

The guard sweep here fails until #467 lands, and that is the ordering rather than a defect

Verify corpus checks out server main and runs its guards against this corpus. Binding a shared meta operation introduces one orphan-input finding — the operation's caller-supplied parent_session_index, which its two existing callers in prism-audit and prism-evaluate both leave to the caller and both carry a harmless verdict for. This corpus needs the third entry, and a triage entry is a file in the server repository, so it cannot be on main until the server change merges:

[FAIL] binding-fidelity  own input 'parent_session_index' has no producer in
       workflow 'work-package' … [untriaged]

That entry is in #467, where the same sweep passes because the guard reads the scripts from that branch. So:

  1. Merge Delivery cost and closed gates: the server answers what it already knows, and the cost gate runs #467 first. Its submodule pointer already names this branch's commit, which is pushed, and its Verify job is green including the new delivery-cost gate.
  2. Re-run this check. It goes green with no change to either branch.

The alternative — binding the input on the step — is the shape the two prism callers deliberately do not use, because the session index is the caller's own argument rather than a workflow variable. Following them keeps one treatment for one operation across all three callers.

Worth noting as a finding in its own right: a corpus change that introduces a new binding finding cannot be verified before the server change that classifies it, and nothing says so. The evaluation this branch comes from records the same shape elsewhere — a record whose authority outlives its checker.

@m2ux
m2ux merged commit 3bdbb84 into workflows Aug 17, 2026
1 of 2 checks passed
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