dinostack
Skill14 starsChanged 15 days agoApache-2.0View on GitHub
Apply when the user mentions any software development work: implementing features, fixing bugs, reviewing or refactoring code, debugging, testing, deploying, working with agents or subagents, making architecture decisions, setting up projects, managing dependencies, writing scripts, or any task that involves reading, writing, or reasoning about code and systems.
In this repository17 other files it gives its agents.
- AGENTS.mdAGENTS.md
- bin/AGENTS.mdAGENTS.md
- .codex/AGENTS.mdAGENTS.md
- .github/workflows/AGENTS.mdAGENTS.md
- hooks/AGENTS.mdAGENTS.md
- .kimi/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- .github/copilot-instructions.mdCopilot instructions
- .cursor/rules/agent-methodology.mdcCursor rule
- .cursor/rules/code-standards.mdcCursor rule
- .cursor/rules/conventions.mdcCursor rule
- .cursor/rules/frontmatter/agent-methodology.yamlCursor rule
- .cursor/rules/frontmatter/code-standards.yamlCursor rule
- .cursor/rules/frontmatter/conventions.yamlCursor rule
- contentSkill
- dinostackSkill
- dinostackSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
20 rules. About 0 are common, 12 are distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈12
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 63
Run /ds-help for the full command inventory.
- Very specific: line 153
Read the project marker: Look for a root AGENTS.md in the current working directory.
- Very specific: line 157
If both appear, the one that appears FIRST wins.
- Very specific: line 173
Skill/command references: Every file in content/commands/ begins with a one-line reminder to run this preflight and no-op if inactive.
- Distinctive: line 183
The owner test: Before producing anything yourself, ask whether a named agent's contract already covers it.
- Distinctive: line 204
Scope discipline: Do only the requested scope.
- Distinctive: line 219
Stop and ask the user ONLY when one of the following holds.
- Distinctive: line 238
When uncertain whether to ask: prefer acting. A small course correction after the fact is cheaper than a stalled conductor.
- Distinctive: line 240
Default-and-proceed protocol: Every time the conductor is tempted to ask the user a question, it must first attempt to derive a default by …
- Distinctive: line 291
Never start project exploration as Low and promise to promote later.
- Distinctive: line 293
If that required named-agent route cannot start, the canonical fail-closed rule applies: report the blocker or stay within bounded …
- Very specific: line 444
Only after profile=relaxed resolves and all four predicates pass, this is a no-investigation fast path.
- Distinctive: line 472
Only after all four predicates pass, apply the override to these five canonical carrier rows:
- Distinctive: line 491
Write an ADR, plan, or spec is Elevated in every profile.
- Distinctive: line 521
All signals not mentioned above keep their default level regardless of profile.
- Distinctive: line 550
If a task initially classified as Low reveals Elevated signals during execution, stop, reclassify as Elevated, and apply adversarial review …
- Distinctive: line 554
After completing a Low-risk change, re-read it in full.
- Very specific: line 575
When a Brief or Plan governs the task (see METHODOLOGY.md §Planning Artifacts), include the artifact path under the Risk: and Tier: lines:
- Very specific: line 627
Before every Agent spawn, the conductor reads the target agent's capabilities: block (if present) and verifies that all declared tools are …
- Very specific: line 668
Low-risk units: no Skeptic - reads, snapshots, memory answers, and subagent result synthesis are conductor-direct.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
IMPORTANT - READ THIS FIRST: If
skill_auto_load: trueis set in~/.claude/agentic-engineering.json, this skill is configured to auto-load. Read this entire SKILL.md before taking any action on software development tasks. Do not start implementing until you have read the Rules section below.
The Agentic Engineering system defines how to plan, delegate, review, and ship software using a structured multi-agent workflow. It covers risk classification, adversarial review, task decomposition, and quality gates so that changes are correct, safe, and reviewable. Read the rules files on every session and the reference docs on the triggers described in METHODOLOGY.md §Protocol Details (read on trigger).
Early relaxed-advice routing gate. This gate applies only after activation resolves
profile=relaxed and all four canonical predicates pass. If profile is default or strict, this
gate does not apply and the motivating advisory retains its existing Elevated routing. After the
relaxed-only guard passes, apply risk classification before the first project-content read. Relaxed
ephemeral chat advice remains direct only when the answer can be produced from context already held;
otherwise classify Elevated before reading. Within that relaxed-only override, breadth alone is not
an investigation request. For the exact prompt How would you recommend changing DinoStack? in
that relaxed-only override, give bounded high-level advice from the methodology and context loaded
during mandatory skill activation, state specificity or evidence limitations when useful, and do
not explore the project merely to improve specificity. An explicit user request for unfamiliar,
repository-specific, multi-file or multi-read evidence is Elevated and delegated before any
project-content read. That explicit-request qualifier narrows only whether advisory wording
constitutes an investigation request; it does not narrow risk classification. After the four
predicates and carrier exceptions, every other canonical Elevated signal still wins, including
security-sensitive, high-stakes, state-changing, and protocol or infrastructure signals. If the
required named-agent route cannot start, report the blocker or offer only bounded context-only
advice that does not perform the requested investigation; never fall back to conductor multi-file
or project exploration.
State-changing implementation requests (implement, change, fix, or build) never qualify for this
advice exception: establish the named Engineer/Worker route before any non-mandatory project read
or command. Until that route starts, do not inspect or verify candidate work; a failed route ends
in a blocker. Canonical candidate-branch and fail-closed details:
content/sections/04-risk-classification.md §Relaxed ephemeral chat-advice override.
Conductor default: act, don't ask. The conductor's job is to complete the goal, not to approve every step. With a recommendation, act on it and report afterwards. Stop and ask only for destructive/irreversible actions, missing information only the user has, materially ambiguous acceptance criteria, scope-completion decisions, an operator-only grant, or a required operator ratification. Repeated stops within one task are a planning signal, not a virtue. See Proactive autonomy in METHODOLOGY.md §Delegation for the full rule, anti-patterns, and stop-frequency thresholds.
Rules (read these files)
- METHODOLOGY.md - the assembled kernel: delegation, risk classification, activation preflight, planning gate, task decomposition, and worktree lifecycle; the core rules for when to act directly vs. spawn Workers and Skeptics.
- rules/code-standards.md - the engineering contract for documentation evidence, tool selection, code comments, reuse, quality gates, resource use, and dependencies; detailed procedures load on trigger.
- rules/conventions.md - writing style including length discipline (write for the permanent audience), project structure, session context and memory handling, and git workflow including required PRs and worktree-per-feature conventions.
Commands (invoke by name)
/ds-help- static, zero-token command reference; lists every slash command with a one-line description./ds-status- read-only resolver dump; shows the resolved mode, profile, and marker with provenance plus a plain-English explainer of what they do and how to change them./ds-brief- interactive planning dialogue; produces the Brief artifact before architect and engineer are spawned. Invoke when operator implies planning intent at session start, or use/ds-brief --from <path>to extract a Brief from an existing PRD./ds-update- update an existing dinostack/DinoStack install (or fresh-install if none exists); invoke when the user says "pull and install DinoStack", "update DinoStack", "install the latest DinoStack", "reinstall dinostack", or "update my AE install".
Run /ds-help for the full command inventory.
Reference Docs (read on trigger - see Protocol Details in METHODOLOGY.md)
- references/skeptic-protocol.md - Skeptic loop orchestration, findings classification (Critical/Major/Minor), sign-off format, adversarial briefs, and the Elevated + Cleanup path.
- references/subagent-protocol.md - parallel spawning rules, worktree isolation, check-in behavior, phase breadcrumbs, and task decomposition rules for multi-Worker plans.
- references/agent-team.md - named agent roles (engineer, architect, investigator, debugger, security-auditor, orchestration-planner), composed flows, decision rules, and spawn requirements.
- references/design-goals.md - design principles and goals of the Agentic Engineering system; read when evaluating whether a proposed change aligns with the system's intent.
- references/regression-test-obligation.md - per-finding regression-test obligation: every Critical or Major behavior-defect finding fixed during a task must come with a regression test that would have caught it; read when fixing a Skeptic finding to confirm what counts as a valid regression test.
- references/doc-sync-obligation.md - per-change doc-sync obligation: a reality-asserting change (alters a count/list/path/convention/behavior an intent-layer doc states) must update the affected docs in the same change; read when a change touches a documented surface.
- references/role-models.md - Pi / oh-my-pi per-role model routing and antagonist
reviewer model diversity; read when resolving
role-models.ymlor spawning reviewers on Pi/omp. - references/model-discovery.md - Pi/oh-my-pi model selection paths (ask-user
wizard, harness-native, pin-by-hand) and the per-role ranking heuristics in
bin/ds-models; read when seedingrole-models.yml. - references/evidence-on-disk.md - spill/sketch/rehydrate protocol for large tool output; when to spill, the three-step loop, teardown, and ephemerality.
- references/cross-harness-teams.md -
ds-teamCLI andteam.ymlschema for orchestrating parallel agent teams across multiple AI harnesses; read when usingds-teamor configuring cross-harness dispatch withteam.yml. - references/digest-return-pattern.md - digest-return discipline: when a background loop-running spawn (multi-iteration Skeptic/QA, long investigation) returns, the conductor reads the structured digest and acts - it does not re-read the internal transcript; read when running a multi-unit plan with parallel background loops.
- references/learnings-capture-instruction.md - the standing "watch for learnings"
instruction: what counts as a learning, the in-flight
ds-learning-shard appendpath for the four roles it belongs to (engineer,adr-generator,product-discovery,release-orchestrator), thelearnings_candidate[]path for the three roles whose return contract declares that field, and its canonical definition; read when acting as any subagent role. - references/command-authoring.md - authoring discipline for commands, skills, and agent definitions: trigger-keyword descriptions (always injected into context even when unused, so enumerate when to fire, not behavior) and bad/good example-pair seeding to encode taste; read when authoring or editing a command file, skill definition, or agent definition.
- references/memory-shard-convention.md - git-tracked per-fact shard directory
(
.agentic/memory-shards/) a project's root MEMORY.md compiles from, the frontmatter every shard carries, and the split/regenerate round-trip's entry-loss and reordering refusal guards; read when working onbin/ds-memory-shard,bin/ds-memory-capture,hooks/lib/memory-shard.js, or any writer that captures a fact into a shard.
Embedded Resident Content
METHODOLOGY.md (minimal corpus - see note below)
Activation preflight
Run this check once at the first skill invocation (and every /-command). Read activation config and the project marker directly; resolve identity exactly once with ds-identity resolve-hook --cwd <cwd> (3-second timeout, 64 KiB output cap). Do not spawn or use LLM reasoning. Resolver failure means identity none and never blocks activation. Exception: Step 6 may run the bounded, fail-open bin/ds-migrate scaffolding sync.
Read the global mode and profile. Load
~/.claude/agentic-engineering.json. If missing or unreadable, assumemode=opt-outandprofile=default(back-compat). Expected shape:{ "mode": "opt-out" | "opt-in", "profile": "relaxed" | "default" | "strict", "set_at": "<ISO8601>" }. Anymodevalue other thanopt-inis treated asopt-out. Anyprofilevalue other thanrelaxedorstrictis treated asdefault(see the deprecated legacy preset subsection below for the fallback path whenprofileis genuinely absent rather than merely invalid).Also invoke that resolver and record only validated JSON
nullor{developer_id, provisional, identity_scope, config_dir?}. It safely discovers project/profile/global candidates and applies confirmation-first ordering: project > profile > global, then provisional project > profile > global. Do not re-read identity files. A provisional winner triggers the scoped first-turn notice. Full resolver and routing contract:content/commands/ds-identity.md.Deprecated legacy preset (read-only compat). Older configs may still carry a session-wide
presetfield (lean|standard|strict) at either scope. It is a read-only fallback used ONLY whenprofileis genuinely ABSENT at that scope - check key presence, not truthiness. An invalidprofilevalue is treated identically to absent for this purpose (a valid legacypresetmay then apply); if nothing validates anywhere, terminate atdefault.Legacy preset table:
Preset Resolves to profile lean relaxed standard default strict strict Precedence chain (replaces the old "preset wins on collision" rule): project
profile> projectpreset(legacy, only if project profile absent) > globalprofile> globalpreset(legacy, only if global profile absent) > hardcoded"default".Presence of a legacy
presetkey at either scope fires a deprecation notice regardless of whether it wins resolution (see §Session Context and Memory incontent/rules/conventions.mdfor the two notice templates).Note: this deprecated session-wide
presetfield is distinct from the per-spawnPreset:declaration introduced in the Tier declaration section below - that mechanism is unaffected by this deprecation. The session-wide preset was a legacy tone-setting alias; the per-spawn preset is a capability bundle. Both terms use "preset" intentionally - context disambiguates.- Read the project marker. Look for a root
AGENTS.mdin the current working directory. If the project uses the Claude Code@AGENTS.mdimport pattern,CLAUDE.mdwill point at it - resolve through to the actualAGENTS.md. If neither file exists, treat marker asnone. - Scan for marker lines. Case-insensitive, whole-line match (allow leading or trailing whitespace, and an optional markdown list prefix
-):agentic-engineering: opt-inagentic-engineering: opt-outIf both appear, the one that appears FIRST wins; print a one-line warning:agentic-engineering: both opt-in and opt-out markers found in AGENTS.md - using the first one (<value>). Remove the duplicate.Also scan foragentic-engineering-profile: <value>. If present, it overrides the global profile. Valid values:relaxed,default,strict. Any other value falls back to the precedence chain in the deprecated legacy preset subsection above (project preset, then global profile, then global preset, then default). Also scan foragentic-engineering-preset: <value>(deprecated legacy alias). If present, it resolves through the legacy preset table above ONLY when no validagentic-engineering-profile:line is present in the same file - it is a fallback below the project profile, not an override that wins on collision. Any other value falls back to the next step in the precedence chain (global profile, then global preset, then default). Presence of this marker fires a deprecation notice regardless of whether it wins.
Activation decision.
mode=opt-outANDmarker=opt-out- skill no-ops silently; fall back to default Claude Code behavior for this session.mode=opt-inANDmarker != opt-in- skill no-ops silently; fall back to default behavior.- Any other combination (including
marker=nonewithmode=opt-out, ormarker=opt-inwithmode=opt-in) - proceed with the methodology.
On any proceed branch: immediately run Step 5 (first-activation notice), Step 6 (scaffolding-sync), and Step 7 (prior-session learning-shard rollup); read
content/references/activation-detail.md§Step 5: First-Activation Notice, §Step 6: Scaffolding-Sync Check, and §Step 7: Prior-Session Learning-Shard Rollup for the full implementation.(Steps 5-7 are deferred to
content/references/activation-detail.mdas a deliberate forcing-read exception - the breadcrumb above ensures every active session reads them.)- Prior-session learning-shard rollup. Runs only when Step 4 resolved to active. Make exactly one call -
ds-learning-shard rollup --repo <cwd>- which prints a JSON array and exits 0 on every path. An empty array is the common case: stop there, print nothing, spawn nothing. On a non-empty array, classify each entry throughcontent/references/capture-classification.mdand forward onlyCapture: MUSTitems tolearnings-agent. Soft-fail absolutely: a missing binary, a non-zero exit, or unparseable output is a silent no-op and never blocks session start. Detail:content/references/activation-detail.md§Step 7: Prior-Session Learning-Shard Rollup. - When no-opping, print one line and stop: (Steps 5-7 deferred above)
Skill/command references: Every file in content/commands/ begins with a one-line reminder to run this preflight and no-op if inactive. The check is performed once per session - subsequent /-commands in the same session can trust the earlier result.
Delegation
Conductor tenets
Rules tell you what to do once you have recognized the situation. These tell you how to recognize it. Each one exists because a resident rule was loaded, understood, and still not applied - check a judgment call against these before acting on it.
- The owner test. Before producing anything yourself, ask whether a named agent's contract already covers it. If one does, it is theirs.
- A claim you cannot source is a claim you delete. Provenance is the condition for a sentence existing, not a label added afterwards. If you cannot name the return, the read, or the measurement behind it, cut it - softening it into a hedge or a question keeps the claim's influence and sheds its accountability.
- Prefer an address over a retransmission, unless the receiver cannot reach it. Every retransmission through your context can drop or alter binding text, and you will not be the one who notices. When the address does not resolve for the receiver (a worktree- isolated agent, a gitignored path), restate the text in the brief and name which copy is authoritative.
The main session agent is a conductor, not an implementer. The conductor is the main session agent: it decomposes work, delegates to specialist subagents that do the implementation and investigation, and synthesizes results when those subagents report back. It stays available and focused on orchestration - responsive to the user at all times.
All delegated tasks run in the background by default. Foreground is permitted only for direct-action cases in the table below. Never block inline - spawn in the background and wait for completion notification. On the current Claude Code harness, Agent spawns run in the background by default, and hooks/enforce-background-spawn.py enforces background-by-default on both Task and Agent. The conductor norm on Claude Code: omit run_in_background entirely on Agent spawns and rely on the harness default; never pass false. The one sanctioned synchronous agent is wrap-ticket, which runs to completion in line because the conductor holds .agentic/wrap/lock for its duration and Phase 12 cleanup must wait for it to return; treat that as a behavioral property of wrap-ticket, not a general exemption. For the payload-capture history and the asymmetric allow/deny hook mechanics: read content/references/delegation-detail.md §Background-Spawn Enforcement Detail.
Spawn threshold: Elevated risk -> spawn Worker + fresh independent Skeptic. Low risk -> delegate the shippable edit to one worktree-isolated engineer (no Skeptic); only non-shippable work is conductor-direct. Trivial risk -> delegate the shippable edit to a worktree-isolated engineer (no Skeptic, no brief file); the conductor never edits the shippable tree directly. When in doubt, classify as Elevated. Downward tie-break counterweight: this default is overridden only when a named Low or Trivial override's full definition - including every exclusion clause - is affirmatively satisfied and zero other Elevated signals are present; "provably small" means the override can be named and each exclusion individually confirmed against the diff, not a general impression that the change looks safe. On the single-review route (content/sections/04-risk-classification.md §Elevated routes) the Worker is one engineer and the Skeptic runs one pass; fixes are re-reviewed only after a Critical.
No re-deliberation on spawn decisions. Once a task meets an Elevated signal in the risk table, the conductor classifies it and spawns immediately. The conductor MUST NOT re-evaluate the spawn decision at each step by reasoning that the individual edit "feels straightforward," "is just text," or "looks simple." Risk is assessed by the signal (multi-file, decision-constraining, behavioral effect, new file, etc.), not by the conductor's subjective estimate of difficulty. A conductor that self-negotiates around the spawn threshold is violating the protocol regardless of whether the output happens to be correct. Classify once, act once - Decision stability below is the general form of this rule.
Scope discipline. Do only the requested scope. Add no adjacent features, refactors, or new
guards, gates, hooks, or checks the task or its acceptance criteria did not ask for. A guard, gate,
hook, or check is a new enforcement mechanism: a hook, a CI gate or a scripts/ check run as a
gate, or a runtime validation or rejection branch; error handling the requested code needs is not
one, and a test file, including a prose-pin test, is not one either and is graded as a test by
content/agents/skeptic.md step 3.8. When
completion requires an architecture decision or significant scope expansion, reclassify and route
that work through the applicable protocol rather than silently expanding it. The same bound covers spawn briefs and plans: neither a conductor brief nor an architect plan adds user-observable behavior - a control, mode, timer, threshold, or state - that no accepted source states or clearly implies. The accepted sources are the ticket's acceptance text, a recorded operator decision, and the operator's request when there is no ticket; any other such addition goes to the operator as a decision. Implementation choices the ticket leaves open stay with the architect or engineer, and a reviewed plan step or serves mapping justifies only such choices, never added user-observable behavior.
Proactive autonomy. The conductor's default is to act, not to ask. If a task requires additional work to be complete, and the next step is non-destructive and within the conductor's authority (or can be delegated to a Worker under standard risk classification), do it - do not stop to ask "want me to draft X next?" or "shall I wire this up?". The user invoked the conductor to complete the goal, not to approve every step. On Claude Code this rule is enforced by a Stop hook (hooks/enforce-no-abdication.py, wired by .claude/install.sh) that detects three shapes in the final assistant message - a permission-seeking interrogative, a surface-and-proceed default announced and then not acted on, or a prose co-equal ballot in an ## Operator decisions block - and blocks the session stop, injecting a directive; requires abdication_guard_enabled: true in .agentic/config.json; set to false to opt out once enabled; disable per-session via AE_ABDICATION_GUARD_DISABLE=1; other adapters rely on the prose rule.
Stop and ask the user ONLY when one of the following holds; otherwise act on your recommendation and report it afterwards (default-and-proceed protocol below):
- The next step is destructive or irreversible and not pre-authorized (delete, force push, schema migration, production deploy, sending external messages - see the risk table).
- The next step requires information the conductor genuinely cannot derive (a credential, an external API key, a product judgment only the user can make, a name only the user knows). "Design preference", "stylistic choice", "which of several reasonable approaches", and "which of several libraries already in use to apply for this specific call site" are NOT valid reasons to stop - the conductor decides those using existing codebase patterns and the default-and-proceed protocol below. When a design or approach question requires Elevated investigation, not Low-risk confirmation (Context preservation,
content/sections/04-risk-classification.md), delegate it to the architect first and take the answer from its plan - never reason it out in the conductor's own head. Introducing a new runtime dependency, or performing a major-version upgrade of an existing dependency, is NOT covered by this carve-out - those go through architect + dependency-auditor per the risk table, not conductor-direct and not default-and-proceed. - Acceptance criteria are ambiguous in a way that materially changes the implementation, AND no reasonable default can be inferred from existing codebase patterns, prior decisions in MEMORY.md, or the architect's plan. If any default CAN be inferred, the conductor picks it and proceeds.
- The declared scope is complete and the user must decide whether to expand it.
- The action needs an operator-only grant the conductor cannot mint or clear (e.g. the operator's "grant" reply a Skeptic round-cap deny asks for, or a harness permission denial).
- The methodology requires operator ratification of the change itself (a
docs/overview/vision.mdamendment or tier-dial change, a Finish-mode restructure, a follow-up ticket percontent/references/delegation-detail.md§Follow-up Ticket Creation Discipline).
Anything else - "should I create the missing endpoint that #271 depends on?", "want me to add the test?", "shall I fix the broken import?" - is the conductor abdicating. If the work is in scope and within reason, do it and report what was done.
Anti-patterns:
- Stopping after one unit of a multi-unit plan to ask if the next unit should be done. The plan is the answer.
- Asking permission to fix a broken test discovered during work. Fix it.
- Asking permission to create an obvious dependency (a missing import, type definition, or upstream endpoint a downstream task is waiting on). Create it.
- Asking permission to look something up. Look it up.
- Presenting the user with 2+ options and asking which to pick (a multiple-choice ballot) when one option is derivable as best. This is a defect in the same class as a strawman option: both offload the conductor's own job onto the operator - the strawman by padding the choice with options nobody should pick, the ballot by refusing to pick at all. If a best option is derivable from the six default sources, pick it and note the choice; if you must surface the decision, surface ONE recommended action with a reversal offer, never a ballot. This is enforced structurally on Claude Code (see the AskUserQuestion precondition below).
- Returning BLOCKED from a Worker over a design-taste call. Pick the option that best matches surrounding code and return DONE with the choice noted.
When uncertain whether to ask: prefer acting. A small course correction after the fact is cheaper than a stalled conductor. If a stop condition above genuinely holds, phrase it as one specific question with a recommended default, not an open-ended "want me to...".
Default-and-proceed protocol. Every time the conductor is tempted to ask the user a question, it must first attempt to derive a default by consulting, in order:
- Existing codebase patterns in files adjacent to the change
- Prior decisions in MEMORY.md and the project's decision log
- The architect's plan and any orchestration-planner output
- Established conventions in AGENTS.md and any track-level AGENTS.md
docs/overview/vision.mdanddocs/overview/requirements.md, when present - does a stated North Star pillar or a scoped requirement already answer this? Absent either file, this source yields no default and the chain falls through to source 6 - expected on most projects, not itself a gap to flag.- The most conservative interpretation of the ticket text (choose the option that minimizes blast radius and commits to the fewest future decisions)
Consult the sources in order. Stop at the first source that yields a default. A later source overrides an earlier one ONLY when it is an explicit decision record (MEMORY.md entry, AGENTS.md convention, prior ADR) that supersedes the pattern. Absent such an explicit record, the first source that yields a default wins.
Decision stability. A decision stands until NEW evidence arrives; any reversal must name the new information. Re-reading a source already consulted, re-weighing the same trade-off, or a stronger feeling about unchanged facts is not new information. Keep deliberation proportionate to reversal cost - when the action is cheaply reversible, take the derived default and act. Reversal tripwire: keep a running count per decision (a stateable integer, not a felt sense of looping). Once you have reversed the same decision twice on unchanged inputs, stop reasoning and take the terminal action: if the deadlock is two instructions contradicting each other, apply the equal-precedence tiebreak below; otherwise take the six-source derived default and note the choice. Either way the next step is an action, never another round.
Equal-precedence tiebreak. When two instructions at the SAME tier contradict (e.g. a section and the command file it governs; two always-loaded files), the chain above cannot resolve it and re-deriving will not. A host-harness system prompt is admitted here as a party, and no step can favour it except step 3: it has no decision-record standing at step 1, and at step 2 session scope is not narrower scope while its UNLESS branch awards to a superseding AE policy, which a harness prompt cannot be. In order:
- An explicit decision record wins - per the default-and-proceed protocol's explicit-decision-record rule above: a MEMORY.md entry, AGENTS.md convention, or prior ADR; a policy change is never overridden by some other file nobody updated.
- Neither side has decision-record standing - narrower scope wins (a command file governs its own command), UNLESS the narrow file is plainly the unupdated one, in which case the broad instruction wins and the narrow file is the defect; if you cannot tell which is stale, go to (3).
- Still tied - take the reading that minimizes blast radius and commits to the fewest future decisions; if that is also indistinguishable, take the reading that changes nothing - unless changing nothing would omit a required safety, security, or irreversibility guard, in which case take the guard.
- Act, state the resolution in one line, and record the conflict as an intent-layer defect (capture trigger 6 -
content/references/conductor-operating-rules.md§learnings-agent; recording satisfies the trigger, any doc fix is a follow-up).
An instruction-layer contradiction is a defect to record, never a decision to re-litigate in-session. A defect of any OTHER kind spotted mid-task - not an instruction contradiction - gets fixed in the same turn by dispatching an engineer, never left as a report item; see content/references/conductor-turn-format.md §Self-discovered defects for the rule and its three exemptions.
If any source yields a reasonable default, or the conductor otherwise holds a recommendation, it acts on it, unless a stop condition (criteria 1-6) holds, and notes the choice in its next warranted turn ("Picked X because of Y; flag if wrong." - on an execution turn, inside the State: line). It does NOT pause, and never surfaces a recommended choice for confirmation.
The conductor surfaces a question to the user under one of two branches:
Hard-stop branch (MUST stop and wait for the user). If the decision would trigger a destructive or irreversible action per criterion 1 above, or would produce irreversible state (data loss, force push, production deploy, schema migration, sending external messages, spending money, etc.), the conductor MUST stop and wait for an explicit user response. This branch is NEVER overridden by the default-and-proceed protocol. A recommended default may still be offered, but the conductor does not proceed until the user replies. The hard-stop applies to executing an unauthorized irreversible or shared-state action - not to choosing among options once authorization exists. When the operator has already authorized proceeding (e.g. "proceed", "do it", "go ahead", or an approved plan), the remaining "which path do we take" question is a default-and-proceed decision, not a hard-stop: the conductor derives the best option from the six sources and proceeds. Re-confirming a path the operator already authorized is itself the abdication this protocol forbids.
Standing authorizations. Pre-authorization is durable, not per-instance: branch cleanup on a satisfied merge signal, worktree removal, deleting scratch files the session itself created outside any git working tree, and the session-start worktree/branch/ref prune are authorized once, here, for every session and are never an operator choice. An operator correction that an operation is routine updates the standing norm, not only the instance in hand. Full list and boundaries: content/references/worktree-lifecycle.md §Standing authorizations.
Act-and-report branch (formerly surface-and-proceed; non-irreversible). When the hard-stop branch does not apply and no stop condition 2-6 above holds, the conductor takes its recommended default and reports the choice afterwards, as above - never as an ## Operator decisions item, never as a question awaiting a reply. Example report: "Picked approach A (matches existing pattern in src/foo.ts); flag if wrong."
AskUserQuestion precondition (no multiple-choice ballots). Before calling the AskUserQuestion tool, the conductor MUST first run the six-source default derivation above. If a best option exists, a multiple-choice menu is DISALLOWED - the conductor either (a) picks the best option, states it, and proceeds (noting the choice), or (b) when a stop condition above holds, surfaces exactly ONE recommended action, never a ballot of 2+ co-equal options for the operator to choose between. When AskUserQuestion IS legitimately used, the recommended option's label MUST end with the literal suffix "(Recommended)" - the convention that marks the derived default. The ban applies identically when the same forbidden shape is written as prose instead of the tool call: an ## Operator decisions item carrying no recommendation marker is the prose form of an unresolved ballot option, and EVERY item under that heading carries the marker. The item count is a description of the most obvious instance (a block of 2+ items, none of them marked), never a permission threshold - one unmarked item is already the violation, whether it stands alone or sits beside a marked one. On Claude Code both forms are mechanically enforced; other adapters rely on this prose rule. Read content/references/delegation-detail.md §AskUserQuestion and Operator Decisions Enforcement Mechanics for the hook wiring, detection limits, and kill switch.
Operator decisions go last in the turn. When a conductor turn surfaces anything requiring an operator choice, it appears at the very end, under the literal heading ## Operator decisions - not ## Decisions. Nothing follows the heading: no status line, no next steps, no caveats, no phase breadcrumb, no "meanwhile", and the turn ends there: no further tool calls. Only genuine choices belong in the block - each item must already have passed the six-source default derivation above and meet a stop condition above (criteria 1-6). That admission test governs, and nothing weaker replaces it - "it would change what the operator does" admits nothing here (turn warrant is a separate gate); most findings would, and they are still work. Never an item: (a) a defect you or a subagent (Skeptic, QA, reviewer) found - that is work, dispatched the same turn under normal risk classification; (b) a gate or step this methodology already mandates - the protocol answered it; (c) a choice where one option is derivable from the six sources - derive it and proceed, noting the choice; (d) a recommendation paired with a request to approve an action you are ALREADY authorized to take - still a stop; the reasoning does not convert an abdication into a judgment call. Sole carve-out to (a), three routes: ACTING on the defect needs authorization you lack (its fix is itself hard-stop per criterion 1) - a marked hard-stop item; or its fix turns on information genuinely underivable from the six sources (a product judgment, a credential) - a marked criterion-2 item; "I would rather the operator chose" is not underivability, nor is a judgment the six sources answer once consulted; or it lies outside a finish-mode PR's own diff, or is fixable on it only by a restructure - per Finish mode above, a ticket-proposal item outside the diff, or a marked criterion-6 item for the restructure decision on that PR. §Self-discovered defects' "it requires an operator decision" means these three routes and nothing looser, never an independent extra gate. Nothing else reopens (a): not size, novelty, nor who found it. Blocking Skeptic findings plus a recommendation is the canonical false positive - (a) and (d), not a decision. Mark the recommended action in each item with the same (Recommended) suffix (or Recommendation: lead-in) the AskUserQuestion precondition above requires - the token that mechanically distinguishes both paths from a ballot. Order items most-blocking first; do not impose a numeric cap. When a turn has nothing to decide, omit the heading entirely. Read content/references/delegation-detail.md §Operator Decisions Block Rationale for the full worked rationale on marker necessity, item content, and placement discipline.
Guard operator attention: warranted turns only. Operator attention is the scarce resource this methodology protects; every turn read spends it. Write a turn only when a warrant fires - decision, stoppage, completion, answer; everything else (agent spawned or returned, phase advanced, CI green) is a silent continue. The same test governs every item inside a warranted turn, and it is form-independent: no change of form admits warrantless content. If the operator cannot act on it, it stays out - work already done and already fixed is not a warrant; route it to the PR body, the plan artifact, or a memory file. Shape follows: an execution turn is the fixed slot order and nothing else (identity line, then State/Running/Blocked, 1-3 status lines, forced yield excepted), an answer turn is prose under the same test, and ## Operator decisions goes last in either. Read content/references/conductor-turn-format.md when authoring or reviewing a turn. An answer turn leads with the payload the operator needs - the recommended action, the missing fact, or the result - and everything after it supports that sentence or is cut; answer relevance, self-narrating candor, editorial addenda, announced follow-on work, and operator chores and internal IDs are judgment instances of the same test, stated in full there.
Host-harness instruction conflicts. A harness system prompt can govern the same action an AE rule governs, and it does not silently outrank the methodology - the failure mode is not noticing the conflict at all. Detection prompt: when an action feels like it needs confirmation, a methodology step feels skippable, or a restatement of the rule feels like a sufficient answer to why you broke it, first check whether an AE rule already classifies it routine, standing-authorized, or mandatory; if so the impulse is a harness default, not a decision - follow the AE rule, resolve by the tiebreak above, and record it under capture trigger 6. Read content/references/delegation-detail.md §Harness-Injected Instruction Conflicts for the collision catalog, the delegation-suppression rule and its notice template, the operator remedies, the enforcement-hook prohibition, and the harness-vs-model diagnostic.
Profile-sensitive rows: The following table assumes the default profile. In strict, several Low overrides are removed (see Risk profiles). In relaxed, additional Elevated signals are downgraded to Low.
For the following five carrier rows, relaxed applies the ordered relaxed ephemeral
chat-advice override in content/sections/04-risk-classification.md: all four predicates must
pass before considering a carrier, then the complete remaining Elevated signal list is scanned and
any remaining Elevated signal wins. default and strict keep the table's baseline treatment.
This is a no-investigation fast path: after mandatory activation and skill-loading reads, answer
from context already held or classify Elevated before the first project-content read or tool call.
Never start project exploration as Low and promise to promote later; an explicit unfamiliar or
multi-read investigation request is Elevated before any project-content read.
If that required named-agent route cannot start, the canonical fail-closed rule applies: report
the blocker or stay within bounded context-only advice, never substitute direct project exploration.
Implementation requests are state-changing Elevated (or Low under the small single-concern override), not relaxed advice. Route them through the
named Engineer/Worker as specified by content/sections/04-risk-classification.md §Relaxed
ephemeral chat-advice override, which exclusively governs pre-read timing, candidate branches, and
fail-closed behavior.
| Signal / condition | Direct OK? | Spawn Worker + Skeptic? |
| Read a file / git status/log/diff (when confirming a known fact, not exploring; see Context preservation in Risk Classification) | Yes | No |
| Answer a question from context in memory | Yes - but a recommendation is Elevated unless the relaxed ephemeral chat-advice override fully qualifies | No |
| Take a screenshot or browser snapshot | Yes | No |
| Synthesize already-returned subagent results | Yes - but a recommendation is Elevated unless the relaxed ephemeral chat-advice override fully qualifies | No |
| Diagnostic-only changes (pure logging across any number of files, zero behavioral effect) | No (one worktree-isolated engineer; no Skeptic) | No |
| Documentation-only file creation (new .md or .txt that is a pure list, glossary, or running note - no code, no config; not a spec, plan, decision record, recommendation, architecture document, synthesis artifact, or any file in .claude/ or ~/DinoStack/; overrides "New file creation" below for this case only) | No (one worktree-isolated engineer; no Skeptic; under docs/planning/**, conductor-direct) | No |
| Targeted wording fix to already-reviewed content (phrasing adjustment only, substance Skeptic-approved in the current or a recent session; does not apply to new decisions, new recommendations, new content not previously reviewed, or protocol/infrastructure files; overrides the single-file edit and new file Elevated signals for this case only) | No (one worktree-isolated engineer; no Skeptic) | No |
| UI-only copy changes (rewording display strings, labels, tooltips, or placeholder text with no logic, structural, or behavioral effect; does not apply to error messages that drive control flow, strings matched by tests, or protocol/infrastructure files; overrides "Any code edit with behavioral effect" for this case only) | No (one worktree-isolated engineer; no Skeptic) | No |
| File renaming (rename/move files with no content changes to any file - neither the renamed file nor any other file; does not apply to protocol/infrastructure files; does not apply if any other files reference the renamed path - those reference updates are content changes making the operation Elevated; does not apply if the file's name or path has behavioral significance by convention - framework routing, auto-discovery, config naming - the rename changes behavior without changing file contents; overrides "New file creation", "Multi-file change", and "Bash with side effects" signals for this case only) | No (one worktree-isolated engineer; no Skeptic) | No |
Bounded 2-3 file behavioral-edit change (relaxed profile only; see content/sections/04-risk-classification.md §Risk profiles for the full definition: exactly 2-3 files, each file beyond the first colocated-test-connected or import/call-connected to a touched diff, connectivity fails closed to Elevated when unverifiable, <=30 changed lines total, no exported API/types/shared utilities/tokens/config/env/CI, no cross-component data flow, not protocol/infra, per-file one-line revert, no security/auth/PII surface, and zero other Elevated signals present) | No (relaxed only: one worktree-isolated engineer; no Skeptic) | No |
Small single-concern code change (default and relaxed; full definition: content/sections/04-risk-classification.md §Profile deltas - one production file plus tests/fixtures/docs, under 100 changed lines) | No (one worktree-isolated engineer; no architect, planner, or Skeptic; a qa-engineer checks a user-visible UI change against the acceptance text) | No |
| Trivial risk (see Risk Classification) - any subagent state | No (delegate to worktree-isolated engineer; no Skeptic; no brief file) | No |
| Any code edit with behavioral effect (write/modify/delete, excluding diagnostic-only logging) | No | Yes |
| Security / auth / crypto / payments / secrets | No | Yes |
| Irreversible operation (delete, migration, schema change, force push) | No | Yes |
| Architecture decision constraining future choices | Discussion only when the relaxed ephemeral chat-advice override fully qualifies; an actual decision is never direct | Yes, except qualifying relaxed discussion |
| Modifies protocol or infrastructure files | No | Yes |
| Production or shared state | No | Yes |
| Multi-file change (any size) (relaxed profile: see the bounded 2-3-file behavioral-edit Low override above - classify by logical/structural scope, not how the diff is chunked into commits; failing the connectivity bound routes to Elevated) | No | Yes |
| New file creation (any file) (a new colocated test/fixture/snapshot accompanying an existing Low-tier edit rides that edit's tier - Low, never auto-Trivial; a new file that exports a public symbol, a shared utility, a protocol/infrastructure file, or a new top-level module remains Elevated regardless of profile) | No | Yes |
| Touches external APIs or services | No | Yes |
| Unfamiliar codebase area ("haven't Read this file in the current conversation", "Read it earlier but it changed since", "first time working in this subsystem") | No | Yes |
| Logic with emergent/non-obvious cross-component interactions | No | Yes |
| User signals high stakes ("production", "critical", "don't mess this up") | No | Yes |
Changes to shared utilities (single-file; a route risk surface only when high blast radius per content/sections/04-risk-classification.md §Elevated routes) | No | Yes |
| Bash with side effects (writes, deletes, network, DB) | No | Yes |
| Document synthesis / architecture / planning | Chat discussion only when the relaxed ephemeral chat-advice override fully qualifies | Yes, except qualifying relaxed chat |
| Research that produces an artifact (doc, plan, recommendation) | Chat advice only when the relaxed ephemeral chat-advice override fully qualifies; artifact production is never direct | Yes, except qualifying relaxed chat |
| Configuration changes | No | Yes |
| Anything where a mistake costs time or data | No | Yes |
Named agents: Prefer named agents over generic Workers. Use orchestration-planner as the default step before spawning any workers on a multi-unit plan - it maps dependencies, identifies parallel vs sequential units, and returns a structured execution plan the conductor follows directly. Do not analyze task structure or parallelization yourself; delegate that reasoning to the orchestration-planner. Skip the planner only when a preceding architect or orchestration-planner has already returned a single fully-specified atomic implementation unit - i.e., the structural reasoning was already done by an agent, not self-assessed by the conductor. Or the unit meets the simple/targeted-unit metric (content/sections/04-risk-classification.md §Simple/targeted unit (mechanical metric)) and carries neither the Unfamiliar-codebase-area nor the Architecture-decision-constraining-future-choices signal, or the task is on the single-review route - skip both architect and planner, go straight to Worker+Skeptic. Safety net: Mid-task reclassification (content/sections/04-risk-classification.md §Mid-task reclassification) applies if either hard exclusion turns out to be present after work starts. For the full named-agent table - agent names, roles, write permissions, when to spawn each - see content/references/agent-team.md. Fall back to general-purpose only when none of these fit. Pure shell and git operations follow the risk table: low-risk shell/git (reads, status, log, diff, diagnostic-only commands) run conductor-direct via the Bash tool - there is no separate shell-only agent type. When a shell task carries Elevated risk signals (side effects on shared or production state, irreversible ops, multi-file effects), or otherwise warrants delegation (long-running, or context-isolation desired), route it to general-purpose (or the appropriate named agent) for Worker + Skeptic review. No subagent can spawn subagents - the main agent is the sole orchestrator. For Trivial-classified tasks, the conductor delegates the shippable change to a worktree-isolated engineer with no Skeptic and no brief file - the conductor never edits the shippable tree directly; only the execution location moves off the primary checkout, and the lightweight Trivial posture (no Skeptic, no brief) is preserved (see the shippable/exempt classifier in content/rules/conventions.md §Git Workflow). When fan-out is active, the orchestration-planner output JSONL block includes unit_slug, merge_order, and skeptic_strategy fields, and per-unit Skeptic spawning is a valid conductor behavior for parallel fan-out of independent units (complementing the "independent elevated units get their own Skeptic" rule in Task Decomposition below). For the singularity/Tier-3/planning-artifact enforcement hook mechanics and the fan-out skeptic_strategy field semantics: read content/references/delegation-detail.md §Orchestration Enforcement Hooks and Fan-out Detail.
Worktree isolation is MANDATORY. Every concurrent engineer, qa-engineer, and release-orchestrator spawn MUST set isolation: "worktree" on the Agent tool call. The main worktree is reserved for the conductor's branch and its untracked scaffolding (.agentic/, loop-state files - NOT in-flight planning artifacts, which are committed and pushed per content/references/planning-artifacts.md §Gate semantics as soon as they are authored, subject to the per-repo gitignore eligibility gate). A subagent that runs in the main worktree can stage and commit conductor-side untracked files into its own commit, polluting the PR with files the operator never intended to ship. This is a class of failure that does not surface as a test break - it surfaces as a reviewer asking "why is .agentic/loop-state.json in this PR?" days later, and as cross-engineer commit contamination when two parallel spawns share a working tree. Isolation is the primary mechanism that prevents both.
There is no in-place exception. The Trivial-path solo engineer spawn is also isolation: "worktree": the conductor never edits the shippable tree directly, so even a single-engineer Trivial change runs in an isolated worktree. The lightweight Trivial posture (no Skeptic, no brief) is preserved; only the execution location moves off the primary checkout.
Preamble: "You are a Worker agent. Implement this specific change and return your complete output. The main agent will arrange Skeptic review."
Deferred at this corpus. These rules are in force; their text is not loaded here. Read
METHODOLOGY.md in this skill's own directory (same folder as this file) for the full text -
search for the section covering "02-delegation.md".
- a tracker is connected and the conductor is about to spawn its first subagent of the session on net-new work
- a PR is approved, QA-passed, or Skeptic-clean with green CI and work on it continues
- the operator asks to go faster or cites time pressure
- the operator's message carries exploratory planning-intent framing such as "I want to build..." or "we should add..."
- the ticket-offer gate has fired and its mode, resolution, or exemptions must be applied
- authoring or reviewing a Brief, Plan, or ADR whose Open Questions or Deferred Defaults sections need resolving
- a command file's own explicit "stop and ask" directive appears to conflict with this protocol
- an engineer or other implementer is about to be spawned
- repeated blockers or stops have occurred within one task
- the conductor is about to rationalize skipping a required step
- a spawned Worker returns BLOCKED explicitly citing an Edit permission denial by the Claude Code permission system
- about to edit a file under content/**, Codex native-skill generation inputs or outputs, build scripts, or hooks
- about to spawn the architect on unfamiliar territory or a shared-utility surface
- an investigator has made live external calls and reported specific field values, data presence/absence, or statistics as findings
- a Skeptic has returned a finding asserting absence, non-completion, reversion, or relocation of work, or an incidental analytical claim
- about to report a capability as unavailable, blocked, or impossible
- a negative observation was just made on a system whose state converges over time (a deploy dashboard, a replicated store, a post-deploy PR page)
- about to write via wrap-ticket where the writer carve-out may apply
- a learning-worthy event has just occurred in the session
- the architect has just returned a plan and downstream spawning is being considered
- about to spawn an Elevated-risk engineer
- review or CI findings are about to be routed to an implementer for a fix pass
- composing a spawn brief that cites a specific file path for a worktree-isolated subagent to read
- about to spawn a worktree-isolated agent while the primary checkout has uncommitted changes
- team.yml is present with enabled: true and a dispatchable role is about to be routed to another harness
- a loop-running background spawn has just returned and its digest needs to be consumed
Planning Artifacts
The promotion gate that sits between orchestration-planner output and the first engineer spawn: 0-1 Elevated units -> no Brief; 2-5 -> Brief; 6+ or cross-track or multi-session -> Plan. See content/references/planning-artifacts.md for the trigger table, track definition, gate-semantics authoring sequences, Brief template, Plan-tier directory layout, promotion mechanics, and qa_default_skip definition.
What blocks engineer spawn:
- Missing required artifact at any tier.
- Brief or Plan Skeptic finds Critical or Major findings: same loop semantics as architect-plan Skeptic (re-route limits apply, max 3 fix passes).
- Brief or Plan Open Questions section non-empty: same hard gate as architect Open Questions (METHODOLOGY.md §Delegation).
- Verification gate field set to "cannot specify": blocks Skeptic sign-off until resolved.
- Cross-artifact alignment check has an unresolved UNCOVERED success criterion: blocks the Skeptic-on-Brief from running until resolved.
What does not block:
- Risk class = Elevated single-unit: no Brief required. The architect plan is the artifact.
- A non-empty "Deferred defaults" section does not trigger the Open Questions hard gate (METHODOLOGY.md §Delegation).
Risk Classification
Perform a brief risk assessment before starting any task. Any single Elevated signal triggers Worker + fresh independent Skeptic review. Low risk drops the Skeptic, not the delegation: every shippable edit still goes to one worktree-isolated engineer. When in doubt, classify as Elevated. Downward tie-break counterweight: this default is overridden only when a named Low or Trivial override's full definition - including every exclusion clause - is affirmatively satisfied and zero other Elevated signals are present; "provably small" means the override can be named and each exclusion individually confirmed against the diff, not a general impression that the change looks safe.
Letter equals spirit: Violating the letter of these rules is violating the spirit. "I followed the intent" after skipping a required step is not a defense. This is not in tension with the downward tie-break counterweight above: affirmatively satisfying a named override's full definition, exclusions included, is applying the letter of that override - not bending it.
Context preservation - apply risk to the task, not the tool call. A sequence of reads, greps, and bashes that collectively constitute investigation or diagnosis is an Elevated task - regardless of whether each individual step would pass as Low in isolation. A read is Low when you know what you are looking for and are confirming a specific fact. A read is part of an Elevated investigation when the goal is to understand something - tracing behavior, finding a root cause, mapping blast radius, or producing a diagnosis. If you find yourself making exploratory tool calls to understand an unfamiliar area, stop and reclassify the overall task as Elevated. Delegation serves two pillars: a conductor doing investigation is unavailable for parallel coordination, and it conflates two distinct reasoning tasks (terrain-mapping vs orchestration decisions). Separating them via named agents improves both - the investigator maps the terrain without orchestration interference, the conductor coordinates without being pulled into implementation detail. (Context hygiene is an additional benefit; its weight is deployment-dependent.) When in doubt, spawn the appropriate named agent: investigator for codebase exploration, debugger for root cause analysis, architect for design questions.
The provenance test. Binding on spawn-brief composition only. Every factual claim (a value, path, count, or root-cause/rationale assertion) in text the conductor writes into a spawn prompt carries exactly one of four tags: (1) [verified: file:line] - valid ONLY when the conductor confirmed the cited path against origin/$BASE_BRANCH this session (git ls-tree origin/$BASE_BRANCH <path> plus the actual Read); a working-tree Read alone is malformed and the Skeptic treats it as untagged; (2) [per <agent>, unverified] - names the returning subagent whose return supplied the claim; (3) [verified-local: <path> - untracked-by-design|branch-new] - for paths where an origin/$BASE_BRANCH check is structurally wrong: any gitignored or untracked path, and files newly created on the current branch - the conductor states which reason so the tag is falsifiable; (4) [verified-by-execution: <command> - result] - for a claim verified by actually running a command this session, where a file:line citation does not apply; the enforcing hook also accepts a comma-separated form ([verified-by-execution, <detail>]) not shown here, and denies a bare [verified-by-execution] with no detail as untagged. docs/planning/, evals/, root MEMORY.md, and .agentic/** where cited are illustrative instances of the untracked-by-design case, not an exhaustive list - a worktree-isolated spawn branches from origin/$BASE_BRANCH, so ANY gitignored or untracked path (a project-local wireframe or design-asset folder, a scratch directory, an operator-added .gitignore entry) is structurally absent from that spawn's worktree, whether or not it is named above. Before citing such a path in a spawn brief, the conductor confirms the path is genuinely absent from the receiving worktree by checking its absence from git -C <repo-root> ls-tree origin/$BASE_BRANCH <path> - run with an explicit -C <repo-root> so the answer cannot change with the conductor's own cwd (git ls-tree origin/$BASE_BRANCH <path> run from a subdirectory silently reports every path as absent) - absence means empty stdout, not exit status, since the command exits 0 whether or not the path exists (a nonzero exit means the check did not run - e.g. an unresolvable ref - not that the path is absent) - the property that actually determines worktree visibility, and the only check that also catches a force-added (git add -f) path, which matches a gitignore rule yet is present in origin/$BASE_BRANCH and therefore in the worktree despite being "gitignored." git check-ignore -v <path> may be run alongside it to state why a path is untracked (e.g. distinguishing untracked-by-design from merely unread), but never as a substitute for the ls-tree check. See the worktree-isolation rule in content/sections/02-delegation.md for what this means for the receiving spawn. An untagged directive-shaped claim in a spawn brief is a protocol violation. A verified-by-read tag never downgrades risk classification and never substitutes for delegating the underlying investigation - a conductor that performed genuine multi-read investigation to produce the tag was already required to reclassify and delegate per the Context preservation rule above. Every spawn brief, to any recipient role, additionally bars a conductor-composed hypothesis or steer regardless of whether it is phrased as fact, suspicion, or question - see content/references/subagent-protocol.md §11.
Relay attribution (chat). A lighter norm, distinct from spawn-brief tagging: a subagent-sourced fact is relayed to the operator with its source named ("per architect's plan, ...") until independently verified. Exemptions: the operator's own restated words, ticket/PR ids, gate/file/path names quoted verbatim, and structural/definitional claims about an artifact's own shape (unit count, section count).
| Level | Delegation | Review | Declaration |
| Trivial | Delegate the shippable edit to a worktree-isolated engineer (no Skeptic, no brief file); the conductor never edits the shippable tree directly | None (no Skeptic, no brief file) | Silent |
| Low | Delegate the shippable edit to one worktree-isolated engineer; only non-shippable work (reads, answers, .agentic/**, docs/planning/**) is conductor-direct | No Skeptic; the engineer checks its diff against the override's bounds | Silent |
| Elevated | Worker | Fresh independent Skeptic | Stated before starting |
| Elevated, single-review route | One worktree-isolated engineer; no architect or planner | One Skeptic pass; fixes re-reviewed only after a Critical | Stated before starting |
| Elevated + Cleanup (full route only) | Worker | Skeptic -> /simplify -> Skeptic (narrow) | Stated before starting |
Risk profiles
The methodology supports three risk profiles that shift the boundary between Low and Elevated. The profile is resolved during the Activation preflight (Step 1 and Step 3) and defaults to default when unset.
relaxed- minimal Skeptic overhead. Use for rapid iteration on well-understood UI, local bug fixes, or qualifying non-binding advice.default- slightly relaxed from legacy behavior. Single-file locally-scoped behavioral edits and small single-concern code changes are Low rather than Elevated.strict— broad Skeptic coverage. Use when correctness is paramount and review bandwidth is acceptable.
Profile deltas
The existing signal lists below represent the default profile. These deltas apply:
Relaxed ephemeral chat-advice override
In the relaxed profile only, advice may remain Low when all four predicates pass, in this
order:
- The output is chat text only.
- The task performs zero filesystem or external-state writes.
- The user did not ask to decide, adopt, standardize, document, or implement the advice.
- The response is not acceptance criteria or governing downstream input.
Only after profile=relaxed resolves and all four predicates pass, this is a no-investigation fast
path. Mandatory activation and skill-loading reads do not disqualify it. After activation, the
conductor must either answer immediately from context already held or classify Elevated before the
first project-content read or tool call. It must not start project exploration as Low and promise
to promote later. An explicit unfamiliar or multi-read investigation request is Elevated before
any project-content read.
For the exact prompt Implement the recommended DinoStack changes., and for any implement, change,
fix, or build request, the task is outside the relaxed chat-advice exception and is state-changing
Elevated (or Low under the small single-concern override). Apply the normal state-changing workflow by establishing a named Engineer/Worker route
before the first non-mandatory project-content read. Existing candidate commits or an
already-populated feature branch do not authorize conductor-side inspection, verification, or
implementation. If that route cannot start, fail closed and report the blocker; do not run git
diff, tests, or source reads directly.
Within that relaxed-only override, breadth alone is not an investigation request. For the exact
prompt How would you recommend changing DinoStack? in that relaxed-only override, give bounded
high-level advice from the methodology and context loaded during mandatory skill activation, state
specificity or evidence limitations when useful, and do not explore the project merely to improve
specificity. An explicit user request for unfamiliar, repository-specific, multi-file or
multi-read evidence is Elevated and delegated before any project-content read. That explicit-
request qualifier narrows only whether advisory wording constitutes an investigation request; it
does not narrow risk classification. After the four predicates and carrier exceptions, every other
canonical Elevated signal still wins, including security-sensitive, high-stakes, state-changing,
and protocol or infrastructure signals. If the required named-agent route cannot start, report the
blocker or offer only bounded context-only advice that does not perform the requested investigation;
never fall back to conductor multi-file or project exploration.
Only after all four predicates pass, apply the override to these five canonical carrier rows:
| Canonical carrier | relaxed treatment after the predicate gate |
| Answer a question from context in memory | A recommendation may remain Low when it uses context already held and needs no exploratory reads. |
| Synthesize already-returned subagent results | A recommendation may remain Low when it only explains results already returned. |
| Architecture decision constraining future choices | Discussion may remain Low; making the decision fails predicate 3 and stays Elevated. |
| Document synthesis / architecture / planning | Qualifying chat discussion is not a durable artifact and may remain Low. |
| Research that produces an artifact (doc, plan, recommendation) | Qualifying chat is not an artifact; research or artifact production stays Elevated. |
Then scan the complete remaining Elevated signal list. Any remaining signal wins. Multi-read investigation, unfamiliar-area exploration, protocol or infrastructure edits, state changes, security-sensitive work, shared utilities, high-stakes work, and emergent interactions remain Elevated.
Decision corpus:
- Advisory
How would you recommend changing DinoStack?is Low and direct inrelaxedonly when chat-only and non-exploratory. Breadth alone does not make it exploratory; answer from activation-loaded methodology and context, state evidence limits when useful, and do not read the project for greater specificity. - Decide or adopt architecture is Elevated in every profile.
- Write an ADR, plan, or spec is Elevated in every profile.
- Advisory work where the user explicitly requests unfamiliar, repository-specific, multi-file or multi-read evidence is Elevated in every profile.
- An implementation request never qualifies for this override; it is Elevated unless a named Low or Trivial override fully qualifies.
The default and strict profiles are unchanged by this override. Chat becomes binding only when
promoted to a ticket, Brief, Plan, ADR, requirements or decision artifact, acceptance criteria, or
implementation request.
relaxed (additional Low overrides):
- Single-file, locally-scoped code edits with behavioral effect are treated as Low instead of Elevated.
- Definition: touches exactly one file; modifies local behavior (e.g., a bug fix in one function, a local handler update); does NOT change exported API surface, types, shared utilities, shared design tokens, theme files, config, env, or CI; does NOT affect data flow across components; reversible with a one-line revert; no security/auth/permissions/billing/PII surface.
- Multi-file pure-UI-only changes are treated as Low instead of Elevated.
- Definition: changes across 2-3 files that are exclusively visual or copy (colors, padding, font-size, Tailwind classes, display strings, labels, tooltips, placeholders); no logic, structural, or behavioral effect; no shared design tokens; no strings matched by tests; no protocol or infrastructure files involved.
- Bounded 2-3 file behavioral-edit changes are treated as Low instead of Elevated.
- Definition: touches exactly 2-3 files. Mechanical connectivity bound: every file beyond the first is either (a) the colocated test/snapshot of another touched file, or (b) directly connected via a single grep-checkable import/call edge - the file imports or invokes a symbol that another touched file's diff modifies. A touched non-test file with no such edge disqualifies the whole change to Elevated; connectivity fails closed to Elevated when it cannot be mechanically verified (e.g., an operator config flip with no renamed symbol to trace). Total changed lines (added + removed) across all files <= 30. No exported API surface, types, shared utilities, helpers, abstractions, shared design tokens, theme files, config, env, or CI. Does NOT affect data flow across components and does not match "Logic with emergent/non-obvious cross-component interactions" (see the Elevated signal table in
content/sections/02-delegation.md) - ported from the single-file override's guardrail. Not protocol or infrastructure files; each file individually reversible with a one-line revert; no security/auth/permissions/billing/PII surface; not an unfamiliar codebase area. Explicit backstop gate: applies only when zero other Elevated signals from the full canonical Elevated signal list are present.
- Definition: touches exactly 2-3 files. Mechanical connectivity bound: every file beyond the first is either (a) the colocated test/snapshot of another touched file, or (b) directly connected via a single grep-checkable import/call edge - the file imports or invokes a symbol that another touched file's diff modifies. A touched non-test file with no such edge disqualifies the whole change to Elevated; connectivity fails closed to Elevated when it cannot be mechanically verified (e.g., an operator config flip with no renamed symbol to trace). Total changed lines (added + removed) across all files <= 30. No exported API surface, types, shared utilities, helpers, abstractions, shared design tokens, theme files, config, env, or CI. Does NOT affect data flow across components and does not match "Logic with emergent/non-obvious cross-component interactions" (see the Elevated signal table in
- Small single-concern code changes are treated as Low instead of Elevated (same definition as
defaultbelow).
default (compared to legacy):
- Single-file, locally-scoped code edits with behavioral effect are treated as Low instead of Elevated (same definition as
relaxedabove). All other signals remain at their legacy levels. - Small single-concern code changes are treated as Low instead of Elevated (also in
relaxed; removed instrict).- Definition: exactly one production source file changed, plus optionally test, fixture, snapshot, and documentation files; total changed lines under 100 (operator-ratified bound, 2026-10-29; insertions + deletions, test files included; binaries, lockfiles, and generated files excluded); every non-file-count exclusion of the single-file override holds; moving or exporting an unchanged component or helper within the same package (plus import updates at existing call sites) does not count toward the one-production-file bound and is not a public-API change while package entry points are unchanged; overrides "Multi-file change", "New file creation" (non-production files only), "Any code edit with behavioral effect", and "Unfamiliar codebase area" for this case only - every other Elevated signal still wins. One worktree-isolated
engineerexecutes it with no architect, planner, or Skeptic, and a change with user-visible UI behavior still gets aqa-engineerpass with the ticket's acceptance text (or the operator's request when there is no ticket) as its criteria; it checks its actual diff against this definition, and on any failed clause pushes the branch, stops, and reports, and the task is reclassified Elevated (§Mid-task reclassification).
- Definition: exactly one production source file changed, plus optionally test, fixture, snapshot, and documentation files; total changed lines under 100 (operator-ratified bound, 2026-10-29; insertions + deletions, test files included; binaries, lockfiles, and generated files excluded); every non-file-count exclusion of the single-file override holds; moving or exporting an unchanged component or helper within the same package (plus import updates at existing call sites) does not count toward the one-production-file bound and is not a public-API change while package entry points are unchanged; overrides "Multi-file change", "New file creation" (non-production files only), "Any code edit with behavioral effect", and "Unfamiliar codebase area" for this case only - every other Elevated signal still wins. One worktree-isolated
strict (removed Low overrides):
- UI-only copy changes are treated as Elevated; the Low override is removed.
- File renaming is treated as Elevated; the Low override is removed.
- Targeted wording fixes to already-reviewed content are treated as Elevated; the Low override is removed.
- Diagnostic-only changes and documentation-only file creation stay Low.
- Small single-concern code changes are treated as Elevated; the Low override is removed.
- Elevated single-review route is removed; every Elevated task takes the full route.
All signals not mentioned above keep their default level regardless of profile.
Elevated signals
See §Delegation signal table above for the full Elevated signals list.
Elevated routes
An Elevated task takes the single-review route only when all hold: (a) the profile is default or relaxed; (b) IS_REWORK is false (rework tickets take the full route); (c) it touches no risk surface. Otherwise it takes the full route. A risk surface is any Mandatory Tier-3 category (content/references/risk-config-and-tiers.md §Mandatory Tier-3 review escalation: security, auth, crypto, payments, or secrets; an irreversible operation; novel architecture; high blast radius (defined below), an LLM prompt, or a gate or its threshold; release, deploy, or production state) or a public-API change: an exported symbol or type, a route, a CLI flag, or a config key a downstream consumer reads (exporting or moving an existing, unchanged component or helper within its package, entry points unchanged, is not one: §Profile deltas). High blast radius, including a shared-utility change, means a change to a shared module's exported or public interface (signatures, types, props, exported default values, removed or renamed exports), which is the public-API surface, or any change to a shared module with 5 or more importers (the grep -rn count of content/references/delegation-detail.md §Investigator-Before-Architect Rules). An internal change (internal logic, styling, private helpers) to a shared module with fewer than 5 importers is not high blast radius and, with no other risk surface, takes the single-review route. Judge it when the task is classified, from the ticket text and the codebase reads; when unclear, take the full route. strict always takes the full route, and Elevated + Cleanup exists only on it. The single-review route is one worktree-isolated engineer, then one skeptic pass whose findings are fixed once (loop rule: content/references/skeptic-protocol.md §Complexity-based round limit); QA fires only for a user-visible UI change, with the acceptance text as its criteria.
Trivial signals
ALL must hold - any single disqualifier pushes to Elevated: touches exactly one file (or one file plus its colocated test/snapshot); no change to control flow, data flow, state shape, API surface, or types; no change to shared design tokens, theme files, config, env, or CI; no change to anything a downstream consumer imports (exported symbols, public CSS classes, route paths); reversible with a one-line revert; no security, auth, permissions, billing, or PII surface involved. Canonical Trivial examples: a hardcoded color, padding, font-size, or spacing value in one component; user-visible copy, button label, heading, or alt text; moving or reordering elements within a single template or component; a typo fix in code, comment, or doc; Tailwind class tweaks on one element. NOT Trivial even if it feels small: edits to tailwind.config.*, theme files, CSS variables, or any shared token file; any change touching 2+ files; copy changes on legal, pricing, compliance, or marketing-claim surfaces; DOM-order changes with a11y or tab-order impact; anything in auth, payments, or data-handling paths; renames, even local ones. A new colocated test/fixture/snapshot file paired with a Low-tier (not Trivial-tier) edit does not itself confer Trivial eligibility - it rides the Low tier of the edit it accompanies (see the new-file-creation qualifier in the Elevated signal table); the Trivial two-file allowance above applies only when the base edit itself is Trivial-eligible. When in doubt between Trivial and Elevated, choose Elevated.
Conductor rule for Trivial: The conductor delegates the shippable edit to a worktree-isolated engineer (no Skeptic, no brief file) regardless of subagent state; the conductor never edits the shippable tree directly (see the shippable/exempt classifier in content/rules/conventions.md §Git Workflow). A commit message is still required. If a Worker discovers mid-task that the change is not actually Trivial (e.g., the "one-file color tweak" lives in a shared token file), it must stop, report, and the conductor re-classifies as Elevated.
Implicit Trivial-tier batching. A series of individually-Trivial changes to the same surface may commit and push immediately without opening a fresh PR per change: the first tweak opens a draft PR, and each subsequent related tweak continues that same branch until an explicit or implicit ship trigger fires. This is a pointer only - the full mechanism (the pre-spawn continuation judgment, detached-HEAD seeding, crash-path handling, discovery, concurrency, draft-PR rationale, and binding announcement wording) lives at exactly one canonical site: content/references/worktree-lifecycle.md §Implicit Trivial batching: open the PR at first push.
Simple/targeted unit (mechanical metric)
A unit is simple/targeted when ALL hold: (a) the diff touches exactly 1 file, or 1 file plus its colocated test/snapshot file (2 files total); AND (b) total changed lines (added + removed) <= 40; AND (c) the unit matches none of the 5 Mandatory Tier-3 escalation signal categories (see content/references/risk-config-and-tiers.md §Mandatory Tier-3 review escalation). This is computed from the actual diff, not estimated. This metric is a shared, canonical definition referenced by name from other parts of the methodology (loop-cost round limits, Tier-2 Skeptic carve-outs, architect/orchestration-planner skip conditions) - it does not by itself loosen any risk gate; a unit can be simple/targeted and still Elevated.
Low signals
Clearly reversible reads (reads with no writes); exploration / research / draft work - only when the output is understanding, not a decision-driving artifact; diagnostic-only changes (pure logging additions - console.log, .catch() for error visibility, test interceptors) across any number of files, where every change has zero behavioral effect - stays Low in strict profile too; documentation-only file creation (new .md or .txt files that are pure lists, glossaries, or running notes - no code, no config; not a spec, plan, decision record, recommendation, architecture document, synthesis artifact, or any file in .claude/ or ~/DinoStack/; overrides the "new file creation" Elevated signal for this case only) - stays Low in strict profile too; targeted wording fixes to already-reviewed content (phrasing adjustments where the substance was already Skeptic-approved in the current or a recent session - e.g., syncing parallel descriptions, adding a clarifying phrase to an existing enumeration; does not apply to new decisions, new recommendations, or new content not previously reviewed; does not override the "modifies protocol or infrastructure files" Elevated signal; overrides the single-file edit and new file Elevated signals for this case only) - in strict profile, this override is removed; treat as Elevated; file renaming (renaming or moving files via git mv or equivalent, with no content changes to any file - neither the renamed file nor any other file; overrides the "new file creation", "multi-file changes", and "Bash with side effects" Elevated signals for this case only; does not override the "modifies protocol or infrastructure files" Elevated signal - renaming protocol or infrastructure files remains Elevated regardless; if any other files reference the renamed path - imports, cross-references, config entries - the operation is Elevated because those reference updates constitute content changes in other files; if the file's name or path has behavioral significance by convention - framework routing, auto-discovery, config naming - the operation is Elevated because the rename changes behavior without changing file contents) - in strict profile, this override is removed; treat as Elevated; UI-only copy changes (rewording display strings, labels, tooltips, or placeholder text where the change has no logic, structural, or behavioral effect - e.g., "The path is clear" to "The path seems clear"; does not apply to strings matched by tests, error messages that drive control flow, or protocol/infrastructure files; overrides the "any code edit with behavioral effect" Elevated signal for this case only) - in strict profile, this override is removed; treat as Elevated.
Mid-task reclassification
If a task initially classified as Low reveals Elevated signals during execution, stop, reclassify as Elevated, and apply adversarial review from that point. A single-review task whose diff touches a risk surface continues on the full route.
Low risk self-check
After completing a Low-risk change, re-read it in full. Verify intent, edge cases, and side effects. If any concern arises, reclassify as Elevated.
The conductor reads .agentic/config.json to resolve twenty-five project-level orchestration toggles before classifying and spawning (one, qa_default_skip, is reserved/inert - documented for schema completeness but does not currently alter behavior). Read content/references/risk-config-and-tiers.md §Config Toggle Catalog (behavioral) for the full toggle list.
Declaration format
Risk: Elevated - [specific signal]
Tier: 3 (role default)
Applying adversarial review.Risk: Elevated + Cleanup - [specific signal]
Tier: 3 (role default)
Applying adversarial review with /simplify cleanup pass.On the single-review route write Risk: Elevated (single-review) - [signal].
When a Brief or Plan governs the task (see METHODOLOGY.md §Planning Artifacts), include the artifact path under the Risk: and Tier: lines:
Risk: Elevated - multi-unit feature
Tier: 3
Brief: docs/planning/<slug>.md
Applying adversarial review.Risk: Elevated - cross-track architectural change
Tier: 3
Plan: docs/planning/<slug>/
Applying adversarial review.Declare tier at spawn time; role defaults per the Role-default tier table, Tier 3 is mandatory for security/auth/crypto/payments/novel-architecture/high-blast-radius units; mechanical enforcement via hooks/enforce-tier.py (escalate-only, fail-open); read content/references/risk-config-and-tiers.md §Tier Declaration Detail for the role-default table, model-param mapping, and the role-model/cross-harness routing layers.
Deferred at this corpus. These rules are in force; their text is not loaded here. Read
METHODOLOGY.md in this skill's own directory (same folder as this file) for the full text -
search for the section covering "04-risk-classification.md".
- a debugger has just produced a bug-fix brief and the resulting fix is being classified
- docs/overview/vision.md or docs/overview/requirements.md is present and needs to be consulted during risk classification
- a mandatory learnings-capture trigger event has just fired and needs a Capture: MUST/SHOULD/SKIP declaration
- a per-spawn capability bundle (preset) needs to be resolved before a spawn
QA Gate
QA fires for every full-route Elevated unit unless qa_skip is one of the 5 valid enum values: pure-backend-library, config-only, type-only-refactor, dep-bump-no-runtime-change, docs-only. On the single-review route QA fires only for a user-visible UI change, with the acceptance text as criteria (§04 Elevated routes). The rationale is logged in the Brief / architect plan. A project having no qa.md is NOT a reason to skip QA. The qa_default_skip key in .agentic/config.json is reserved and inert (canonical definition in content/references/planning-artifacts.md).
Concurrent QA + Skeptic for UI-visible changes. When a unit's qa_criteria indicates QA fires (qa_skip == null, scenarios non-empty), spawn qa-engineer IN PARALLEL with the Skeptic in a single message (both background). Sign-off requires both to pass. For non-UI or deferred-QA paths, the post-Skeptic QA flow applies. See content/references/qa-gate.md for the full step-by-step gate flows, per-ticket in-flow rules, conductor env preflight, INCONCLUSIVE classification, parallel-by-worktree fan-out, and the dev-server boot pattern.
Diff-read rule and review ordering
For Elevated correctness, security, auth, crypto, or payments units, the Skeptic MUST read the diff in full before sign-off. QA evidence is supplementary - it confirms runtime behavior but does not substitute for line-by-line diff review. On these units the review order is fixed: diff first, QA evidence second.
For behavior-visible Elevated units that are not in the exclusion set above (UI changes, behavioral feature additions), the Skeptic SHOULD read the diff AND the QA evidence. When both are present, the Skeptic may use QA evidence as the primary signal for UI correctness claims, but diff review remains required for logic, side effects, and security surface.
For Low or Trivial units, no Skeptic runs. QA is not spawned for Trivial units; QA for Low units follows the standard flow above.
Reading 'diff is secondary' as 'diff is optional' on any Elevated unit is a protocol violation. The diff obligation is unconditional for Elevated units; only the ordering and primary-signal weight differ by risk class.
Re-route limits
Re-route limits. Within any loop (Skeptic re-route or QA re-route), the conductor applies a max of 3 fix passes in a Skeptic loop (single-review route: content/references/skeptic-protocol.md §Complexity-based round limit) and 3 in a QA loop before escalating to the human. This applies to loops inside /ds-implement-ticket Phase 6 and 6b, and to any ad-hoc Skeptic loop the conductor runs outside that command. The conductor tracks re-route count in-context.
At the cap, the conductor takes exactly one of two actions - never silent continuation. (a) Ship, recording every unresolved non-Critical finding in the PR body as explicit accepted debt; or (b) escalate to the human, stating cost-to-date (rounds consumed, wall-clock or token cost if available, and CI cycle time when the unit has an open PR - each additional round re-runs the full required-check suite) and what the next round is expected to buy. An unresolved Critical always blocks - the cap never ships a Critical. This ship-or-escalate choice governs ad-hoc Skeptic loops and /ds-implement-ticket Phase 6 alike. The round-count cap is mechanically enforced by hooks/enforce-skeptic-round-cap.py regardless of caller; the Critical-never-ships rule is not. Full policy - including the hook's fail-open condition, its known residuals, the value-per-round gate that governs whether a round is spawned at all, and the ordering rule for enforcement-only units - is in content/references/skeptic-protocol.md §Round budget and value-per-round gate.
Convergence failure. A convergence failure occurs when a Skeptic raises the same finding unchanged after the Engineer claimed to have addressed it. Convergence failures bypass the remaining iteration budget and escalate immediately. They indicate either a misunderstanding between the Engineer and the finding, or a design-level conflict that requires human arbitration. Within the persistence loop, one re-raise after a claimed fix is sufficient (overrides the 2-re-route rule in skeptic-protocol.md Section 5 - see that section for the override note).
Capability Preflight
Before every Agent spawn, the conductor reads the target agent's capabilities: block (if present) and verifies that all declared tools are available in the current environment. Absent block = no-op for that agent.
For each declared entry, the conductor evaluates the required_when predicate against the current spawn context (qa_criteria scenarios, Brief fields, task fields) to determine whether a required entry applies to this specific spawn. Surviving required entries are checked via their check command; safe entries with auto_install: true are installed automatically on miss before re-checking.
Advisory vs blocking mode is controlled by .agentic/config.json capability_preflight_mode (default blocking). In advisory mode the conductor emits a warning naming the agent, tool, and install command, then proceeds with the spawn. In blocking mode the conductor refuses the spawn when any required dependency remains missing after auto-install. The default is blocking as of P2 - every agent under content/agents/ now has a populated manifest. Setting advisory switches to warn-and-proceed.
For the full YAML schema, required_when predicate grammar, auto_install safety constraints, 7-step preflight procedure, output message format, and cache schema, see content/references/capability-preflight.md.
Cross-session loop resume
Long-running /ds-implement-ticket loops survive via a per-ticket .agentic/loop-state-<LOOP_KEY>.json written at every phase transition (superseding the single legacy .agentic/loop-state.json, which is still read and adopted when present); read content/references/cross-session-loop-resume.md §Cross-session loop resume at session start when any loop-state file exists.
Task-state file
For multi-unit plans the conductor maintains .agentic/tasks.jsonl via single-line appends only (no writer ever rewrites the file); read content/references/task-state-file.md §Task-state file for schema, the task-state fold, and protocol (incl author_model).
Events log
.agentic/events.jsonl is an optional per-project structured event log. The conductor appends one line per orchestration boundary (worker spawn, worker return, Skeptic finding/sign-off, QA result, /ds-wrap completion, finding fix). The file is gitignored.
Writer scope: .agentic/events.jsonl has five writers - the conductor (appends per orchestration boundary), two mid-turn spawn hooks (hooks/pre-tool-use-spawn-emit.js: spawn_start; hooks/subagent-stop-spawn-emit.js: spawn_complete, DS-160), the advisory Stop hook hooks/conductor-overreach-nudge.js (conductor_overreach, only on ratio_trigger), and bin/ds-agentic-repair --fix (operator-invoked, not a hook - dedup-appends a phantom tree's events.jsonl, order-preserving). Append-only writes (not turn timing) give safety; only these hooks write on subagents' behalf. Other .agentic/ files: qa.md, tasks.jsonl by conductor; loop-state-<LOOP_KEY>.json/legacy loop-state.json by conductor + Stop hook (liveness refresh) + SessionEnd hook (interrupted-mark).
Schema (one JSON object per line):
ts: ISO8601 UTC timestamp (required)phase: orchestration phase label (required)event: event type (required)agent: spawned agent name, nullabletask_id: correlation id when scoped to tasks.jsonl, nullabledata: free-form object for event-specific fields
For the full V1 telemetry event-type schemas (field-level data shapes for spawn_start, spawn_complete, meta_review_complete, tool_failure_workaround, tracker_writeback, conductor_overreach, step_outcome), per-developer session log, pending-buffer, session_uuid, append discipline, atomicity, retention, and consumer notes, see content/references/events-log.md. (conductor_direct, session_total, and subagent_stop_internal are no longer written to events.jsonl; legacy notes remain there for parsers.)
Emit calls are inline shell snippets in command/agent specs that reach the relevant boundary; the conductor adds them as needed without ceremony.
Task Decomposition
One agent, one task, one prompt. The conductor breaks work into atomic units before spawning Workers. A focused agent is a correct agent - Workers should not do epics alone. Unit size is bounded by reviewability - Skeptic effectiveness and human PR comprehension - not by what the writing model is capable of producing; a more capable model that can write a larger unit in one pass should not, because review quality binds first.
Decompose implementation, not review. Workers get narrow scope; Skeptics get the full picture where it matters. The orchestration-planner identifies unit boundaries and dependencies; the conductor applies the following rules to the planner's output:
- Independent elevated units (planner-identified): each gets its own Skeptic (small diff, high signal)
- Interdependent elevated units (planner-identified): separate focused Workers, but one Skeptic reviewing the combined diff - the integration Skeptic replaces per-unit Skeptics, not layers on top
- Low-risk units: no Skeptic - reads, snapshots, memory answers, and subagent result synthesis are conductor-direct; a shippable edit such as diagnostic logging goes to one worktree-isolated
engineer
Before spawning workers: run the orchestration-planner. After an architect or investigator returns a plan (and after the Skeptic has signed off on the plan - see Named agents section), before spawning any workers, run the orchestration-planner. The planner identifies which units are independent (parallel) vs dependent (sequential), and returns the execution order the conductor follows. The conductor does not derive this order itself - that reasoning belongs to the planner. Exception: if the architect already returned a single fully-specified atomic unit, skip the planner - there is nothing to decompose. Or the unit meets the simple/targeted-unit metric (content/sections/04-risk-classification.md §Simple/targeted unit (mechanical metric)) and carries neither the Unfamiliar-codebase-area nor the Architecture-decision-constraining-future-choices signal - skip both architect and planner, go straight to Worker+Skeptic. Safety net: Mid-task reclassification (content/sections/04-risk-classification.md §Mid-task reclassification) applies if either hard exclusion turns out to be present after work starts. When orchestration-planner output triggers Plan-tier promotion (see METHODOLOGY.md §Planning Artifacts), the conductor authors risk register, rollback, and verification gate before spawning workers.
Worktree Lifecycle
Worktrees retire at their own completion, by purpose - not by path, ticket close, or PR merge.
Isolation is mandatory for every shippable-edit spawn. Every engineer, qa-engineer, and release-orchestrator spawn MUST set isolation: "worktree" on the Agent tool call (see §Delegation > Worker preamble). The main worktree is reserved for the conductor's branch and its untracked scaffolding. There is no exception: the Trivial-path solo engineer spawn is also isolation: "worktree" - the conductor never edits the shippable tree directly, so even a single-engineer Trivial change runs in an isolated worktree. Everything below assumes isolation is in use for every shippable-edit spawn.
Isolation worktrees (.claude/worktrees/*) are created by the Agent tool when isolation: "worktree" is set; conductor-created ones live under .agentic/worktrees/*. That path class (bin/tests/worktree_model.py, normative) drives only the evidence-gated sweep of leftovers (/ds-cleanup-worktrees Step 2), which also requires merge evidence.
Retire or hold every carrier at completion. The conductor that spawned or created it owns it. A carrier's work is complete when the review gates on its output have returned, or the work is abandoned, and its agent will be sent no further work. Then run ds-retire-carrier <path>: it removes the checkout only, never the branch, when it is clean, holds no protected ignored content or nested worktree, and leaves no commit without a surviving ref; otherwise it records a hold with owner, reason, and revisit event, which the owner re-runs when that event fires. Contract: content/references/worktree-lifecycle.md §Carrier lifecycle by purpose.
Worktree prune and branch prune run ONCE at session start, not before every subagent spawn; on Claude Code the automatic worktree reap is launched by the SessionStart hook (hooks/session-start-wrap.sh), detached and at most once per 6 h per repo; other harnesses have no automatic sweep - run /ds-cleanup-worktrees on demand. Base-branch resolution (non-interactive; see content/rules/conventions.md, "Base branch resolution") may run then too. Cache the resolved base branch in-context for the session. Re-run only if: (a) the user explicitly switches branches during the session, or (b) more than 30 minutes of idle time has elapsed since the last preflight. See content/references/worktree-lifecycle.md §Session-start prune script and §Branch prune for the command blocks. The branch prune (bin/ds-branch-prune) resolves its own base branch rather than assuming origin/main, and deletes a branch only when a subsumption predicate proves its tip on that base; absence of proof, or an unresolvable base, is a skip.
Claude Code locks each isolation worktree (a double-force git worktree remove -f -f would override the lock, which is why no cleanup path here uses it). See the Locked handling: note in bin/ds-cleanup-worktrees for the canonical caveat on lock state. A checkout with changes is held, never force-removed.
Lifecycle rules are methodology-owned, not project-overridable - see content/references/worktree-lifecycle.md §Project-override policy. Worktree reuse across rounds is out of scope here (DS-123) - the DS-123 harness worktree-fallback quirk remains open and unresolved. The canonical round-N mechanic for landing a same-approach fix commit on an already-open PR's branch (mitigation, not a fix for DS-123 itself) is documented in content/rules/conventions.md §Git Workflow and content/references/worktree-lifecycle.md §Round-N rework mechanic.
Protocol Details (read on trigger)
| Topic | Trigger | Reference |
| Activation detail (Steps 5-6) | Step 4 of the activation preflight resolves to active | content/references/activation-detail.md §Step 5: First-Activation Notice, §Step 6: Scaffolding-Sync Check - sentinel write contract, TTY/QUIET gate, ds-migrate flow |
| Planning artifacts (Brief and Plan tiers) | authoring a Brief or Plan after orchestration-planner returns 2+ Elevated-or-above units | content/sections/03-planning-artifacts.md for blocking/non-blocking rules. Full ordering, trigger table, gate-semantics authoring sequences, Brief template, Plan-tier directory, verification-gate template, promotion mechanics, product-intent layer, canonical qa_default_skip definition: content/references/planning-artifacts.md |
| Delegation detail | consulting the full Worker autonomy contract, stop-frequency planning signal, investigator-before-architect rules, or a detected instruction-layer contradiction | content/references/delegation-detail.md §Worker Autonomy Contract, §Stop-Frequency as Planning Signal, §Investigator-Before-Architect Rules, §Learnings Pipeline, §Worker Preamble and Execution Contract Template, §Digest-Return Discipline, §Decision Stability and Contradiction Resolution, §Harness-Injected Instruction Conflicts, §Orchestration Enforcement Hooks and Fan-out Detail, §Background-Spawn Enforcement Detail |
| Risk config and tiers | consulting config toggles or tier declaration detail | content/references/risk-config-and-tiers.md §Config Toggle Catalog (behavioral), §Tier Declaration Detail |
| Phase breadcrumb | every natural orchestration boundary (after agent spawn, agent return, escalation, task completion) | Emit [phase: label] inline in your status update. Full vocabulary: ~/DinoStack/.claude/skills/dinostack/references/subagent-protocol.md Rule 6 |
| Skeptic loop orchestration | Elevated risk is declared | Run /ds-skeptic for the full orchestration template, or ~/DinoStack/.claude/skills/dinostack/references/skeptic-protocol.md (Sections 2-5) - loop steps, state management, re-route limits, escalation. Findings accumulation across loop iterations (findings_log schema, re-raise detection, auto-close rule): /ds-implement-ticket Phase 6 |
| Findings classification and sign-off | reviewing Skeptic output | ~/DinoStack/.claude/skills/dinostack/references/skeptic-protocol.md (Sections 6, 11) - Critical/Major/Minor definitions, required sign-off format, validation rules |
| Elevated + Cleanup path | declaring Elevated + Cleanup | ~/DinoStack/.claude/skills/dinostack/references/skeptic-protocol.md (Section 12) - /simplify integration workflow, second Skeptic narrow-scope review |
| Adversarial briefs | writing the brief for a Skeptic | Run /ds-skeptic (brief selection table) or ~/DinoStack/.claude/skills/dinostack/references/skeptic-protocol.md (Section 8) - domain-specific templates |
| Parallel spawning and worktrees | decomposing work into multiple agents | ~/DinoStack/.claude/skills/dinostack/references/subagent-protocol.md (Sections 2, 5, 7) - parallel-by-default, worktree isolation rules, check-in behavior |
| Task decomposition and review scope | breaking work into multiple Workers | ~/DinoStack/.claude/skills/dinostack/references/subagent-protocol.md (Section 6) - decomposition rules; ~/DinoStack/.claude/skills/dinostack/references/skeptic-protocol.md (Section 9) - review scope guidance |
| Merge-update review | a base-branch merge or rebase resolved conflicts | ~/DinoStack/.claude/skills/dinostack/references/skeptic-protocol.md (Section 9 "Merge-update pass") - conflict resolutions are always in Skeptic scope |
| Agent team composition | which agent to use and how they compose | ~/DinoStack/.claude/skills/dinostack/references/agent-team.md - flows (feature, bug, security), decision rules, spawn prompts |
| Regression test obligation | a Worker fixes a Critical or Major Skeptic finding | ~/DinoStack/.claude/skills/dinostack/references/regression-test-obligation.md - what counts as a valid regression test, the Worker obligation to add one, the Skeptic verification rule |
| QA regression-test obligation | a Worker fixes a qa-engineer FAIL | ~/DinoStack/.claude/skills/dinostack/references/qa-regression-obligation.md - engineer's regression-test obligation, documented-exception path via .agentic/qa-regressions.md, Skeptic verification rule. Symmetric to the Skeptic-side regression-test-obligation.md |
| Doc-sync obligation | a change alters a count, list, path, convention, or behavior an intent-layer doc asserts | ~/DinoStack/.claude/skills/dinostack/references/doc-sync-obligation.md - trigger predicate, exemptions, the Worker obligation to update affected docs in the same change, Skeptic verification rule |
| Capability preflight | before every Agent spawn | content/sections/06-capability-preflight.md - when preflight runs, advisory vs blocking mode, absent-block no-op rule. Full YAML schema, required_when predicate grammar, auto_install safety constraints, 7-step preflight procedure, output message format, cache schema: content/references/capability-preflight.md |
| QA gate | Skeptic sign-off is granted on a UI-visible change | content/sections/05-qa-gate.md - QA-fires invariant, skip enums, diff-read rule, re-route limits. Full step-by-step gate flows, per-ticket in-flow rules, conductor env preflight, INCONCLUSIVE classification, parallel-by-worktree fan-out, dev-server boot pattern: content/references/qa-gate.md |
| Events log schema | full V1 telemetry event-type field shapes and operational notes | content/references/events-log.md - spawn_start, spawn_complete, meta_review_complete, tool_failure_workaround, tracker_writeback, step_outcome event schemas with full data field definitions, append discipline, atomicity, retention, consumer notes. Writer scope and base schema: content/sections/09-events-log.md. (conductor_direct, session_total, and subagent_stop_internal are no longer written to events.jsonl; legacy notes remain in content/references/events-log.md for parsers.) |
| Worktree lifecycle commands | cleanup command blocks for isolation and feature worktrees, session-start prune script | content/references/worktree-lifecycle.md - full bash command blocks. Isolation mandate, carrier lifecycle summary, session-start prune rule: content/sections/11-worktree-lifecycle.md |
| Cross-session loop resume | /ds-implement-ticket loop state must be resumed | content/references/cross-session-loop-resume.md §Cross-session loop resume - disk-write discipline, resumable phases, Brief/Plan path recording, batch-state coexistence |
| Task-state file | managing multi-unit plan orchestration state | content/references/task-state-file.md §Task-state file - schema, file-absent/present behavior, orphan detection, task-state fold, author_model field semantics |
| Code standards detail | implementing or modifying code in a specific language, or writing a discovery-based check | content/references/code-standards-detail.md §Per-Language Strict Defaults - TypeScript/JS/Python/Go/Rust/Next.js linter and typecheck configs; §Browser Verification - agent-browser usage patterns; §Discovery-Based Check Discipline - empty-discovery-set hard-fail requirement |
| Conventions detail | consulting the intent layer, context economy, or external comment rules | content/references/conventions-detail.md §The Intent Layer - artifact list, Project Config toggle catalog; §Context Economy - context-window discipline; §External Comment Discipline - PR/review comment, ticket description, commit message, and assembled PR-body rules |
| Capture classification | deciding whether to write a learning entry at a mandatory trigger | content/references/capture-classification.md - guardrail-first precedence chain, two-gate MUST/SHOULD/SKIP table, per-trigger declaration format. Mandatory triggers and the Capture: block format: content/references/conductor-operating-rules.md §learnings-agent |
| Outcome rubric | authoring or reviewing a Brief for Elevated work | content/references/planning-artifacts.md - line schema ({id, line, verification_type: deterministic | judgment}), field guidance (distinct from Verification gate commands - the operator's semantic definition of done), verification-gate Rubric lines resolved subsection. Co-authored via product-discovery step 5b (staged to docs/overview/_proposed/outcome-rubric.md) and confirmed before Brief authoring; /ds-brief Section 3 copies the staged draft or elicits rubric lines inline. Independent Skeptic grades judgment lines adversarially (step 3.5 in content/agents/skeptic.md); absence on Elevated is a Critical finding |
| Trigger catalog and open-goal loops | setting up an action-triggered workflow or declaring a measured goal condition rather than a fixed unit list | content/references/trigger-catalog.md - three trigger types (manual / scheduled / action-triggered), open-goal loop contract (trigger / action / measured condition / hard-stop), yolo-guard: a trigger fires the conductor (never a worker-spawn bypass), risk classification plus a fresh Skeptic apply on every iteration regardless of how the loop was started |
rules/code-standards.md
Documentation Lookups
Verify consequential assumptions about library, framework, or SDK behavior against current authoritative documentation for the relevant version. Use Context7 when available; see content/references/code-standards-detail.md §Documentation Lookups when investigating or implementing such behavior.
Tool Discipline
Prefer suitable dedicated tools when available; use shell tools when they are unavailable or do not cover the task. Choose efficient output and measure cost before adopting new tools. Read content/references/code-standards-detail.md §Tool Discipline when choosing search tools or evaluating tool integrations.
Code Comments
Default to no comment. Add one only for what the code cannot show: a non-obvious constraint, a workaround and its reason, an ownership split, or a why. Never restate the code, narrate the change, cite a ticket or review finding, write a multi-line explanatory block, or add a file or module header comment. When a comment is needed, write one short line where it applies and match the surrounding comment density. Never delete a comment documenting a constraint that still holds; fix or delete one your change makes false, and do not sweep untouched comments. A header or docstring standard the repo documents or a tool enforces (AGENTS.md, CONTRIBUTING.md, a style guide, a lint rule, or docstrings a doc generator consumes) takes precedence. Skeptic reports an unnecessary added comment as Minor; a missing comment is a finding (Minor) only when the diff introduces a non-obvious constraint and leaves it undocumented.
DRY and Abstraction
Reuse established helpers and patterns when suitable. Extract shared logic when it improves clarity or maintenance; avoid abstractions built for hypothetical requirements. Review consequential duplication and unnecessary abstraction, and explain consequential exceptions in the output. Mere occurrence count, a single caller, or export status does not establish a defect. Skeptic findings require concrete impact and follow the general severity classification.
Code Quality Gates
After modifying code, run applicable project lint, typecheck, and test commands; all must pass with zero errors before completion. Greenfield projects start with zero warnings. In existing projects, introduce no new warnings and report pre-existing issues to the user.
Do not suppress or disable checks to pass gates. Suppression comments (@ts-ignore, noqa, etc.) require explicit user approval. For new projects via /ds-init-project, set up pre-commit hooks (husky + lint-staged for JS/TS, pre-commit for Python). If an existing project lacks tooling, run available checks and recommend setup.
When implementing or modifying code, read content/references/code-standards-detail.md §Per-Language Strict Defaults, §Browser Verification, and §Discovery-Based Check Discipline for language defaults, browser checks, and hard-failing empty discovery.
Resource Use
An agent launching a heavy process (test suite, build, or browser run) owns its machine footprint. Before launching, check available memory and swap: on macOS, free plus inactive vm_stat pages (counts, not bytes) and sysctl vm.swapusage; on Linux, the available column of free. Start well below the runner's per-core default, observe peak per-worker memory (ps -o rss), and scale up only while headroom remains. Never start a heavy run while another of yours is running. While iterating, run affected test files; the full gate before completion still applies. Afterwards, kill processes and browsers you started.
Package Management
When adding or upgrading dependencies, or diagnosing an outdated dependency bug, read content/references/code-standards-detail.md §Package Management for version resolution, existing constraints, and the upgrade-before-workaround policy.
rules/conventions.md
Writing Style
Never use em dashes (--). Use a regular hyphen (-) instead in all generated text, copy, comments, documentation, and commit messages.
Length discipline
Operator attention is the scarce resource this methodology protects and the primary consideration when a trade-off is unclear: output volume scales with the number of agents while reading capacity does not, so an artifact that must be waded through makes the operator a bottleneck. The length and ordering rules here govern durable artifacts; in-session turns to the operator are governed by content/references/conductor-turn-format.md §Length discipline, except the emphasis cap below, which reaches turns as well.
Lead with the primary information. An operator reads an artifact to make a decision, to unblock an agent, or to understand a result. Name which, then open with what that reader needs: the decision and its options, what is blocked and what would clear it, or the outcome. Everything else earns its place by supporting that, including material that is merely adjacent, defensive, or present for completeness. Accuracy is not a licence to include: true, verified, well-written content that competes with the primary information is noise, and noise is a defect. Per-surface caps (content/references/conventions-detail.md §External Comment Discipline) are proxies for this rule, so meeting a bullet count while burying the answer defeats it. (The "parse test": can the reader find the primary information and act on it without reading the rest?)
Write for the permanent audience. Review residue is what usually buries it. An artifact written during a review loop has a temporary audience - the reviewer, the Skeptic, the QA round - and a permanent one, reading the source, the commit history, the PR, or the ticket months later. Only the permanent audience remains, so write for it alone. Prose that exists to stop a reviewer raising a point again is review exhaust: a reviewer is answered in the round, not in the artifact. Round history and rejected-alternative defences are two instances, not the set - the test is whether the line would earn its place had no review happened. State a real constraint once, neutrally, where it applies, and prefer an assertion that fails over a comment that asks.
Code comments follow content/rules/code-standards.md §Code Comments.
Emphasis is a scarce budget, not a per-item defence. In agent-authored output addressed to an operator - a PR body, tracker comment, commit message, source comment, or turn to the operator - thirty bolded phrases compete with the primary information and obscure it, the same defect expressed typographically; if more than about five phrases in one such artifact are bolded, none should be. Never use capitals for emphasis. Methodology reference prose is outside this cap, where bolded lead-ins carry the scannability the parse test rewards.
Project Structure Convention
AGENTS.md is the canonical project-instructions file across Claude Code, Codex, Cursor, and other tools. Claude Code reads it natively (not yet on Bedrock/Vertex/Foundry; toggle under Project instructions in /config) when no project-level CLAUDE.md is present - a project CLAUDE.md supersedes it unless that file imports it (DinoStack's own scaffold does, via an @AGENTS.md line; a nested AGENTS.md likewise loads only via a sibling CLAUDE.md containing @AGENTS.md). Always structure projects with a lean root AGENTS.md and deeper context in subdirectory AGENTS.md files co-located with the code they describe.
- Root
AGENTS.md- one-paragraph summary, resolved architecture decisions, cross-cutting conventions, repo structure map. Keep it under ~40 lines. This limit applies to project root AGENTS.md files. The global~/.claude/CLAUDE.mdis exempt. - Subdirectory
AGENTS.md(e.g.backend/AGENTS.md,contracts/AGENTS.md) - loaded only when working in that directory. Can be as detailed as needed without polluting other contexts. Detail here means durable conventions and decisions; step-by-step procedures follow the runbook rule below. - Runbooks live in separate files, not inline. Step-by-step procedures (build/run steps, multi-command how-tos, gotcha catalogs) do not belong inline in any AGENTS.md - the file is auto-loaded into every session working in its directory, so a 20-line procedure taxes every unrelated session there. Put the procedure in its own doc scoped to the deepest directory it applies to (e.g.
<dir>/docs/local-run.md) and leave a one-line pointer in that AGENTS.md (- Local build + open: see docs/local-run.md). Mechanical trigger: more than ~10 lines of procedure content in an AGENTS.md (aggregate across the file) means externalize and link. This is the same "read on trigger" pattern the methodology uses for its own reference docs. .claude/settings.json- project-scoped MCP servers and shared config (safe to commit)..claude/settings.local.json- secrets and local env values (always gitignored).
When starting a new project, run /ds-init-project to scaffold this structure automatically.
Session Context and Memory
Session startup: Read .agentic/context.md as the first action of every session - standalone, never in parallel with other tool calls.
Meta-divergence sweep at session start. After reading .agentic/context.md, the conductor sweeps .agentic/events.jsonl for meta_review_complete events whose original_task_id is not present in .agentic/.meta-divergence-surfaced. For each such event with non-empty data.divergence.critical_missed or data.divergence.major_missed, emit at the next user-facing turn boundary:
META-DIVERGENCE: meta-Skeptic identified [Critical|Major] '<finding-title>' that original Skeptic missed on <task_id>. Original sign-off stands; review recommended before merging.
[phase: meta-divergence-critical]Then append original_task_id to the tracker file. The sweep is a standalone scan - not parallel with other startup tool calls. Tracker file format is one original_task_id per line, append-only, matching /ds-init-project Step 9's .agentic/* umbrella ignore (not individually enumerated - see content/project-scaffolding.yml). File-absent equals empty set. This catches divergences whose meta-Skeptic completed asynchronously after the originating session ended.
Pagination (vicious loop defense): The sweep MUST NOT read the full .agentic/events.jsonl on every boot. It reads only events with ts strictly greater than the timestamp stored in .agentic/.meta-divergence-last-sweep (ISO8601 UTC, single line, file-absent = first run). On first run (no tracker file), the scan is capped to the most recent 100 lines of the events file. After the sweep completes, the conductor writes the current ISO8601 UTC timestamp to the tracker file (atomic: tmp + mv). This prevents the vicious loop where growing telemetry consumes ever more context on every session start. See content/references/skeptic-protocol.md Section 14 "Session-start sweep pagination" for the full procedure.
Skill-candidate sweep at session start. After the meta-divergence sweep, the conductor checks .agentic/skill-candidates.md for entries. Each entry begins with a ## <domain> heading (the unique key); its **Status:** field is either open or dismissed. For each entry whose **Status:** is open AND whose domain is NOT present in .agentic/.skill-candidates-surfaced, emit at the next user-facing turn boundary:
SKILL-CANDIDATE: domain '<domain>' has accumulated <count> occurrences - consider creating a skill (suggested artifact: <suggestedArtifact>). Run /ds-skill-candidates for the full backlog.
[phase: skill-candidate]Then append the domain (the ## <domain> heading value, without the ## prefix) to .agentic/.skill-candidates-surfaced (atomic tmp + mv, one domain per line, file-absent = empty set, gitignored). File-absent for .agentic/skill-candidates.md = no-op. The sweep is non-blocking: emitting the notice never gates any conductor action. Only entries with **Status:** open trigger the notice; entries with **Status:** dismissed are skipped.
Pagination (skill-candidate sweep): The sweep reads only entries whose **Last seen:** date is strictly greater than the date stored in .agentic/.skill-candidates-last-sweep (ISO8601 UTC, single line, file-absent = first run). On first run (no tracker file), all open un-surfaced entries are candidates. After the sweep completes, the conductor writes the current ISO8601 UTC timestamp to .agentic/.skill-candidates-last-sweep (atomic: tmp + mv). This mirrors the meta-divergence pagination discipline and prevents re-scanning the full backlog on every session start.
Pending-merge sweep at session start. Runs at session start, after the skill-candidate sweep. Skip when any of: TRACKER == none; the pending_merge_sweep config toggle is false; fewer than 60 minutes have elapsed since the last sweep (the throttle); .agentic/ticket-ledger.jsonl is absent or unreadable; or the candidate set is empty after exclusions. Otherwise runs /ds-ticket-status-sync --pending-merge, tracked via .agentic/.pending-merge-last-sweep (throttle timestamp) and .agentic/pending-merge-state.jsonl (sweep state). See content/commands/ds-ticket-status-sync.md §Pending-merge sweep for the procedure. This sweep emits no first-user-turn notice and does not add to the stacked-notice count at :89 - it prints only when a transition actually fires.
Knowledge-strand sweep. Runs at session start after the pending-merge sweep; read-only (no worktree/branch/write/fetch). Checks the same five-file set as /ds-wrap Part G for uncommitted changes versus origin/<BASE_BRANCH>, honoring knowledge_commit_exclude so an operator-excluded file is never surfaced; emits a non-blocking KNOWLEDGE-STRAND: notice pointing at /ds-wrap when found. See content/references/conventions-detail.md §Session-Start Sweeps for notice format, gating rules, tracker-key derivation, and pagination rationale.
Sibling-PR auto-merge sweep. Runs at session start after the knowledge-strand sweep. Entirely inert (zero gh calls) unless auto_merge_on_ci_green is true; when enabled, rebases every other open, non-draft PR the agent owns (gh pr list --author "@me") whose auto-merge is ALREADY enabled (autoMergeRequest non-null) but stuck BEHIND a moved $BASE_BRANCH - it never newly queues a PR's auto-merge, suspends auto-merge before rebasing and leaves it off pending the owning flow's refreshed evidence and guarded requeue. See content/references/conventions-detail.md §Session-Start Sweeps -> "Sibling-PR auto-merge sweep" for the procedure and soft-fail contract.
Session context. The read contract is unchanged: read .agentic/context.md as the first action of every session. How it is produced changed: the Stop hook writes this session's own .agentic/context.d/<session_id>.md shard after every agent turn, and .agentic/context.md is then recomposed as a DERIVED ROLLUP of .agentic/_wrap.md (the curated region) plus the shard set. Nothing writes context.md directly any more - a direct write is discarded by the next turn's recomposition. Writers are session-keyed so concurrent sessions cannot clobber each other, and because the rollup is derivable a lost update self-heals on the next turn rather than losing data. (Legacy fallback: ~/.claude/projects/[hash]/context.md - used only when .agentic/context.md does not exist.) /ds-wrap is available for richer on-demand summarization; it writes _wrap.md. Update MEMORY.md (root <cwd>/MEMORY.md) at the end of any session where stable facts were learned. Close the session cleanly so the Stop hook can finish writing context.md: in the terminal CLI, use /exit rather than ctrl+c; in the desktop or web app, just close the window or tab normally rather than force-quitting.
Knowledge-file routing (three distinct stores):
<cwd>/MEMORY.md- canonical durable facts; committed (exception: see conventions-detail.md); delivered to the main session only, by a SessionStart hook (never@-imported); written by/ds-wrap(Part B promotion, capped 3/run, plus a one-time migration stub seed), wrap-ticket,/ds-memory-update..agentic/memory.md- deferred-wrap daemon staging; written exclusively by the daemon (/ds-wrap-deferredStep 3);/ds-wraponly reads and drains it (Part B), never writes it; gitignored; NOT auto-injected; NOT the same as rootMEMORY.md..agentic/learnings.md- structured fix-pattern learnings; committed; written bylearning-extractor(mechanically) andlearnings-agent(mandatory triggers, conductor-spawned).
Per-developer session log: .agentic/session-log/<developer_id>.jsonl - per-developer session rollup written by the Stop hook. Committed to git via the .agentic/session-log/ carve-out in .gitignore when commit_telemetry: true (default) and identity is confirmed; the commit happens at /ds-implement-ticket Phase 8 as a SEPARATE commit on the PR branch. Teammates receive it on pull after squash merge. See content/references/events-log.md "Per-developer session log". Aggregated via ds-cost team.
Identity setup. ds-identity auto derives a provisional global GitHub handle; init <handle> sets one manually. --scope project stores a gitignored repo identity; --scope profile stores an active harness-profile identity. Effective identity uses confirmation-first project > profile > global ordering. Full paths, profile bindings, and routing contract: content/commands/ds-identity.md.
Conductor first-user-turn provisional-confirm. When the preflight resolves a provisional: true effective identity, the conductor substitutes the winning scope (global, profile, or project) and surfaces the following notice at its first user-facing turn - non-blocking, analogous to the meta-divergence notice:
IDENTITY: tracking handle '<handle>' auto-derived (provisional) - confirm or correct.
Telemetry is buffered (not lost) until confirmed.
Confirm: ds-identity confirm --scope <scope>
Correct: ds-identity init <handle> --force --scope <scope>Profile commands use the active config binding; add --profile-dir <dir> only when absent. The notice re-surfaces until confirmation. Buffered telemetry is tagged with the winning identity_scope; confirmation flushes only that scope, leaving nonmatching records buffered. See content/commands/ds-identity.md.
Deprecated-preset first-user-turn notice. When the preflight (Step 1 in content/sections/01-activation-preflight.md) finds a legacy session-wide preset key present at either scope - ~/.claude/agentic-engineering.json preset: or an agentic-engineering-preset: marker line - the conductor surfaces one of the two notices below at its first user-facing turn, non-blocking, analogous to the meta-divergence and identity-provisional-confirm notices. Fire on PRESENCE of the key regardless of whether it wins resolution; use the first template when the legacy preset won at that scope, the second when it was present but overridden by a profile elsewhere in the precedence chain:
# Legacy preset WON resolution at this scope:
DEPRECATED: preset key '{value}' ({scope}) resolved to profile={resolved}; migrate by setting
profile={resolved} directly - preset support will be removed after the deprecation window.
# Legacy preset PRESENT but did NOT win (coexistence / cross-scope override):
DEPRECATED: preset key '{value}' ({scope}) is present but NOT used - effective profile is
'{effective}' (source: {source}). Remove the stale preset key/marker - it has no effect and
will be rejected after the deprecation window.One of 5 stacked first-user-turn notices in this section (meta-divergence, skill-candidate, identity-provisional-confirm, deprecated-preset, knowledge-strand); ordering among the five is immaterial.
Telemetry is BUFFERED, not lost. While identity is unconfirmed (provisional or absent), the Stop hook writes session telemetry to a pending buffer (~/.agentic/session-log/.pending/<uuid>.json) rather than directly to the session log. Pending sessions are flushed and attributed when ds-identity confirm (or init --force) runs. No session is silently dropped.
TEAM dimension. ds-cost team aggregates all .agentic/session-log/*.jsonl files found locally. Session-logs are committed to git via the Phase 8 telemetry commit (when commit_telemetry: true and identity is confirmed), so team reflects sessions from any developer whose telemetry has landed on the current branch via pull after merge.
MEMORY.md is delivered to the main session only, by a SessionStart hook (never @-imported). It stores stable facts learned about the project - architecture, key file paths, user preferences, recurring solutions. Include rationale with each entry ("chose X because Y"). Rules:
- Before adding an entry, check if it supersedes an existing one and update it in place (adjust the date)
- Remove entries that are no longer true
- Do not duplicate what is already in
AGENTS.md - Session-specific state (current task, next steps) belongs in
context.md, not here - Entry format:
- **YYYY-MM-DD:** [what and why, in one sentence]
Read content/references/conventions-detail.md §The Intent Layer for the artifact list, intent-debt concept, Project Overview Layer, Project Config (.agentic/config.json) toggle catalog, and Ubiquitous Language (glossary.md).
Git Workflow
Conductor never edits shippable artifacts directly - including Trivial one-line changes. Every shippable change is delegated to a worktree-isolated engineer branched from origin/$BASE_BRANCH. The conductor edits only exempt artifacts in its own checkout. Worktrees are exclusively for subagents.
Shippable/exempt classifier (4-rule precedence, first match wins):
.agentic/**-> EXEMPT (conductor sole-writer).- begins
docs/planning/-> EXEMPT (Briefs/Plans/ADRs/planning subdirs). ALL other docs SHIPPABLE, by name:docs/research/,docs/_archive/,docs/overview/,docs/technical/,docs/images/,docs/slides/, filedocs/index.html(VerceloutputDirectory: docs). - conductor-direct PRINT/DECISION/RESOLVER-EXECUTION -> EXEMPT. A conductor-direct session-context write under this exemption targets
.agentic/_wrap.md, NEVER.agentic/context.md.context.mdis a derived rollup recomposed from_wrap.mdplus the per-session shards on every turn, so a direct write to it is silently discarded by the next Stop turn - the exemption would quietly lose the conductor's edit. - any other tracked-file write -> SHIPPABLE -> delegate to worktree-isolated engineer (Trivial: no Skeptic/no brief; Elevated: full Worker+Skeptic).
Mechanical backstop (Claude Code, DinoStack checkout only). A PreToolUse hook (hooks/enforce-shippable-edit.py) mechanically enforces this classifier for the conductor: it matches Write/Edit/MultiEdit, and denies a conductor-direct edit (agent_id absent) to a shippable file inside the repo. Exempt: .agentic/**, docs/planning/**, the instruction-layer basenames AGENTS.md/MEMORY.md/CLAUDE.md at any depth (the sanctioned /wrap conductor-write path), and paths outside the repo. Fail-open on any error. Kill-switch: AE_SHIPPABLE_GUARD_DISABLE=1. Residual: conductor hand-edits to the instruction-layer files made OUTSIDE /wrap are mechanically unguarded by design - that workflow trades the backstop for /wrap's own internal Skeptic review.
Base branch resolution - resolve BASE_BRANCH in this order and cache the result for the session:
- Explicit declaration wins. If the project declares a base/integration branch via a
BASE_BRANCH:line inAGENTS.md, use it. Highest priority. - Else the remote's default branch (
git symbolic-ref --short refs/remotes/origin/HEAD, strippingorigin/). - Else a local
developbranch. - Else a local
developmentbranch. - Else
main(fall back tomaster). Do NOT auto-create any branch. PrintBASE_BRANCH resolved to: [value]and cache it asBASE_BRANCHfor the session.
Conductor preflight - run this checklist ONCE at session start. Do not skip it when the user issues a direct command; commands are goals, not overrides for workflow hygiene. Cache the resolved base branch in-context for the session; do not re-run the full preflight before every subagent spawn. Re-run only if the user explicitly switches branches or after 30+ minutes of idle time.
- What branch is the working tree on? (
git branch --show-current) - Does this branch already contain unrelated commits? If yes, start fresh from the base branch (resolve it per Base branch resolution above) before proceeding.
- Are there uncommitted changes? If so, do they belong to the current task? Stash or commit unrelated work before proceeding.
- When was
originlast fetched? Rungit fetch originif it has been more than a few minutes. - Resolve the base branch per Base branch resolution above and cache it as
BASE_BRANCHfor the session. Resolution is non-interactive and may run here at session start. - Run
ds-base-sync "$REPO" "$BASE_BRANCH"(PATH-guarded, non-blocking on any exit). Seecontent/references/base-branch-sync.md§Call sites. - Run worktree prune and the branch prune (see
content/references/worktree-lifecycle.md§Session-start prune script and §Branch prune) - both run ONCE at session start; on Claude Code the SessionStart hook launches the worktree reap (other harnesses: run/ds-cleanup-worktreeson demand). Then runds-retire-carrier --list-holdsand re-run each listed path, adding--releaseto an explicit hold only when its revisit event has occurred.
Subagent worktrees: Each parallel subagent gets its own worktree at .agentic/worktrees/<branch-name> under the project root (gitignored via /ds-init-project Step 9's .agentic/* umbrella - see content/project-scaffolding.yml), branched from origin/$BASE_BRANCH. The conductor merges each subagent branch back after sign-off.
git worktree add .agentic/worktrees/<branch-name> -b <branch-name> "origin/$BASE_BRANCH"Branch naming: feature/<name>, fix/<name>, chore/<name>.
Merging: After Skeptic sign-off, subagent branches merge back into the conductor's current branch. The conductor's branch (not the individual subagent branch) then opens a PR into $BASE_BRANCH. PRs are required regardless of whether other sessions are active - they make in-flight work visible and force explicit conflict resolution.
PR delivery records (all team PRs). Follow content/references/delivery-record.md: provisional at creation, refresh after owner push/rebase and before merge/new queue; suspend queued head advancement first. Publish separate human approval, protocol review, CI, QA and UAT evidence with SHA coverage, reasons and unfinished owners. Every merge/new queue (including authorized --admin) requires successful publication and --match-head-commit using its published_sha; failure blocks that action. Existing approval authority and review/QA exemptions remain in force.
Merge-time tracker writeback. An agent's own gh pr merge exiting 0 outside /ds-implement-ticket Phase 12 auto-merge fires /ds-ticket-status-sync <TICKET_ID> --pr <PR_NUMBER> --no-confirm. --auto exiting 0 means QUEUED, not merged, and does not fire it. Full: content/references/conventions-detail.md §Merge-Time Tracker Writeback.
Auto-merge follow-through. Whenever an agent has opened a PR it owns against $BASE_BRANCH and auto_merge_on_ci_green is true in .agentic/config.json, IT un-drafts the PR if needed and queues gh pr merge <N> --match-head-commit <published_sha> --squash --delete-branch --auto, re-drafting (gh pr ready --undo) ONLY IF IT performed that un-draft itself and the queue then fails - never touching a PR the operator had already marked ready, since "Allow auto-merge" may be off. The ad-hoc rule is never gated on a particular command; Phase 10, Phase 12 and the sweep differ - full detail: content/references/conventions-detail.md §Auto-merge follow-through. --auto exiting 0 means QUEUED, not merged. When the toggle is false (default), nothing fires and a turn must state the PR's real state, never a future merge intention it has no mechanism to carry out.
Cleanup: retire or hold each carrier at completion (ds-retire-carrier; content/references/worktree-lifecycle.md §Carrier lifecycle by purpose). Between tasks, no completed carrier stays without a recorded hold.
Commit each fix immediately during testing. Never accumulate uncommitted changes during live testing sessions. After each validated fix: commit, PR, merge, pull - then start the next fix. Do not batch multiple unrelated fixes. Exception - Implicit Trivial batching: a series of individually-Trivial-classified tweaks to the same surface may share one draft PR across multiple pushes instead of a fresh commit-PR-merge-pull cycle per tweak; the pre-spawn continuation judgment (see content/references/worktree-lifecycle.md §Implicit Trivial batching: open the PR at first push) is the discriminator that decides whether a given tweak continues an open batch or starts a new one - the file-overlap scope test that runs on return is rare-miss verification only, never the batching decision itself. Genuinely distinct fixes - unrelated files, unrelated intent, a topic switch - still follow the full commit-PR-merge-pull cycle per fix; "related" is defined by that same continuation judgment, not by file adjacency.
DCO sign-off when the repo enforces it. When the target repo enforces DCO - a DCO / Signed-off-by CI check exists, or CONTRIBUTING requires sign-off - commit with git commit -s so the Signed-off-by: trailer is present and matches the commit author email; without it the DCO check fails and the commit must be amended. This is conditional: only sign off when the repo enforces it, not universally for every repo. The dinostack repo itself enforces a DCO check, so commits to it require -s.
Multi-session support: Multiple Claude Code sessions can work on different features simultaneously. Each session operates on its own branch. Claude Code locks (git worktree lock) each isolation worktree. See the Locked handling: note in bin/ds-cleanup-worktrees for the canonical caveat on lock state.
Temp-file ownership. Agents that write temp files are responsible for deleting them in teardown. If a downstream phase consumes the temp files, the consuming phase deletes the originals after consumption.
Superseding an open PR's work means close + rebase, never bundle. If your branch's work makes another open PR's commits unnecessary or subsumed, close that PR citing the superseding one and rebase your branch clean of its commits - do not merge or cherry-pick the superseded PR's commits into your own branch. A branch whose history contains another open PR's head commit is exactly the pattern an advisory review-rigor CI check flags where configured; treat the flag as confirmation to close + rebase, not to proceed. This applies to superseding only - see the rework-rounds bullet immediately below for the same-approach case.
Rework rounds on an open PR stay on the same PR - push fix commits to the existing branch, do not close and reopen. Rework (round-N fix, same implementation approach already on the open PR - a Skeptic finding, CI failure, or review comment resolved by a surgical edit that builds on top of the existing branch tip) is a distinct git-workflow class from superseding (a wholesale replacement of the PR's approach, where the old commits become dead weight rather than a foundation - still close + rebase per the bullet above). Test: if the fix commit builds on top of the existing branch tip and addresses specific findings against it, it is rework; if the new work discards the prior round's approach outright, it is superseding. See content/references/worktree-lifecycle.md §Round-N rework mechanic for the round-N branching and recovery procedure.
Context Economy
Read content/references/conventions-detail.md §Context Economy for context-window discipline rules (no duplicate file contents, minimal diffs, no verbatim tool output, structured blocks over prose) and multi-developer coordination guidance.
External Comment Discipline
Read content/references/conventions-detail.md §External Comment Discipline for rules on PR bodies, review comments, commit messages, ticket descriptions, and other external-facing artifacts (name the reader, lead with result, bullets over prose, evidence beats description, no marketing voice).
Note for this Claude Code build
The rules files named above (rules/code-standards.md, rules/conventions.md) are embedded verbatim under 'Embedded Resident Content' - already in context now that this skill has been invoked. Do not issue a separate Read for them.
The methodology body embedded above is the MINIMAL corpus: some rules are deferred and replaced by a "Deferred at this corpus" pointer block naming a trigger event. If a pointer block's named trigger fires during a task, DO read METHODOLOGY.md in this same skill directory - it carries the full, unfiltered text. That Read is REQUIRED in that case, not redundant.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

