devrites 3.0.5 → 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 +15 -0
- package/README.md +280 -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 +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 +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
|
@@ -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 {
|
|
@@ -12,7 +12,7 @@ import (
|
|
|
12
12
|
// — capability: <c>" section they sit under. It is the shared reader behind two
|
|
13
13
|
// consumers: the spec-validate `--against` ledger cross-check (specvalidate.go)
|
|
14
14
|
// and the capability-ledger fold (ledger.go). The grammar linter (lintSpec) is
|
|
15
|
-
// deliberately left untouched
|
|
15
|
+
// deliberately left untouched (delta H2 headers are transparent to it) so this
|
|
16
16
|
// parser adds delta-awareness without perturbing the flat-spec lint contract.
|
|
17
17
|
|
|
18
18
|
// Delta kinds, lower-cased. A requirement outside any delta section has kind "".
|
|
@@ -35,7 +35,7 @@ var (
|
|
|
35
35
|
// Requirement is one "### Requirement: <name>" block with its delta context.
|
|
36
36
|
type Requirement struct {
|
|
37
37
|
Name string // header text after "Requirement:", trailing space trimmed
|
|
38
|
-
Key string // strings.ToLower(Name)
|
|
38
|
+
Key string // strings.ToLower(Name): the identity used to match across specs
|
|
39
39
|
Kind string // added | modified | removed | "" (flat, no delta section)
|
|
40
40
|
Capability string // from the section tag; "" when untagged
|
|
41
41
|
HeaderLine int // 1-based line of the "### Requirement:" header
|
|
@@ -48,7 +48,7 @@ type SpecDoc struct {
|
|
|
48
48
|
HasDelta bool // at least one "## … Requirements" delta section was seen
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
// ParseSpec reads and structures a spec.md. It never fails on grammar problems
|
|
51
|
+
// ParseSpec reads and structures a spec.md. It never fails on grammar problems:
|
|
52
52
|
// that is lintSpec's job; ParseSpec only extracts blocks and their delta context.
|
|
53
53
|
func ParseSpec(file string) (*SpecDoc, error) {
|
|
54
54
|
f, err := os.Open(file)
|
|
@@ -109,7 +109,7 @@ func ParseSpec(file string) (*SpecDoc, error) {
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
// requirementKeys returns the set of lower-cased requirement names present in a
|
|
112
|
-
// spec file
|
|
112
|
+
// spec file: the identity index a cross-spec existence check consults. A missing
|
|
113
113
|
// or unreadable file yields an empty set (the caller decides whether that is an
|
|
114
114
|
// error), matching how the ledger treats an unseeded capability.
|
|
115
115
|
func requirementKeys(file string) map[string]bool {
|
|
@@ -45,11 +45,11 @@ func SpecSkeleton(arg, cwd string, stdout, stderr io.Writer) int {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
if len(missing) > 0 {
|
|
48
|
-
fmt.Fprintf(stdout, "spec-skeleton: BLOCKED
|
|
48
|
+
fmt.Fprintf(stdout, "spec-skeleton: BLOCKED: %s: missing top-level section(s): %s\n", rel, strings.Join(missing, ", "))
|
|
49
49
|
return 3
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
fmt.Fprintf(stdout, "spec-skeleton: OK
|
|
52
|
+
fmt.Fprintf(stdout, "spec-skeleton: OK: %s: all required top-level sections present\n", rel)
|
|
53
53
|
return 0
|
|
54
54
|
}
|
|
55
55
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Package lib holds native Go implementations of the deterministic, zero-token
|
|
2
2
|
// workflow checks DevRites used to run as individual .sh helpers. Each exported
|
|
3
|
-
// function owns its logic outright
|
|
3
|
+
// function owns its logic outright (it does not shell out) and reproduces the
|
|
4
4
|
// legacy behavior (stdout + exit code) exactly, verified in the CLI test suite
|
|
5
5
|
// by golden assertions or, transitionally, a bash-parity comparison.
|
|
6
6
|
package lib
|
|
@@ -15,11 +15,11 @@ import (
|
|
|
15
15
|
"strings"
|
|
16
16
|
)
|
|
17
17
|
|
|
18
|
-
// Spec-grammar validator
|
|
18
|
+
// Spec-grammar validator: deterministic lint of the structured
|
|
19
19
|
// Requirement/Scenario acceptance grammar in a spec.md. A port of
|
|
20
20
|
// spec-validate.sh; see standards/spec-grammar.md for the grammar.
|
|
21
21
|
//
|
|
22
|
-
// Exit codes: 0 valid (or no structured requirements
|
|
22
|
+
// Exit codes: 0 valid (or no structured requirements: nothing to lint) ·
|
|
23
23
|
// 1 grammar violation(s) · 2 usage · 5 missing spec.md.
|
|
24
24
|
var (
|
|
25
25
|
reqHeaderRe = regexp.MustCompile(`^[[:space:]]*###[[:space:]]+[Rr]equirement:`)
|
|
@@ -57,13 +57,13 @@ func SpecValidate(arg, against, cwd string, stdout, stderr io.Writer) int {
|
|
|
57
57
|
rel := strings.TrimPrefix(spec, cwd+"/")
|
|
58
58
|
|
|
59
59
|
if reqs == 0 && len(findings) == 0 {
|
|
60
|
-
fmt.Fprintf(stdout, "spec-validate: %s uses the simple acceptance form (no \"### Requirement:\" blocks)
|
|
60
|
+
fmt.Fprintf(stdout, "spec-validate: %s uses the simple acceptance form (no \"### Requirement:\" blocks): nothing to lint\n", rel)
|
|
61
61
|
return 0
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
// Delta cross-check (opt-in via --against): a spec written as deltas against a
|
|
65
65
|
// living ledger must classify each requirement correctly. Skipped for a flat
|
|
66
|
-
// snapshot (no delta sections)
|
|
66
|
+
// snapshot (no delta sections): there is nothing to reconcile.
|
|
67
67
|
if against != "" {
|
|
68
68
|
findings = append(findings, checkAgainstLedger(spec, against, defaultCapability(arg))...)
|
|
69
69
|
}
|
|
@@ -72,12 +72,12 @@ func SpecValidate(arg, against, cwd string, stdout, stderr io.Writer) int {
|
|
|
72
72
|
for _, f := range findings {
|
|
73
73
|
fmt.Fprintln(stderr, f)
|
|
74
74
|
}
|
|
75
|
-
fmt.Fprintf(stderr, "spec-validate: %s
|
|
75
|
+
fmt.Fprintf(stderr, "spec-validate: %s: %d requirement(s) / %d scenario(s); %d grammar error(s) (see standards/spec-grammar.md)\n",
|
|
76
76
|
rel, reqs, scens, len(findings))
|
|
77
77
|
return 1
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
fmt.Fprintf(stdout, "spec-validate: OK
|
|
80
|
+
fmt.Fprintf(stdout, "spec-validate: OK: %s: %d requirement(s) / %d scenario(s) well-formed (SHALL + WHEN/THEN, unique headers)\n",
|
|
81
81
|
rel, reqs, scens)
|
|
82
82
|
return 0
|
|
83
83
|
}
|
|
@@ -220,7 +220,7 @@ func lintSpec(file string) (reqCount, scenCount int, findings []string, err erro
|
|
|
220
220
|
}
|
|
221
221
|
if scenInReq == 0 {
|
|
222
222
|
if looseWhenThen {
|
|
223
|
-
findings = append(findings, fmt.Sprintf("ERROR:%s: Requirement \"%s\" (line %d) has WHEN/THEN lines but no \"#### Scenario:\" header
|
|
223
|
+
findings = append(findings, fmt.Sprintf("ERROR:%s: Requirement \"%s\" (line %d) has WHEN/THEN lines but no \"#### Scenario:\" header: wrap them in a scenario", file, curReq, reqLine))
|
|
224
224
|
} else {
|
|
225
225
|
findings = append(findings, fmt.Sprintf("ERROR:%s: Requirement \"%s\" (line %d) has no \"#### Scenario:\" block", file, curReq, reqLine))
|
|
226
226
|
}
|
|
@@ -245,7 +245,7 @@ func lintSpec(file string) (reqCount, scenCount int, findings []string, err erro
|
|
|
245
245
|
looseWhenThen = false
|
|
246
246
|
key := strings.ToLower(name)
|
|
247
247
|
if first, dup := seen[key]; dup {
|
|
248
|
-
findings = append(findings, fmt.Sprintf("ERROR:%s: duplicate Requirement header \"%s\" (lines %d and %d)
|
|
248
|
+
findings = append(findings, fmt.Sprintf("ERROR:%s: duplicate Requirement header \"%s\" (lines %d and %d): headers must be unique", file, name, first, nr))
|
|
249
249
|
} else {
|
|
250
250
|
seen[key] = nr
|
|
251
251
|
}
|
|
@@ -311,7 +311,7 @@ func resolveSpecPath(command, arg string, stderr io.Writer) (string, int, bool)
|
|
|
311
311
|
var spec string
|
|
312
312
|
switch {
|
|
313
313
|
case isDir(arg):
|
|
314
|
-
spec = arg + "/spec.md" // string concat, not filepath.Join
|
|
314
|
+
spec = arg + "/spec.md" // string concat, not filepath.Join: preserve the exact path bytes
|
|
315
315
|
case isFile(arg):
|
|
316
316
|
spec = arg
|
|
317
317
|
default:
|
|
@@ -359,11 +359,11 @@ func checkAgainstLedger(spec, ledgerRoot, defaultCap string) []string {
|
|
|
359
359
|
switch r.Kind {
|
|
360
360
|
case DeltaAdded:
|
|
361
361
|
if exists {
|
|
362
|
-
findings = append(findings, fmt.Sprintf("ERROR:%s: Requirement %q (line %d) is marked ADDED but already exists in ledger capability %q
|
|
362
|
+
findings = append(findings, fmt.Sprintf("ERROR:%s: Requirement %q (line %d) is marked ADDED but already exists in ledger capability %q: use MODIFIED, or drop the delta", spec, r.Name, r.HeaderLine, capability))
|
|
363
363
|
}
|
|
364
364
|
case DeltaModified, DeltaRemoved:
|
|
365
365
|
if !exists {
|
|
366
|
-
findings = append(findings, fmt.Sprintf("ERROR:%s: Requirement %q (line %d) is marked %s but is absent from ledger capability %q
|
|
366
|
+
findings = append(findings, fmt.Sprintf("ERROR:%s: Requirement %q (line %d) is marked %s but is absent from ledger capability %q: use ADDED, or fix the capability tag", spec, r.Name, r.HeaderLine, strings.ToUpper(r.Kind), capability))
|
|
367
367
|
}
|
|
368
368
|
}
|
|
369
369
|
}
|
|
@@ -371,7 +371,7 @@ func checkAgainstLedger(spec, ledgerRoot, defaultCap string) []string {
|
|
|
371
371
|
}
|
|
372
372
|
|
|
373
373
|
// defaultCapability derives the fallback capability for an untagged delta section:
|
|
374
|
-
// the workspace slug
|
|
374
|
+
// the workspace slug: the basename of the workspace dir, or of the spec.md's
|
|
375
375
|
// parent directory when a bare file path was given.
|
|
376
376
|
func defaultCapability(arg string) string {
|
|
377
377
|
if isDir(arg) {
|