devrites 3.0.4 → 3.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +40 -1
- package/README.md +280 -521
- package/SECURITY.md +91 -77
- package/docs/adr/README.md +7 -9
- package/docs/agents/domain.md +5 -5
- package/docs/agents/issue-driven-rites.md +5 -5
- package/docs/agents/issue-tracker.md +1 -1
- package/docs/agents/triage-labels.md +2 -2
- package/docs/architecture.md +101 -85
- package/docs/capability-surface-selection.md +3 -1
- package/docs/cli.md +20 -13
- package/docs/command-map.md +39 -35
- package/docs/engine/agent-contract.md +11 -9
- package/docs/engine/commands.md +92 -78
- package/docs/engine/state-schema.md +23 -19
- package/docs/engine/workspace-schema.md +12 -11
- package/docs/extensions.md +17 -17
- package/docs/flow.md +34 -23
- package/docs/harness-compliance.md +2 -2
- package/docs/orchestration.md +21 -20
- package/docs/porting-to-a-new-harness.md +6 -2
- package/docs/release.md +30 -12
- package/docs/research/go-authoritative-workflow-schema-and-quality-2026-07-20.md +3 -3
- package/docs/skills.md +77 -52
- package/docs/templates/CRITIC_REVIEW_PACKET_TEMPLATE.md +35 -0
- package/docs/usage.md +56 -45
- package/engine/Makefile +2 -2
- package/engine/commands.go +3 -3
- package/engine/harnessmatrix.go +2 -2
- package/engine/hookpolicy.go +9 -9
- package/engine/hooks.go +11 -11
- package/engine/hooks_workspace.go +11 -11
- package/engine/internal/doctor/doctor.go +7 -7
- package/engine/internal/gate/gate.go +11 -11
- package/engine/internal/harness/compliance.go +1 -1
- package/engine/internal/harness/harness.go +7 -7
- package/engine/internal/install/install.go +2 -0
- package/engine/internal/install/install_test.go +3 -3
- package/engine/internal/iohooks/detach_unix.go +1 -1
- package/engine/internal/iohooks/iohooks.go +8 -8
- package/engine/internal/lib/adoption.go +1 -1
- package/engine/internal/lib/analyze.go +15 -15
- package/engine/internal/lib/archivesearch.go +3 -3
- package/engine/internal/lib/budget.go +3 -3
- package/engine/internal/lib/buildreadiness.go +6 -6
- package/engine/internal/lib/checkacceptance.go +10 -10
- package/engine/internal/lib/closeout.go +5 -5
- package/engine/internal/lib/conventions.go +3 -3
- package/engine/internal/lib/coverage.go +4 -4
- package/engine/internal/lib/doubtcoverage.go +9 -9
- package/engine/internal/lib/evidencefresh.go +6 -6
- package/engine/internal/lib/extensions.go +9 -9
- package/engine/internal/lib/footprint.go +13 -13
- package/engine/internal/lib/jsonout.go +2 -2
- package/engine/internal/lib/lanes.go +2 -2
- package/engine/internal/lib/learnings.go +9 -9
- package/engine/internal/lib/ledger.go +8 -8
- package/engine/internal/lib/ledger_test.go +5 -5
- package/engine/internal/lib/mutationgate.go +4 -4
- package/engine/internal/lib/overrides.go +9 -9
- package/engine/internal/lib/overrides_test.go +2 -2
- package/engine/internal/lib/packageexistence.go +732 -55
- package/engine/internal/lib/packageexistence_test.go +343 -0
- package/engine/internal/lib/preamble.go +6 -6
- package/engine/internal/lib/progress.go +5 -5
- package/engine/internal/lib/reconcile.go +80 -20
- package/engine/internal/lib/reconcile_test.go +13 -5
- package/engine/internal/lib/resolve.go +3 -3
- package/engine/internal/lib/reviewerstats.go +2 -2
- package/engine/internal/lib/reviewintegrity.go +13 -13
- package/engine/internal/lib/reviewintegrity_test.go +6 -6
- package/engine/internal/lib/runbook.go +1 -1
- package/engine/internal/lib/session.go +1 -1
- package/engine/internal/lib/session_test.go +2 -2
- package/engine/internal/lib/specparse.go +4 -4
- package/engine/internal/lib/specskeleton.go +2 -2
- package/engine/internal/lib/specvalidate.go +13 -13
- package/engine/internal/lib/stuck.go +13 -13
- package/engine/internal/lib/templates/conventions_ledger_header.md +1 -1
- package/engine/internal/lib/templates/conventions_orient_header.txt +1 -1
- package/engine/internal/lib/testintegrity.go +9 -9
- package/engine/internal/lib/tickafk.go +4 -4
- package/engine/internal/lib/util.go +1 -1
- package/engine/internal/migrate/migrate.go +2 -2
- package/engine/internal/migrate/migrate_test.go +1 -0
- package/engine/internal/orient/firstrun.go +8 -8
- package/engine/internal/orient/orient.go +5 -5
- package/engine/internal/state/concurrency_test.go +4 -4
- package/engine/internal/state/feature.go +6 -6
- package/engine/internal/state/lock_unix.go +1 -1
- package/engine/internal/state/schema.go +1 -1
- package/engine/internal/state/snapshot.go +2 -2
- package/engine/internal/state/write.go +1 -1
- package/engine/internal/version/version.go +1 -1
- package/engine/main.go +5 -5
- package/engine/subagent_orient_context.txt +4 -4
- package/engine/testdata/golden/TestParityA1Guard/source-edit-enforce-denies.golden +1 -1
- package/engine/testdata/golden/TestParityAnalyze/slug=covered.golden +2 -2
- package/engine/testdata/golden/TestParityAnalyze/slug=dangling.golden +3 -3
- package/engine/testdata/golden/TestParityAnalyze/slug=noac.golden +2 -2
- package/engine/testdata/golden/TestParityAnalyze/slug=order.golden +4 -4
- package/engine/testdata/golden/TestParityAnalyze/slug=orphan.golden +3 -3
- package/engine/testdata/golden/TestParityAnalyze/slug=uncovered.golden +3 -3
- package/engine/testdata/golden/TestParityBudget/extra-md.golden +1 -1
- package/engine/testdata/golden/TestParityBudget/over-advisory.golden +1 -1
- package/engine/testdata/golden/TestParityBudget/over-strict.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=approved.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=emptystatus.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=trailhash.golden +1 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=trailpipe.golden +1 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-ok.golden +1 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=id-ok.golden +1 -1
- package/engine/testdata/golden/TestParityCloseOut/active_pointed_elsewhere.golden +1 -1
- package/engine/testdata/golden/TestParityCoverage/arg=speconly.golden +2 -2
- package/engine/testdata/golden/TestParityCursor/bare.golden +1 -1
- package/engine/testdata/golden/TestParityCursor/full-afk.golden +1 -1
- package/engine/testdata/golden/TestParityCursor/full-hitl.golden +1 -1
- package/engine/testdata/golden/TestParityCursor/red.golden +2 -2
- package/engine/testdata/golden/TestParityCursor/zerogates.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=ghost.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=inline.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing-inline.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=nodoubt.golden +1 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=nolog.golden +1 -1
- package/engine/testdata/golden/TestParityLearnings/mine-no-archive.golden +1 -1
- package/engine/testdata/golden/TestParityLearnings/mine.golden +1 -1
- package/engine/testdata/golden/TestParityLearnings/nudge.golden +1 -1
- package/engine/testdata/golden/TestParityMutationGate/active-slug.golden +1 -1
- package/engine/testdata/golden/TestParityMutationGate/explicit-slug.golden +1 -1
- package/engine/testdata/golden/TestParityPackageExistence/declared.golden +1 -1
- package/engine/testdata/golden/TestParityPackageExistence/default-import-subpath.golden +1 -1
- package/engine/testdata/golden/TestParityReconcile/check-clean.golden +1 -1
- package/engine/testdata/golden/TestParityRedwatch/fail-writes-red.golden +1 -1
- package/engine/testdata/golden/TestParityResolve/answer/state.md.golden +1 -1
- package/engine/testdata/golden/TestParityResolve/batch.golden +1 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-devrites-agent-denies.golden +1 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-git-commit.golden +1 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-mutating.golden +1 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=flat.golden +1 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=valid/spec.md.golden +1 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=valid.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/custom-window-2.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/dominant.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/few.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/ghost.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/identical.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/nolog.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/pingpong.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/varied.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-04-identical.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-2.5-varied4.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-4x-varied4.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-leadspace-varied4.golden +1 -1
- package/engine/testdata/golden/TestParityStuckCheck/window-plus4-identical.golden +1 -1
- package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent-subagent-type-key.golden +1 -1
- package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent.golden +1 -1
- package/engine/testdata/golden/TestParityTestIntegrity/clean.golden +1 -1
- package/engine/testdata/golden/TestParityTickAfk/missingField.golden +1 -1
- package/engine/testdata/golden/TestParityTickAfk/none.golden +1 -1
- package/engine/testdata/golden/TestParityWrightScope/out-of-scope-enforce-denies.golden +1 -1
- package/engine/testdata/golden/TestSpecSkeleton/missing-some.golden +1 -1
- package/engine/testdata/golden/TestSpecSkeleton/present-all.golden +1 -1
- package/engine/tests/adr_0004_required_by_phase_test.go +2 -2
- package/engine/tests/adr_0006_clock_seam_test.go +1 -1
- package/engine/tests/budget_test.go +1 -1
- package/engine/tests/canonical_ac_ids_test.go +2 -2
- package/engine/tests/cli_test.go +1 -1
- package/engine/tests/concurrency_cli_test.go +1 -1
- package/engine/tests/gate_test.go +4 -4
- package/engine/tests/hook_test.go +3 -3
- package/engine/tests/hooks_io_test.go +1 -1
- package/engine/tests/lib_parity_test.go +29 -29
- package/engine/tests/meta_test.go +2 -2
- package/engine/tests/parity_closeout_test.go +1 -1
- package/engine/tests/parity_learnings_test.go +2 -2
- package/engine/tests/parity_mutationgate_test.go +2 -2
- package/engine/tests/parity_resolve_test.go +1 -1
- package/engine/tests/parity_test.go +3 -3
- package/engine/tests/parity_tickafk_test.go +1 -1
- package/engine/validatepack.go +5 -5
- package/engine/validatepackskills.go +9 -9
- package/pack/.claude/agents/devrites-code-reviewer.md +21 -22
- package/pack/.claude/agents/devrites-devex-reviewer.md +17 -17
- package/pack/.claude/agents/devrites-doubt-reviewer.md +6 -6
- package/pack/.claude/agents/devrites-forge-judge.md +26 -26
- package/pack/.claude/agents/devrites-frontend-reviewer.md +17 -17
- package/pack/.claude/agents/devrites-performance-reviewer.md +19 -18
- package/pack/.claude/agents/devrites-plan-reviewer.md +29 -27
- package/pack/.claude/agents/devrites-retrospector.md +19 -19
- package/pack/.claude/agents/devrites-security-auditor.md +15 -15
- package/pack/.claude/agents/devrites-simplifier-reviewer.md +14 -14
- package/pack/.claude/agents/devrites-slice-wright.md +52 -51
- package/pack/.claude/agents/devrites-spec-reviewer.md +11 -11
- package/pack/.claude/agents/devrites-strategy-reviewer.md +21 -21
- package/pack/.claude/agents/devrites-test-analyst.md +13 -13
- package/pack/.claude/settings.json +1 -1
- package/pack/.claude/skills/devrites-api-interface/SKILL.md +12 -12
- package/pack/.claude/skills/devrites-audit/SKILL.md +7 -7
- package/pack/.claude/skills/devrites-browser-proof/SKILL.md +16 -16
- package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +14 -14
- package/pack/.claude/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
- package/pack/.claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
- package/pack/.claude/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
- package/pack/.claude/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
- package/pack/.claude/skills/devrites-debug-recovery/reference/trace.md +4 -4
- package/pack/.claude/skills/devrites-doubt/SKILL.md +14 -14
- package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +18 -18
- package/pack/.claude/skills/devrites-frontend-craft/reference/craft.md +17 -17
- package/pack/.claude/skills/devrites-frontend-craft/reference/design-references.md +25 -25
- package/pack/.claude/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
- package/pack/.claude/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
- package/pack/.claude/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
- package/pack/.claude/skills/devrites-frontend-craft/reference/shape.md +13 -13
- package/pack/.claude/skills/devrites-interview/SKILL.md +27 -27
- package/pack/.claude/skills/devrites-lib/SKILL.md +25 -27
- package/pack/.claude/skills/devrites-lib/reference/model-tiers.md +5 -5
- package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
- package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +11 -3
- package/pack/.claude/skills/devrites-lib/reference/standards/README.md +10 -10
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
- package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +37 -37
- package/pack/.claude/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
- package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
- package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +40 -40
- package/pack/.claude/skills/devrites-lib/reference/standards/coding-style.md +7 -7
- package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
- package/pack/.claude/skills/devrites-lib/reference/standards/core.md +23 -23
- package/pack/.claude/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/deprecation.md +18 -18
- package/pack/.claude/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
- package/pack/.claude/skills/devrites-lib/reference/standards/development-workflow.md +12 -13
- package/pack/.claude/skills/devrites-lib/reference/standards/documentation.md +4 -4
- package/pack/.claude/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/elicitation.md +26 -26
- package/pack/.claude/skills/devrites-lib/reference/standards/error-handling.md +4 -4
- package/pack/.claude/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
- package/pack/.claude/skills/devrites-lib/reference/standards/hooks.md +3 -3
- package/pack/.claude/skills/devrites-lib/reference/standards/observability.md +15 -15
- package/pack/.claude/skills/devrites-lib/reference/standards/patterns.md +8 -8
- package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +5 -5
- package/pack/.claude/skills/devrites-lib/reference/standards/principles.md +31 -31
- package/pack/.claude/skills/devrites-lib/reference/standards/prose-style.md +25 -25
- package/pack/.claude/skills/devrites-lib/reference/standards/security.md +30 -30
- package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
- package/pack/.claude/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
- package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +40 -40
- package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +26 -26
- package/pack/.claude/skills/devrites-prose-craft/SKILL.md +5 -5
- package/pack/.claude/skills/devrites-refresh-indexes/SKILL.md +6 -6
- package/pack/.claude/skills/devrites-source-driven/SKILL.md +8 -8
- package/pack/.claude/skills/devrites-ux-shape/SKILL.md +33 -33
- package/pack/.claude/skills/devrites-ux-shape/reference/brief-template.md +6 -6
- package/pack/.claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
- package/pack/.claude/skills/rite/SKILL.md +13 -14
- package/pack/.claude/skills/rite/reference/menu.md +10 -10
- package/pack/.claude/skills/rite-adopt/SKILL.md +17 -18
- package/pack/.claude/skills/rite-adopt/reference/adoption.md +9 -9
- package/pack/.claude/skills/rite-adopt/reference/anti-patterns.md +6 -6
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +14 -14
- package/pack/.claude/skills/rite-autocomplete/reference/decision-policy.md +4 -4
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +7 -7
- package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
- package/pack/.claude/skills/rite-build/SKILL.md +22 -22
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +9 -9
- package/pack/.claude/skills/rite-build/reference/anti-patterns.md +6 -6
- package/pack/.claude/skills/rite-build/reference/checkpoint-protocol.md +14 -14
- package/pack/.claude/skills/rite-build/reference/checkpoint.md +8 -8
- package/pack/.claude/skills/rite-build/reference/evidence-standard.md +1 -1
- package/pack/.claude/skills/rite-build/reference/forge.md +28 -29
- package/pack/.claude/skills/rite-build/reference/frontend-trigger.md +2 -2
- package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +3 -3
- package/pack/.claude/skills/rite-build/reference/output.md +1 -1
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +44 -44
- package/pack/.claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/.claude/skills/rite-build/reference/tdd.md +6 -6
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +23 -23
- package/pack/.claude/skills/rite-converge/SKILL.md +17 -17
- package/pack/.claude/skills/rite-converge/reference/anti-patterns.md +7 -7
- package/pack/.claude/skills/rite-converge/reference/convergence-assessment.md +14 -14
- package/pack/.claude/skills/rite-customize/SKILL.md +2 -2
- package/pack/.claude/skills/rite-define/SKILL.md +25 -25
- package/pack/.claude/skills/rite-define/reference/anti-patterns.md +5 -5
- package/pack/.claude/skills/rite-define/reference/gates.md +13 -13
- package/pack/.claude/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/.claude/skills/rite-doctor/SKILL.md +11 -11
- package/pack/.claude/skills/rite-dogfood/SKILL.md +2 -2
- package/pack/.claude/skills/rite-explain/SKILL.md +22 -22
- package/pack/.claude/skills/rite-explain/reference/intake.md +16 -16
- package/pack/.claude/skills/rite-frame/SKILL.md +22 -22
- package/pack/.claude/skills/rite-frame/reference/failure-modes.md +13 -13
- package/pack/.claude/skills/rite-handoff/SKILL.md +12 -12
- package/pack/.claude/skills/rite-learn/SKILL.md +23 -23
- package/pack/.claude/skills/rite-plan/SKILL.md +21 -21
- package/pack/.claude/skills/rite-plan/reference/anti-patterns.md +3 -3
- package/pack/.claude/skills/rite-plan/reference/dependency-graph.md +1 -1
- package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +3 -3
- package/pack/.claude/skills/rite-plan/reference/slicing.md +9 -9
- package/pack/.claude/skills/rite-plan/reference/task-breakdown.md +3 -3
- package/pack/.claude/skills/rite-polish/SKILL.md +11 -11
- package/pack/.claude/skills/rite-polish/reference/anti-patterns.md +8 -8
- package/pack/.claude/skills/rite-polish/reference/backend-polish.md +13 -13
- package/pack/.claude/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
- package/pack/.claude/skills/rite-polish/reference/code.md +26 -26
- package/pack/.claude/skills/rite-polish/reference/harden-checklist.md +31 -31
- package/pack/.claude/skills/rite-polish/reference/ui.md +23 -23
- package/pack/.claude/skills/rite-pov/SKILL.md +3 -3
- package/pack/.claude/skills/rite-pr-feedback/SKILL.md +2 -2
- package/pack/.claude/skills/rite-pressure-test/SKILL.md +14 -14
- package/pack/.claude/skills/rite-prototype/SKILL.md +13 -13
- package/pack/.claude/skills/rite-prove/SKILL.md +17 -17
- package/pack/.claude/skills/rite-prove/reference/anti-patterns.md +4 -4
- package/pack/.claude/skills/rite-prove/reference/browser-proof.md +2 -2
- package/pack/.claude/skills/rite-prove/reference/failure-triage.md +4 -4
- package/pack/.claude/skills/rite-prove/reference/proof-ladder.md +6 -6
- package/pack/.claude/skills/rite-prove/reference/test-command-discovery.md +1 -1
- package/pack/.claude/skills/rite-quick/SKILL.md +22 -22
- package/pack/.claude/skills/rite-resolve/SKILL.md +18 -18
- package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +7 -7
- package/pack/.claude/skills/rite-review/SKILL.md +34 -34
- package/pack/.claude/skills/rite-review/reference/anti-patterns.md +4 -4
- package/pack/.claude/skills/rite-review/reference/cognitive-load.md +22 -22
- package/pack/.claude/skills/rite-review/reference/feature-scoped-review.md +2 -2
- package/pack/.claude/skills/rite-review/reference/five-axis-review.md +8 -8
- package/pack/.claude/skills/rite-review/reference/nielsen-heuristics.md +14 -14
- package/pack/.claude/skills/rite-review/reference/performance-checklist.md +14 -14
- package/pack/.claude/skills/rite-review/reference/security-review.md +9 -9
- package/pack/.claude/skills/rite-seal/SKILL.md +26 -26
- package/pack/.claude/skills/rite-seal/reference/anti-patterns.md +8 -8
- package/pack/.claude/skills/rite-seal/reference/conventions-ledger.md +8 -8
- package/pack/.claude/skills/rite-seal/reference/final-evidence.md +9 -9
- package/pack/.claude/skills/rite-seal/reference/go-no-go.md +9 -9
- package/pack/.claude/skills/rite-seal/reference/phase-contract.md +43 -43
- package/pack/.claude/skills/rite-ship/SKILL.md +12 -12
- package/pack/.claude/skills/rite-ship/reference/anti-patterns.md +5 -5
- package/pack/.claude/skills/rite-ship/reference/close-out.md +2 -2
- package/pack/.claude/skills/rite-ship/reference/design-memory.md +22 -22
- package/pack/.claude/skills/rite-ship/reference/git-ship.md +10 -10
- package/pack/.claude/skills/rite-ship/reference/ledger.md +9 -9
- package/pack/.claude/skills/rite-ship/reference/rollout.md +11 -11
- package/pack/.claude/skills/rite-ship/reference/ship-template.md +1 -1
- package/pack/.claude/skills/rite-spec/SKILL.md +45 -45
- package/pack/.claude/skills/rite-spec/reference/acceptance-criteria.md +4 -4
- package/pack/.claude/skills/rite-spec/reference/anti-patterns.md +6 -6
- package/pack/.claude/skills/rite-spec/reference/interview-patterns.md +3 -3
- package/pack/.claude/skills/rite-spec/reference/investigation.md +21 -21
- package/pack/.claude/skills/rite-spec/reference/question-protocol.md +9 -9
- package/pack/.claude/skills/rite-spec/reference/references-intake.md +8 -8
- package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +19 -19
- package/pack/.claude/skills/rite-status/SKILL.md +13 -13
- package/pack/.claude/skills/rite-temper/SKILL.md +29 -29
- package/pack/.claude/skills/rite-temper/reference/anti-patterns.md +11 -11
- package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +20 -20
- package/pack/.claude/skills/rite-temper/reference/scope-modes.md +16 -16
- package/pack/.claude/skills/rite-temper/reference/significance.md +10 -10
- package/pack/.claude/skills/rite-temper/reference/strategy-template.md +14 -14
- package/pack/.claude/skills/rite-vet/SKILL.md +31 -31
- package/pack/.claude/skills/rite-vet/reference/anti-patterns.md +14 -14
- package/pack/.claude/skills/rite-vet/reference/artifacts.md +10 -10
- package/pack/.claude/skills/rite-vet/reference/cross-model.md +9 -9
- package/pack/.claude/skills/rite-vet/reference/depth.md +14 -14
- package/pack/.claude/skills/rite-vet/reference/eng-lenses.md +9 -9
- package/pack/.claude/skills/rite-vet/reference/review-axes.md +28 -28
- package/pack/.claude/skills/rite-zoom-out/SKILL.md +18 -18
- package/pack/generated/claude/agents/devrites-code-reviewer.md +21 -22
- package/pack/generated/claude/agents/devrites-devex-reviewer.md +17 -17
- package/pack/generated/claude/agents/devrites-doubt-reviewer.md +6 -6
- package/pack/generated/claude/agents/devrites-forge-judge.md +26 -26
- package/pack/generated/claude/agents/devrites-frontend-reviewer.md +17 -17
- package/pack/generated/claude/agents/devrites-performance-reviewer.md +19 -18
- package/pack/generated/claude/agents/devrites-plan-reviewer.md +29 -27
- package/pack/generated/claude/agents/devrites-retrospector.md +19 -19
- package/pack/generated/claude/agents/devrites-security-auditor.md +15 -15
- package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +14 -14
- package/pack/generated/claude/agents/devrites-slice-wright.md +52 -51
- package/pack/generated/claude/agents/devrites-spec-reviewer.md +11 -11
- package/pack/generated/claude/agents/devrites-strategy-reviewer.md +21 -21
- package/pack/generated/claude/agents/devrites-test-analyst.md +13 -13
- package/pack/generated/claude/settings.json +1 -1
- package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +12 -12
- package/pack/generated/claude/skills/devrites-audit/SKILL.md +7 -7
- package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +16 -16
- package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +14 -14
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/trace.md +4 -4
- package/pack/generated/claude/skills/devrites-doubt/SKILL.md +14 -14
- package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +18 -18
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/craft.md +17 -17
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/design-references.md +25 -25
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/shape.md +13 -13
- package/pack/generated/claude/skills/devrites-interview/SKILL.md +27 -27
- package/pack/generated/claude/skills/devrites-lib/SKILL.md +25 -27
- package/pack/generated/claude/skills/devrites-lib/reference/model-tiers.md +5 -5
- package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
- package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +11 -3
- package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +10 -10
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
- package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +37 -37
- package/pack/generated/claude/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
- package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
- package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +40 -40
- package/pack/generated/claude/skills/devrites-lib/reference/standards/coding-style.md +7 -7
- package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
- package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +23 -23
- package/pack/generated/claude/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/deprecation.md +18 -18
- package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
- package/pack/generated/claude/skills/devrites-lib/reference/standards/development-workflow.md +12 -13
- package/pack/generated/claude/skills/devrites-lib/reference/standards/documentation.md +4 -4
- package/pack/generated/claude/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/elicitation.md +26 -26
- package/pack/generated/claude/skills/devrites-lib/reference/standards/error-handling.md +4 -4
- package/pack/generated/claude/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
- package/pack/generated/claude/skills/devrites-lib/reference/standards/hooks.md +3 -3
- package/pack/generated/claude/skills/devrites-lib/reference/standards/observability.md +15 -15
- package/pack/generated/claude/skills/devrites-lib/reference/standards/patterns.md +8 -8
- package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +5 -5
- package/pack/generated/claude/skills/devrites-lib/reference/standards/principles.md +31 -31
- package/pack/generated/claude/skills/devrites-lib/reference/standards/prose-style.md +25 -25
- package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +30 -30
- package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
- package/pack/generated/claude/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
- package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +40 -40
- package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +26 -26
- package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +5 -5
- package/pack/generated/claude/skills/devrites-refresh-indexes/SKILL.md +6 -6
- package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +8 -8
- package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +33 -33
- package/pack/generated/claude/skills/devrites-ux-shape/reference/brief-template.md +6 -6
- package/pack/generated/claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
- package/pack/generated/claude/skills/rite/SKILL.md +13 -14
- package/pack/generated/claude/skills/rite/reference/menu.md +10 -10
- package/pack/generated/claude/skills/rite-adopt/SKILL.md +17 -18
- package/pack/generated/claude/skills/rite-adopt/reference/adoption.md +9 -9
- package/pack/generated/claude/skills/rite-adopt/reference/anti-patterns.md +6 -6
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +14 -14
- package/pack/generated/claude/skills/rite-autocomplete/reference/decision-policy.md +4 -4
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +7 -7
- package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
- package/pack/generated/claude/skills/rite-build/SKILL.md +22 -22
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +9 -9
- package/pack/generated/claude/skills/rite-build/reference/anti-patterns.md +6 -6
- package/pack/generated/claude/skills/rite-build/reference/checkpoint-protocol.md +14 -14
- package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +8 -8
- package/pack/generated/claude/skills/rite-build/reference/evidence-standard.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/forge.md +28 -29
- package/pack/generated/claude/skills/rite-build/reference/frontend-trigger.md +2 -2
- package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +3 -3
- package/pack/generated/claude/skills/rite-build/reference/output.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +44 -44
- package/pack/generated/claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/tdd.md +6 -6
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +23 -23
- package/pack/generated/claude/skills/rite-converge/SKILL.md +17 -17
- package/pack/generated/claude/skills/rite-converge/reference/anti-patterns.md +7 -7
- package/pack/generated/claude/skills/rite-converge/reference/convergence-assessment.md +14 -14
- package/pack/generated/claude/skills/rite-customize/SKILL.md +2 -2
- package/pack/generated/claude/skills/rite-define/SKILL.md +25 -25
- package/pack/generated/claude/skills/rite-define/reference/anti-patterns.md +5 -5
- package/pack/generated/claude/skills/rite-define/reference/gates.md +13 -13
- package/pack/generated/claude/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/generated/claude/skills/rite-doctor/SKILL.md +11 -11
- package/pack/generated/claude/skills/rite-dogfood/SKILL.md +2 -2
- package/pack/generated/claude/skills/rite-explain/SKILL.md +22 -22
- package/pack/generated/claude/skills/rite-explain/reference/intake.md +16 -16
- package/pack/generated/claude/skills/rite-frame/SKILL.md +22 -22
- package/pack/generated/claude/skills/rite-frame/reference/failure-modes.md +13 -13
- package/pack/generated/claude/skills/rite-handoff/SKILL.md +12 -12
- package/pack/generated/claude/skills/rite-learn/SKILL.md +23 -23
- package/pack/generated/claude/skills/rite-plan/SKILL.md +21 -21
- package/pack/generated/claude/skills/rite-plan/reference/anti-patterns.md +3 -3
- package/pack/generated/claude/skills/rite-plan/reference/dependency-graph.md +1 -1
- package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +3 -3
- package/pack/generated/claude/skills/rite-plan/reference/slicing.md +9 -9
- package/pack/generated/claude/skills/rite-plan/reference/task-breakdown.md +3 -3
- package/pack/generated/claude/skills/rite-polish/SKILL.md +11 -11
- package/pack/generated/claude/skills/rite-polish/reference/anti-patterns.md +8 -8
- package/pack/generated/claude/skills/rite-polish/reference/backend-polish.md +13 -13
- package/pack/generated/claude/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
- package/pack/generated/claude/skills/rite-polish/reference/code.md +26 -26
- package/pack/generated/claude/skills/rite-polish/reference/harden-checklist.md +31 -31
- package/pack/generated/claude/skills/rite-polish/reference/ui.md +23 -23
- package/pack/generated/claude/skills/rite-pov/SKILL.md +3 -3
- package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +2 -2
- package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +14 -14
- package/pack/generated/claude/skills/rite-prototype/SKILL.md +13 -13
- package/pack/generated/claude/skills/rite-prove/SKILL.md +17 -17
- package/pack/generated/claude/skills/rite-prove/reference/anti-patterns.md +4 -4
- package/pack/generated/claude/skills/rite-prove/reference/browser-proof.md +2 -2
- package/pack/generated/claude/skills/rite-prove/reference/failure-triage.md +4 -4
- package/pack/generated/claude/skills/rite-prove/reference/proof-ladder.md +6 -6
- package/pack/generated/claude/skills/rite-prove/reference/test-command-discovery.md +1 -1
- package/pack/generated/claude/skills/rite-quick/SKILL.md +22 -22
- package/pack/generated/claude/skills/rite-resolve/SKILL.md +18 -18
- package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +7 -7
- package/pack/generated/claude/skills/rite-review/SKILL.md +34 -34
- package/pack/generated/claude/skills/rite-review/reference/anti-patterns.md +4 -4
- package/pack/generated/claude/skills/rite-review/reference/cognitive-load.md +22 -22
- package/pack/generated/claude/skills/rite-review/reference/feature-scoped-review.md +2 -2
- package/pack/generated/claude/skills/rite-review/reference/five-axis-review.md +8 -8
- package/pack/generated/claude/skills/rite-review/reference/nielsen-heuristics.md +14 -14
- package/pack/generated/claude/skills/rite-review/reference/performance-checklist.md +14 -14
- package/pack/generated/claude/skills/rite-review/reference/security-review.md +9 -9
- package/pack/generated/claude/skills/rite-seal/SKILL.md +26 -26
- package/pack/generated/claude/skills/rite-seal/reference/anti-patterns.md +8 -8
- package/pack/generated/claude/skills/rite-seal/reference/conventions-ledger.md +8 -8
- package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +9 -9
- package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +9 -9
- package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +43 -43
- package/pack/generated/claude/skills/rite-ship/SKILL.md +12 -12
- package/pack/generated/claude/skills/rite-ship/reference/anti-patterns.md +5 -5
- package/pack/generated/claude/skills/rite-ship/reference/close-out.md +2 -2
- package/pack/generated/claude/skills/rite-ship/reference/design-memory.md +22 -22
- package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +10 -10
- package/pack/generated/claude/skills/rite-ship/reference/ledger.md +9 -9
- package/pack/generated/claude/skills/rite-ship/reference/rollout.md +11 -11
- package/pack/generated/claude/skills/rite-ship/reference/ship-template.md +1 -1
- package/pack/generated/claude/skills/rite-spec/SKILL.md +45 -45
- package/pack/generated/claude/skills/rite-spec/reference/acceptance-criteria.md +4 -4
- package/pack/generated/claude/skills/rite-spec/reference/anti-patterns.md +6 -6
- package/pack/generated/claude/skills/rite-spec/reference/interview-patterns.md +3 -3
- package/pack/generated/claude/skills/rite-spec/reference/investigation.md +21 -21
- package/pack/generated/claude/skills/rite-spec/reference/question-protocol.md +9 -9
- package/pack/generated/claude/skills/rite-spec/reference/references-intake.md +8 -8
- package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +19 -19
- package/pack/generated/claude/skills/rite-status/SKILL.md +13 -13
- package/pack/generated/claude/skills/rite-temper/SKILL.md +29 -29
- package/pack/generated/claude/skills/rite-temper/reference/anti-patterns.md +11 -11
- package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +20 -20
- package/pack/generated/claude/skills/rite-temper/reference/scope-modes.md +16 -16
- package/pack/generated/claude/skills/rite-temper/reference/significance.md +10 -10
- package/pack/generated/claude/skills/rite-temper/reference/strategy-template.md +14 -14
- package/pack/generated/claude/skills/rite-vet/SKILL.md +31 -31
- package/pack/generated/claude/skills/rite-vet/reference/anti-patterns.md +14 -14
- package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +10 -10
- package/pack/generated/claude/skills/rite-vet/reference/cross-model.md +9 -9
- package/pack/generated/claude/skills/rite-vet/reference/depth.md +14 -14
- package/pack/generated/claude/skills/rite-vet/reference/eng-lenses.md +9 -9
- package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +28 -28
- package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +18 -18
- package/pack/generated/codex/agents/devrites-code-reviewer.toml +21 -22
- package/pack/generated/codex/agents/devrites-devex-reviewer.toml +17 -17
- package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +6 -6
- package/pack/generated/codex/agents/devrites-forge-judge.toml +26 -26
- package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +17 -17
- package/pack/generated/codex/agents/devrites-performance-reviewer.toml +19 -18
- package/pack/generated/codex/agents/devrites-plan-reviewer.toml +29 -27
- package/pack/generated/codex/agents/devrites-retrospector.toml +19 -19
- package/pack/generated/codex/agents/devrites-security-auditor.toml +15 -15
- package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +14 -14
- package/pack/generated/codex/agents/devrites-slice-wright.toml +52 -51
- package/pack/generated/codex/agents/devrites-spec-reviewer.toml +11 -11
- package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +21 -21
- package/pack/generated/codex/agents/devrites-test-analyst.toml +13 -13
- package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +15 -15
- package/pack/generated/codex/skills/devrites-audit/SKILL.md +10 -10
- package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +19 -19
- package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +17 -17
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/trace.md +4 -4
- package/pack/generated/codex/skills/devrites-doubt/SKILL.md +17 -17
- package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +20 -20
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/craft.md +17 -17
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/design-references.md +25 -25
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/shape.md +13 -13
- package/pack/generated/codex/skills/devrites-interview/SKILL.md +30 -30
- package/pack/generated/codex/skills/devrites-lib/SKILL.md +28 -30
- package/pack/generated/codex/skills/devrites-lib/reference/model-tiers.md +5 -5
- package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
- package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +11 -3
- package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +10 -10
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
- package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +37 -37
- package/pack/generated/codex/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
- package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
- package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +40 -40
- package/pack/generated/codex/skills/devrites-lib/reference/standards/coding-style.md +7 -7
- package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
- package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +23 -23
- package/pack/generated/codex/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/deprecation.md +18 -18
- package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
- package/pack/generated/codex/skills/devrites-lib/reference/standards/development-workflow.md +12 -13
- package/pack/generated/codex/skills/devrites-lib/reference/standards/documentation.md +4 -4
- package/pack/generated/codex/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/elicitation.md +26 -26
- package/pack/generated/codex/skills/devrites-lib/reference/standards/error-handling.md +4 -4
- package/pack/generated/codex/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
- package/pack/generated/codex/skills/devrites-lib/reference/standards/hooks.md +3 -3
- package/pack/generated/codex/skills/devrites-lib/reference/standards/observability.md +15 -15
- package/pack/generated/codex/skills/devrites-lib/reference/standards/patterns.md +8 -8
- package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +5 -5
- package/pack/generated/codex/skills/devrites-lib/reference/standards/principles.md +31 -31
- package/pack/generated/codex/skills/devrites-lib/reference/standards/prose-style.md +25 -25
- package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +30 -30
- package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
- package/pack/generated/codex/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
- package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +40 -40
- package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +26 -26
- package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +8 -8
- package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +9 -9
- package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +11 -11
- package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +36 -36
- package/pack/generated/codex/skills/devrites-ux-shape/reference/brief-template.md +6 -6
- package/pack/generated/codex/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
- package/pack/generated/codex/skills/rite/SKILL.md +16 -17
- package/pack/generated/codex/skills/rite/reference/menu.md +10 -10
- package/pack/generated/codex/skills/rite-adopt/SKILL.md +20 -21
- package/pack/generated/codex/skills/rite-adopt/reference/adoption.md +9 -9
- package/pack/generated/codex/skills/rite-adopt/reference/anti-patterns.md +6 -6
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +17 -17
- package/pack/generated/codex/skills/rite-autocomplete/reference/decision-policy.md +4 -4
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +7 -7
- package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
- package/pack/generated/codex/skills/rite-build/SKILL.md +25 -25
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +9 -9
- package/pack/generated/codex/skills/rite-build/reference/anti-patterns.md +6 -6
- package/pack/generated/codex/skills/rite-build/reference/checkpoint-protocol.md +14 -14
- package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +8 -8
- package/pack/generated/codex/skills/rite-build/reference/evidence-standard.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/forge.md +28 -29
- package/pack/generated/codex/skills/rite-build/reference/frontend-trigger.md +2 -2
- package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +3 -3
- package/pack/generated/codex/skills/rite-build/reference/output.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +44 -44
- package/pack/generated/codex/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/tdd.md +6 -6
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +23 -23
- package/pack/generated/codex/skills/rite-converge/SKILL.md +20 -20
- package/pack/generated/codex/skills/rite-converge/reference/anti-patterns.md +7 -7
- package/pack/generated/codex/skills/rite-converge/reference/convergence-assessment.md +14 -14
- package/pack/generated/codex/skills/rite-customize/SKILL.md +5 -5
- package/pack/generated/codex/skills/rite-define/SKILL.md +28 -28
- package/pack/generated/codex/skills/rite-define/reference/anti-patterns.md +5 -5
- package/pack/generated/codex/skills/rite-define/reference/gates.md +13 -13
- package/pack/generated/codex/skills/rite-define/reference/plan-template.md +1 -1
- package/pack/generated/codex/skills/rite-doctor/SKILL.md +14 -14
- package/pack/generated/codex/skills/rite-dogfood/SKILL.md +5 -5
- package/pack/generated/codex/skills/rite-explain/SKILL.md +25 -25
- package/pack/generated/codex/skills/rite-explain/reference/intake.md +16 -16
- package/pack/generated/codex/skills/rite-frame/SKILL.md +25 -25
- package/pack/generated/codex/skills/rite-frame/reference/failure-modes.md +13 -13
- package/pack/generated/codex/skills/rite-handoff/SKILL.md +15 -15
- package/pack/generated/codex/skills/rite-learn/SKILL.md +26 -26
- package/pack/generated/codex/skills/rite-plan/SKILL.md +24 -24
- package/pack/generated/codex/skills/rite-plan/reference/anti-patterns.md +3 -3
- package/pack/generated/codex/skills/rite-plan/reference/dependency-graph.md +1 -1
- package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +3 -3
- package/pack/generated/codex/skills/rite-plan/reference/slicing.md +9 -9
- package/pack/generated/codex/skills/rite-plan/reference/task-breakdown.md +3 -3
- package/pack/generated/codex/skills/rite-polish/SKILL.md +14 -14
- package/pack/generated/codex/skills/rite-polish/reference/anti-patterns.md +8 -8
- package/pack/generated/codex/skills/rite-polish/reference/backend-polish.md +13 -13
- package/pack/generated/codex/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
- package/pack/generated/codex/skills/rite-polish/reference/code.md +26 -26
- package/pack/generated/codex/skills/rite-polish/reference/harden-checklist.md +31 -31
- package/pack/generated/codex/skills/rite-polish/reference/ui.md +23 -23
- package/pack/generated/codex/skills/rite-pov/SKILL.md +6 -6
- package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +5 -5
- package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +17 -17
- package/pack/generated/codex/skills/rite-prototype/SKILL.md +16 -16
- package/pack/generated/codex/skills/rite-prove/SKILL.md +20 -20
- package/pack/generated/codex/skills/rite-prove/reference/anti-patterns.md +4 -4
- package/pack/generated/codex/skills/rite-prove/reference/browser-proof.md +2 -2
- package/pack/generated/codex/skills/rite-prove/reference/failure-triage.md +4 -4
- package/pack/generated/codex/skills/rite-prove/reference/proof-ladder.md +6 -6
- package/pack/generated/codex/skills/rite-prove/reference/test-command-discovery.md +1 -1
- package/pack/generated/codex/skills/rite-quick/SKILL.md +25 -25
- package/pack/generated/codex/skills/rite-resolve/SKILL.md +21 -21
- package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +7 -7
- package/pack/generated/codex/skills/rite-review/SKILL.md +37 -37
- package/pack/generated/codex/skills/rite-review/reference/anti-patterns.md +4 -4
- package/pack/generated/codex/skills/rite-review/reference/cognitive-load.md +22 -22
- package/pack/generated/codex/skills/rite-review/reference/feature-scoped-review.md +2 -2
- package/pack/generated/codex/skills/rite-review/reference/five-axis-review.md +8 -8
- package/pack/generated/codex/skills/rite-review/reference/nielsen-heuristics.md +14 -14
- package/pack/generated/codex/skills/rite-review/reference/performance-checklist.md +14 -14
- package/pack/generated/codex/skills/rite-review/reference/security-review.md +9 -9
- package/pack/generated/codex/skills/rite-seal/SKILL.md +29 -29
- package/pack/generated/codex/skills/rite-seal/reference/anti-patterns.md +8 -8
- package/pack/generated/codex/skills/rite-seal/reference/conventions-ledger.md +8 -8
- package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +9 -9
- package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +9 -9
- package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +43 -43
- package/pack/generated/codex/skills/rite-ship/SKILL.md +15 -15
- package/pack/generated/codex/skills/rite-ship/reference/anti-patterns.md +5 -5
- package/pack/generated/codex/skills/rite-ship/reference/close-out.md +2 -2
- package/pack/generated/codex/skills/rite-ship/reference/design-memory.md +22 -22
- package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +10 -10
- package/pack/generated/codex/skills/rite-ship/reference/ledger.md +9 -9
- package/pack/generated/codex/skills/rite-ship/reference/rollout.md +11 -11
- package/pack/generated/codex/skills/rite-ship/reference/ship-template.md +1 -1
- package/pack/generated/codex/skills/rite-spec/SKILL.md +48 -48
- package/pack/generated/codex/skills/rite-spec/reference/acceptance-criteria.md +4 -4
- package/pack/generated/codex/skills/rite-spec/reference/anti-patterns.md +6 -6
- package/pack/generated/codex/skills/rite-spec/reference/interview-patterns.md +3 -3
- package/pack/generated/codex/skills/rite-spec/reference/investigation.md +21 -21
- package/pack/generated/codex/skills/rite-spec/reference/question-protocol.md +9 -9
- package/pack/generated/codex/skills/rite-spec/reference/references-intake.md +8 -8
- package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +19 -19
- package/pack/generated/codex/skills/rite-status/SKILL.md +16 -16
- package/pack/generated/codex/skills/rite-temper/SKILL.md +32 -32
- package/pack/generated/codex/skills/rite-temper/reference/anti-patterns.md +11 -11
- package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +20 -20
- package/pack/generated/codex/skills/rite-temper/reference/scope-modes.md +16 -16
- package/pack/generated/codex/skills/rite-temper/reference/significance.md +10 -10
- package/pack/generated/codex/skills/rite-temper/reference/strategy-template.md +14 -14
- package/pack/generated/codex/skills/rite-vet/SKILL.md +34 -34
- package/pack/generated/codex/skills/rite-vet/reference/anti-patterns.md +14 -14
- package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +10 -10
- package/pack/generated/codex/skills/rite-vet/reference/cross-model.md +9 -9
- package/pack/generated/codex/skills/rite-vet/reference/depth.md +14 -14
- package/pack/generated/codex/skills/rite-vet/reference/eng-lenses.md +9 -9
- package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +28 -28
- package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +21 -21
- package/package.json +2 -2
- package/scripts/build-binaries.sh +1 -1
- package/scripts/build-host-artifacts.sh +1 -1
- package/scripts/build-release-tarball.sh +1 -1
- package/scripts/check-cross-refs.py +8 -8
- package/scripts/check-invocation-integrity.py +4 -4
- package/scripts/check-no-global-writes.sh +2 -2
- package/scripts/check-reply-contract.sh +1 -1
- package/scripts/check-rule-uniqueness.sh +2 -2
- package/scripts/codex-generate.sh +5 -5
- package/scripts/devrites-detect.sh +33 -33
- package/scripts/eval-runner.py +7 -7
- package/scripts/grade-feature.sh +14 -14
- package/scripts/install-lib.sh +2 -2
- package/scripts/pin.sh +12 -12
- package/scripts/run-behavioral-evals.sh +12 -12
- package/scripts/run-evals.sh +1 -1
- package/scripts/run-outcome-evals.sh +12 -12
- package/scripts/scan-pack-security.py +4 -4
- package/scripts/scan-supply-chain-iocs.py +7 -7
- package/scripts/skills-inventory.mjs +21 -4
- package/scripts/sync-version.sh +2 -2
- package/scripts/validate-workflow-security.py +12 -6
- package/scripts/validate-workspace-schema.py +2 -2
- package/scripts/validate.sh +7 -7
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Enforcement is phase-relative, gate-scoped, and transition-fired: a gate
|
|
4
4
|
// checks only the sections required to make its transition, and only when it is
|
|
5
|
-
// run
|
|
5
|
+
// run: never on every tool call. A block is a HITL pause (a structured
|
|
6
6
|
// "missing X" the human resolves and retries), never a crash. Judgment gates
|
|
7
7
|
// stay advisory; these deterministic gates are the ones allowed to block.
|
|
8
8
|
package gate
|
|
@@ -23,10 +23,10 @@ type Kind string
|
|
|
23
23
|
|
|
24
24
|
const (
|
|
25
25
|
// Readiness checks the sections required to LEAVE the feature's current
|
|
26
|
-
// phase
|
|
26
|
+
// phase: the gate fired when advancing to the next phase.
|
|
27
27
|
Readiness Kind = "readiness"
|
|
28
28
|
// Seal checks the full seal-phase requirement set regardless of the
|
|
29
|
-
// feature's current phase
|
|
29
|
+
// feature's current phase: the final completeness gate before shipping.
|
|
30
30
|
Seal Kind = "seal"
|
|
31
31
|
)
|
|
32
32
|
|
|
@@ -44,7 +44,7 @@ type Result struct {
|
|
|
44
44
|
// Check runs a gate against feature <slug> under root, reading the files
|
|
45
45
|
// directly (the files are always the source of truth, so a gate never trusts a
|
|
46
46
|
// possibly-stale cache). It returns an error only for a genuinely broken request
|
|
47
|
-
// (unknown slug, unreadable state)
|
|
47
|
+
// (unknown slug, unreadable state): a legitimately incomplete feature is a
|
|
48
48
|
// Result with Blocked set, not an error.
|
|
49
49
|
func Check(kind Kind, root, slug string) (*Result, error) {
|
|
50
50
|
f, err := state.LoadFeature(root, slug)
|
|
@@ -68,7 +68,7 @@ func Check(kind Kind, root, slug string) (*Result, error) {
|
|
|
68
68
|
|
|
69
69
|
// Render produces the deterministic, greppable gate output (with a trailing
|
|
70
70
|
// newline). A block names exactly the missing sections and the resolve step, so
|
|
71
|
-
// a human
|
|
71
|
+
// a human (or an AFK agent) knows precisely what to fix.
|
|
72
72
|
func (r *Result) Render() string {
|
|
73
73
|
var b strings.Builder
|
|
74
74
|
fmt.Fprintf(&b, "gate: %s\n", r.Kind)
|
|
@@ -92,10 +92,10 @@ func (r *Result) Render() string {
|
|
|
92
92
|
// StopGate evaluates the stop-hook rest-point invariant for the active feature:
|
|
93
93
|
// a feature that CLAIMS completion (it has advanced to seal, ship, or done)
|
|
94
94
|
// must not have an empty proof section. This is a rest-point check, NOT
|
|
95
|
-
// whole-feature completeness
|
|
95
|
+
// whole-feature completeness: normal in-progress incompleteness never trips it,
|
|
96
96
|
// so a mid-build turn is never blocked.
|
|
97
97
|
//
|
|
98
|
-
// It returns a zero StopResult (Blocked false)
|
|
98
|
+
// It returns a zero StopResult (Blocked false) (silent, no block) when there
|
|
99
99
|
// is no active feature or the workspace can't be read, keeping the stop hook
|
|
100
100
|
// fail-open.
|
|
101
101
|
func StopGate(root string) (StopResult, error) {
|
|
@@ -108,7 +108,7 @@ func StopGate(root string) (StopResult, error) {
|
|
|
108
108
|
return StopResult{}, nil // fail-open: a broken workspace never wedges Stop
|
|
109
109
|
}
|
|
110
110
|
// Fail-on-red: the redwatch hook marks a known-red suite by writing .red. A turn
|
|
111
|
-
// must not rest while it is set
|
|
111
|
+
// must not rest while it is set: evidence over confidence. This is a rest-point
|
|
112
112
|
// invariant (a concrete, provable inconsistency), not whole-feature completeness.
|
|
113
113
|
featureDir := devritespaths.FeatureDir(root, slug)
|
|
114
114
|
if _, statErr := os.Stat(filepath.Join(featureDir, ".red")); statErr == nil {
|
|
@@ -116,7 +116,7 @@ func StopGate(root string) (StopResult, error) {
|
|
|
116
116
|
Slug: slug,
|
|
117
117
|
Blocked: true,
|
|
118
118
|
Reason: fmt.Sprintf(
|
|
119
|
-
"feature %q has tests/build RED (.red is set)
|
|
119
|
+
"feature %q has tests/build RED (.red is set): fix to green, or record the failure and next step, before stopping",
|
|
120
120
|
slug),
|
|
121
121
|
}, nil
|
|
122
122
|
}
|
|
@@ -125,7 +125,7 @@ func StopGate(root string) (StopResult, error) {
|
|
|
125
125
|
Slug: slug,
|
|
126
126
|
Blocked: true,
|
|
127
127
|
Reason: fmt.Sprintf(
|
|
128
|
-
"feature %q has open %s human question(s) in questions.md but state.md is not awaiting_human
|
|
128
|
+
"feature %q has open %s human question(s) in questions.md but state.md is not awaiting_human: surface the gate before stopping",
|
|
129
129
|
slug, strings.Join(gates, "/")),
|
|
130
130
|
}, nil
|
|
131
131
|
}
|
|
@@ -135,7 +135,7 @@ func StopGate(root string) (StopResult, error) {
|
|
|
135
135
|
Slug: slug,
|
|
136
136
|
Blocked: true,
|
|
137
137
|
Reason: fmt.Sprintf(
|
|
138
|
-
"feature %q is at phase %q but proof.md is empty
|
|
138
|
+
"feature %q is at phase %q but proof.md is empty: record acceptance evidence, or move the phase back, before stopping",
|
|
139
139
|
slug, f.Phase),
|
|
140
140
|
}, nil
|
|
141
141
|
}
|
|
@@ -95,7 +95,7 @@ func RenderMatrix() string {
|
|
|
95
95
|
}
|
|
96
96
|
b.WriteString("\nTiers: **Native** (the harness exposes and delivers the surface directly; policy notes state whether it blocks) · **Adapter-backed** ")
|
|
97
97
|
b.WriteString("(supported through a translation shim) · **Instruction-backed** ")
|
|
98
|
-
b.WriteString("(no runtime surface
|
|
98
|
+
b.WriteString("(no runtime surface: rides on a directive the model may under-fire) · ")
|
|
99
99
|
b.WriteString("**Conditional** (native but gated on an operator precondition).\n\n")
|
|
100
100
|
b.WriteString(MatrixEndMarker)
|
|
101
101
|
return b.String()
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// One binary serves both Claude Code and Codex. The shared gate/orientation
|
|
4
4
|
// logic lives in the middle (internal/orient, internal/gate); this package
|
|
5
5
|
// translates each harness's hook stdin schema and its exit/decision convention.
|
|
6
|
-
// The engine never calls a model
|
|
6
|
+
// The engine never calls a model: these adapters only shape stdin/stdout.
|
|
7
7
|
package harness
|
|
8
8
|
|
|
9
9
|
import (
|
|
@@ -93,7 +93,7 @@ type StopInput struct {
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
// ParseStopInput decodes a Stop hook's stdin. An empty or malformed payload is
|
|
96
|
-
// not an error
|
|
96
|
+
// not an error: it decodes to the zero value (StopHookActive false), so a
|
|
97
97
|
// harness that sends nothing simply gets a first-pass gate check. This keeps the
|
|
98
98
|
// hook fail-open: bad stdin never crashes it.
|
|
99
99
|
func (h Harness) ParseStopInput(r io.Reader) StopInput {
|
|
@@ -107,8 +107,8 @@ func (h Harness) ParseStopInput(r io.Reader) StopInput {
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
// PreToolInput is the subset of a PreToolUse hook's stdin the reviewer-readonly
|
|
110
|
-
// guard reads: which tool is about to run, its command, and
|
|
111
|
-
// agent-scoping gate
|
|
110
|
+
// guard reads: which tool is about to run, its command, and: for the optional
|
|
111
|
+
// agent-scoping gate: the calling subagent's name. Every field is best-effort:
|
|
112
112
|
// a hook that can't identify the tool simply falls through to its silent no-op.
|
|
113
113
|
type PreToolInput struct {
|
|
114
114
|
ToolName string
|
|
@@ -118,7 +118,7 @@ type PreToolInput struct {
|
|
|
118
118
|
|
|
119
119
|
// ParsePreToolInput decodes a PreToolUse payload. Like ParseStopInput it never
|
|
120
120
|
// errors: an empty or malformed payload decodes to the zero value so a guard hook
|
|
121
|
-
// stays fail-open. AgentType reads `agent_type` ONLY
|
|
121
|
+
// stays fail-open. AgentType reads `agent_type` ONLY: matching
|
|
122
122
|
// devrites-reviewer-readonly.sh's node parse exactly (it does not consult the
|
|
123
123
|
// subagent_type / agentType aliases; SubagentAgentType does, for the subagent
|
|
124
124
|
// hook that needs them).
|
|
@@ -145,7 +145,7 @@ func (h Harness) ParsePreToolInput(r io.Reader) PreToolInput {
|
|
|
145
145
|
|
|
146
146
|
// SubagentAgentType decodes just the spawned subagent's name from a SubagentStart
|
|
147
147
|
// payload, reading whichever of agent_type / subagent_type / agentType the harness
|
|
148
|
-
// populates (Claude and Codex differ)
|
|
148
|
+
// populates (Claude and Codex differ): the exact 3-way fallback
|
|
149
149
|
// devrites-subagent-orient.sh uses. Never errors: bad stdin yields "".
|
|
150
150
|
func (h Harness) SubagentAgentType(r io.Reader) string {
|
|
151
151
|
var raw struct {
|
|
@@ -198,7 +198,7 @@ type preToolEnvelope struct {
|
|
|
198
198
|
// GuardInput is the fuller PreToolUse / PostToolUse payload the write-guards read:
|
|
199
199
|
// the tool + its command / target path, the calling subagent's identity (both the
|
|
200
200
|
// agent_id Claude sends and the agent_type Codex sends), and the tool's response
|
|
201
|
-
// text (for the post-hooks that inspect output). Best-effort
|
|
201
|
+
// text (for the post-hooks that inspect output). Best-effort: bad stdin yields
|
|
202
202
|
// the zero value so a guard stays fail-open.
|
|
203
203
|
type GuardInput struct {
|
|
204
204
|
ToolName string
|
|
@@ -1185,6 +1185,8 @@ func containsDevritesHook(v any) bool {
|
|
|
1185
1185
|
|
|
1186
1186
|
func isDevritesHooksComment(comment string) bool {
|
|
1187
1187
|
return comment == "DevRites hooks" ||
|
|
1188
|
+
strings.HasPrefix(comment, "DevRites hooks: every event invokes the global `devrites-engine` engine binary") ||
|
|
1189
|
+
strings.HasPrefix(comment, "DevRites hooks: auto-approve the read-only orientation/gate scripts") ||
|
|
1188
1190
|
strings.HasPrefix(comment, "DevRites hooks — every event invokes the global `devrites-engine` engine binary") ||
|
|
1189
1191
|
strings.HasPrefix(comment, "DevRites hooks — auto-approve the read-only orientation/gate scripts") ||
|
|
1190
1192
|
strings.HasPrefix(comment, "DevRites hooks for Codex. Project hooks load only after")
|
|
@@ -195,7 +195,7 @@ func TestInstallMergesClaudeHooksIntoExistingSettings(t *testing.T) {
|
|
|
195
195
|
}`+"\n")
|
|
196
196
|
target := t.TempDir()
|
|
197
197
|
testutil.WriteFile(t, filepath.Join(target, ".claude", "settings.json"), `{
|
|
198
|
-
"$comment": "DevRites hooks
|
|
198
|
+
"$comment": "DevRites hooks: keep my local notes",
|
|
199
199
|
"theme": "dark",
|
|
200
200
|
"statusLine": {"type":"command","command":"DEVRITES_THEME=dark echo user-status"},
|
|
201
201
|
"hooks": {"Stop":[{"hooks":[
|
|
@@ -209,7 +209,7 @@ func TestInstallMergesClaudeHooksIntoExistingSettings(t *testing.T) {
|
|
|
209
209
|
runInstall(t, target, payload, func(o *Options) { o.Stderr = &stderr })
|
|
210
210
|
|
|
211
211
|
settings := testutil.ReadFile(t, filepath.Join(target, ".claude", "settings.json"))
|
|
212
|
-
for _, preserved := range []string{"DevRites hooks
|
|
212
|
+
for _, preserved := range []string{"DevRites hooks: keep my local notes", `"theme": "dark"`, "echo user-status", "echo user-stop"} {
|
|
213
213
|
if !strings.Contains(settings, preserved) {
|
|
214
214
|
t.Fatalf("Claude settings lost user content %q:\n%s", preserved, settings)
|
|
215
215
|
}
|
|
@@ -229,7 +229,7 @@ func TestInstallMergesClaudeHooksIntoExistingSettings(t *testing.T) {
|
|
|
229
229
|
|
|
230
230
|
runUninstall(t, target)
|
|
231
231
|
settings = testutil.ReadFile(t, filepath.Join(target, ".claude", "settings.json"))
|
|
232
|
-
for _, preserved := range []string{"DevRites hooks
|
|
232
|
+
for _, preserved := range []string{"DevRites hooks: keep my local notes", `"theme": "dark"`, "echo user-status", "echo user-stop"} {
|
|
233
233
|
if !strings.Contains(settings, preserved) {
|
|
234
234
|
t.Fatalf("Claude settings uninstall lost user content %q:\n%s", preserved, settings)
|
|
235
235
|
}
|
|
@@ -5,7 +5,7 @@ package iohooks
|
|
|
5
5
|
import "syscall"
|
|
6
6
|
|
|
7
7
|
// detachSysProcAttr starts the refresh worker in its own session so it outlives the
|
|
8
|
-
// Stop hook that spawned it
|
|
8
|
+
// Stop hook that spawned it: the detached-background contract of refresh-indexes.
|
|
9
9
|
func detachSysProcAttr() *syscall.SysProcAttr {
|
|
10
10
|
return &syscall.SysProcAttr{Setsid: true}
|
|
11
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
package iohooks
|
|
2
2
|
|
|
3
|
-
// IO hooks: the ported bash hooks that do network or process-orchestration IO
|
|
3
|
+
// IO hooks: the ported bash hooks that do network or process-orchestration IO:
|
|
4
4
|
// the source-citation cache (a conditional-HEAD revalidation cache) and the
|
|
5
5
|
// code-index refresher (a detached background reindex). Unlike the deterministic
|
|
6
6
|
// control-plane hooks these reach the network / spawn processes; they are kept in
|
|
@@ -47,7 +47,7 @@ type sourceCacheEntry struct {
|
|
|
47
47
|
|
|
48
48
|
func sourceCacheOff() bool { return os.Getenv("DEVRITES_SOURCE_CACHE") == "off" }
|
|
49
49
|
|
|
50
|
-
// ioProjectDir is the repo root the IO hooks key off
|
|
50
|
+
// ioProjectDir is the repo root the IO hooks key off: CLAUDE_PROJECT_DIR or CWD,
|
|
51
51
|
// like the shell hooks. (The cache is project-global under .devrites/, not
|
|
52
52
|
// feature-scoped, so it does not use the feature-dir resolver.)
|
|
53
53
|
func ioProjectDir() string {
|
|
@@ -61,7 +61,7 @@ func ioProjectDir() string {
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
// sourceCachePath is the entry path for a URL: .devrites/source-cache/<key>.json,
|
|
64
|
-
// keyed on the first 32 hex chars of sha256(url)
|
|
64
|
+
// keyed on the first 32 hex chars of sha256(url): matching the shell hooks.
|
|
65
65
|
func sourceCachePath(url string) string {
|
|
66
66
|
sum := sha256.Sum256([]byte(url))
|
|
67
67
|
key := hex.EncodeToString(sum[:])[:32]
|
|
@@ -69,7 +69,7 @@ func sourceCachePath(url string) string {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
// hookSourceCachePre serves a cached page reading ONLY after revalidating it with a
|
|
72
|
-
// conditional HEAD that returns 304
|
|
72
|
+
// conditional HEAD that returns 304: a fresh verification, not a memory read.
|
|
73
73
|
// Ported from devrites-source-cache-pre.sh. Cache hit → the reading on stderr +
|
|
74
74
|
// exit 2 (Claude hands that to the agent in place of the fetch); miss/uncertain →
|
|
75
75
|
// exit 0 (the real WebFetch proceeds). Fail-open on every uncertainty.
|
|
@@ -124,7 +124,7 @@ func SourceCachePre(stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
124
124
|
fetched = "a previous fetch"
|
|
125
125
|
}
|
|
126
126
|
fmt.Fprintf(stderr, "[devrites-source-cache] Cache hit for %s\n", url)
|
|
127
|
-
fmt.Fprintf(stderr, "Revalidated via HTTP 304
|
|
127
|
+
fmt.Fprintf(stderr, "Revalidated via HTTP 304: the page is unchanged since %s, so this cached reading is still a valid citation.\n", fetched)
|
|
128
128
|
if e.Prompt != "" {
|
|
129
129
|
fmt.Fprintf(stderr, "Cached under the prompt: %q. If your angle differs, judge whether this reading still covers it before re-fetching.\n", e.Prompt)
|
|
130
130
|
}
|
|
@@ -135,7 +135,7 @@ func SourceCachePre(stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
// hookSourceCachePost stores a completed WebFetch keyed on sha256(url) together with
|
|
138
|
-
// the origin's validator headers
|
|
138
|
+
// the origin's validator headers, but only when the origin supplies a validator
|
|
139
139
|
// (else a later 304 could never prove freshness). Ported from
|
|
140
140
|
// devrites-source-cache-post.sh. Always exit 0.
|
|
141
141
|
func SourceCachePost(stdin io.Reader, stdout, stderr io.Writer) int {
|
|
@@ -390,7 +390,7 @@ func computeRefreshState(root string) refreshState {
|
|
|
390
390
|
}
|
|
391
391
|
|
|
392
392
|
// repoChangedSince reports whether any tracked file under root is newer than the
|
|
393
|
-
// stamp, skipping the excluded directories
|
|
393
|
+
// stamp, skipping the excluded directories: the Go form of the script's `find
|
|
394
394
|
// -newer`. It returns on the first newer file found.
|
|
395
395
|
func repoChangedSince(root, stamp string) bool {
|
|
396
396
|
info, err := os.Stat(stamp)
|
|
@@ -505,7 +505,7 @@ func runIndexTool(out io.Writer, timeout time.Duration, name string, args ...str
|
|
|
505
505
|
}
|
|
506
506
|
}
|
|
507
507
|
|
|
508
|
-
// cbmRegistered reports whether codebase-memory-mcp is installed AND tracks root
|
|
508
|
+
// cbmRegistered reports whether codebase-memory-mcp is installed AND tracks root:
|
|
509
509
|
// a cheap repo-local marker first, then the project registry.
|
|
510
510
|
func cbmRegistered(root string) bool {
|
|
511
511
|
if !hasTool("codebase-memory-mcp") {
|
|
@@ -320,7 +320,7 @@ func Decisions(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
320
320
|
}
|
|
321
321
|
}
|
|
322
322
|
for _, e := range matches {
|
|
323
|
-
fmt.Fprintf(stdout, "%s:%d %s
|
|
323
|
+
fmt.Fprintf(stdout, "%s:%d %s: %s\n", e.Path, e.Line, e.Slug, e.Text)
|
|
324
324
|
}
|
|
325
325
|
if len(matches) == 0 {
|
|
326
326
|
fmt.Fprintln(stdout, "decisions: no matches.")
|
|
@@ -15,10 +15,10 @@ import (
|
|
|
15
15
|
// written, so a coverage gap surfaces as a one-line plan edit rather than a reslice
|
|
16
16
|
// mid-build. It emits a markdown report and flags:
|
|
17
17
|
//
|
|
18
|
-
// Coverage
|
|
19
|
-
// Consistency
|
|
20
|
-
// Orphan slice
|
|
21
|
-
// Ambiguity
|
|
18
|
+
// Coverage : a spec AC id that no slice Satisfies (CRITICAL)
|
|
19
|
+
// Consistency : a slice that Satisfies an AC the spec never defines (CRITICAL)
|
|
20
|
+
// Orphan slice: a slice that satisfies no acceptance criterion (warn)
|
|
21
|
+
// Ambiguity : an unquantified vague adjective or unresolved
|
|
22
22
|
// placeholder in the spec (warn)
|
|
23
23
|
//
|
|
24
24
|
// It closes with a Metrics line (criteria count, coverage %, orphan + ambiguity
|
|
@@ -69,14 +69,14 @@ func Analyze(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
69
69
|
covered := 0
|
|
70
70
|
fmt.Fprintln(stdout, "## Coverage")
|
|
71
71
|
if len(specACs) == 0 {
|
|
72
|
-
fmt.Fprintln(stdout, "- [warn] spec.md
|
|
72
|
+
fmt.Fprintln(stdout, "- [warn] spec.md: no AC-### acceptance ids found; tag criteria for a machine-checkable gate.")
|
|
73
73
|
} else {
|
|
74
74
|
for _, ac := range specACs {
|
|
75
75
|
if taskSet[ac] {
|
|
76
76
|
covered++
|
|
77
|
-
fmt.Fprintf(stdout, "- [ok] %s
|
|
77
|
+
fmt.Fprintf(stdout, "- [ok] %s: covered\n", ac)
|
|
78
78
|
} else {
|
|
79
|
-
fmt.Fprintf(stdout, "- [CRITICAL] %s (spec.md)
|
|
79
|
+
fmt.Fprintf(stdout, "- [CRITICAL] %s (spec.md): no slice Satisfies it (uncovered)\n", ac)
|
|
80
80
|
crit++
|
|
81
81
|
}
|
|
82
82
|
}
|
|
@@ -88,7 +88,7 @@ func Analyze(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
88
88
|
if len(taskACs) > 0 {
|
|
89
89
|
for _, ac := range taskACs {
|
|
90
90
|
if !specSet[ac] {
|
|
91
|
-
fmt.Fprintf(stdout, "- [CRITICAL] %s (tasks.md)
|
|
91
|
+
fmt.Fprintf(stdout, "- [CRITICAL] %s (tasks.md): referenced by a slice but not defined in spec.md (dangling)\n", ac)
|
|
92
92
|
crit++
|
|
93
93
|
}
|
|
94
94
|
}
|
|
@@ -99,7 +99,7 @@ func Analyze(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
99
99
|
for _, name := range orphanSlices(tasksData) {
|
|
100
100
|
if name != "" {
|
|
101
101
|
orphans++
|
|
102
|
-
fmt.Fprintf(stdout, "- [warn] slice '%s'
|
|
102
|
+
fmt.Fprintf(stdout, "- [warn] slice '%s': satisfies no acceptance criterion (add Satisfies, or justify)\n", name)
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
|
|
@@ -127,17 +127,17 @@ func Analyze(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
127
127
|
|
|
128
128
|
fmt.Fprintln(stdout)
|
|
129
129
|
if crit > 0 {
|
|
130
|
-
fmt.Fprintf(stdout, "## Verdict: BLOCKED
|
|
130
|
+
fmt.Fprintf(stdout, "## Verdict: BLOCKED: %d CRITICAL finding(s). Resolve before %s.\n", crit, workflow.ForVerb("build").Both())
|
|
131
131
|
return 1
|
|
132
132
|
}
|
|
133
|
-
fmt.Fprintln(stdout, "## Verdict: clear
|
|
133
|
+
fmt.Fprintln(stdout, "## Verdict: clear: spec/tasks consistent and fully mapped.")
|
|
134
134
|
return 0
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
// ambiguityFindings scans spec text for unfalsifiable criteria: a vague quality
|
|
138
138
|
// adjective (fast, robust, secure …) on a line with no number to pin it down, or an
|
|
139
139
|
// unresolved placeholder (TODO, ???, <placeholder> …). Code fences are skipped. One
|
|
140
|
-
// finding per line
|
|
140
|
+
// finding per line: a placeholder takes precedence over an adjective. 1-based lines.
|
|
141
141
|
func ambiguityFindings(specData []byte) []string {
|
|
142
142
|
var out []string
|
|
143
143
|
inFence := false
|
|
@@ -151,16 +151,16 @@ func ambiguityFindings(specData []byte) []string {
|
|
|
151
151
|
}
|
|
152
152
|
ln := i + 1
|
|
153
153
|
if m := placeholderRe.FindString(line); m != "" {
|
|
154
|
-
out = append(out, fmt.Sprintf("- [warn] spec.md:L%d
|
|
154
|
+
out = append(out, fmt.Sprintf("- [warn] spec.md:L%d: unresolved placeholder %q", ln, m))
|
|
155
155
|
continue
|
|
156
156
|
}
|
|
157
|
-
// Strip the AC id before the digit gate
|
|
157
|
+
// Strip the AC id before the digit gate: else the id's own digit masks
|
|
158
158
|
// a vague adjective on the very criterion line it tags.
|
|
159
159
|
bare := acIDRe.ReplaceAllString(line, "")
|
|
160
160
|
bare = taskACRe.ReplaceAllString(bare, "")
|
|
161
161
|
if !analyzeDigitRe.MatchString(bare) {
|
|
162
162
|
if m := vagueAdjRe.FindString(bare); m != "" {
|
|
163
|
-
out = append(out, fmt.Sprintf("- [warn] spec.md:L%d
|
|
163
|
+
out = append(out, fmt.Sprintf("- [warn] spec.md:L%d: %q is not quantified; state a measurable target", ln, m))
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
166
|
}
|
|
@@ -10,7 +10,7 @@ import (
|
|
|
10
10
|
)
|
|
11
11
|
|
|
12
12
|
// ArchiveSearch surfaces shipped features whose spec.md overlaps a query, so
|
|
13
|
-
// /rite-spec can spot prior art before writing a new spec
|
|
13
|
+
// /rite-spec can spot prior art before writing a new spec: an extension, a
|
|
14
14
|
// conflict, or a re-spec of solved work. It is advisory, not a gate: it always
|
|
15
15
|
// exits 0 when it runs (empty output means no overlap), and reserves exit 2 for
|
|
16
16
|
// a missing query. The query is the feature's key nouns, one or many args; a
|
|
@@ -36,7 +36,7 @@ func ArchiveSearch(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
36
36
|
|
|
37
37
|
entries, err := os.ReadDir(filepath.Join(root, "archive"))
|
|
38
38
|
if err != nil {
|
|
39
|
-
// No archive yet
|
|
39
|
+
// No archive yet: no prior art to surface. Silent, successful no-op.
|
|
40
40
|
return 0
|
|
41
41
|
}
|
|
42
42
|
|
|
@@ -80,7 +80,7 @@ func ArchiveSearch(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
// specTitle returns the spec's first Markdown heading, or its first non-empty
|
|
83
|
-
// line, as a one-line label
|
|
83
|
+
// line, as a one-line label: empty when the spec has neither.
|
|
84
84
|
func specTitle(b []byte) string {
|
|
85
85
|
for _, line := range strings.Split(string(b), "\n") {
|
|
86
86
|
line = strings.TrimSpace(line)
|
|
@@ -10,7 +10,7 @@ import (
|
|
|
10
10
|
// The context-budget lint. A feature is deliberately a directory of small,
|
|
11
11
|
// single-concern files rather than one long document: each file stays
|
|
12
12
|
// context-cheap to read, and completeness is self-evident from which files
|
|
13
|
-
// exist. That discipline only holds if the files stay small
|
|
13
|
+
// exist. That discipline only holds if the files stay small: a spec.md that
|
|
14
14
|
// grows to 800 lines is a "sausage" that an agent must load whole, spending the
|
|
15
15
|
// context window it was meant to conserve. Budget measures every workspace file
|
|
16
16
|
// against a per-file line ceiling and flags the overgrown ones.
|
|
@@ -107,10 +107,10 @@ func Budget(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
107
107
|
return 0
|
|
108
108
|
}
|
|
109
109
|
if strict {
|
|
110
|
-
fmt.Fprintf(stdout, "budget: %d file(s) over the line budget
|
|
110
|
+
fmt.Fprintf(stdout, "budget: %d file(s) over the line budget: split or trim them\n", over)
|
|
111
111
|
return 3
|
|
112
112
|
}
|
|
113
|
-
fmt.Fprintf(stdout, "budget: %d file(s) over the line budget (advisory
|
|
113
|
+
fmt.Fprintf(stdout, "budget: %d file(s) over the line budget (advisory: pass --strict to fail)\n", over)
|
|
114
114
|
return 0
|
|
115
115
|
}
|
|
116
116
|
|
|
@@ -12,7 +12,7 @@ import (
|
|
|
12
12
|
)
|
|
13
13
|
|
|
14
14
|
// BuildReadiness decides whether a feature is ready to build, reading only its
|
|
15
|
-
// recorded state (state.md)
|
|
15
|
+
// recorded state (state.md): an open HITL question, a blocked plan, or an
|
|
16
16
|
// unapproved plan each stops the build with a distinct, actionable exit code
|
|
17
17
|
// rather than trusting the model to honour a prose checklist. It never mutates
|
|
18
18
|
// the workspace.
|
|
@@ -33,7 +33,7 @@ func BuildReadiness(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
33
33
|
if shown == "" {
|
|
34
34
|
shown = "<unset>"
|
|
35
35
|
}
|
|
36
|
-
fmt.Fprintf(stderr, "readiness: no active workspace/state.md (slug=%s)
|
|
36
|
+
fmt.Fprintf(stderr, "readiness: no active workspace/state.md (slug=%s): run %s <feature>\n", shown, workflow.ForVerb("spec").Both())
|
|
37
37
|
return 5
|
|
38
38
|
}
|
|
39
39
|
|
|
@@ -43,16 +43,16 @@ func BuildReadiness(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
43
43
|
status := readinessField(lines, "Status")
|
|
44
44
|
switch status {
|
|
45
45
|
case "awaiting_human":
|
|
46
|
-
fmt.Fprintf(stderr, "readiness: STOP
|
|
46
|
+
fmt.Fprintf(stderr, "readiness: STOP: Status: awaiting_human. Resume with %s <qid> \"<answer>\".\n", workflow.ForVerb("resolve").Both())
|
|
47
47
|
return 3
|
|
48
48
|
case "blocked":
|
|
49
|
-
fmt.Fprintf(stderr, "readiness: STOP
|
|
49
|
+
fmt.Fprintf(stderr, "readiness: STOP: Status: blocked. Repair with %s repair (or unblock).\n", workflow.ForVerb("plan").Both())
|
|
50
50
|
return 4
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
approved := readinessField(lines, "Plan approved")
|
|
54
54
|
if approved == "" || approved == "none" {
|
|
55
|
-
fmt.Fprintf(stderr, "readiness: STOP
|
|
55
|
+
fmt.Fprintf(stderr, "readiness: STOP: plan not approved (state.md has no \"Plan approved\"). Run %s.\n", workflow.ForVerb("define").Both())
|
|
56
56
|
return 2
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -60,7 +60,7 @@ func BuildReadiness(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
60
60
|
if shownStatus == "" {
|
|
61
61
|
shownStatus = "running"
|
|
62
62
|
}
|
|
63
|
-
fmt.Fprintf(stdout, "readiness: OK
|
|
63
|
+
fmt.Fprintf(stdout, "readiness: OK: plan approved %s, status %s. Ready to build.\n", approved, shownStatus)
|
|
64
64
|
return 0
|
|
65
65
|
}
|
|
66
66
|
|
|
@@ -9,7 +9,7 @@ import (
|
|
|
9
9
|
"strings"
|
|
10
10
|
)
|
|
11
11
|
|
|
12
|
-
// Executable acceptance criteria
|
|
12
|
+
// Executable acceptance criteria: a port of check-acceptance.sh. Grades the
|
|
13
13
|
// AC-### acceptance criteria in spec.md against seal.md: each spec
|
|
14
14
|
// criterion must be checked ([x]) in seal.md. Without ids it falls back to a
|
|
15
15
|
// count/unchecked heuristic. The spec-time mirror is SpecValidate (shape); this
|
|
@@ -41,7 +41,7 @@ func CheckAcceptance(ws string, stdout, stderr io.Writer) int {
|
|
|
41
41
|
return 5
|
|
42
42
|
}
|
|
43
43
|
if !isFile(seal) {
|
|
44
|
-
fmt.Fprintf(stderr, "check-acceptance: no seal.md in %s
|
|
44
|
+
fmt.Fprintf(stderr, "check-acceptance: no seal.md in %s: feature not sealed\n", ws)
|
|
45
45
|
return 5
|
|
46
46
|
}
|
|
47
47
|
|
|
@@ -57,14 +57,14 @@ func CheckAcceptance(ws string, stdout, stderr io.Writer) int {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
if sectionEmpty(specBody) {
|
|
60
|
-
fmt.Fprintln(stderr, "check-acceptance: spec.md has no \"## Acceptance criteria\" section
|
|
60
|
+
fmt.Fprintln(stderr, "check-acceptance: spec.md has no \"## Acceptance criteria\" section: nothing to grade")
|
|
61
61
|
return 1
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
specIDs := sortedUniqueIDs(specBody)
|
|
65
65
|
|
|
66
66
|
if len(specIDs) > 0 {
|
|
67
|
-
// ID mode
|
|
67
|
+
// ID mode: each spec AC id must be checked ([x]) in seal.md.
|
|
68
68
|
checkedIDs := map[string]bool{}
|
|
69
69
|
for _, line := range sealBody {
|
|
70
70
|
if checkedRe.MatchString(line) {
|
|
@@ -85,18 +85,18 @@ func CheckAcceptance(ws string, stdout, stderr io.Writer) int {
|
|
|
85
85
|
total-len(missing), total, " "+strings.Join(missing, " "))
|
|
86
86
|
return 1
|
|
87
87
|
}
|
|
88
|
-
fmt.Fprintf(stdout, "check-acceptance: OK
|
|
88
|
+
fmt.Fprintf(stdout, "check-acceptance: OK: all %d acceptance criteria (%s) proven + checked in seal.md\n",
|
|
89
89
|
total, strings.Join(specIDs, " "))
|
|
90
90
|
return 0
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
// Fallback (no ids)
|
|
93
|
+
// Fallback (no ids): count spec criteria vs seal checked/unchecked items.
|
|
94
94
|
specN := countMatching(specBody, bulletRe)
|
|
95
95
|
sealTotal := countMatching(sealBody, checkboxRe)
|
|
96
96
|
sealUnchecked := countMatching(sealBody, uncheckedRe)
|
|
97
97
|
|
|
98
98
|
if sealTotal < specN {
|
|
99
|
-
fmt.Fprintf(stderr, "check-acceptance: seal.md lists %d acceptance items but spec.md has %d criteria
|
|
99
|
+
fmt.Fprintf(stderr, "check-acceptance: seal.md lists %d acceptance items but spec.md has %d criteria: %d dropped. (Tag criteria AC-### to grade by id.)\n",
|
|
100
100
|
sealTotal, specN, specN-sealTotal)
|
|
101
101
|
return 1
|
|
102
102
|
}
|
|
@@ -104,12 +104,12 @@ func CheckAcceptance(ws string, stdout, stderr io.Writer) int {
|
|
|
104
104
|
fmt.Fprintf(stderr, "check-acceptance: %d acceptance criterion(s) unchecked in seal.md (unproven). (Tag criteria AC-### to grade by id.)\n", sealUnchecked)
|
|
105
105
|
return 1
|
|
106
106
|
}
|
|
107
|
-
fmt.Fprintf(stdout, "check-acceptance: OK
|
|
107
|
+
fmt.Fprintf(stdout, "check-acceptance: OK: %d acceptance items all checked in seal.md (no ids; add AC-### for id-level grading)\n", sealTotal)
|
|
108
108
|
return 0
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
// acSection returns the body lines under an "## Acceptance Criteria" heading
|
|
112
|
-
// (case-insensitive on the words), up to the next "## " heading
|
|
112
|
+
// (case-insensitive on the words), up to the next "## " heading: mirroring the
|
|
113
113
|
// awk one-liner in check-acceptance.sh.
|
|
114
114
|
func acSection(file string) ([]string, error) {
|
|
115
115
|
f, err := os.Open(file)
|
|
@@ -140,7 +140,7 @@ func acSection(file string) ([]string, error) {
|
|
|
140
140
|
// sectionEmpty reports whether the acceptance body is empty in the bash sense:
|
|
141
141
|
// awk emits each in-section line with a trailing newline, $() strips the trailing
|
|
142
142
|
// newlines, and `[ -z ]` tests the remainder. A body of only blank lines collapses
|
|
143
|
-
// to ""
|
|
143
|
+
// to "", so a heading followed by blanks is "nothing to grade", not a fallback.
|
|
144
144
|
func sectionEmpty(lines []string) bool {
|
|
145
145
|
return strings.TrimRight(strings.Join(lines, "\n"), "\n") == ""
|
|
146
146
|
}
|
|
@@ -9,7 +9,7 @@ import (
|
|
|
9
9
|
|
|
10
10
|
// CloseOut retires a shipped feature: it moves the feature directory into the
|
|
11
11
|
// archive and, when the feature is still the active one, clears the ACTIVE cursor
|
|
12
|
-
// so the next /rite-spec starts clean. The workspace is relocated, never deleted
|
|
12
|
+
// so the next /rite-spec starts clean. The workspace is relocated, never deleted:
|
|
13
13
|
// the audit trail is preserved under archive/<slug>.
|
|
14
14
|
//
|
|
15
15
|
// args is `<slug> [devrites-dir]`. The optional second argument overrides the
|
|
@@ -18,7 +18,7 @@ import (
|
|
|
18
18
|
//
|
|
19
19
|
// 0 archived (ACTIVE cleared if it pointed here)
|
|
20
20
|
// 4 no slug given, or the feature has no workspace
|
|
21
|
-
// 5 an archive already exists at the destination
|
|
21
|
+
// 5 an archive already exists at the destination: refuse to clobber it
|
|
22
22
|
func CloseOut(root string, args []string, stdout, stderr io.Writer) int {
|
|
23
23
|
slug := argAt(args, 0)
|
|
24
24
|
dv := argAt(args, 1)
|
|
@@ -41,12 +41,12 @@ func CloseOut(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
41
41
|
// A broken symlink at the destination still counts as "already there", so use
|
|
42
42
|
// Lstat rather than Stat to avoid silently overwriting it.
|
|
43
43
|
if _, err := os.Lstat(arch); err == nil {
|
|
44
|
-
fmt.Fprintf(stderr, "close-out: archive already exists at %s
|
|
44
|
+
fmt.Fprintf(stderr, "close-out: archive already exists at %s: refusing to clobber\n", arch)
|
|
45
45
|
return 5
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
// Fail closed: if the move does not happen, leave the cursor alone and do not
|
|
49
|
-
// claim success
|
|
49
|
+
// claim success: a lost audit trail must never look like a clean close-out.
|
|
50
50
|
if err := os.MkdirAll(filepath.Join(dv, "archive"), 0o755); err != nil {
|
|
51
51
|
fmt.Fprintf(stderr, "close-out: cannot create archive dir: %v\n", err)
|
|
52
52
|
return 1
|
|
@@ -64,6 +64,6 @@ func CloseOut(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
64
64
|
return 0
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
fmt.Fprintf(stdout, "close-out: archived %s -> %s (ACTIVE pointed elsewhere
|
|
67
|
+
fmt.Fprintf(stdout, "close-out: archived %s -> %s (ACTIVE pointed elsewhere: left as-is)\n", slug, filepath.ToSlash(arch))
|
|
68
68
|
return 0
|
|
69
69
|
}
|
|
@@ -162,7 +162,7 @@ func conventionsPromote(args []string, stdout, stderr io.Writer) int {
|
|
|
162
162
|
}
|
|
163
163
|
if !already {
|
|
164
164
|
e.Corroborations++
|
|
165
|
-
e.Proofs = append(e.Proofs, fmt.Sprintf("%s %s
|
|
165
|
+
e.Proofs = append(e.Proofs, fmt.Sprintf("%s %s: %s", slug, conventionDate(date), evidence))
|
|
166
166
|
}
|
|
167
167
|
entries[key] = e
|
|
168
168
|
if err := saveConventions(root, entries); err != nil {
|
|
@@ -202,7 +202,7 @@ func conventionsContradict(args []string, stdout, stderr io.Writer) int {
|
|
|
202
202
|
}
|
|
203
203
|
when := conventionDate(date)
|
|
204
204
|
e.Contradictions++
|
|
205
|
-
e.Proofs = append(e.Proofs, fmt.Sprintf("%s %s
|
|
205
|
+
e.Proofs = append(e.Proofs, fmt.Sprintf("%s %s: CONTRADICTED: %s", slug, when, evidence))
|
|
206
206
|
entries[key] = e
|
|
207
207
|
if err := saveConventions(root, entries); err != nil {
|
|
208
208
|
fmt.Fprintln(stderr, err)
|
|
@@ -240,7 +240,7 @@ func conventionsContradict(args []string, stdout, stderr io.Writer) int {
|
|
|
240
240
|
return 1
|
|
241
241
|
}
|
|
242
242
|
}
|
|
243
|
-
fmt.Fprintf(stdout, "DRIFT: convention '%s' contradicted by %s
|
|
243
|
+
fmt.Fprintf(stdout, "DRIFT: convention '%s' contradicted by %s: now %s\n", key, slug, state)
|
|
244
244
|
return 0
|
|
245
245
|
}
|
|
246
246
|
|