You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
skills(automation): deduplicate the send-back eval (AUTO-H-01)
The eval restated SKILL.md's "Send-back for revision (ADR-0044)" section rather
than testing beyond it: the canonical shape, the four lint findings, the
wait-vs-approval_revise rationale and the showcase pointer all had a second copy
here. 2,204 tokens -- 15% of the authored package -- went to a surface with one
real authoring in the whole corpus, while `notify` (20 authorings) got 15.
Delete the Expected-Output fence and the Common-Mistakes rows that restate the
skill; keep Scenario + Validation Criteria, which is what a grader needs. The one
row that did NOT restate SKILL.md (a "revise mode" re-suspend of the approval
node) survives as criterion 7, so no graded fact is lost.
1,329 -> 550 tokens (ceiling 1,329).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Mirrors the canonical `showcase_budget_approval` flow in the showcase app in
53
-
the framework repo.
54
-
55
-
## Common Mistakes
56
-
57
-
| Mistake | Why it is wrong | Caught by |
58
-
|---|---|---|
59
-
| Missing `label` on the flow or on a node |`label` is required by `FlowSchema` — `FlowSchema.parse` / `registerFlow` rejects the definition before any graph validation runs |`registerFlow` (schema parse) |
60
-
| Resubmit edge **without**`type: 'back'`|`registerFlow` validates the graph-minus-back-edges as a DAG, so it rejects the cycle as un-declared |`registerFlow`; lint `flow-approval-revise-unmarked-backedge`|
61
-
|`revise` edge into a plain **`wait`** node (or any other type) | The window is a service-owned pause: a `wait` is `resumeAuthority: 'any'`, so a raw run-resume walks the back-edge with no submitter check and no audit row, and can destroy the run. `sendBack` refuses this metadata (amended ADR-0044) | lint `flow-approval-revise-target-not-service-owned` (**error**) |
62
-
|`revise` edge to a window that **never loops back**| A valid DAG (registerFlow accepts it), but the submitter has nowhere to resubmit — the branch dead-ends | lint `flow-approval-revise-dead-end`|
63
-
|`maxRevisions: 0` together with a `revise` edge | Send-back is disabled, so every revise auto-rejects and the branch never runs | lint `flow-approval-revise-disabled`|
64
-
| Re-suspending the approval node in a "revise mode" (no window node, no edge) | Hides a state machine inside one node — invisible to the canvas/run log; not the ADR-0044 model. (The 2026-07-28 amendment made the window a dedicated node TYPE, which keeps it visible; it did not move the pause inside the approval node.) | design review |
65
-
| Reusing `reject` for send-back |`reject` terminates; send-back is a *movement* that returns the record for rework (status `returned`, not `rejected`) | semantics |
66
-
67
20
## Validation Criteria
68
21
69
22
Score the generated flow:
@@ -74,8 +27,11 @@ Score the generated flow:
74
27
4.**Revise window** — the `revise` edge targets an `approval_revise` node. *(required)*
75
28
5.**Guard** — `maxRevisions >= 1` on the approval config (the default `3` is fine; `0` fails). *(required)*
76
29
6.**No lint findings** — `lint-flow-patterns` emits none of the four `flow-approval-revise-*` findings. *(required)*
77
-
7.**Approve / reject intact** — the approval still has `approve` and `reject` out-edges. *(preferred)*
30
+
7.**Window is a node, not a mode** — the pause is the `approval_revise` node on
31
+
the graph, not a "revise mode" re-suspend of the approval node itself (that
32
+
hides a state machine inside one node, invisible to the canvas and run log). *(required)*
33
+
8.**Approve / reject intact** — the approval still has `approve` and `reject` out-edges. *(preferred)*
78
34
79
-
Pass = criteria 1–6 all hold. The canonical failure this eval guards against is a
35
+
Pass = criteria 1–7 all hold. The canonical failure this eval guards against is a
80
36
run that builds the loop but omits the back-edge (criterion 3) — accepted by a
0 commit comments