Pulls in 15 upstream commits since the April 3 bundling snapshot
(msieurthenardier/mission-control). Notable changes:
- agentic-workflow rewritten as the "fast" variant: per-leg design and
implement, single review and commit across the whole flight
- New Skill-Project Boundary section: skills no longer read or write
project-owned artifacts by literal heading
- routine-maintenance scoped to post-mission only; adds state-machine
reachability and cache freshness audits
- Test metrics capture threaded through debrief, maintenance, and flight
- Crew prompts no longer carry skill-required instructions; SKILL.md is
the protocol
- Worktree git strategy removed; standardized on {target-project}
- Jira artifact template removed upstream
Local URL correction in init-project/README.md preserved
(anthropics/flight-control -> msieurthenardier/mission-control).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
240 lines
11 KiB
Markdown
240 lines
11 KiB
Markdown
---
|
|
name: leg
|
|
description: Generate detailed implementation guidance for LLM execution. Use when creating atomic implementation steps from a flight.
|
|
---
|
|
|
|
# Leg Implementation Guidance
|
|
|
|
Generate detailed implementation guidance for LLM execution.
|
|
|
|
## Prerequisites
|
|
|
|
- Project must be initialized with `/init-project` (`.flightops/ARTIFACTS.md` must exist)
|
|
- A flight must exist before creating legs
|
|
|
|
## Workflow
|
|
|
|
### Phase 1: Context Loading
|
|
|
|
1. **Identify the target project**
|
|
- Read `projects.md` to find the project's path
|
|
|
|
2. **Verify project is initialized**
|
|
- Check if `{target-project}/.flightops/ARTIFACTS.md` exists
|
|
- **If missing**: STOP and tell the user to run `/init-project` first
|
|
- Do not proceed without the artifact configuration
|
|
|
|
3. **Read the artifact configuration**
|
|
- Read `{target-project}/.flightops/ARTIFACTS.md` for artifact locations and formats
|
|
|
|
4. **Read the parent flight**
|
|
- Understand the objective being achieved
|
|
- Review design decisions and constraints
|
|
- Note the technical approach defined
|
|
|
|
5. **Read the flight log in detail** (critical)
|
|
|
|
The flight log captures ground truth from actual implementation. Read it fully and extract:
|
|
- Actual outcomes from completed legs
|
|
- Deviations from the original plan
|
|
- Anomalies discovered during execution
|
|
- Environment details (versions, configurations)
|
|
- Decisions made during implementation
|
|
- Workarounds for issues encountered
|
|
|
|
6. **Identify this leg's scope**
|
|
- Which leg from the flight's leg list?
|
|
- What comes before and after?
|
|
- Dependencies on other legs?
|
|
- How do prior leg outcomes affect this leg?
|
|
|
|
7. **Identify environment constraints**
|
|
- Execution environment (devcontainer, WSL, cloud)?
|
|
- User context (root, specific user)?
|
|
- Environment variables or shell setup needed?
|
|
- Commands inside vs outside containers?
|
|
|
|
### Phase 2: Implementation Analysis
|
|
|
|
Deep dive into the specific implementation:
|
|
|
|
1. **Identify exact files to modify**
|
|
- Read existing files that will be changed
|
|
- Understand current code structure
|
|
- Note imports, dependencies, patterns
|
|
|
|
2. **Understand existing patterns**
|
|
- How is similar functionality implemented?
|
|
- What conventions does the codebase follow?
|
|
- What testing patterns are used?
|
|
|
|
3. **Determine inputs and outputs**
|
|
- What state exists before this leg?
|
|
- What state must exist after completion?
|
|
- What can the implementing agent assume?
|
|
|
|
4. **Identify edge cases**
|
|
- What could go wrong?
|
|
- What validation is needed?
|
|
- What error handling is required?
|
|
- If this leg modifies database schemas: does it include migration creation AND execution? Both must happen in the same leg — a schema defined but never migrated is a gap.
|
|
|
|
5. **State-machine reachability audit**
|
|
|
|
For every state, status, or lifecycle value this leg introduces or relies on, verify nothing in a lower layer makes the state unreachable.
|
|
|
|
- Enumerate the infrastructure layers that could foreclose the state: DB constraints (FK ON DELETE behaviors, NOT NULL, CHECK constraints, triggers), application caches and their invalidation rules, API/protocol version compatibility, fallback handlers that silently mask the state, and indexes that imply assumptions.
|
|
- Audit existing tests for assertions that contradict the new design. A test that pins behavior the new state machine breaks must be inverted, renamed, or deleted as part of this leg — not after. The rename pattern (e.g., `test_X_does_Y` → `test_X_does_not_do_Y` with the assertion inverted) is preferred over delete-and-readd because it documents the intent shift in git blame.
|
|
- When a design requires a row to persist past a referenced entity's deletion, explicitly inspect the schema's FK behaviors and any tests that pin them. A `ON DELETE CASCADE` on a referencing column will silently delete the row your design needs to keep.
|
|
|
|
6. **Cache freshness contract**
|
|
|
|
For every cache (in-memory dict, query result cache, computed derived state, frontend session storage) this leg reads from or populates, declare an explicit freshness contract.
|
|
|
|
- **Source of truth**: which underlying data does this cache reflect?
|
|
- **Rebuild trigger**: pick exactly one — per-call rebuild, TTL with value, invalidation event, or accepted permanent staleness until process restart.
|
|
- **Maximum staleness acceptable to the user**: be specific. "Until process restart" is rarely acceptable for user-facing state where users expect their edits to apply.
|
|
- **User-action invalidation map**: list every user action that mutates the source-of-truth, and confirm each one invalidates or refreshes the cache. If a user can edit X in one UI surface but the cached X never sees the edit elsewhere, that mismatch will surface as a bug — name it now.
|
|
|
|
Conflating "the cached object works fine" with "the cached object reflects current config" is a common error. State health and state freshness are different contracts.
|
|
|
|
7. **Identify dependent code** (for interface changes)
|
|
- Does this leg modify shared interfaces?
|
|
- What files consume these interfaces? Run `grep -rn '<changed_symbol>' tests/ src/`; if any test or non-leg-scope source imports or calls it, signature changes break any "prior tests pass UNMODIFIED" acceptance criterion.
|
|
- Should updating consumers be part of this leg?
|
|
|
|
8. **Identify platform considerations**
|
|
- Does this leg touch OS-specific features?
|
|
- What platform differences might affect implementation?
|
|
|
|
### Phase 3: Guidance Generation
|
|
|
|
Create the leg artifact using the format defined in `.flightops/ARTIFACTS.md`.
|
|
|
|
### Phase 3b: Citation Verification
|
|
|
|
Before marking the leg `ready`, mechanically validate every code-location citation in the draft artifact against current code. Citations drift between when a flight is designed and when its legs are designed (intervening legs commit changes; source artifacts age). Catching drift here prevents the implementing agent from chasing a stale `file:line` into the wrong code.
|
|
|
|
1. **Extract citations**
|
|
- Scan the leg artifact for code-location references matching `path/to/file.ext:line` or `path/to/file.ext:line-line` patterns
|
|
- Also collect symbol-form citations: `path/to/file.ext:symbol_name`
|
|
- Skip references to non-source artifacts (`mission.md:42`, `flight.md:100`) — those are out of scope
|
|
|
|
2. **Verify each citation**
|
|
- Read the cited location in current code
|
|
- Compare against the snippet, symbol, or surrounding description provided in the leg
|
|
- Classify each:
|
|
- **`OK`** — content at the cited location matches the description
|
|
- **`drifted`** — content moved; the description is still accurate but the line number is wrong
|
|
- **`gone`** — described content no longer exists in the file (or the file itself is gone)
|
|
- **`unverifiable`** — citation has no snippet/symbol and the description is too vague to confirm
|
|
|
|
3. **Repair drift inline**
|
|
- For `drifted`: locate the new line number via grep on the snippet/symbol and update the citation in the leg artifact
|
|
- For `gone`: do not silently retire — flag for human review (the gap may have been independently fixed, OR the leg may now be obsolete)
|
|
- For `unverifiable`: rewrite the citation using one of the durable forms (see "Citing Code Locations" guideline)
|
|
|
|
4. **Append a Citation Audit summary**
|
|
- At the bottom of the leg artifact, append a clearly-titled section (something like `## Citation Audit` if the project's leg conventions don't dictate otherwise) summarizing the audit
|
|
- If all citations verified clean: one sentence — `N citations verified against current code at leg design time.`
|
|
- If any drift was repaired or flagged: list each one with classification and resolution
|
|
|
|
## Guidelines
|
|
|
|
### Writing Effective Objectives
|
|
|
|
State exactly what the leg accomplishes:
|
|
|
|
**Weak**: "Set up the database stuff"
|
|
|
|
**Strong**: "Create the User model with email, password_hash, and timestamp fields"
|
|
|
|
### Acceptance Criteria
|
|
|
|
Criteria must be:
|
|
- **Binary**: Either met or not met
|
|
- **Observable**: Can be verified by inspection or test
|
|
- **Complete**: Nothing else needed for "done"
|
|
|
|
**Weak**: "Code is clean" (subjective)
|
|
|
|
**Strong**: "User model exists in `prisma/schema.prisma`"
|
|
|
|
### Verification Steps
|
|
|
|
Tell the agent exactly *how* to confirm each criterion:
|
|
|
|
**Weak**: "Make sure it works"
|
|
|
|
**Strong**:
|
|
```markdown
|
|
## Verification Steps
|
|
- Run `npx prisma migrate status` — should show no pending migrations
|
|
- Run `npm test` — all tests pass
|
|
- Tab through form fields — focus order matches visual order
|
|
```
|
|
|
|
For accessibility work, include specific checks:
|
|
- Keyboard navigation sequences
|
|
- Screen reader commands to test
|
|
- Automated tool commands (Lighthouse, axe-core)
|
|
|
|
### Citing Code Locations
|
|
|
|
When the leg artifact references specific code, prefer durable forms over bare line numbers. Line numbers drift; symbols and snippets do not.
|
|
|
|
| Form | Example | When to use |
|
|
|------|---------|-------------|
|
|
| `file:symbol` | `the_one/api.py:create_provider` | Most cases — symbol names survive line shifts |
|
|
| `file:line — "snippet"` | `the_one/api.py:805 — "raise ProviderConfigError"` | When a specific line matters; the snippet is a self-verifier |
|
|
| `file:CONSTANT_NAME` | `web/middleware.py:GATED_METHODS` | Module-level constants and assignments |
|
|
| `file:line` (bare) | `api.py:805` | **Avoid** — brittle, no way to verify drift |
|
|
|
|
The snippet form is especially valuable: it lets Phase 3b mechanically confirm the cited content didn't move, and it tells the implementing agent exactly what they're looking at without needing to chase the line number.
|
|
|
|
When in doubt, include both — `the_one/api.py:805 (in create_provider) — "raise ProviderConfigError if base_url is empty"` — symbol + line + snippet covers all three drift modes.
|
|
|
|
### Implementation Guidance
|
|
|
|
Be explicit, not implicit:
|
|
|
|
**Implicit**: "Add validation to the email field"
|
|
|
|
**Explicit**: "Add email validation using the `validator` library's `isEmail` function. Return HTTP 400 with `{ "error": "Invalid email format" }` on validation failure."
|
|
|
|
### Code Examples
|
|
|
|
Provide examples when:
|
|
- The codebase has specific patterns to follow
|
|
- There are multiple valid approaches
|
|
- The implementation isn't obvious from context
|
|
|
|
### Leg Sizing
|
|
|
|
A well-sized leg:
|
|
- Takes minutes to a few hours
|
|
- Is atomic (can be completed independently)
|
|
- Has clear, verifiable acceptance criteria
|
|
- Produces a working increment
|
|
|
|
**Too small**: Single-line change with no meaningful criteria
|
|
**Too large**: Would benefit from intermediate checkpoints
|
|
|
|
### Documenting Workarounds
|
|
|
|
When implementing a workaround, document:
|
|
- **What**: The workaround clearly
|
|
- **Why**: Why the ideal solution wasn't feasible
|
|
- **When to remove**: Condition for replacement
|
|
|
|
### Immutability
|
|
|
|
Once a leg is `in-flight`:
|
|
- Do NOT modify the leg document
|
|
- If requirements change, mark it `aborted` (changes rolled back)
|
|
- Create a new leg with updated requirements
|
|
|
|
## Output
|
|
|
|
Create the leg artifact using the location and format defined in `.flightops/ARTIFACTS.md`.
|