devrites 3.0.5 → 3.0.7
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 +21 -0
- package/README.md +282 -533
- package/SECURITY.md +26 -26
- package/docs/adr/README.md +7 -9
- package/docs/agents/domain.md +5 -5
- package/docs/agents/issue-driven-rites.md +1 -1
- package/docs/agents/issue-tracker.md +1 -1
- package/docs/agents/triage-labels.md +2 -2
- package/docs/architecture.md +45 -45
- package/docs/cli.md +11 -11
- package/docs/command-map.md +33 -33
- package/docs/engine/agent-contract.md +6 -6
- package/docs/engine/commands.md +66 -65
- package/docs/engine/state-schema.md +15 -15
- package/docs/engine/workspace-schema.md +7 -7
- package/docs/extensions.md +17 -17
- package/docs/flow.md +17 -17
- package/docs/harness-compliance.md +2 -2
- package/docs/orchestration.md +21 -20
- package/docs/release.md +22 -5
- package/docs/research/go-authoritative-workflow-schema-and-quality-2026-07-20.md +3 -3
- package/docs/skills.md +77 -52
- package/docs/usage.md +33 -32
- 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 +95 -24
- package/engine/internal/install/install_test.go +111 -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 +5 -5
- 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/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 +18 -18
- 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/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 +10 -10
- 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 +7 -7
- package/pack/.claude/skills/rite/reference/menu.md +6 -6
- package/pack/.claude/skills/rite-adopt/SKILL.md +15 -15
- 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 +18 -18
- 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/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 +10 -10
- 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 +7 -7
- package/pack/generated/claude/skills/rite/reference/menu.md +6 -6
- package/pack/generated/claude/skills/rite-adopt/SKILL.md +15 -15
- 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 +21 -21
- 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/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 +10 -10
- 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 +10 -10
- package/pack/generated/codex/skills/rite/reference/menu.md +6 -6
- package/pack/generated/codex/skills/rite-adopt/SKILL.md +18 -18
- 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 +7 -8
- 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
|
@@ -65,7 +65,7 @@ var fallbackPackageResolver = packageResolver{extract: quotedModulesFromAddedLin
|
|
|
65
65
|
|
|
66
66
|
// PackageExistence catches hallucinated or typo-squatted dependencies: every new
|
|
67
67
|
// third-party import in the slice diff must be DECLARED in a project manifest, not
|
|
68
|
-
// merely imported. It is deterministic and offline
|
|
68
|
+
// merely imported. It is deterministic and offline: it checks the manifest, not a
|
|
69
69
|
// package registry. The workspace is <root>/features/<slug>.
|
|
70
70
|
//
|
|
71
71
|
// 0 clean, nothing to check, or skipped (not a git repo / no manifest)
|
|
@@ -86,7 +86,7 @@ func PackageExistence(root string, args []string, stdout, stderr io.Writer) int
|
|
|
86
86
|
cwd, _ := os.Getwd()
|
|
87
87
|
gitRoot := gitToplevel(cwd)
|
|
88
88
|
if gitRoot == "" {
|
|
89
|
-
fmt.Fprintln(stderr, "package-existence: not a git repo
|
|
89
|
+
fmt.Fprintln(stderr, "package-existence: not a git repo: skipped.")
|
|
90
90
|
return 0
|
|
91
91
|
}
|
|
92
92
|
ref := "HEAD"
|
|
@@ -122,7 +122,7 @@ func PackageExistence(root string, args []string, stdout, stderr io.Writer) int
|
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
if !hasManifest {
|
|
125
|
-
fmt.Fprintln(stderr, "package-existence: no recognized manifest
|
|
125
|
+
fmt.Fprintln(stderr, "package-existence: no recognized manifest: skipped.")
|
|
126
126
|
return 0
|
|
127
127
|
}
|
|
128
128
|
|
|
@@ -132,14 +132,14 @@ func PackageExistence(root string, args []string, stdout, stderr io.Writer) int
|
|
|
132
132
|
packages = append(packages, pkg)
|
|
133
133
|
}
|
|
134
134
|
sort.Strings(packages)
|
|
135
|
-
fmt.Fprintf(stderr, "package-existence: %d imported package(s) are NOT declared in a manifest
|
|
135
|
+
fmt.Fprintf(stderr, "package-existence: %d imported package(s) are NOT declared in a manifest: verify each exists and add it via the package manager:\n", len(packages))
|
|
136
136
|
for _, pkg := range packages {
|
|
137
137
|
fmt.Fprintf(stderr, " - %s: imported but not declared in any manifest\n", pkg)
|
|
138
138
|
}
|
|
139
139
|
fmt.Fprintln(stderr, "An undeclared import is how hallucinated/typo-squatted packages slip in. Confirm the name on the registry before trusting it.")
|
|
140
140
|
return 3
|
|
141
141
|
}
|
|
142
|
-
fmt.Fprintln(stdout, "package-existence: OK
|
|
142
|
+
fmt.Fprintln(stdout, "package-existence: OK: every new third-party import is declared in a manifest.")
|
|
143
143
|
return 0
|
|
144
144
|
}
|
|
145
145
|
|
|
@@ -11,7 +11,7 @@ import (
|
|
|
11
11
|
"github.com/devrites/devrites/internal/workflow"
|
|
12
12
|
)
|
|
13
13
|
|
|
14
|
-
// spaceChars is the POSIX [[:space:]] set under the C locale
|
|
14
|
+
// spaceChars is the POSIX [[:space:]] set under the C locale: the collation the
|
|
15
15
|
// parity oracle pins (LC_ALL=C), so trimming matches the bash awk/sed exactly.
|
|
16
16
|
const spaceChars = " \t\n\v\f\r"
|
|
17
17
|
|
|
@@ -22,7 +22,7 @@ func featureDir(root, slug string) string {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
// activeSlug reads the active-feature pointer at <root>/ACTIVE (trimmed), or ""
|
|
25
|
-
// when absent
|
|
25
|
+
// when absent: the new-schema replacement for the old .devrites/ACTIVE lookup.
|
|
26
26
|
func activeSlug(root string) string {
|
|
27
27
|
slug, err := devritespaths.ActiveSlug(root)
|
|
28
28
|
if err != nil {
|
|
@@ -32,7 +32,7 @@ func activeSlug(root string) string {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
// preambleArtifacts is the fixed order preamble.sh scans for present artifacts.
|
|
35
|
-
// It is NOT sorted
|
|
35
|
+
// It is NOT sorted: the display order is the workflow order, so the port keeps
|
|
36
36
|
// the literal list.
|
|
37
37
|
var preambleArtifacts = []string{
|
|
38
38
|
"brief", "spec", "references", "strategy", "plan", "tasks", "eng-review",
|
|
@@ -41,7 +41,7 @@ var preambleArtifacts = []string{
|
|
|
41
41
|
"polish-report", "review", "seal", "ship", "handoff",
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
// Preamble prints the active feature's workspace state
|
|
44
|
+
// Preamble prints the active feature's workspace state: the orientation every
|
|
45
45
|
// workspace-operating rite-* skill runs first (step 0). Read-only. root is the
|
|
46
46
|
// .devrites directory; slug defaults to the active feature at <root>/ACTIVE.
|
|
47
47
|
// Always exits 0: orientation is never a hard dependency.
|
|
@@ -63,7 +63,7 @@ func Preamble(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
63
63
|
|
|
64
64
|
if state, err := os.ReadFile(filepath.Join(workDir, "state.md")); err == nil {
|
|
65
65
|
fmt.Fprintln(stdout, "### state.md")
|
|
66
|
-
// Emit the file verbatim, like `cat
|
|
66
|
+
// Emit the file verbatim, like `cat`: no added trailing newline.
|
|
67
67
|
_, _ = stdout.Write(state)
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -148,7 +148,7 @@ func isHeadingLine(line string) bool {
|
|
|
148
148
|
|
|
149
149
|
// splitLinesNoTrailing splits data into lines on '\n', dropping a single trailing
|
|
150
150
|
// newline's empty final element so a "\n"-terminated file yields N lines, not N+1
|
|
151
|
-
//
|
|
151
|
+
// : matching how awk/grep iterate records.
|
|
152
152
|
func splitLinesNoTrailing(data []byte) []string {
|
|
153
153
|
s := string(data)
|
|
154
154
|
s = strings.TrimSuffix(s, "\n")
|
|
@@ -12,18 +12,18 @@ import (
|
|
|
12
12
|
)
|
|
13
13
|
|
|
14
14
|
// State-parsing patterns ported verbatim from progress.sh's awk. Each name-strip
|
|
15
|
-
// sub is anchored (^ or $), so it matches at most once per line
|
|
15
|
+
// sub is anchored (^ or $), so it matches at most once per line: ReplaceAllString
|
|
16
16
|
// is therefore equivalent to awk's single-match sub.
|
|
17
17
|
var (
|
|
18
18
|
sliceCheckRe = regexp.MustCompile(`^- \[[^\]]*\][[:space:]]*`) // drop "- [x] "
|
|
19
19
|
sliceNameRe = regexp.MustCompile(`^Slice[[:space:]]*[0-9]+:[[:space:]]*`) // drop "Slice N: "
|
|
20
20
|
sliceStateRe = regexp.MustCompile(`[[:space:]]+(built|pending)[[:space:]]*$`)
|
|
21
|
-
sliceSepRe = regexp.MustCompile(`[[:space:]]+[^[:alnum:][:space:]]+[[:space:]]*$`) // drop "
|
|
21
|
+
sliceSepRe = regexp.MustCompile(`[[:space:]]+[^[:alnum:][:space:]]+[[:space:]]*$`) // drop " · "
|
|
22
22
|
sliceCheckedRe = regexp.MustCompile(`\[[xX]\]`)
|
|
23
23
|
sliceHeadingRe = regexp.MustCompile(`^##[[:space:]]+(SLICE-[0-9]{3})(?:[[:space:]]+(.*))?$`)
|
|
24
24
|
)
|
|
25
25
|
|
|
26
|
-
// Progress renders the active feature's position
|
|
26
|
+
// Progress renders the active feature's position: the deterministic footer every
|
|
27
27
|
// workspace-operating rite-* skill prints last. Read-only. Prints nothing and
|
|
28
28
|
// exits 0 when there is no active workspace, so pre-spec callers stay silent. root
|
|
29
29
|
// is the .devrites directory; slug defaults to the active feature at <root>/ACTIVE.
|
|
@@ -38,7 +38,7 @@ func Progress(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
38
38
|
workDir := featureDir(root, slug)
|
|
39
39
|
statePath := filepath.Join(workDir, "state.md")
|
|
40
40
|
if slug == "" || !isFile(statePath) {
|
|
41
|
-
return 0 // silent
|
|
41
|
+
return 0 // silent: no active workspace
|
|
42
42
|
}
|
|
43
43
|
stateBytes, err := os.ReadFile(statePath)
|
|
44
44
|
if err != nil {
|
|
@@ -180,7 +180,7 @@ func parsePhase(lines []string) string {
|
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
// tallySlices reads the "## Slice progress" block: total slice lines, how many are
|
|
183
|
-
// checked, and the display name of the last checked one
|
|
183
|
+
// checked, and the display name of the last checked one: the awk in progress.sh.
|
|
184
184
|
func tallySlices(lines []string) (total, built int, lastbuilt string) {
|
|
185
185
|
inp := false
|
|
186
186
|
for _, line := range lines {
|
|
@@ -9,7 +9,7 @@ import (
|
|
|
9
9
|
"strings"
|
|
10
10
|
)
|
|
11
11
|
|
|
12
|
-
// Reconcile enforces that the orchestrator never edits source itself
|
|
12
|
+
// Reconcile enforces that the orchestrator never edits source itself: only the
|
|
13
13
|
// dispatched slice-wright writes code and tests, while the orchestrator writes
|
|
14
14
|
// bookkeeping under .devrites/. `snapshot` records the working tree just before
|
|
15
15
|
// the wright runs; `check` diffs it afterward and flags any changed path that is
|
|
@@ -17,8 +17,8 @@ import (
|
|
|
17
17
|
// <root>/features/<slug>.
|
|
18
18
|
//
|
|
19
19
|
// 0 clean check, snapshot written, inline fallback, or skipped (not a git repo)
|
|
20
|
-
// 5 VIOLATION
|
|
21
|
-
// 6 setup error
|
|
20
|
+
// 5 VIOLATION: source changed outside the wright's claimed set
|
|
21
|
+
// 6 setup error: bad args, missing snapshot, or missing claimed manifest
|
|
22
22
|
func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
23
23
|
mode := argAt(args, 0)
|
|
24
24
|
slug := argAt(args, 1)
|
|
@@ -29,7 +29,7 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
29
29
|
cwd, _ := os.Getwd()
|
|
30
30
|
gitRoot := gitToplevel(cwd)
|
|
31
31
|
if gitRoot == "" {
|
|
32
|
-
fmt.Fprintln(stderr, "reconcile: not a git repo
|
|
32
|
+
fmt.Fprintln(stderr, "reconcile: not a git repo: gate skipped, verify the diff by hand.")
|
|
33
33
|
return 0
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -37,28 +37,37 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
37
37
|
base := filepath.Join(d, ".reconcile-base")
|
|
38
38
|
claimed := filepath.Join(d, ".reconcile-claimed")
|
|
39
39
|
inline := filepath.Join(d, ".reconcile-inline")
|
|
40
|
+
objects := filepath.Join(d, ".reconcile-objects")
|
|
40
41
|
|
|
41
42
|
if slug == "" || !isDir(d) {
|
|
42
43
|
s := slug
|
|
43
44
|
if s == "" {
|
|
44
45
|
s = "<unset>"
|
|
45
46
|
}
|
|
46
|
-
fmt.Fprintf(stderr, "reconcile: no active workspace (slug=%s)
|
|
47
|
+
fmt.Fprintf(stderr, "reconcile: no active workspace (slug=%s): nothing to reconcile.\n", s)
|
|
47
48
|
return 6
|
|
48
49
|
}
|
|
49
50
|
|
|
50
|
-
closeWindow := func() {
|
|
51
|
+
closeWindow := func() {
|
|
52
|
+
_ = os.Remove(base)
|
|
53
|
+
_ = os.Remove(claimed)
|
|
54
|
+
_ = os.Remove(inline)
|
|
55
|
+
_ = os.RemoveAll(objects)
|
|
56
|
+
}
|
|
51
57
|
|
|
52
58
|
switch mode {
|
|
53
59
|
case "snapshot":
|
|
54
60
|
_ = os.Remove(inline) // clear any stale sentinel / prior-slice manifest
|
|
55
61
|
_ = os.Remove(claimed)
|
|
56
|
-
|
|
62
|
+
_ = os.RemoveAll(objects)
|
|
63
|
+
tree, err := worktreeTree(gitRoot, objects)
|
|
57
64
|
if err != nil {
|
|
65
|
+
_ = os.RemoveAll(objects)
|
|
58
66
|
fmt.Fprintf(stderr, "reconcile: cannot snapshot worktree: %v\n", err)
|
|
59
67
|
return 6
|
|
60
68
|
}
|
|
61
69
|
if err := os.WriteFile(base, []byte(tree+"\n"), 0o644); err != nil {
|
|
70
|
+
_ = os.RemoveAll(objects)
|
|
62
71
|
fmt.Fprintf(stderr, "reconcile: cannot write snapshot: %v\n", err)
|
|
63
72
|
return 6
|
|
64
73
|
}
|
|
@@ -67,16 +76,16 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
67
76
|
|
|
68
77
|
case "check":
|
|
69
78
|
if isFile(inline) {
|
|
70
|
-
fmt.Fprintln(stderr, "reconcile: inline-fallback run (no wright dispatched)
|
|
79
|
+
fmt.Fprintln(stderr, "reconcile: inline-fallback run (no wright dispatched): gate skipped.")
|
|
71
80
|
closeWindow()
|
|
72
81
|
return 0
|
|
73
82
|
}
|
|
74
83
|
if !isFile(base) {
|
|
75
|
-
fmt.Fprintln(stderr, `reconcile: no snapshot (.reconcile-base)
|
|
84
|
+
fmt.Fprintln(stderr, `reconcile: no snapshot (.reconcile-base): run "devrites-engine reconcile snapshot" before dispatch.`)
|
|
76
85
|
return 6
|
|
77
86
|
}
|
|
78
87
|
if !isFile(claimed) {
|
|
79
|
-
fmt.Fprintln(stderr, "reconcile: no claimed manifest (.reconcile-claimed)
|
|
88
|
+
fmt.Fprintln(stderr, "reconcile: no claimed manifest (.reconcile-claimed): write the wright Files-changed paths first.")
|
|
80
89
|
return 6
|
|
81
90
|
}
|
|
82
91
|
baseBytes, err := os.ReadFile(base)
|
|
@@ -86,19 +95,34 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
86
95
|
}
|
|
87
96
|
baseTree := strings.TrimSpace(string(baseBytes))
|
|
88
97
|
if baseTree == "" {
|
|
89
|
-
fmt.Fprintln(stderr, "reconcile: empty snapshot (.reconcile-base)
|
|
98
|
+
fmt.Fprintln(stderr, "reconcile: empty snapshot (.reconcile-base): re-run \"devrites-engine reconcile snapshot\" before dispatch.")
|
|
99
|
+
return 6
|
|
100
|
+
}
|
|
101
|
+
if !isDir(objects) {
|
|
102
|
+
fmt.Fprintln(stderr, "reconcile: missing snapshot object database (.reconcile-objects): re-run \"devrites-engine reconcile snapshot\" before dispatch.")
|
|
90
103
|
return 6
|
|
91
104
|
}
|
|
92
|
-
nowTree, err := worktreeTree(gitRoot)
|
|
105
|
+
nowTree, err := worktreeTree(gitRoot, objects)
|
|
93
106
|
if err != nil {
|
|
94
107
|
fmt.Fprintf(stderr, "reconcile: cannot capture worktree: %v\n", err)
|
|
95
108
|
return 6
|
|
96
109
|
}
|
|
110
|
+
diff := exec.Command("git", "-C", gitRoot, "diff", "--name-only", baseTree, nowTree)
|
|
111
|
+
diff.Env, err = reconcileGitEnv(gitRoot, objects)
|
|
112
|
+
if err != nil {
|
|
113
|
+
fmt.Fprintf(stderr, "reconcile: cannot compare worktree: %v\n", err)
|
|
114
|
+
return 6
|
|
115
|
+
}
|
|
116
|
+
diffOut, err := diff.CombinedOutput()
|
|
117
|
+
if err != nil {
|
|
118
|
+
fmt.Fprintf(stderr, "reconcile: cannot compare worktree: git diff --name-only: %v: %s\n", err, strings.TrimSpace(string(diffOut)))
|
|
119
|
+
return 6
|
|
120
|
+
}
|
|
97
121
|
|
|
98
122
|
claimedSet := claimedPaths(claimed)
|
|
99
123
|
viol := 0
|
|
100
124
|
var violist strings.Builder
|
|
101
|
-
for _, f := range
|
|
125
|
+
for _, f := range splitLinesNoTrailing(diffOut) {
|
|
102
126
|
if f == "" || strings.HasPrefix(f, ".devrites/") {
|
|
103
127
|
continue
|
|
104
128
|
}
|
|
@@ -108,13 +132,13 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
108
132
|
}
|
|
109
133
|
}
|
|
110
134
|
if viol > 0 {
|
|
111
|
-
fmt.Fprintf(stderr, "reconcile: STOP
|
|
135
|
+
fmt.Fprintf(stderr, "reconcile: STOP: %d source file(s) changed OUTSIDE the wright (A1 breach):\n", viol)
|
|
112
136
|
fmt.Fprint(stderr, violist.String())
|
|
113
137
|
fmt.Fprintln(stderr, "The orchestrator must NOT edit source. Re-dispatch the wright (continue it once) or revert these.")
|
|
114
138
|
return 5
|
|
115
139
|
}
|
|
116
140
|
closeWindow()
|
|
117
|
-
fmt.Fprintln(stdout, "reconcile: OK
|
|
141
|
+
fmt.Fprintln(stdout, "reconcile: OK: every source change is the wright's; orchestrator touched only bookkeeping.")
|
|
118
142
|
return 0
|
|
119
143
|
|
|
120
144
|
default:
|
|
@@ -132,23 +156,36 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
132
156
|
// snapshot and the check would then record that same sha, the diff would come
|
|
133
157
|
// back empty, and the gate would report OK on precisely the A1 breach it exists
|
|
134
158
|
// to catch. Surface the error and let the caller fail closed.
|
|
135
|
-
func worktreeTree(gitRoot string) (string, error) {
|
|
159
|
+
func worktreeTree(gitRoot, objectDir string) (string, error) {
|
|
136
160
|
idx := filepath.Join(os.TempDir(), fmt.Sprintf("devrites-reconcile-%d.idx", os.Getpid()))
|
|
137
161
|
_ = os.Remove(idx)
|
|
138
162
|
defer func() { _ = os.Remove(idx) }()
|
|
139
|
-
|
|
163
|
+
if err := os.MkdirAll(objectDir, 0o700); err != nil {
|
|
164
|
+
return "", fmt.Errorf("create object directory: %w", err)
|
|
165
|
+
}
|
|
166
|
+
env, err := reconcileGitEnv(gitRoot, objectDir)
|
|
167
|
+
if err != nil {
|
|
168
|
+
return "", err
|
|
169
|
+
}
|
|
170
|
+
env = append(env, "GIT_INDEX_FILE="+idx)
|
|
140
171
|
|
|
141
172
|
add := exec.Command("git", "-C", gitRoot, "add", "-A")
|
|
142
173
|
add.Env = env
|
|
143
|
-
|
|
144
|
-
if err
|
|
174
|
+
addOut, err := add.CombinedOutput()
|
|
175
|
+
if err != nil {
|
|
176
|
+
if detail := strings.TrimSpace(string(addOut)); detail != "" {
|
|
177
|
+
return "", fmt.Errorf("git add -A: %w: %s", err, detail)
|
|
178
|
+
}
|
|
145
179
|
return "", fmt.Errorf("git add -A: %w", err)
|
|
146
180
|
}
|
|
147
181
|
|
|
148
182
|
write := exec.Command("git", "-C", gitRoot, "write-tree")
|
|
149
183
|
write.Env = env
|
|
150
|
-
out, err := write.
|
|
184
|
+
out, err := write.CombinedOutput()
|
|
151
185
|
if err != nil {
|
|
186
|
+
if detail := strings.TrimSpace(string(out)); detail != "" {
|
|
187
|
+
return "", fmt.Errorf("git write-tree: %w: %s", err, detail)
|
|
188
|
+
}
|
|
152
189
|
return "", fmt.Errorf("git write-tree: %w", err)
|
|
153
190
|
}
|
|
154
191
|
tree := strings.TrimSpace(string(out))
|
|
@@ -158,6 +195,29 @@ func worktreeTree(gitRoot string) (string, error) {
|
|
|
158
195
|
return tree, nil
|
|
159
196
|
}
|
|
160
197
|
|
|
198
|
+
func reconcileGitEnv(gitRoot, objectDir string) ([]string, error) {
|
|
199
|
+
common := exec.Command("git", "-C", gitRoot, "rev-parse", "--git-common-dir")
|
|
200
|
+
out, err := common.CombinedOutput()
|
|
201
|
+
if err != nil {
|
|
202
|
+
return nil, fmt.Errorf("git rev-parse --git-common-dir: %w: %s", err, strings.TrimSpace(string(out)))
|
|
203
|
+
}
|
|
204
|
+
commonDir := strings.TrimSpace(string(out))
|
|
205
|
+
if !filepath.IsAbs(commonDir) {
|
|
206
|
+
commonDir = filepath.Join(gitRoot, commonDir)
|
|
207
|
+
}
|
|
208
|
+
alternates := []string{filepath.Join(commonDir, "objects")}
|
|
209
|
+
if inherited := os.Getenv("GIT_OBJECT_DIRECTORY"); inherited != "" {
|
|
210
|
+
alternates = append(alternates, inherited)
|
|
211
|
+
}
|
|
212
|
+
if inherited := os.Getenv("GIT_ALTERNATE_OBJECT_DIRECTORIES"); inherited != "" {
|
|
213
|
+
alternates = append(alternates, inherited)
|
|
214
|
+
}
|
|
215
|
+
return append(os.Environ(),
|
|
216
|
+
"GIT_OBJECT_DIRECTORY="+objectDir,
|
|
217
|
+
"GIT_ALTERNATE_OBJECT_DIRECTORIES="+strings.Join(alternates, string(os.PathListSeparator)),
|
|
218
|
+
), nil
|
|
219
|
+
}
|
|
220
|
+
|
|
161
221
|
// claimedPaths reads the .reconcile-claimed manifest into a set of the exact
|
|
162
222
|
// paths the wright reported changing.
|
|
163
223
|
func claimedPaths(path string) map[string]struct{} {
|
|
@@ -75,7 +75,7 @@ func runReconcile(t *testing.T, root string, args ...string) (int, string) {
|
|
|
75
75
|
|
|
76
76
|
func TestWorktreeTreeErrorsOutsideGitRepo(t *testing.T) {
|
|
77
77
|
dir := t.TempDir()
|
|
78
|
-
tree, err := worktreeTree(dir)
|
|
78
|
+
tree, err := worktreeTree(dir, t.TempDir())
|
|
79
79
|
if err == nil {
|
|
80
80
|
t.Fatalf("worktreeTree(%q) = %q, nil; want an error outside a git repo", dir, tree)
|
|
81
81
|
}
|
|
@@ -86,13 +86,14 @@ func TestWorktreeTreeErrorsOutsideGitRepo(t *testing.T) {
|
|
|
86
86
|
|
|
87
87
|
func TestWorktreeTreeCapturesUntrackedFiles(t *testing.T) {
|
|
88
88
|
dir := newGitRepo(t)
|
|
89
|
+
objects := t.TempDir()
|
|
89
90
|
|
|
90
|
-
before, err := worktreeTree(dir)
|
|
91
|
+
before, err := worktreeTree(dir, objects)
|
|
91
92
|
if err != nil {
|
|
92
93
|
t.Fatalf("worktreeTree: %v", err)
|
|
93
94
|
}
|
|
94
95
|
writeFile(t, filepath.Join(dir, "untracked.go"), "package main\n")
|
|
95
|
-
after, err := worktreeTree(dir)
|
|
96
|
+
after, err := worktreeTree(dir, objects)
|
|
96
97
|
if err != nil {
|
|
97
98
|
t.Fatalf("worktreeTree: %v", err)
|
|
98
99
|
}
|
|
@@ -100,7 +101,7 @@ func TestWorktreeTreeCapturesUntrackedFiles(t *testing.T) {
|
|
|
100
101
|
t.Errorf("worktreeTree did not observe the untracked file: both trees = %s", before)
|
|
101
102
|
}
|
|
102
103
|
|
|
103
|
-
// The user's real index must be untouched
|
|
104
|
+
// The user's real index must be untouched: the file stays untracked.
|
|
104
105
|
out, err := exec.Command("git", "-C", dir, "status", "--porcelain", "untracked.go").Output()
|
|
105
106
|
if err != nil {
|
|
106
107
|
t.Fatalf("git status: %v", err)
|
|
@@ -113,6 +114,13 @@ func TestWorktreeTreeCapturesUntrackedFiles(t *testing.T) {
|
|
|
113
114
|
func TestReconcileSnapshotThenCleanCheck(t *testing.T) {
|
|
114
115
|
gitRoot := newGitRepo(t)
|
|
115
116
|
root := workspace(t, "feat")
|
|
117
|
+
objects := t.TempDir()
|
|
118
|
+
if err := os.Chmod(objects, 0o500); err != nil {
|
|
119
|
+
t.Fatalf("make git objects read-only: %v", err)
|
|
120
|
+
}
|
|
121
|
+
t.Cleanup(func() { _ = os.Chmod(objects, 0o700) })
|
|
122
|
+
t.Setenv("GIT_OBJECT_DIRECTORY", objects)
|
|
123
|
+
writeFile(t, filepath.Join(gitRoot, "untracked.go"), "package main\n")
|
|
116
124
|
|
|
117
125
|
if code, out := runReconcile(t, root, "snapshot", "feat"); code != 0 {
|
|
118
126
|
t.Fatalf("snapshot = %d, want 0\n%s", code, out)
|
|
@@ -137,7 +145,7 @@ func TestReconcileCheckFlagsUnclaimedChange(t *testing.T) {
|
|
|
137
145
|
if code, out := runReconcile(t, root, "snapshot", "feat"); code != 0 {
|
|
138
146
|
t.Fatalf("snapshot = %d, want 0\n%s", code, out)
|
|
139
147
|
}
|
|
140
|
-
// The orchestrator edits source it never claimed
|
|
148
|
+
// The orchestrator edits source it never claimed: the A1 breach.
|
|
141
149
|
writeFile(t, filepath.Join(gitRoot, "rogue.go"), "package main\n")
|
|
142
150
|
writeFile(t, filepath.Join(root, "work", "feat", ".reconcile-claimed"), "seed.go\n")
|
|
143
151
|
|
|
@@ -107,7 +107,7 @@ func Resolve(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
107
107
|
if err := clearAwaiting(sfile, bid); err != nil {
|
|
108
108
|
return fail(stderr, err.Error(), 1)
|
|
109
109
|
}
|
|
110
|
-
fmt.Fprintf(stdout, "Dropped: %s
|
|
110
|
+
fmt.Fprintf(stdout, "Dropped: %s: %s\n", bid, reason)
|
|
111
111
|
} else {
|
|
112
112
|
bid, ans := splitColon(line)
|
|
113
113
|
ans = strings.TrimPrefix(ans, " ")
|
|
@@ -169,7 +169,7 @@ func clockNow() time.Time {
|
|
|
169
169
|
func nowUTC() string { return clockNow().UTC().Format("2006-01-02T15:04:05Z") }
|
|
170
170
|
|
|
171
171
|
// resolveNextQID prints the next sequential question id for today, refusing (exit
|
|
172
|
-
// 6) an id that already has a header
|
|
172
|
+
// 6) an id that already has a header: a sign questions.md was hand-edited.
|
|
173
173
|
func resolveNextQID(qpath string, stdout, stderr io.Writer) int {
|
|
174
174
|
if qpath == "" {
|
|
175
175
|
return fail(stderr, "Usage: devrites-engine resolve next-qid <questions.md path>", 5)
|
|
@@ -363,7 +363,7 @@ func clearAwaiting(sfile, qid string) error {
|
|
|
363
363
|
out = append(out, fmt.Sprintf("- %s %s: resolved %s", ts, resumePhase, qid))
|
|
364
364
|
}
|
|
365
365
|
out, _ = state.SetCursorField(out, state.CursorStatus, "running")
|
|
366
|
-
out, _ = state.SetCursorField(out, state.CursorNextAction, "(resume
|
|
366
|
+
out, _ = state.SetCursorField(out, state.CursorNextAction, "(resume: `"+resumeCommand.Both()+"` to continue the workflow)")
|
|
367
367
|
if err := fsutil.WriteFileAtomic(sfile, joinRecords(out), 0o644); err != nil {
|
|
368
368
|
return fmt.Errorf("update state %s: %w", sfile, err)
|
|
369
369
|
}
|
|
@@ -29,7 +29,7 @@ type reviewerStatEntry struct {
|
|
|
29
29
|
|
|
30
30
|
var reviewerAgentRe = regexp.MustCompile(`^devrites-[a-z][a-z-]*$`)
|
|
31
31
|
|
|
32
|
-
// alwaysOnReviewers are the roster's unconditional axes
|
|
32
|
+
// alwaysOnReviewers are the roster's unconditional axes: stats are recorded for
|
|
33
33
|
// visibility but the verdict is always run.
|
|
34
34
|
var alwaysOnReviewers = map[string]bool{
|
|
35
35
|
"devrites-spec-reviewer": true,
|
|
@@ -183,7 +183,7 @@ func reviewerVerdict(agent string, zeroStreak int) string {
|
|
|
183
183
|
case alwaysOnReviewers[agent]:
|
|
184
184
|
return "run (always-on)"
|
|
185
185
|
case insuranceReviewers[agent]:
|
|
186
|
-
return "run (insurance
|
|
186
|
+
return "run (insurance: never gated)"
|
|
187
187
|
case zeroStreak >= gateStreak:
|
|
188
188
|
return "gate-candidate"
|
|
189
189
|
default:
|
|
@@ -8,14 +8,14 @@ import (
|
|
|
8
8
|
"strings"
|
|
9
9
|
)
|
|
10
10
|
|
|
11
|
-
// findingLabel matches a bold severity label
|
|
12
|
-
// in review.md (`- **Critical
|
|
11
|
+
// findingLabel matches a bold severity label: the shape a *real* finding carries
|
|
12
|
+
// in review.md (`- **Critical**: ...`). A plain summary count ("Critical 0 /
|
|
13
13
|
// Important 0") is deliberately NOT matched: an all-zero tally is the rubber-stamp
|
|
14
14
|
// this gate exists to catch, not evidence that review happened.
|
|
15
15
|
var findingLabel = regexp.MustCompile(`\*\*(Critical|Important|Suggestion|Nit|FYI)\*\*`)
|
|
16
16
|
|
|
17
17
|
// noFindingsMarker matches the justification an adversarial reviewer must leave
|
|
18
|
-
// when it genuinely finds nothing
|
|
18
|
+
// when it genuinely finds nothing: the axis stayed clean, and here is the
|
|
19
19
|
// account of the passes that came back empty. Presence is all this gate checks;
|
|
20
20
|
// the quality of the account is the reviewer fan-out's job (same contract as
|
|
21
21
|
// doubt-coverage's `doubt: MISSING` and footprint's roster).
|
|
@@ -34,14 +34,14 @@ var reviewAxes = []struct {
|
|
|
34
34
|
|
|
35
35
|
// ReviewIntegrity guards the opposite failure from the rest of review discipline:
|
|
36
36
|
// not the noisy false positive (which confidence-banding suppresses) but the
|
|
37
|
-
// silent false negative
|
|
37
|
+
// silent false negative: a reviewer that returns "looks good, nothing found".
|
|
38
38
|
// An empty findings list is treated as suspicious, not as a pass: an adversarial
|
|
39
39
|
// axis that reports nothing must justify the emptiness, exactly as it must quote a
|
|
40
40
|
// line to raise a finding. Read-only; the workspace is <root>/work/<slug>.
|
|
41
41
|
//
|
|
42
|
-
// 0 every axis accounted for
|
|
42
|
+
// 0 every axis accounted for: has findings, has a no-findings justification, or review.md absent/freeform
|
|
43
43
|
// 2 usage (no slug)
|
|
44
|
-
// 1 an adversarial axis is silent AND unjustified
|
|
44
|
+
// 1 an adversarial axis is silent AND unjustified: a suspected rubber-stamp
|
|
45
45
|
func ReviewIntegrity(root string, args []string, stdout, stderr io.Writer) int {
|
|
46
46
|
slug := argAt(args, 0)
|
|
47
47
|
if slug == "" {
|
|
@@ -55,15 +55,15 @@ func ReviewIntegrity(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
55
55
|
dir := featureDir(root, slug)
|
|
56
56
|
review, ok := readFileOK(filepath.Join(dir, "review.md"))
|
|
57
57
|
if !ok {
|
|
58
|
-
fmt.Fprintln(stdout, "review-integrity: no review.md
|
|
58
|
+
fmt.Fprintln(stdout, "review-integrity: no review.md: nothing to assess (pass)")
|
|
59
59
|
return 0
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
sections := axisSections(review)
|
|
63
63
|
if len(sections) == 0 {
|
|
64
64
|
// A freeform review with no `## Spec` / `## Code review` headings can't be
|
|
65
|
-
// assessed mechanically
|
|
66
|
-
fmt.Fprintln(stdout, "review-integrity: no per-axis sections in review.md
|
|
65
|
+
// assessed mechanically: say so and pass rather than flag a format choice.
|
|
66
|
+
fmt.Fprintln(stdout, "review-integrity: no per-axis sections in review.md: heading-based check n/a (pass)")
|
|
67
67
|
return 0
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -71,7 +71,7 @@ func ReviewIntegrity(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
71
71
|
for _, ax := range reviewAxes {
|
|
72
72
|
body, present := sections[ax.label]
|
|
73
73
|
if !present {
|
|
74
|
-
continue // axis not written as its own section
|
|
74
|
+
continue // axis not written as its own section: nothing to check here
|
|
75
75
|
}
|
|
76
76
|
hasFinding := findingLabel.MatchString(body)
|
|
77
77
|
justified := noFindingsMarker.MatchString(body)
|
|
@@ -79,7 +79,7 @@ func ReviewIntegrity(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
79
79
|
case hasFinding:
|
|
80
80
|
fmt.Fprintf(stdout, " %s: findings present\n", ax.label)
|
|
81
81
|
case justified:
|
|
82
|
-
fmt.Fprintf(stdout, " %s: clean
|
|
82
|
+
fmt.Fprintf(stdout, " %s: clean: no-findings justification present\n", ax.label)
|
|
83
83
|
default:
|
|
84
84
|
fmt.Fprintf(stdout, " %s: SILENT (no finding, no justification)\n", ax.label)
|
|
85
85
|
silent = append(silent, ax.label)
|
|
@@ -87,12 +87,12 @@ func ReviewIntegrity(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
if len(silent) > 0 {
|
|
90
|
-
fmt.Fprintf(stdout, "review-integrity: SILENT
|
|
90
|
+
fmt.Fprintf(stdout, "review-integrity: SILENT: %s reviewed nothing and justified nothing.\n", strings.Join(silent, ", "))
|
|
91
91
|
fmt.Fprintln(stdout, "A zero-findings axis is suspicious, not a pass. Re-run the axis, or record a")
|
|
92
92
|
fmt.Fprintln(stdout, "'No-findings:' justification naming the adversarial passes that came back empty.")
|
|
93
93
|
return 1
|
|
94
94
|
}
|
|
95
|
-
fmt.Fprintln(stdout, "review-integrity: OK
|
|
95
|
+
fmt.Fprintln(stdout, "review-integrity: OK: every adversarial axis has findings or a justified clean bill.")
|
|
96
96
|
return 0
|
|
97
97
|
}
|
|
98
98
|
|
|
@@ -36,7 +36,7 @@ Everything matches the spec. Nothing to report.
|
|
|
36
36
|
Critical 0 / Important 0 / Suggestion 0
|
|
37
37
|
|
|
38
38
|
## Code review
|
|
39
|
-
- **Important
|
|
39
|
+
- **Important**: off-by-one in pagination at api/list.go:42.
|
|
40
40
|
`)
|
|
41
41
|
code, out := runReviewIntegrity(t, root, "feat")
|
|
42
42
|
if code != 1 {
|
|
@@ -59,13 +59,13 @@ No-findings: ran the missing/partial/incorrect passes against each AC; every
|
|
|
59
59
|
criterion is implemented and no scope creep found.
|
|
60
60
|
|
|
61
61
|
## Code review
|
|
62
|
-
- **Nit
|
|
62
|
+
- **Nit**: rename tmp to buf at util.go:9.
|
|
63
63
|
`)
|
|
64
64
|
code, out := runReviewIntegrity(t, root, "feat")
|
|
65
65
|
if code != 0 {
|
|
66
66
|
t.Fatalf("justified clean axis should pass, got %d\n%s", code, out)
|
|
67
67
|
}
|
|
68
|
-
if !contains(out, "Spec: clean
|
|
68
|
+
if !contains(out, "Spec: clean: no-findings justification present") {
|
|
69
69
|
t.Fatalf("want Spec recognised as justified, got:\n%s", out)
|
|
70
70
|
}
|
|
71
71
|
}
|
|
@@ -73,10 +73,10 @@ criterion is implemented and no scope creep found.
|
|
|
73
73
|
func TestReviewIntegrityBothWithFindingsPasses(t *testing.T) {
|
|
74
74
|
root := t.TempDir()
|
|
75
75
|
writeReview(t, root, "feat", `## Spec
|
|
76
|
-
- **Critical
|
|
76
|
+
- **Critical**: AC-003 unimplemented.
|
|
77
77
|
|
|
78
78
|
## Code review
|
|
79
|
-
- **Important
|
|
79
|
+
- **Important**: missing error path.
|
|
80
80
|
`)
|
|
81
81
|
if code, out := runReviewIntegrity(t, root, "feat"); code != 0 {
|
|
82
82
|
t.Fatalf("both-with-findings should pass, got %d\n%s", code, out)
|
|
@@ -95,7 +95,7 @@ func TestReviewIntegrityNoReviewPasses(t *testing.T) {
|
|
|
95
95
|
|
|
96
96
|
func TestReviewIntegrityFreeformPasses(t *testing.T) {
|
|
97
97
|
root := t.TempDir()
|
|
98
|
-
// No per-axis headings
|
|
98
|
+
// No per-axis headings: can't assess mechanically, must not false-positive.
|
|
99
99
|
writeReview(t, root, "feat", "# Review\n\nLooks fine overall, shipping.\n")
|
|
100
100
|
if code, out := runReviewIntegrity(t, root, "feat"); code != 0 {
|
|
101
101
|
t.Fatalf("freeform review should pass, got %d\n%s", code, out)
|
|
@@ -44,7 +44,7 @@ func Runbook(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
44
44
|
fmt.Fprintf(stderr, "runbook: %v\n", err)
|
|
45
45
|
return 1
|
|
46
46
|
}
|
|
47
|
-
fmt.Fprintf(stdout, "runbook: OK
|
|
47
|
+
fmt.Fprintf(stdout, "runbook: OK: %d step(s) in %s\n", len(steps), displayRunbookPath(root, path))
|
|
48
48
|
return 0
|
|
49
49
|
case "run":
|
|
50
50
|
return runbookRun(root, args[1:], stdout, stderr)
|
|
@@ -227,7 +227,7 @@ func ReviewFingerprints(root string, args []string, stdout, stderr io.Writer) in
|
|
|
227
227
|
dir := featureDir(root, slug)
|
|
228
228
|
review, ok := readFileOK(filepath.Join(dir, "review.md"))
|
|
229
229
|
if !ok {
|
|
230
|
-
fmt.Fprintln(stdout, "review-fingerprints: no review.md
|
|
230
|
+
fmt.Fprintln(stdout, "review-fingerprints: no review.md: nothing to fingerprint.")
|
|
231
231
|
return 0
|
|
232
232
|
}
|
|
233
233
|
records := reviewFindingFingerprints(review)
|
|
@@ -76,10 +76,10 @@ func TestReviewFingerprintsStableAndWritable(t *testing.T) {
|
|
|
76
76
|
writeReview(t, root, "feat", `# Review
|
|
77
77
|
|
|
78
78
|
## Spec
|
|
79
|
-
- **Critical
|
|
79
|
+
- **Critical**: AC-003 is unproven.
|
|
80
80
|
|
|
81
81
|
## Code review
|
|
82
|
-
- **Important
|
|
82
|
+
- **Important**: missing error handling.`)
|
|
83
83
|
stdout, stderr := &bytes.Buffer{}, &bytes.Buffer{}
|
|
84
84
|
code := ReviewFingerprints(root, []string{"--write", "feat"}, stdout, stderr)
|
|
85
85
|
if code != 0 {
|