feat(planning): draft non-quantifiable goals and route the dynamic-workflows lever - #1707
Conversation
…rkflows lever Closes #1652, closes #1654. `planning` 0.26.3 -> 0.27.0. Prose plus the skill description; no manifest surface beyond the version bump. Step 2 gains a branch for intents with no honest metric: a structural constraint, enumerated required contents, and a self-verification sub-step that requires the verifying work rather than its verdict — worded that way because the evaluator calls no tools and can only credit verification performed in the transcript. Co-drafting points at `/planning:interview` instead of restating it. Step 0's lever router gains the dynamic-workflows row, with the availability fact that keeps it from reading as preview-gated, the `ultracode` keyword vs `/effort ultracode` distinction, and the constraint that the `Workflow` tool is main-thread only — so subagent-resident work, the loop lanes included, cannot take this lever. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VRSgwJ7RN4vPZt4oJAADHy
…outer row Independent verification against <https://code.claude.com/docs/en/sub-agents> refuted the claim that the `Workflow` tool is main-thread only: the filter that removes it applies to every NON-fork subagent, and forks "skip both filters and receive the main conversation's exact tool pool". The lane conclusion is unchanged — only its stated reason and categorical scope were wrong. `research-deep` already said "non-fork"; the paraphrase lost it. Also from the same pass, against <https://code.claude.com/docs/en/workflows>: `/effort ultracode` now carries both halves it combines (`xhigh` effort plus per-task workflow planning) and its model condition, the routines row states its research-preview status so the workflow row's availability line does not read as a silent contrast, `/en/workflows` joins Step 1's cross-check list so the row's drift-prone facts have a live-verification path, and the row's detail moves below the bullet list, which is one line per lever. Step 2's three moves now state that they feed the Step 1 shape rather than replace it, so the enumeration cannot be read as the condition shape the file declines to restate. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VRSgwJ7RN4vPZt4oJAADHy
A second verification pass caught that "the loop lanes included" overshot: a lane's orchestrating session is the main thread, where `Workflow` is reachable — only the item-workers it dispatches are non-fork subagents. The constraint now scopes to where the work actually lands and says where the lever does apply, instead of foreclosing a live option. Also: the branch cites the evaluator as documented (it receives the condition and the conversation so far), the same-plugin `/planning:interview` reference drops the `(if installed)` qualifier the repo reserves for cross-plugin citations, and the new prose matches the file's unwrapped paragraph style. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VRSgwJ7RN4vPZt4oJAADHy
…cabulary
Independent verification against the current workflows doc found the keyword
caveat's exclusion list one route short — an Agent SDK prompt that never stamps
its origin as human input — and silent on the natural-language opt-in the same
page grants ("use a workflow"), which left the keyword reading as the only
in-prompt path to a workflow.
The subagent caveat's "item-workers" named nothing: the lanes call them workers
and worktree subagents, so the term a reader would grep for did not exist.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRSgwJ7RN4vPZt4oJAADHy
|
Claude finished @kyle-sexton's task in 2m 16s —— View job PR Review
Overall: The changes are well-scoped, accurate, and the design decisions are sound. Three minor suggestions below, all Suggestion-level — nothing blocking. plugin.json
SKILL.mdThe two main additions hold up. Non-quantifiable goals branch (Step 2): The three-move framework (structural constraint → enumerated contents → checkable sub-step) is the right answer to the "no honest metric" problem. The explanation of why Move 3 must require the work rather than the verdict — the evaluator calls no tools, so it reads evidence only from what Claude surfaced in the transcript — is accurate and the reasoning is stated in the skill so the model running it can apply judgment, not just follow a rule. The fallback to Dynamic-workflows router row (Step 0): 🟡 Nit — cross-plugin reference is the primary witness for the Workflow tool filter, not the docs URL.
The sentence structure puts the other skill first and the authoritative docs URL as secondary. If
🟡 Nit — double-negative in the
The embedded The routines/schedule caveat CHANGELOG.md🟡 Nit — line break falls inside a phrase. The raw source at line 28–29: The break between README.mdThe updated REVIEW.md checks
|
|
Claude finished @kyle-sexton's task in 1m 12s —— View job Security Review — PR #1707
Scope: 4 files — No security issues found. The diff is composed entirely of prose instructions, a changelog entry, a description update, and a semver bump. A brief accounting of each surface that could theoretically carry a security concern:
Additional doc-fetch URL (SKILL.md line 46) — the skill now also cross-checks Dynamic-workflow routing guidance (SKILL.md lines 29–35) — prose only. The caveats about Shell invocation in Step 3 (SKILL.md lines 76–78) — pre-existing, untouched by this PR.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9fc9bb44b8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…d of replacing it Step 0's dynamic-workflows row read "a dynamic workflow, not a goal loop" — an unconditional route away from drafting. The other rows earn that shape because each names a lever that genuinely substitutes for `/goal`: an interval starts the turn, a routine runs sessionless, a Stop hook holds the per-turn logic, a one-shot needs no continuation at all. A workflow does not substitute. It decides how a single task fans out; it supplies no completion evaluator, so it cannot answer the question `/goal` answers. The repository's own workflow guidance states the composition directly: the goal sets the hard completion requirement and the workflow performs the parallel work. As written, an intent needing both — a migration that fans out across several workflow runs and must keep turning until a stated condition holds — hit the row and stopped before the skill drafted anything, with no lever left carrying the completion condition. The row now routes away only for the orchestration-only intent and names the composition for the rest. The CHANGELOG entry and the plugin README's one-line summary follow the corrected boundary. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0134vdV1jXJhzpSmeT7y5B8N
|
Claude encountered an error after 0s —— View job I'll analyze this and get back to you. |
|
Claude encountered an error after 0s —— View job I'll analyze this and get back to you. |
|
Claude finished @kyle-sexton's task in 2m 19s —— View job PR Review
Overall: The core additions are sound. Commit What changed since the last automated reviewThe synchronize event that triggered this run reflects commit
Codex finding — resolved. The original workflow row read Three nits from the prior review — still open🟡 Nit — cross-plugin reference leads instead of the docs URL.
The parenthetical puts the cross-plugin reference first and the authoritative docs URL as trailing context. If
🟡 Nit — double-negative in the
The embedded
🟡 Nit — CHANGELOG line break mid-phrase. The break between Substantive reviewNon-quantifiable goals branch (Step 2): The three-move framework (structural constraint → enumerated required contents → self-verification sub-step) is the right answer. The explanation of why Move 3 must require the work rather than the verdict — the evaluator is a fresh-context model that calls no tools, so it reads only what Claude surfaced in the transcript — is accurate and stated in the skill so the model can apply judgment rather than follow a formula. The fallback to Dynamic-workflows row (Step 0, after plugin.json: README.md: Updated description is accurate to the changes. The two added trigger phrases ( |
|
Claude finished @kyle-sexton's task in 1m 32s —— View job Security Review — PR #1707
Scope: 4 files — No security issues found. A surface-by-surface accounting:
New doc-fetch URL (line 46) — the skill now also cross-checks Dynamic-workflows router row (lines 28–37) — prose only. Notably, the Non-quantifiable goals branch (lines 58–70) — prose instructing how to structure a goal condition. The "fetch citations" example in move 3 describes what a user might put in a Shell execution in Step 3 (lines 76–80) — pre-existing, untouched by this PR. The
|
…hapes, record the review boundary (#1712) ## What Three loop-lane convention notes, all in `docs/conventions/loop-lane/README.md`, batched because they touch the same document. **#1655 — pin the "`/loop` runs the prompt fresh, not the session" distinction.** A relaunch is the only context reset a loop lane gets; the note records that and points at the authoritative surface in `claude-ops` `lanes` rather than restating it. **#1656 — reconcile the two launch shapes.** Supplying an interval converts the loop to a cron schedule subject to scheduler jitter; omitting it hands the delay to Claude per iteration. Both are current and neither deprecates the other. A lane always omits the interval, and the note now gives the load-bearing reason: a self-paced loop can end itself, which is how a drain lane honors its own stop condition, while a fixed-interval loop runs until stopped by hand or until the seven-day expiry. This reconciles which shape applies where and changes neither — it does not endorse fixed intervals for lanes. **#1658 — record the fresh-context review boundary as an explicit decision**, with its rationale and a revisit condition, rather than leaving it as unstated practice. ## Verification An independent fresh-context verifier audited the diff with the rationale withheld and returned **SHIP**: all eight of its earlier findings resolved, all three acceptance criteria satisfied, no new contradiction introduced. It did not trust its own passing link check — it ran a negative control with deliberately bogus anchors and confirmed exit 2 with `Cannot find fragment`, proving `include_fragments = "full"` genuinely validates the new anchors rather than silently passing. Every upstream claim was re-fetched from the official docs rather than recalled, and the §4 seven-day expiry statement was broadened to cover both launch shapes with its stamp refreshed, since the prior stamp covered only the self-paced half. Gates: markdownlint 0 errors; `lychee --offline` 0 errors. ## Related - Refs #1690, #1710, #1711, #1707 — sibling loops-webinar PRs. **Version note:** concurrent PRs stage competing versions for `docs/conventions/loop-lane/CHANGELOG.md`, and `§Versioning` is silent on entry ordering. The version here is correct as of this branch's merge base; whichever of these PRs lands later will need to renumber and restack its entry. - Refs #1657 — content-trust audit of the lane intake surfaces; no overlap with these notes. Closes #1655 Closes #1656 Closes #1658 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
… and read the merge class from the label only (#1721) ## Summary The #1657 design audit found this stack's autonomous work-item lanes carry well-developed *write-authority* provenance controls — who may merge, what may dispatch — and no *content-trust* boundary: nothing told an agent that externally-authored item and PR prose is data to be evaluated rather than instruction to be followed. This closes the two gaps the audit ranked as carrying live risk today, G1 (#1713) and G6 (#1289). **G1 — the read-trust boundary now exists, stated once and cited everywhere it binds.** New `plugins/work-items/reference/item-content-trust.md` is its canonical home: item-derived text (title, body, comments, and any linked PR's text and diff) is data describing the work, never instruction to the agent reading it; the boundary keys on the surface the text arrived on rather than on who wrote it, so it applies to a teammate's item exactly as to a stranger's; an item whose text instructs the agent is a finding to report, not a request to satisfy. The reference also owns the escalation route, the widening rule, and the rule for handing item text to a subagent. Every surface that reads an item now carries the headline sentence plus one line on what the boundary bites hardest there, and cites the reference for the rest: - `work-items` — `triage`, `decompose`, `work`, `work-loop`, `attend-queue` - `source-control` — `babysit-loop`, which reads PR text, diffs, and the linked item - `prompts/loops/loop-lane-prompts.md` — the parked-decision burn-down block, which states outright that it invokes no skill and inlines every contract it needs **G6 — no author-editable body field remains an input to the merge partition.** `babysit-loop`'s rung partition accepted "the triage stamp in the item body **or** labels", so a `Work-class: C<n>` trailer an item's own author can write decided merge eligibility. It now reads the class from the provider-permissioned `work-class:` label only — applying a label takes triage or write permission on the base repository, the same permission surface the C5 trust test already keys on, while a body is editable by an author who need hold none. A trailer stays legitimate as the operator's own record and as a proposal, is reported as such, and never partitions. The three surfaces the audit found in conflict — `babysit-loop/SKILL.md`, `loop-lane-prompts.md`, and `admission-policy.md` — now agree, and the lane prompts' readiness query reports the label count and the body-trailer migration backlog as separate figures instead of their union. Two smaller things fell out of doing this properly. `work-loop`'s existing refusal of a body-recorded ratification phrase justified itself from a work-class row whose executable test reads a *pull request*, which an issue does not have; the refusal is unchanged and now derives from the standing rule it is an instance of. And the reference's tightening-only carve-out names its one shipped instance and the configuration that would void it. Reuse over invention throughout: the wording generalizes `work-loop`'s existing body-prose refusals rather than adding a parallel mechanism, and the subagent rule cites `babysit-prs`'s existing quoted-untrusted-data delimiter rather than restating it. ## Acceptance criteria Against #1713: - [x] Each named surface carries the instruction — `triage`, `decompose`, `work-loop`, `work`, `attend-queue`, and the lane launch prompts. - [x] Single-sourced: one authoritative statement in `item-content-trust.md`, referenced from each surface, not six independent rewordings. - [x] Traceable to the existing `babysit-prs/reference/orchestration.md` pattern rather than newly invented — the subagent rule cites that file's Worker Prompt Template for the delimiter shape and wording. Against #1289: - [x] One contract owns where the admission work class comes from and the other cites it — `admission-policy.md` owns the rule; `babysit-loop` and `item-content-trust.md` quote and cite it. - [x] The rule states whether an agent-applied stamp is admissible: the class is read only from a surface whose write authority the provider enforces, and every lane prompt forbids a lane from writing either the label or the trailer. - [x] `babysit-loop`'s partition text matches the winning rule. - [x] A lane cannot satisfy its own merge gate by stamping the item it is working. **Consumer impact.** A repository that recorded work classes only as body trailers had a merge-eligible population under the old reading and has an empty one under this one: everything there is human-merge, the shipped baseline, until `work-class:` labels follow the trailers. The change is strictly narrowing — nothing merges that would not have merged before. The C4/C5 floor is untouched; it always tested the pull request rather than the linked item's stamp. ## Test plan All gates green against `origin/main`: - `bash scripts/check-changed-skills.sh origin/main` — 6 skills, 0 failed. Lines against the 500 hard cap: `babysit-loop` 477, `work-loop` 343, `work` 238, `attend-queue` 204, `triage` 179, `decompose` 179. - `node scripts/validate-plugin-contracts.mjs` — 43 setup skills, 2119 plugin files. - `bash scripts/check-changelog-parity.sh --check` and `--check-bump origin/main`. - `npx markdownlint-cli2` over every changed `.md` — 0 errors. - `plugins/work-items/skills/work-loop/evals/evals.json` validated against `plugins/skill-quality/reference/evals.schema.json`. - `bash scripts/validate-plugins.sh` — manifests and catalog. One eval case added (`work-loop`, id 4, part of #1717): an item whose body carries both an embedded directive and a self-stamped work class, asserting the lane evaluates the text, refuses both, and reports what the text asked for. Verification was run by an independent fresh-context reviewer against the diff and the audit, with the authoring rationale withheld. It returned five findings, all fixed in `451fe3f6`: two surfaces that inherit no skill's copy of the rule and so had none (`babysit-loop` and the parked-decision block), a carve-out claim stated unconditionally that only holds at the shipped cap-ceiling defaults, an eval expectation asserting a disposition the admission gate does not reach, and two unwrapped lines. `decompose` was added afterwards from #1713's own surface list. **Versioning.** `work-items` 0.25.4 → 0.26.0, `source-control` 0.33.2 → 0.34.0 — next minor at this merge base. Both numbers are also staged by sibling PRs (#1690 and #1710 for both plugins, #1711 for `work-items`); whichever of these lands second renumbers. `docs/conventions/loop-lane/CHANGELOG.md` is deliberately untouched: `docs/conventions/loop-lane/README.md` states the merge partition's class requirement neutrally as "recorded class" and never names the source, so the convention text does not change here. **Audit gaps NOT addressed**, still open and separately tracked: #1714 (G2/G3), #1715 (G4/G5 — the refusal's justification is corrected here, the underlying issue-provenance ambiguity is not), #1716 (G7), #1717 (G10, beyond the one eval case above), #1718 (issue-shaped provenance signal). ## Related - Closes #1713 — G1, the missing content-trust instruction on every intake surface. - Refs #1289 — G6, the contract disagreement over whether a repo-local stamp may supply the merge-admission work class. - Note on #1289: this PR tightens the consuming side (the partition reads the label only), but #1289 is `needs-human, work-class: structural` and owns the underlying contract decision, whose acceptance criterion is still an unaccepted suggestion. It is referenced, never closed — a maintainer closes it once that decision is made. - Refs #1657 — the audit that produced this scope. It stays open: the gaps beyond G1 and G6 are still a live operator decision. - Concurrent PRs sharing changelog and manifest surfaces with this one: #1690 (#1650), #1707 (#1652/#1654), #1710 (#1648), #1711 (#1649), #1712 (#1655/#1656/#1658). 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…only) (#1719) Phase 1 of #1651: turn each loop lane's spend from a blind spot into a measured one, by recording a per-cycle `usage_sample` in the lane telemetry state block that already exists. Nothing reads the field back. Phase 2 — a budget config key — is deliberately **not** designed here, and no threshold, cap, warning, pause, backoff, pacing change, or merge-rung change derives from the sampled value. ## The signal, and why it is not a token count The issue title says "token usage". This ships **window-percentage** usage instead, because no token count is readable at a lane's cycle boundary. What each lane actually records is the reading its rate-limit guard step already took that cycle: - **Field:** `rate_limits.five_hour.used_percentage` / `rate_limits.seven_day.used_percentage` - **Produced by:** `plugins/rate-limit-guard/scripts/statusline-tee.sh`, which selects `rate_limits` out of the status-line stdin payload and atomically rewrites `~/.claude/rate-limit-guard/rate-limits.json` - **Doc:** <https://code.claude.com/docs/en/statusline> — `used_percentage` is 0–100, `resets_at` is Unix epoch seconds, and `rate_limits` appears only for Claude.ai subscribers after the session's first API response, with each window independently absent. Re-verified 2026-07-28; no drift. Because the guard step already holds this value, the invariant costs a write, not an observation. **Why not tokens.** `context_window.total_input_tokens` / `total_output_tokens` are documented as token counts *currently in the context window, from the most recent API response* — cumulative session totals only before Claude Code v2.1.132. The `/usage`, `/goal`, and `/workflows` figures the issue cites are interactive displays, not values a skill body can parse at a cycle step. **One signal does exist, and is recorded as deferred rather than denied.** `cost.total_cost_usd` is documented as the session's client-side accumulated cost, resetting on `/clear` — machine-readable and session-scoped, so it *would* attribute to a single lane. The tee does not forward it. Widening the tee is a `rate-limit-guard` change (its own bump plus a reader-contract amendment) and is out of scope for a measure-only item, so this PR records it as the deferred candidate with its trigger rather than claiming no signal exists. ## Caveats, re-derived rather than inherited The issue's acceptance criterion names "approximate, machine-local". Both are recorded, but attributed to what they actually describe: - **Approximate** was a `/usage` caveat and does not hold for `used_percentage`, which the status-line schema documents without qualification. The real bound is the guard's staleness rule, so the sample is described as a snapshot no fresher than that rule allows. - **Machine-local** describes the *tee file* — last-writer-wins, no account identifier — not the reading, which is account-scope. The two are now stated separately. - **Disclosed gap:** the tee refreshes only while an interactive session renders a status line, and a lane is by construction a `claude --bg` session. An unattended lane with no interactive window open samples `null` every cycle. An empty sample therefore means *unobserved*, never zero. This is stated rather than glossed, because the framing "the reading is already in hand" otherwise hides it. ## Scope - Extends the existing `#502` durable-state block in both loop lanes — no second telemetry mechanism. `plugins/claude-ops/skills/lanes/scripts/telemetry-upsert.sh` is body-opaque and validates no schema, so it needs no change; nothing else in the repo parses the state block. - The schema tag stays `@1`: the added key is additive-optional and no reader validates the shape. - The attended `attend-queue` lane is unaffected — §4 binds loop lanes, and that lane holds no durable-state block. - `plugins/autonomy/reference/` is untouched. That tree holds the OTLP telemetry contract, not the lane state-block shape; the shape lives in the loop-lane convention and the two lane bodies. ## Versioning — renumbered as predicted The competing numbers this PR's table anticipated all landed first, so every version here was re-derived against `origin/main` at merge time rather than against this branch's original merge base: | File | Now | Superseded by what landed | |---|---|---| | `docs/conventions/loop-lane/CHANGELOG.md` | `6.0.0` | #1690 took `4.0.0`, #1710 took `5.0.0` | | `plugins/source-control` | `0.39.0` | #1690 `0.35.0`, #1710 `0.36.0`, plus `0.37.0` and `0.38.0` landing mid-merge | | `plugins/work-items` | `0.29.0` | #1690 `0.27.0`, #1710 `0.28.0` | The loop-lane bump stays **major** on the convention's own discriminator — §4 states loop-layer invariants and this adds one every loop-lane body must carry. The competing minor reading (a field nothing reads back changes no behavior) is recorded in the entry per the established pattern. The convention entry was also moved back to the top of its changelog, where the merge had left it below the entries that landed ahead of it. `§Versioning` re-derivation trigger 2 is satisfied: the status-line claim was re-verified against its cited page and the stamp refreshed, recorded as a changelog entry. `rate-limit-guard`'s reader contract carries its own 2026-07-23 stamp on the same page; it is unchanged by this PR and its refresh belongs to that plugin's own bump. ## Composition with the two features that landed first Both lane bodies now carry three loop-layer features in one cycle step and one state block: the no-progress streak (#1648), the escalation record write (#1650), and this usage sample. Composing them pushed `babysit-loop`'s `SKILL.md` past the 500-line hard cap, so two things were tightened without changing any contract: - The usage-sample prose in **both** lane bodies keeps the field contract (the `at` semantics, every `null` rule, the delta's roll-over and first-cycle cases) and cites §4 for the single permitted readback, the preceding-interval delta, and the three bounding properties — all of which §4 already states in full. §4's own wording changed from "recorded alongside the sample in each lane body" to "held by citation from each lane body" to match. - `babysit-loop`'s telemetry upsert mechanics — the singleton lookup and the creation-race reconcile — moved to `reference/telemetry-upsert.md`, beside the `pre-escalation-dispatch.md` and `no-progress-detector.md` spokes already there. Still inlined in this plugin rather than invoked from `claude-ops`, for the same reason as before. ## Verification Gates green after the merge: `check-changed-skills.sh` (babysit-loop 486/500 and work-loop 451/500 against the hard 500-line cap, both re-measured with all three features composed), `check-changelog-parity.sh --check` and `--check-bump origin/main`, and markdownlint over every changed markdown file. No `evals.json` is touched. A fresh-context verifier audited the diff with the rationale withheld and traced the tee's producer and the live status-line doc independently. Its findings drove the cumulative-cost correction, the caveat re-attribution, the background-session disclosure, and the removal of a cited precedent that did not exist. Its remaining version-collision finding is the table above. ## Related - #1690 (#1650) — merged; took loop-lane `4.0.0` and both plugin bumps, and writes the escalation record into the same cycle step this PR extends - #1710 (#1648) — merged; took loop-lane `5.0.0` and both plugin bumps, and adds the no-progress streak to the same state block and cycle step - #1712 (#1655/#1656/#1658) — took loop-lane `3.1.0` - #1711 (#1649) — stages a `work-items` bump; still open - #1707 (#1652/#1654) — concurrent lane work, no file overlap - Phase 2 (`*_session_token_budget`) stays deferred until this sampling produces data, per the issue's own staging. Closes #1651 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
/planning:draft-goal-conditionmechanized goal drafting well but assumed a checkablecondition already existed, and its Step 0 repetition-lever router was missing a lever.
Both gaps are closed here.
Non-quantifiable goals (#1652)
Step 2 gains a branch for intents no metric can honestly measure. Rather than
manufacturing a fake number — which aims the evaluator at the wrong thing and lets a run
pass on the wrong evidence — the branch builds the condition from three moves: a
structural constraint, enumerated required contents, and a self-verification sub-step
that requires the verifying work rather than its verdict.
The third move is worded that way for a documented reason, which the branch states: the
/goalevaluator is a fresh small fast model that receives only the condition and theconversation so far and does not call tools, so it can credit only verification that
Claude actually performed in the transcript. An assertion that checking happened reads
identically to the checking having happened.
Co-drafting a still-vague intent points at
/planning:interviewinstead of restating it.Dynamic-workflows router row (#1654)
The router offered
/loop, routines and/schedule, a Stop hook, and a one-shot prompt,leaving work that needs more agents than one conversation can coordinate with nowhere to
route. Two caveats ship with the row, each because it turns a plausible recommendation
into a dead one:
ultracodekeyword vs/effort ultracodeare not interchangeable. The keyword runsone task as a workflow and changes nothing else, and is honored only from a human-typed
prompt (not
-p, not an unstamped Agent SDK prompt, not a scheduled task, not arelayed webhook or PR comment); asking in plain words is the same opt-in.
/effort ultracodeis the standing session setting —xhigheffort plus per-task workflowplanning — and needs a model offering
xhigh.Workflowtool is filtered out of every non-fork subagent, so a lever whosework lands in dispatched non-fork subagents cannot be this one however well it
otherwise fits.
The row also carries the availability fact that keeps it from being skipped as
preview-gated: dynamic workflows are on all paid plans, switched on from the
/configDynamic workflows row on Pro. Routines and
/scheduleare the ones still labelledresearch preview, and that row now says so.
Verification
Every harness claim above was fetched from current official docs this session, not
recalled:
/en/goal,/en/workflows,/en/sub-agents,/en/routines. An independent fresh-contextverifier re-fetched all four and audited the diff with the rationale withheld; its
accuracy findings are fixed in the final commit.
The skill deliberately still hardcodes neither the condition shape nor the character
limit — both are read live at authoring time, and Step 1 now cross-checks the workflow
row against
/en/workflowstoo.Gates: skill gate PASS (101/500 lines, 11/11 trigger phrases preserved), markdownlint 0
errors, changelog parity
--checkand--check-bumpclean,validate-plugins.shclean.Related
Closes #1652
Closes #1654
🤖 Generated with Claude Code