docs(effort): BDR-107 id, CHANGELOG entry, spec corrected for the rulings (vendored pins, exclusions, pairing rule)

This commit is contained in:
bastien
2026-09-28 20:20:05 +02:00
parent 1e3339358c
commit 98ef991958
22 changed files with 39 additions and 29 deletions
@@ -34,6 +34,8 @@ repo.
| Subagent frontmatter `effort:` | Applied to the subagent. Absent → **inherits the session level**. | built-in on sonnet printed `xhigh`; impeccable agent pinned `medium` printed `medium` |
| Skill frontmatter `effort:`, user-typed `/skill` | Applied for the **rest of the turn**, AskUserQuestion included. | headless `/effort-probe-low`: every request at `low` |
| Skill frontmatter `effort:`, loaded by Claude through the Skill tool, **interactive** session | Applied for the rest of the turn. Last loaded skill wins, up and down. | this session: `xhigh` → probe max → `$CLAUDE_EFFORT=max`, request records `effort=max` → probe xhigh → back to `xhigh` |
| Same, pairing rule | Applies **only when the Skill call shares the assistant message with another tool call after it**; a lone Skill call is a no-op. The paired call already runs at the new level. | this session, 8/8 observations |
| Same, re-load | A shifter already loaded in the conversation re-applies its effort when loaded again (paired); only its text is deduped. | this session |
| Same, **headless** (`-p`) | **Not applied** (neither `effort:` nor `model:`). | three `-p` runs, transcript effort unchanged |
| Prompt cache on a mid-turn shift | **Preserved** on Fable 5.1: first request at max read 206,996 cached tokens, wrote 1,164. | this session |
| Agent tool call site | No `effort` parameter (only `model`). One agent file = one effort. | tool schema |
@@ -97,14 +99,16 @@ Applies from the user's invocation for the rest of the turn.
| effort | Skills |
|---|---|
| low | status, commit-change, release-candidate, doc, capitalize, close, reconcile, deploy, profile, plugin-check |
| medium | gitflow, prune-memory, find-docs |
| medium | gitflow, prune-memory |
| high | feat, hotfix, bugfix, refactor, web-validate, harden, seo, geo |
| xhigh | ship-feature, init-project, onboard, tour, audit-delta, analyze, code-clean, client-handover, spec, skillify, brainstorming, writing-plans |
| unlisted | session default, by design (gstack and plugin skills are external; graphify is machine-owned) |
| xhigh | ship-feature, init-project, onboard, tour, audit-delta, analyze, code-clean, client-handover, brainstorming, writing-plans |
| unlisted | session default, by design: gstack skills (`spec` and `skillify` are gstack), plugin skills, and machine-generated skills (`graphify`, `find-docs`) |
`brainstorming` and `writing-plans` are vendored superpowers skills: the
one-line patch drifts from upstream at each resync; a census lock (§7)
makes the loss loud.
`brainstorming` and `writing-plans` are vendored superpowers skills living in
`skills-external/` (gitignored, symlinked into `skills/`): the pin is applied
to the real file and never committed; `install-plugins.sh` re-applies it after
every resync, and the census checks it whenever the file is present (visible
SKIP otherwise).
A skill loaded by Claude as a sub-step (feat → commit-change) also shifts
the level for the rest of the turn (interactive, §2), so orchestrators
@@ -121,6 +125,9 @@ mirroring `lib/model-gate.md`:
- A shift is a `Skill(effort-<level>)` call on the main loop. Never inside a
dispatched agent (agents run on their pin). One tool round-trip,
cache-safe (§2).
- **Pairing rule**: the shift is sent in the same assistant message as the
step's first tool call, shift first; a lone Skill call is a no-op (§2).
Re-loading a shifter re-applies its effort.
- Orchestrator wiring, three points each: `effort-medium` when the plan is
closed and the dispatch phase starts; `effort-low` before the
capitalize / journal / doc-commit tail; `effort-max` at an escalation
@@ -176,7 +183,7 @@ each subagent's effort (2.1.243).
|---|---|
| `settings.json` | `effortLevel` → `high` (curated config: read the diff, LRN-098) |
| `agents/*.md` (20) | `effort:` line per D2; `skills/init-project/SKILL.md:98` citer |
| `skills/*/SKILL.md` (33) | `effort:` line per D3, including the two vendored superpowers skills |
| `skills/*/SKILL.md` (28 tracked) + `skills-external/{brainstorming,writing-plans}/SKILL.md` (not committed) | `effort:` line per D3; `install-plugins.sh` re-applies the two vendored pins after resync |
| `skills/effort-{low,medium,high,xhigh,max}/SKILL.md` | new, frontmatter + one sentence |
| `lib/effort-shift.md` | new include: protocol, wiring points, escalation, turn reset, headless note |
| `lib/model-gate.md` §4 | one paragraph: effort is the second axis, pointer to the include |
@@ -185,6 +192,7 @@ each subagent's effort (2.1.243).
| orchestrator SKILL.md (feat, hotfix, bugfix, ship-feature, init-project, onboard, tour, code-clean, seo, geo, harden, web-validate, client-handover, audit-delta) | include line + the three wiring points; ship-feature 4b max |
| `hooks/statusline.sh`, `hooks/session-start.sh` | live effort display; env-var warning |
| `lib/tests/effort-routing.test.sh` | new census suite (§7) |
| `lib/effort-audit.py` | transcript audit script (§9) |
| `CHANGELOG.md`, `.claude/memory/*` | release note; BDR + LRN + EVAL + journal (§8) |
## 7. Tests and census (`make test`)
@@ -196,8 +204,9 @@ New suite `lib/tests/effort-routing.test.sh`, `grep -qF` locks in the
in its first 10 frontmatter lines, level in the allowed set; the "none"
list has no `effort:`.
2. Tier locks per D2 (one `has` per agent).
3. Skill locks per D3 (one `has` per skill), including `brainstorming` and
`writing-plans` (the resync alarm).
3. Skill locks per D3 (one per skill); the two vendored skills are checked
when present (visible SKIP otherwise); `install-plugins.sh` carries the
re-apply block.
4. The five shifter skills exist with the exact `name:` and `effort:`.
5. `lib/effort-shift.md` is included by every orchestrator in the §6 list;
`verify-secure-loop.md` and `ship-feature/SKILL.md` contain the