wrapup-a90d56 — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited wrapup-a90d56 (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Close the store: write docs/status.md from observed evidence, surface candidate decisions the user may want to record as ADRs, run cross-doc maintenance checks, prune the operating manual's Operational sections, archive shipped milestones, sync session files to git. Predictable and deliberate — wrapup is bounded; tomorrow's open should be fast.
Janitor model: clean up, ensure everything's in its place, move quickly when nothing's blocking, take time when something genuinely needs synthesis. No churn for ceremony.
Status: Released — the marketplace ships this workflow. The current plugin version lives in plugin.json (don't hard-code it here — it only goes stale). Feature additions are marked inline with the version they landed in.| v4.0 | v5.0 |
|---|---|
Wrote HANDOFF.md from chat synthesis (Phase 1.3 tagging → narrative) | Writes docs/status.md from EVIDENCE: git diff, test output, plan-task state, validator results |
Wrote .claude/session-log.md per session | Session-log retired — docs/planning/archive/ serves the journal role |
| Phase 1.3 conversation tagging was the primary synthesis pass | Candidate-decision detection (mechanical + soft) is primary; conversation tagging secondary, scoped to ADR prompts only |
| Phase 4 pruned the whole CLAUDE.md | Phase 5 prunes ONLY Operational sections per sectioned-writer rule; Constitution sections never touched |
| Phase 6 committed HANDOFF.md + session-log.md | Phase 7 commits docs/status.md + archives + ADRs + pruned manual |
| (no cross-doc checks) | Phase 4 runs doc-redundancy.py and doc-contradiction.py from rad-planner (advisory findings) |
| (no milestone archive) | Phase 6 detects milestone completion + prompts to archive current.md to planning/archive/ |
| (no work-detection gate) | Phase 0 refuses to run if no work since last status update (saves noise updates) |
--push — Skip Phase 7.4 push prompt and push the session commit immediately.--no-push — Skip push entirely; commit locally only.--quick — Fast wrapup: skip cross-doc checks (Phase 4), skip candidate-decision deep-scan (Phase 3), skip operating manual prune (Phase 5) unconditionally, simpler status update. Use when "I just sat down for an hour, save state and go."--non-interactive — Suppress prompts (candidate-decision menu, ADR append, archive prompt, push). Tagged decisions land in status.md anyway; the durable DECISIONS.md append is gated by user y so non-interactive defaults to skipping. Cautious mode — no ADR writes without explicit user input.--auto (new in v5.2) — Productive autonomy mode. No prompts, but candidate decisions are written as DRAFT-banner ADRs to docs/decisions/NNNN-*.md so the capture isn't lost. Each draft ADR explicitly labels the rationale as LLM-inferred and surfaces in Phase 8 anomaly block as "⚠ N draft ADRs auto-recorded — review when convenient." Also triggers when a harness-level <system-reminder> signals autonomous-mode behavior even without the explicit flag (see Phase 3.0.5). Use for autonomous loops / Auto permission mode where you want the captures but don't want to be interrupted. Distinct from --non-interactive (which is cautious / skip).--force — Override the Phase 0 no-work check. Used when you want a status refresh even though there's no commit activity (e.g., bookkeeping refresh after manual file edits outside session).The phase logic uses explicit evidence-extraction patterns so output is reproducible from evidence regardless of which model tier the session runs in. The status.md content must be derivable from git diff, test output, and plan-task state — not from chat memory or model recall. Evidence is the contract.
Python launcher. Code blocks below invoke python3 for brevity. Use whichever launcher exists — python3, else python, else the Windows py launcher; the validator scripts are launcher-agnostic pure-stdlib. Each Bash call is independent (shell state does not persist between calls), so resolve the launcher in the block that uses it. If none exists, the validator steps degrade gracefully (Phase 4 emits a "validators unavailable" note).
Announce at start: "Wrapping up — gathering evidence, writing status.md, surfacing candidate decisions, running cross-doc checks, pruning operating manual Operational sections, archiving milestone if shipped, syncing to git..."
If nothing has changed since the last status update, refuse to run. Forcing a noise update erodes status.md's evidence quality.
Check three signals:
# Commits since status.md was last updated
LAST_STATUS_COMMIT=$(git log -1 --format=%H -- docs/status.md 2>/dev/null)
[ -n "$LAST_STATUS_COMMIT" ] && COMMITS_SINCE=$(git rev-list "$LAST_STATUS_COMMIT..HEAD" --count 2>/dev/null || echo 0) || COMMITS_SINCE=0
# Uncommitted changes
DIRTY=$(git status --porcelain 2>/dev/null | wc -l)
# Plan-task changes (acceptance criteria flips)
PLAN_TASK_CHANGES=$(git diff docs/planning/current.md 2>/dev/null | grep -cE '^\+\s*-\s*\[' || echo 0)COMMITS_SINCE > 0 OR DIRTY > 0 OR PLAN_TASK_CHANGES > 0 → proceed to Phase 1.No work detected since last status update.
Commits since last status: 0
Uncommitted changes: 0
Plan acceptance-criteria changes: 0
Nothing to wrap up. Options:
1. Exit (default) — status.md is already current.
2. Run anyway with --force to refresh the status.md timestamp.In --non-interactive mode, exit silently with wrapup_action: "skipped_no_work" in the trailing JSON.
If --force is passed, proceed regardless of the check.
All reads in Phase 1 are issued as one parallel batch. The phase numbering is for human readability.
.rad/profile — extract mode, agent_scope, multi_branch_status (for Phase 2.1 status-file path and Phase 3 mode-aware surfacing)docs/status.md (or docs/status-<current-branch>.md if multi_branch) — prior status for diff and "last completed" carry-forward filteringdocs/planning/current.md — current plan; acceptance-criteria state, planned changes, current milestonePer agent_scope:
claude_only → CLAUDE.mdcodex_only → AGENTS.mdclaude_and_codex → both (AGENTS.md canonical + CLAUDE.md shim)For Phase 5 prune logic.
Run as one combined command:
git status --porcelain 2>/dev/null && echo "---" && \
git diff --name-only 2>/dev/null && echo "---" && \
git diff --stat 2>/dev/null && echo "---" && \
git log --oneline -10 2>/dev/null && echo "---" && \
git log --since="$(git log -1 --format=%cI -- docs/status.md 2>/dev/null)" --format='%H|%s|%ai' 2>/dev/null && echo "---" && \
git rev-parse --abbrev-ref HEAD 2>/dev/nullCapture:
Run mechanical detection for the most common ADR-worthy changes:
# Dependency additions in package.json (or equivalent)
git diff -- package.json 2>/dev/null | grep -E '^\+\s+"' | grep -v '^\+\s+"version"' || true
# New migration files
git diff --name-only --diff-filter=A 2>/dev/null | grep -E '(migrations|schema)/' || true
# .env.example additions
git diff -- .env.example 2>/dev/null | grep -E '^\+\s*[A-Z_]+=' || true
# New top-level directories
git diff --name-only --diff-filter=A 2>/dev/null | awk -F'/' '{print $1}' | sort -u || trueThese feed into Phase 3 candidate-decision detection without needing model reasoning.
If rad-planner is installed at a sibling path, invoke its validators:
RAD_PLANNER_SCRIPTS="${plugin_root}/../rad-planner/scripts"
# Plan health check
[ -f "${RAD_PLANNER_SCRIPTS}/plan-lint.py" ] && \
python3 "${RAD_PLANNER_SCRIPTS}/plan-lint.py" --mode all docs/planning/current.md --json 2>/dev/null
# Status freshness (re-run after Phase 2 writes the new status)
# Cross-doc validators run in Phase 4If validators aren't available (rad-planner not installed), Phase 4 emits a "validators unavailable" note and skips cross-doc checks.
Walk the recent conversation window — bounded the same way as v4.0 (most recent of: prior /wrapup signal, PreCompact marker, prior /startup briefing; default cap 40 turns, 15 in --quick).
Tag turns labeled DECISION (architecture choice, tool selection, naming rule, approach taken — with stated or inferable reason) — these feed Phase 3.
In v5.0, conversation tagging is scoped to ADR prompts only. The bulk of status.md content comes from evidence (git, validators, plan state), not from the chat narrative. This is the biggest behavioral shift from v4.0.
Other v4.0 tag categories (FAIL, CORRECTION, INSIGHT, OPEN) are NOT carried forward into v5.0 status.md — they were narrative-shaped, and v5.0 is evidence-shaped. If a real "what didn't work" or "open question" matters, it surfaces through plan-task state (acceptance criterion still unchecked) or git evidence (file changed but never tested), not from chat synthesis.
Write the canonical handoff per the 8-section schema in docs/status-md-schema.md. Every field has a documented inference policy (DIRECT / HEURISTIC / SYNTHESIZED / USER-STATED). Status.md is evidence-grounded — the planner's "intent" lives in current.md; the session's "reality" lives in status.md.
if multi_branch_status:
STATUS_PATH=docs/status-${current_branch}.md
else:
STATUS_PATH=docs/status.mdFor each of the 8 sections, populate from evidence. Reference docs/status-md-schema.md for the exact inference policy per field.
1. Current state (overwrite)
git rev-parse --abbrev-ref HEADdocs/planning/current.md "Current milestone" section2. Last completed (rewrite, top 5–10 items)
[x]3. Files changed recently (rewrite, top 10)
git diff --name-only <last_status_commit>..HEAD (or current diff if uncommitted)4. Latest validation results (rewrite, evidence-strict)
5. Decisions made during execution (rewrite from Phase 3 output)
Decision: ... / Why: ... / Recorded in ADR? yes (decisions/NNNN-...) | no | pending6. Known issues or blockers (rewrite)
7. Next recommended step (overwrite)
8. If restarting from scratch (overwrite)
Write STATUS_PATH with the populated 8-section content. Sections that are explicitly empty MUST say so ("No data this session" / "No validation run this session — last run YYYY-MM-DD") rather than be silently blank.
Surface decisions that may want to become ADRs. Combines mechanical triggers (Phase 1.4) and conversation tagging (Phase 1.6).
Skip Phase 3 entirely if any of these hold:
--quick mode (skip the deep scan; mechanical triggers still feed status.md Phase 2.5)--non-interactive (no prompt possible; candidates land in status.md but no ADR append — cautious CI default)DECISION-tagged turnsDetect whether the model is running under harness-level autonomy. Two signals:
--auto was passed to /wrapup invocation<system-reminder> is present in the current conversation that signals autonomous-mode behavior (e.g., "the user has asked to work without stopping for clarifying questions", "auto-accept", or equivalent)If either signal is present, Phase 3 enters Auto mode (sub-section 3.2 has a third branch for this; sub-section 3.3 writes draft-banner ADRs instead of prompting).
If neither signal is present and --non-interactive is NOT set, run Phase 3 in the normal interactive mode based on .rad/profile mode field (mentor or dev).
Note on signal interpretation: the harness autonomy hint covers tool-use approvals (Write, Edit, Bash). It does NOT cover the Case C guard rail in /startup Phase 0.5 (data-loss-protected). For /wrapup Phase 3 specifically — where the user's downside is "an auto-recorded ADR may have wrong rationale" rather than "I lose work" — the right behavior under autonomy is to write the ADR with a DRAFT banner so the user can review at their own pace. Better than skipping the capture entirely and losing the record.
Combine:
DECISION-tagged turns from Phase 1.6 conversation walkFor each candidate, compute:
Mentor mode (mode = mentor in .rad/profile, or default):
For each candidate, show teaching + draft entry:
Candidate decision (mentor mode):
Title: Adopt React Query for server-state management
Why: Replaces the existing fetch-with-useEffect pattern (5 sites). React Query handles caching, retry, and revalidation that we've been re-implementing inconsistently.
Evidence: package.json line 23 added "@tanstack/react-query"; commits a1b2c3, d4e5f6
Why this is typically worth an ADR:
Adding dependencies commits future code to that library's API and lifecycle.
Without an ADR, the next session won't know whether to use React Query or
fall back to the prior fetch-with-useEffect pattern when adding a new
server-state read.
Draft entry for decisions/0007-react-query.md:
[full ADR template populated — Context, Decision, Why, Alternatives, Consequences]
Actions:
[a] Accept — write decisions/0007-react-query.md as drafted
[e] Edit — open the draft for your edits before writing
[s] Skip — record in status.md only, no ADR
[d] Defer — record in status.md as "pending — revisit next wrapup"Dev mode (mode = dev):
Quick list, skip-friendly:
Candidate decisions surfaced:
1. Adopt React Query — Evidence: pkg.json + 2 commits
2. New migration: 0042_user_preferences.sql — schema change
3. Add ANTHROPIC_API_KEY to .env.example — env addition
Actions per candidate: [a]ccept / [s]kip / [d]efer
Or: [A] accept all, [S] skip all, [D] defer allAuto mode (detected per 3.0.5: --auto flag OR harness autonomy hint):
No prompt. Write all candidates as draft-banner ADRs directly. Surface counts in Phase 8 anomaly block.
(no terminal prompt — auto-recording)
Phase 8 anomaly will surface:
⚠ N draft ADRs auto-recorded this session: 0007, 0008, 0009 —
review when convenient. Each carries a DRAFT banner; the rationale
is LLM-inferred. Promote each ADR by removing the banner once you
confirm the rationale matches your intent.The DRAFT banner inserted at the top of each auto-recorded ADR (immediately under the H1 title):
> **DRAFT — auto-recorded by `/wrapup`** under harness autonomy. Rationale was
> LLM-inferred from commit messages and changed files; review and revise.
> Remove this banner to promote the ADR to a confirmed decision.Status.md section 5 entry under Auto mode reads:
**Decision: Adopt React Query for server-state management**
- Status: DRAFT auto-recorded at decisions/0007-react-query.md
- Evidence: package.json line 23; commits a1b2c3, d4e5f6
- Action needed: review the LLM-inferred rationale; remove DRAFT banner to confirmThe point of Auto mode: capture the candidate decision (it would be lost otherwise) without falsely claiming user confirmation. The user can review draft ADRs at the next /startup (which surfaces them in the briefing as a soft-warning line) or whenever convenient.
Default (mentor/dev mode): for each accepted candidate:
docs/decisions/NNNN-<slug>.md with the canonical template (Context / Decision / Why / Alternatives / Consequences / Related files)Recorded in ADR? yes (decisions/NNNN-...)For skipped: include in status.md section 5 with Recorded in ADR? no and capture the reason.
For deferred: include in status.md section 5 with Recorded in ADR? pending — revisit next wrapup.
Auto mode (detected per 3.0.5): for every candidate:
docs/decisions/NNNN-<slug>.md with the canonical template plus the DRAFT auto-recorded banner immediately under H1 (template shown in 3.2 Auto mode block)Default mode: emit one line per outcome to the Phase 8 anomaly block:
DECISIONS.md: appended N entries (NNNN–NNNN).Auto mode: emit a single anomaly-block line that explicitly flags review-needed:
⚠ N draft ADRs auto-recorded this session: NNNN, NNNN, NNNN — review when convenient.
Each carries a "DRAFT — auto-recorded" banner. Remove the banner on each to promote.The next /startup briefing surfaces draft-banner ADR count as part of its strategic-doc gap-check, so the user sees pending review items at session open without needing to remember to look.
Run rad-planner's cross-doc validators against the project's strategic docs. Findings are advisory — surface for user review, not blocking.
Skip Phase 4 if any of these hold:
--quick modeRAD_PLANNER_SCRIPTS="${plugin_root}/../rad-planner/scripts"
# Cross-doc redundancy
python3 "${RAD_PLANNER_SCRIPTS}/doc-redundancy.py" "$PWD" --json 2>/dev/null > /tmp/rad-redundancy.json
# Cross-doc contradiction
python3 "${RAD_PLANNER_SCRIPTS}/doc-contradiction.py" "$PWD" --json 2>/dev/null > /tmp/rad-contradiction.json
# User-owned content audit (NEW in v5.6 — visibility pass over the
# operating manual's user-owned sections; neither plugin modifies these,
# but staleness can be flagged for the user to act on)
python3 "${RAD_PLANNER_SCRIPTS}/audit-user-content.py" "$PWD" --json 2>/dev/null > /tmp/rad-user-content.jsonParse the JSON outputs.
Redundancy findings:
Contradiction findings:
User-owned content findings (v5.6):
dead-path): show as "Path referenced in user-owned section doesn't exist — confirm whether to update or remove the reference"orphan-terminology): show as "Title-Case terminology in user-owned section appears nowhere else in the repo — possibly stale (brand reset, retired concept, renamed system)"Display under a single block in the Phase 8 anomaly output (only if any findings):
Cross-doc maintenance:
Redundancies: N (M MEDIUM, K LOW) — see /tmp/rad-redundancy.json or re-run doc-redundancy.py
Contradictions: N (M MEDIUM, K LOW) — see /tmp/rad-contradiction.json or re-run doc-contradiction.py
User-owned content: N (M HIGH, K MEDIUM) — see /tmp/rad-user-content.json or re-run audit-user-content.py
Action: review for canonical placement; resolve before next /plan if blocking.Cross-doc findings are advisory — no automatic file changes. The user decides what to fix.
Honesty about the user-owned audit (v5.6): the audit reads user-owned sections (anything not in either plugin's owned-section list — see docs/cross-plugin-contracts.md) but does not modify them. The single-writer rule keeps user-authored content safe; this advisory layer surfaces signals without crossing that boundary. The two heuristics in v1 catch orphan terminology (Title-Case phrases appearing only in this section, often a brand reset or renamed system that didn't propagate) and dead paths (markdown link or path-shaped tokens to files that no longer exist). False positives surface as confidently as true positives — the user is the final judge.
Prune the operating manual per the sectioned-writer rule. ONLY Operational sections may be touched — Constitution sections are owned by rad-planner and must never be modified by /wrapup.
Skip Phase 5 entirely if any of these hold:
--quick modegit diff --quiet HEAD -- <manual_path> returns 0 AND last commit modifying it is older than last status.md commit)If skipped, log: Operating manual unchanged since last wrapup — prune skipped.
Per agent_scope from .rad/profile:
claude_only → prune CLAUDE.mdcodex_only → prune AGENTS.mdclaude_and_codex → prune both (separate evaluations; CLAUDE.md may have shim-specific Operational content + @AGENTS.md import; AGENTS.md has its own Operational sections)| Section | Owner | /wrapup may prune? |
|---|---|---|
| Project | rad-planner | NO |
| Read order | rad-planner | NO |
| Hard boundaries | rad-planner | NO |
| Engineering rules | rad-planner | NO |
| Lanes (v4.7+) | rad-planner | NO — role-separation contract, never touched |
| Definition of done | rad-planner | NO |
| Escalate triggers | rad-planner | NO |
| Commands | rad-session | YES — prune stale entries |
| Compact Instructions (CLAUDE.md only) | rad-session | YES |
| Claude-specific behavior (CLAUDE.md only) | rad-session | YES |
@AGENTS.md import line (CLAUDE.md shim) | rad-session | YES — only to update or remove import |
| User-added sections (any other heading) | User | NO — preserve |
For each prunable section, evaluate:
| Question | If YES |
|---|---|
| Is this command referencing a binary or path that no longer exists? | Flag in diff; remove with user approval |
| Is this Claude-specific behavior referencing a workflow that retired? (e.g., "merge CLAUDE-FRAGMENT.md" — that's v4.0; retired in v5.0) | Flag in diff; remove with user approval |
Is this entry duplicating what docs/status.md or docs/planning/current.md now captures? | Remove |
| Does this Compact Instructions section reference fields that don't exist in current.md? | Remove the dead reference |
If you encounter ANY section outside the prunable list — including Constitution sections, user-added sections, or unknown headings — preserve it. Surface in the output: "Preserved user/Constitution sections: <list>."
Operating manual changes ({CLAUDE.md | AGENTS.md | both}):
- Removed: "[quoted text]" ([reason])
- Updated: [section] — [what changed]
- Preserved (Constitution + user sections): [N lines]Auto-proceed without prompting if ALL of these hold:
Otherwise: wait for user approval ("looks good" / "fine" / "ok" → proceed; "undo X" → revert that change).
Detect if the current milestone is complete and offer to archive current.md to planning/archive/.
Skip Phase 6 if any of these hold:
--quick mode--non-interactive mode (no prompt possible)docs/planning/current.md doesn't existRead acceptance criteria from docs/planning/current.md. A milestone is "shipped" when:
[x] checkedHeuristic: count [x] vs [ ] checkboxes in the Acceptance criteria section. If 100% checked → milestone shipped.
Milestone M{N} ({theme from current.md}) appears complete:
Acceptance criteria: N/N checked
Status: on track
Archive current.md to docs/planning/archive/YYYY-MM-DD-M{N}-{slug}.md and prepare for the next milestone? (y/N/edit)
[y] Archive — move current.md to planning/archive/; you'll run /rad-planner:plan --improve to set up the next milestone
[N] Skip — leave current.md alone (default)
[edit] Mark some criteria as unverified and re-evaluateOn y:
mkdir -p docs/planning/archivegit mv docs/planning/current.md docs/planning/archive/YYYY-MM-DD-M{N}-{slug}.md (per git so history is preserved)Milestone M{N} archived to docs/planning/archive/YYYY-MM-DD-M{N}-{slug}.md. Run /rad-planner:plan --improve for the next milestone.On N: no action.
On edit: show acceptance criteria, let user uncheck some, re-evaluate.
Keep session files in sync across machines. Behavior aligns with v4.0 but the file list is updated for v5.0.
Skip Phase 7 entirely if any of these hold:
Critical: never `git add -A` or `git add .` Stage explicit paths only:
# Always stage status.md (Phase 2 wrote it)
git add docs/status.md
# Also stage status-<branch>.md if multi-branch
[ -n "$multi_branch_status_file" ] && git add "$multi_branch_status_file"
# Stage current.md if Phase 6 archived it
[ "$milestone_archived" = "true" ] && git add docs/planning/archive/
# Stage ADRs added in Phase 3
[ "$adrs_added" = "true" ] && git add docs/decisions/
# Stage operating manual if Phase 5 pruned it
[ "$manual_pruned" = "true" ] && git add CLAUDE.md AGENTS.md 2>/dev/nullIf git diff --cached --quiet, skip the rest of Phase 7 silently.
HOSTNAME="${HOSTNAME:-${COMPUTERNAME:-$(hostname 2>/dev/null || echo unknown)}}"
DATE=$(date +%Y-%m-%d)
# STATUS is from status.md "Current state" Overall status field
git commit -m "session: ${DATE} on ${HOSTNAME} — ${STATUS}"Priority order:
--push flag → push without prompting--no-push flag → skip push--non-interactive → skip push silently Push session files to origin? (y/N)Default: skip (N). Y → push.
If branch has upstream:
git pushOn rejection: do not force, do not retry. Report:
⚠ Push rejected (likely diverged from origin). The session commit is safe locally. Resolve with: git pull --rebase then git pushFor the Phase 8 anomaly block:
Sync: committed + pushed (<short-sha>)Sync: committed locally (<short-sha>) — N unpushed session commitsSync: committed locally (<short-sha>) — push rejected, resolve manuallyRun size assertions silently. Emit verbose output only when something anomalous happened.
STATUS_LINES=$(wc -l < docs/status.md 2>/dev/null || echo 0)
STATUS_BYTES=$(wc -c < docs/status.md 2>/dev/null || echo 0)Status.md soft caps per section (from docs/status-md-schema.md):
Section 4 and 5 have no caps (strict evidence + variable candidates).
An anomaly exists if any of these hold:
STATUS_LINES > 200 (status.md is getting bloated)docs/decisions/ (worth surfacing — DECISIONS just changed permanently)Emit exactly one line:
Session wrapped up. Sync: pushed (<short-sha>).If sync was skipped, drop the Sync: clause:
Session wrapped up.Emit the anomalous fields only, prefixed with ⚠ where appropriate:
Session wrapped up:
⚠ status.md: <N> lines — over soft cap (typical: <150 lines). Consider grooming.
DECISIONS.md: appended N entries (NNNN–NNNN). Edit consequences as needed.
Cross-doc: N redundancies, M contradictions surfaced (advisory; see /tmp/rad-*.json).
Operating manual: pruned N changes (auto-proceeded | confirmed).
Milestone M{N} archived to docs/planning/archive/YYYY-MM-DD-M{N}-{slug}.md.
⚠ Sync: push rejected — resolve with: git pull --rebase then git pushEach line conditional on its own anomaly. Do not mix success-path lines into the anomaly block.
HANDOFF.md (retired in v5.0 — docs/status.md replaces it).claude/session-log.md (retired in v5.0 — planning/archive/ serves the journal role)git add -A or git add . (always stages explicit paths)git push --force) under any circumstancesCanonical spec docs (top-level):
docs/doc-conventions.md — canonical file structuredocs/cross-plugin-contracts.md — single-writer rule, sectioned-writer exception for operating manualdocs/status-md-schema.md — 8-section status schema with evidence sources and inference policiesrad-planner validators (used by Phase 4):
${plugin_root}/../rad-planner/scripts/doc-redundancy.py — cross-doc Jaccard duplicate detection${plugin_root}/../rad-planner/scripts/doc-contradiction.py — vision non-goals vs current ACs${plugin_root}/../rad-planner/scripts/plan-lint.py — planning/current.md health${plugin_root}/../rad-planner/scripts/status-validator.py — status.md schema validatorPlugin internals:
scripts/README.md — full script documentation--push / --no-push — push behavior override--quick — skip Phase 3 deep scan, Phase 4 cross-doc checks, Phase 5 prune--non-interactive — suppress all prompts (Phase 3 menu, Phase 6 archive prompt, Phase 7 push)--force — override Phase 0 no-work check~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.