README перестал объявлять скилл ручным: model-invocation — намеренное текущее состояние (триггер — форма задачи, не область). Жёсткий гейт получил исключение для глоссария (спорил с шагом 4) и стал единственным владельцем запрета на реализацию; дубли правил схлопнуты к владельцам. Отложенные находки (шов self_review, критерий конца интервью, версионные пометки в шаблонах) — в Pending decisions ROADMAP. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
166 lines
9.8 KiB
Markdown
166 lines
9.8 KiB
Markdown
# Roadmap & backlog — brainstorm-with-docs
|
||
|
||
Single source of truth for what's done, pending, and deferred. In-repo and
|
||
versioned so it survives across sessions and tools (not just an agent's memory).
|
||
|
||
## Status
|
||
|
||
- **v1 — shipped.** Commits `50640d8` (initial) and `f24b342` (review fixes).
|
||
Working hybrid: context inspection, glossary/`CONTEXT.md` + lightweight ADR
|
||
discipline, active grilling, option comparison, durable artifacts, and a
|
||
stop-before-implementation gate that allows investigation but forbids state
|
||
changes.
|
||
- **First live test — 2026-06-06.** Real task: Superset dashboard redesign in the
|
||
clickstream repo (KPI semantics → CONTEXT.md glossary → spec + ADRs). Findings
|
||
landed below; the test report drove the v2 divergence section.
|
||
- **Second live test — 2026-08-01.** Wayfinder map «проектирование генератора»
|
||
(clickstream-data-platform, map #26): four grilling tickets resolved
|
||
fork-by-fork, a fan of options per decision. Landed the whole v2 divergence
|
||
block on this evidence (see below).
|
||
|
||
## Landed (2026-06-06, from first live test)
|
||
|
||
- **R1 — recommend-an-answer-per-question — RESTORED** (`SKILL.md` step 4).
|
||
Evidence: per-question recommendations drove nearly every decision in the test;
|
||
bare questions would have been flat. The user confirmed the recommendation was
|
||
what he leaned on ("often hits the mark").
|
||
- **F1 — divergence — ADDED** as a `<core_rule>` (and echoed in step 5). Final
|
||
form after discussion: offer 2-3 approaches *within* the framing **plus** at
|
||
least one (more if useful) that *challenges* the framing — the divergent option
|
||
is additive, not a stolen slot — with an explicit "don't pad to a number" guard.
|
||
Evidence: in the test, 2 of 3 options were variations of one idea; only the
|
||
consciously-pushed third was a different *kind* of answer. Rationale for keeping
|
||
it mandatory (not "preferably"): the user is the final filter, so a weak
|
||
divergent option costs ~nothing, but a *missing* one is invisible and can't be
|
||
picked or rewritten.
|
||
- **SEAM-bias — FIXED.** The verbose `SEAM/TODO` comment in `SKILL.md` step 5
|
||
primed the running agent with the expected outcome ("we want to see how badly
|
||
pure convergence collapses") — contaminating the very observation it wanted.
|
||
Rationale moved here; `SKILL.md` now carries only a neutral marker. *Principle:
|
||
the shipped skill must not tell a running agent what result the author expects.*
|
||
(New finding, not previously in backlog.)
|
||
- **R2 — interview relentlessness. Verdict: leave SOFT.** In the live test the
|
||
interview ran long because the *user* kept opening new forks, not from
|
||
over-asking. The real value came from data/code cross-referencing ("never ask
|
||
what the repo can answer — search first"), not relentlessness. For pure
|
||
conversation-only alignment, use `grill-me`; this skill stays softer because it
|
||
must also inspect context and produce artifacts.
|
||
- **F4 — comparison target clarified.** `grill-with-docs` is an upstream
|
||
influence, not the main operational sibling: it is intentionally shaped by
|
||
someone else's methodology and was too narrow for the user's documentation
|
||
needs. The practical boundary is now with `grill-me`: **grill-me** = pull
|
||
understanding from the user and sync with the agent, without creating docs;
|
||
**brainstorm-with-docs** = repo-grounded option exploration plus durable
|
||
artifacts. Documented in `README.md`.
|
||
|
||
## Landed (2026-08-01, from second live test)
|
||
|
||
The whole **v2 divergence block** (former proposals 1–6) landed in `SKILL.md`.
|
||
Design intent, for the record: the first test's miss was at the *frame* level
|
||
("fix the KPI strip" — never "is a KPI dashboard the right vehicle at all?"),
|
||
and the user's cost worry made divergence *tiered*, not always-on. What landed:
|
||
|
||
- **Divergence-then-convergence as separate phases** — step 5 is now "Diverge,
|
||
then converge"; the SEAM marker is gone, its intent implemented. Generation
|
||
happens before any evaluation.
|
||
- **Frame-level divergence** — step 5 opens with a one-sentence restatement of
|
||
the user's implicit frame, and the fan must contain ≥1 frame-rejecting option.
|
||
- **Tiered divergence** — fan width calibrated to decision weight: minimum fan
|
||
for cheap/reversible, toolkit pass for hard-to-reverse/expensive-to-unwind.
|
||
- **Idea-generation toolkit with WHEN-triggers** — axis of variation, archetype
|
||
stances, inversion, adjacent-domain steal, pre-mortem; null option promoted
|
||
out of the toolkit into the mandatory minimum fan (cheap win).
|
||
- **Cheap wins** — null option + frame restatement are now unconditional.
|
||
- **Diversity self-check** — "different kinds or variations of one?" check
|
||
before presenting.
|
||
- **Fork-in-place grilling** (new, from the test, not in the old proposals) —
|
||
step 4: when the interview hits a decision fork, run the divergence pass on it
|
||
immediately and wait for the user's reaction before moving on; invite
|
||
reactions to rejected options, not just the favourite. Converge carries
|
||
rejected options + reasons into the resolution record.
|
||
- **F5a** — `docs/agents/*.md` added to the step-1 read list.
|
||
- **Same-day prune** (writing-great-skills review): step 5 is the single owner
|
||
of fan composition — the F1 core rule keeps only the generate-before-judging
|
||
principle, and the repo-side `AGENTS.md` line routes without restating the
|
||
fan. Description halved to two trigger branches (ambiguous problem / decision
|
||
fork); the "Use for" list collapsed from nine bullets to four. Domain
|
||
enumeration dropped from the triggers entirely (user's call): the *shape* —
|
||
unclear direction, decision fork — is the trigger, not the field, and a
|
||
domain list only gave the router reasons not to fire (e.g. course-content
|
||
or skill-design forks).
|
||
|
||
**Evidence from the second test.** Twice the winning answer came from *outside*
|
||
the initially presented fan, after the user pushed against its frame:
|
||
DDL-autogeneration reframed into a data contract owned by the generator (ticket
|
||
#29), and a git-stored snapshot reframed into manifest-only-in-git (ticket #30).
|
||
Pattern worth keeping in mind for future revisions: the fan's value is not only
|
||
its options — presenting it invites the owner to break the frame themselves.
|
||
Per-question recommendations (R1) confirmed again as the main driver.
|
||
|
||
**Routing gap, found and fixed.** Nothing routed grilling/wayfinder sessions to
|
||
this skill except a per-map Notes line and one agent's private memory — fragile
|
||
and machine-local. Fixed two ways: (a) the skill `description` now names
|
||
decision-fork grilling (incl. the Russian trigger word «развилка») so the
|
||
skill router matches it; (b) a repo-side routing line in the project's
|
||
`AGENTS.md` (clickstream-data-platform) — deterministic, versioned, copyable to
|
||
future repos. The third-party grilling skill stays unforked; this skill owns
|
||
the fan practice.
|
||
|
||
## Landed (2026-08-01, from cold review)
|
||
|
||
A fresh-session reviewer (no shared context, writing-great-skills lens) read
|
||
the skill cold. Applied same day:
|
||
|
||
- **README "manual-only" claim was stale** — the worst kind of sediment: a
|
||
wrong statement about the skill's invocation mode. The skill started life
|
||
with `disable-model-invocation: true`; the owner deliberately made it
|
||
model-invoked after live use showed the value is in the agent reaching it
|
||
unprompted. Usage section rewritten; the Codex-behaviour paragraph (built on
|
||
the manual-only premise) removed.
|
||
- **Hard gate contradicted step 4** on inline `CONTEXT.md` capture ("once the
|
||
user agrees on the direction" vs "as it happens"). The gate now carries an
|
||
explicit exception for additive glossary capture; step 4 owns the rule.
|
||
- **Implementation ban deduplicated** — it lived in four places (description,
|
||
"Do not use" list, twice inside the gate, stop_condition). The gate is the
|
||
single owner: its two internal lists collapsed into one, stop_condition
|
||
defers to it. The description keeps its one-line negative trigger and the
|
||
"Do not use" list stays — those do invocation routing, not run-time
|
||
restraint.
|
||
- **Rule/step duplicates collapsed** — minimum-sufficient is owned by the core
|
||
rule (step 7 defers); "what NOT to do now" is owned by step 5 Converge (core
|
||
rule removed). Same move as the fan-composition prune.
|
||
- **README domain list aligned** with the shape-not-domain trigger decision;
|
||
README Roadmap section reduced to a pointer at this file (it had become a
|
||
second source of truth).
|
||
|
||
## Pending decisions (2026-08-01 cold review, deferred by owner)
|
||
|
||
- **Step 7 / self_review seam.** Review runs "before presenting" but after the
|
||
file is written; unclear what happens to the written artifact if review sends
|
||
the run back to the interview. Candidate fixes: review the draft before
|
||
writing, or state honestly "write → review → patch; if a gap opens, back to
|
||
the interview, then update the artifact".
|
||
- **Interview stop criterion.** "Clear enough to synthesize" is vague; candidate
|
||
hardening: problem, constraints, and success criteria named + no open forks
|
||
left.
|
||
- **Version notes in templates.** `artifacts/context.md` carries "(Multi-context
|
||
handling is deliberately light in v1.)" — development history in agent-facing
|
||
text; belongs here, not there.
|
||
|
||
## v2 — remaining
|
||
|
||
Kept from before:
|
||
|
||
- **"Design for isolation / clarity" lens** (from superpowers brainstorming):
|
||
evaluate options by whether each unit has one clear purpose and a clean
|
||
interface.
|
||
- **Fuller multi-context.** v1 handles a single root `CONTEXT.md` and only
|
||
mentions `CONTEXT-MAP.md`. Restore grill-with-docs's full model: `CONTEXT-MAP.md`
|
||
+ per-context `CONTEXT.md` + per-context `docs/adr/` + a Relationships section.
|
||
|
||
## Rejected (do not revisit without new evidence)
|
||
|
||
- **F6 — "space-separated `allowed-tools` won't parse."** False. Claude Code docs
|
||
accept space- or comma-separated or YAML list; and `allowed-tools` is
|
||
pre-approval, not a restriction. No change needed.
|