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
|
@@ -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) {
|
|
@@ -14,7 +14,7 @@ import (
|
|
|
14
14
|
)
|
|
15
15
|
|
|
16
16
|
// awkNumRe recognises an awk "numeric string" (optional surrounding blanks, sign,
|
|
17
|
-
// int/float/exponent)
|
|
17
|
+
// int/float/exponent): the class that makes a comparison numeric. awkLeadNumRe
|
|
18
18
|
// captures the leading numeric prefix strtod would convert (so "4x" → 4).
|
|
19
19
|
var (
|
|
20
20
|
awkNumRe = regexp.MustCompile(`^[ \t\n]*[+-]?([0-9]+\.?[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?[ \t\n]*$`)
|
|
@@ -62,9 +62,9 @@ func sameWindow(h []string, winVal float64) bool {
|
|
|
62
62
|
// Matching is by (tool,target) sha1, timestamps ignored. root is the .devrites
|
|
63
63
|
// directory; the log lives at <root>/features/<slug>/action.log.
|
|
64
64
|
//
|
|
65
|
-
// 0 ok
|
|
65
|
+
// 0 ok: not stuck (or logging, or no workspace: never fail the caller on log)
|
|
66
66
|
// 2 bad args
|
|
67
|
-
// 3 STUCK
|
|
67
|
+
// 3 STUCK: the recent window is a loop
|
|
68
68
|
func Stuck(root string, args []string, stdout, stderr io.Writer) int {
|
|
69
69
|
cmd := argAt(args, 0)
|
|
70
70
|
slug := argAt(args, 1)
|
|
@@ -84,7 +84,7 @@ func Stuck(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
84
84
|
return 2
|
|
85
85
|
}
|
|
86
86
|
if !isDir(dir) {
|
|
87
|
-
return 0 // no workspace
|
|
87
|
+
return 0 // no workspace: never fail the caller
|
|
88
88
|
}
|
|
89
89
|
record := fmt.Sprintf("%d %s %s\n", time.Now().Unix(), tool, sha1Hex(tool+"|"+target))
|
|
90
90
|
f, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644)
|
|
@@ -102,7 +102,7 @@ func Stuck(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
102
102
|
}
|
|
103
103
|
data, err := os.ReadFile(logPath)
|
|
104
104
|
if err != nil {
|
|
105
|
-
fmt.Fprintln(stdout, "stuck: no actions logged
|
|
105
|
+
fmt.Fprintln(stdout, "stuck: no actions logged: not stuck.")
|
|
106
106
|
return 0
|
|
107
107
|
}
|
|
108
108
|
return checkStuck(actionHashes(data), rawWin, stdout)
|
|
@@ -128,14 +128,14 @@ func actionHashes(data []byte) []string {
|
|
|
128
128
|
|
|
129
129
|
// checkStuck evaluates the hash column for identical-repeat,
|
|
130
130
|
// A<->B ping-pong (last 6), and one-action-dominates (≥6 of last 8). The window
|
|
131
|
-
// arg is handled with awk-compatible semantics
|
|
131
|
+
// arg is handled with awk-compatible semantics (see awkNum / sameWindow) because
|
|
132
132
|
// the prior shell helper passed it verbatim to `awk -v win=`.
|
|
133
133
|
func checkStuck(h []string, rawWin string, stdout io.Writer) int {
|
|
134
134
|
n := len(h)
|
|
135
135
|
winVal, isNumericString := awkNum(rawWin)
|
|
136
136
|
|
|
137
137
|
// `NR < win`: a numeric comparison when the token is a numeric string, else a
|
|
138
|
-
// string comparison of str(NR) against the raw token
|
|
138
|
+
// string comparison of str(NR) against the raw token: awk's comparison rule.
|
|
139
139
|
tooFew := false
|
|
140
140
|
if isNumericString {
|
|
141
141
|
tooFew = float64(n) < winVal
|
|
@@ -143,13 +143,13 @@ func checkStuck(h []string, rawWin string, stdout io.Writer) int {
|
|
|
143
143
|
tooFew = strconv.Itoa(n) < rawWin
|
|
144
144
|
}
|
|
145
145
|
if tooFew {
|
|
146
|
-
fmt.Fprintf(stdout, "stuck: only %d action(s)
|
|
146
|
+
fmt.Fprintf(stdout, "stuck: only %d action(s): not stuck.\n", n)
|
|
147
147
|
return 0
|
|
148
148
|
}
|
|
149
149
|
// The last `win` actions are identical. The message echoes the raw token, as
|
|
150
150
|
// awk prints the `win` variable verbatim (so "04"/"+4" render unchanged).
|
|
151
151
|
if sameWindow(h, winVal) {
|
|
152
|
-
fmt.Fprintf(stdout, "stuck: last %s actions identical
|
|
152
|
+
fmt.Fprintf(stdout, "stuck: last %s actions identical: STUCK.\n", rawWin)
|
|
153
153
|
return 3
|
|
154
154
|
}
|
|
155
155
|
// A<->B ping-pong over the last 6 actions.
|
|
@@ -166,7 +166,7 @@ func checkStuck(h []string, rawWin string, stdout io.Writer) int {
|
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
if pp && h[n-1] != h[n-2] {
|
|
169
|
-
fmt.Fprintln(stdout, "stuck: A<->B ping-pong over last 6
|
|
169
|
+
fmt.Fprintln(stdout, "stuck: A<->B ping-pong over last 6: STUCK.")
|
|
170
170
|
return 3
|
|
171
171
|
}
|
|
172
172
|
}
|
|
@@ -183,11 +183,11 @@ func checkStuck(h []string, rawWin string, stdout io.Writer) int {
|
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
185
|
if top >= 6 {
|
|
186
|
-
fmt.Fprintf(stdout, "stuck: one action %d/8 of recent window
|
|
186
|
+
fmt.Fprintf(stdout, "stuck: one action %d/8 of recent window: STUCK.\n", top)
|
|
187
187
|
return 3
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
|
-
fmt.Fprintln(stdout, "stuck: recent window varied
|
|
190
|
+
fmt.Fprintln(stdout, "stuck: recent window varied: not stuck.")
|
|
191
191
|
return 0
|
|
192
192
|
}
|
|
193
193
|
|
|
@@ -197,7 +197,7 @@ func sha1Hex(s string) string {
|
|
|
197
197
|
return hex.EncodeToString(sum[:])
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
// argAt returns args[i] or ""
|
|
200
|
+
// argAt returns args[i] or "": the Go analogue of bash's ${N:-} positional reads.
|
|
201
201
|
func argAt(args []string, i int) string {
|
|
202
202
|
if i < len(args) {
|
|
203
203
|
return args[i]
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
|
|
3
3
|
Conventions proven by sealed slices on this project. **Local, gitignored, advisory.**
|
|
4
4
|
The confidence band is earned: it reflects how many independent sealed slices corroborated
|
|
5
|
-
the convention
|
|
5
|
+
the convention. It is not a model's guess. A high band is still untrusted data; a fresh
|
|
6
6
|
observation of the live code always wins over a stale entry here.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
# Conventions ledger
|
|
1
|
+
# Conventions ledger: proven priors (live code always overrides)
|
|
@@ -10,7 +10,7 @@ import (
|
|
|
10
10
|
"strings"
|
|
11
11
|
)
|
|
12
12
|
|
|
13
|
-
// skipMarkers matches a test that has been muted
|
|
13
|
+
// skipMarkers matches a test that has been muted: a skip/focus/ignore marker
|
|
14
14
|
// across the common test frameworks. assertMarkers matches an assertion. Both are
|
|
15
15
|
// counted per file to detect a test being weakened rather than fixed.
|
|
16
16
|
var (
|
|
@@ -26,7 +26,7 @@ var (
|
|
|
26
26
|
//
|
|
27
27
|
// 0 clean, or skipped because this is not a git repo
|
|
28
28
|
// 2 no active workspace / bad args
|
|
29
|
-
// 3 WEAKENED
|
|
29
|
+
// 3 WEAKENED: a test was deleted, skipped, or de-asserted since the base
|
|
30
30
|
func TestIntegrity(root string, args []string, stdout, stderr io.Writer) int {
|
|
31
31
|
// Accept both `test-integrity [slug]` and the `check [slug]` alias; a leading
|
|
32
32
|
// dash is treated as "no slug".
|
|
@@ -56,7 +56,7 @@ func TestIntegrity(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
56
56
|
cwd, _ := os.Getwd()
|
|
57
57
|
gitRoot := gitToplevel(cwd)
|
|
58
58
|
if gitRoot == "" {
|
|
59
|
-
fmt.Fprintln(stderr, "test-integrity: not a git repo
|
|
59
|
+
fmt.Fprintln(stderr, "test-integrity: not a git repo: gate skipped, eyeball the test diff by hand.")
|
|
60
60
|
return 0
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -85,7 +85,7 @@ func TestIntegrity(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
85
85
|
testChanged++
|
|
86
86
|
old, ok := gitShow(gitRoot, ref+":"+f)
|
|
87
87
|
if !ok || old == "" {
|
|
88
|
-
continue // new test file
|
|
88
|
+
continue // new test file: adding tests is never a weakening
|
|
89
89
|
}
|
|
90
90
|
if !isFile(filepath.Join(gitRoot, f)) {
|
|
91
91
|
weak++
|
|
@@ -110,17 +110,17 @@ func TestIntegrity(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
// Verification-gap advisory: source changed but no test file did. Not a
|
|
113
|
-
// weakening and never a verdict on its own
|
|
113
|
+
// weakening and never a verdict on its own: a pointer to run the
|
|
114
114
|
// verification-gap trace (testing.md), since a green suite can pass identically
|
|
115
115
|
// with the change reverted. Printed on both the clean and weakened paths.
|
|
116
116
|
gapAdvisory := ""
|
|
117
117
|
if srcChanged > 0 && testChanged == 0 {
|
|
118
|
-
gapAdvisory = fmt.Sprintf("test-integrity: advisory
|
|
118
|
+
gapAdvisory = fmt.Sprintf("test-integrity: advisory: %d source file(s) changed, 0 test file(s) touched; "+
|
|
119
119
|
"run the verification-gap trace (testing.md) to confirm each changed behavior is asserted.", srcChanged)
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
if weak > 0 {
|
|
123
|
-
fmt.Fprintf(stderr, "test-integrity: WEAKENED
|
|
123
|
+
fmt.Fprintf(stderr, "test-integrity: WEAKENED: %d test file(s) lost coverage since the slice base:\n", weak)
|
|
124
124
|
fmt.Fprint(stderr, report.String())
|
|
125
125
|
fmt.Fprintln(stderr, "A test weakened to pass a gate is a Critical finding. Revert it; fix the code or raise a blocking question.")
|
|
126
126
|
if gapAdvisory != "" {
|
|
@@ -128,14 +128,14 @@ func TestIntegrity(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
128
128
|
}
|
|
129
129
|
return 3
|
|
130
130
|
}
|
|
131
|
-
fmt.Fprintln(stdout, "test-integrity: OK
|
|
131
|
+
fmt.Fprintln(stdout, "test-integrity: OK: no test deleted, skipped, or de-asserted since the base.")
|
|
132
132
|
if gapAdvisory != "" {
|
|
133
133
|
fmt.Fprintln(stdout, gapAdvisory)
|
|
134
134
|
}
|
|
135
135
|
return 0
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
-
// isSourceFile recognises a path as project source worth pairing with a test
|
|
138
|
+
// isSourceFile recognises a path as project source worth pairing with a test:
|
|
139
139
|
// a code file that is not itself a test. It filters out the common non-code
|
|
140
140
|
// changes (docs, config, lockfiles) so the verification-gap advisory keys on
|
|
141
141
|
// behavior-bearing edits, not a README or a manifest bump.
|
|
@@ -19,7 +19,7 @@ import (
|
|
|
19
19
|
// any workspace. Exit codes:
|
|
20
20
|
//
|
|
21
21
|
// 0 a slice was spent and budget remains, or no budget is set (nothing to do)
|
|
22
|
-
// 3 the budget is now exhausted
|
|
22
|
+
// 3 the budget is now exhausted: the caller must stop and hand back to a human
|
|
23
23
|
// 5 the file is missing, or the field holds a non-numeric value
|
|
24
24
|
func TickAfk(args []string, stdout, stderr io.Writer) int {
|
|
25
25
|
path := argAt(args, 0)
|
|
@@ -37,7 +37,7 @@ func TickAfk(args []string, stdout, stderr io.Writer) int {
|
|
|
37
37
|
|
|
38
38
|
remaining, found := readBudget(lines)
|
|
39
39
|
if !found || remaining == "none" {
|
|
40
|
-
fmt.Fprintf(stdout, "tick-afk: no \"AFK slices remaining\" budget set in %s
|
|
40
|
+
fmt.Fprintf(stdout, "tick-afk: no \"AFK slices remaining\" budget set in %s: no-op\n", path)
|
|
41
41
|
return 0
|
|
42
42
|
}
|
|
43
43
|
if !isAllDigits(remaining) {
|
|
@@ -62,8 +62,8 @@ func TickAfk(args []string, stdout, stderr io.Writer) int {
|
|
|
62
62
|
return 0
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
// readBudget returns the current "AFK slices remaining" value
|
|
66
|
-
// delimited token after the field
|
|
65
|
+
// readBudget returns the current "AFK slices remaining" value: the first blank-
|
|
66
|
+
// delimited token after the field, and whether the field is present at all.
|
|
67
67
|
func readBudget(lines []string) (value string, found bool) {
|
|
68
68
|
value, found = state.CursorField(lines, state.CursorAFKSlicesRemaining)
|
|
69
69
|
if !found {
|
|
@@ -148,7 +148,7 @@ Normalized by DevRites migration.
|
|
|
148
148
|
|
|
149
149
|
// derivePhase reads state.md in either canonical cursor-table or legacy form and
|
|
150
150
|
// maps its recorded phase/status onto the current lifecycle. An unreadable or
|
|
151
|
-
// unrecognised state defaults to build
|
|
151
|
+
// unrecognised state defaults to build: the safe middle of the arc, from which
|
|
152
152
|
// the completeness gates re-derive what's missing.
|
|
153
153
|
func derivePhase(statePath string) state.Phase {
|
|
154
154
|
raw, err := os.ReadFile(statePath)
|
|
@@ -169,7 +169,7 @@ func derivePhase(statePath string) state.Phase {
|
|
|
169
169
|
// mapLegacyPhase maps a current or legacy phase/status word onto the lifecycle.
|
|
170
170
|
func mapLegacyPhase(word string) (state.Phase, bool) {
|
|
171
171
|
word = strings.ToLower(strings.TrimSpace(word))
|
|
172
|
-
// Take the first token, so "done
|
|
172
|
+
// Take the first token, so a legacy "done" status with trailing notes still maps to "done".
|
|
173
173
|
if i := strings.IndexAny(word, " \t—-"); i > 0 {
|
|
174
174
|
word = word[:i]
|
|
175
175
|
}
|
|
@@ -104,6 +104,7 @@ func TestMapLegacyPhase(t *testing.T) {
|
|
|
104
104
|
{word: "in-progress", want: state.PhaseBuild, ok: true},
|
|
105
105
|
{word: "reviewing", want: state.PhaseReview, ok: true},
|
|
106
106
|
{word: "done - shipped", want: state.PhaseDone, ok: true},
|
|
107
|
+
{word: "done — shipped", want: state.PhaseDone, ok: true},
|
|
107
108
|
{word: "mystery"},
|
|
108
109
|
} {
|
|
109
110
|
got, ok := mapLegacyPhase(tc.word)
|
|
@@ -14,21 +14,21 @@ const FirstRunFile = ".first-run-shown"
|
|
|
14
14
|
|
|
15
15
|
// firstRunNudges maps each first-task token to the single orientation line shown
|
|
16
16
|
// on the first-ever session with no active feature. A token missing here (or a
|
|
17
|
-
// future new token) stays silent
|
|
17
|
+
// future new token) stays silent: the nudge is an enhancement, never a
|
|
18
18
|
// dependency, and prose is owned here rather than in the classifier.
|
|
19
19
|
var firstRunNudges = map[string]string{
|
|
20
|
-
"greenfield": "Greenfield project
|
|
21
|
-
"brownfield-unadopted": "Existing codebase with no DevRites history
|
|
22
|
-
"dirty-worktree": "Uncommitted changes in the worktree
|
|
23
|
-
"branch-ahead": "Branch is ahead of its upstream
|
|
24
|
-
"clean-default": "No active feature
|
|
20
|
+
"greenfield": "Greenfield project: start with /rite-spec <feature> to spec the first feature.",
|
|
21
|
+
"brownfield-unadopted": "Existing codebase with no DevRites history: start with /rite-adopt to onboard it.",
|
|
22
|
+
"dirty-worktree": "Uncommitted changes in the worktree: /rite-frame the work in flight, or /rite-quick for a small fix.",
|
|
23
|
+
"branch-ahead": "Branch is ahead of its upstream: /rite-review then /rite-ship the unshipped work.",
|
|
24
|
+
"clean-default": "No active feature: /rite-spec <feature> starts the next one; /rite shows the menu.",
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
// FirstRunDigest returns the one-time blank-slate orientation for a workspace
|
|
28
28
|
// with no active feature. It fires at most once per project: the marker is
|
|
29
29
|
// written before the text is returned, and a marker that cannot be written
|
|
30
30
|
// keeps the digest silent so a broken filesystem never turns into a per-session
|
|
31
|
-
// nag. Fail-open throughout
|
|
31
|
+
// nag. Fail-open throughout: every non-happy path is ("", false).
|
|
32
32
|
func FirstRunDigest(root string) (text string, has bool) {
|
|
33
33
|
marker := filepath.Join(root, FirstRunFile)
|
|
34
34
|
if _, err := os.Stat(marker); err == nil {
|
|
@@ -40,7 +40,7 @@ func FirstRunDigest(root string) (text string, has bool) {
|
|
|
40
40
|
}
|
|
41
41
|
f, err := os.OpenFile(marker, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0o644)
|
|
42
42
|
if err != nil {
|
|
43
|
-
return "", false // marker unwritable (or raced)
|
|
43
|
+
return "", false // marker unwritable (or raced): silent rather than nagging
|
|
44
44
|
}
|
|
45
45
|
if err := f.Close(); err != nil {
|
|
46
46
|
return "", false
|
|
@@ -20,7 +20,7 @@ import (
|
|
|
20
20
|
const ActiveFile = "ACTIVE"
|
|
21
21
|
|
|
22
22
|
// Digest returns the orientation text for the workspace at root and whether
|
|
23
|
-
// there is anything to say. It returns ("", false, nil)
|
|
23
|
+
// there is anything to say. It returns ("", false, nil): silent, not an error:
|
|
24
24
|
// when no feature is active or the active pointer is stale, so a session is never
|
|
25
25
|
// disrupted by a missing or half-set-up workspace.
|
|
26
26
|
func Digest(root string) (text string, has bool, err error) {
|
|
@@ -33,21 +33,21 @@ func Digest(root string) (text string, has bool, err error) {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
// A stale pointer (names a feature that no longer exists) stays silent
|
|
36
|
-
// rather than erroring
|
|
36
|
+
// rather than erroring: orientation must never be a session dependency.
|
|
37
37
|
report, err := state.Status(root, slug)
|
|
38
38
|
if err != nil {
|
|
39
39
|
return "", false, nil
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
var b strings.Builder
|
|
43
|
-
fmt.Fprintf(&b, "DevRites workflow active
|
|
43
|
+
fmt.Fprintf(&b, "DevRites workflow active: feature %q at phase %q.\n\n", report.Slug, report.Phase)
|
|
44
44
|
b.WriteString(report.Render())
|
|
45
45
|
|
|
46
46
|
// Surface only the high-confidence, human-promoted learnings, capped so a
|
|
47
47
|
// growing ledger never bloats the session. Bounds come from
|
|
48
48
|
// DEVRITES_LEARNING_CONFIDENCE_THRESHOLD / DEVRITES_MAX_INJECTED_LEARNINGS.
|
|
49
49
|
if picks := lib.TopLearnings(root, lib.InjectMax(), lib.InjectThreshold()); len(picks) > 0 {
|
|
50
|
-
b.WriteString("\n\nHigh-confidence learnings (untrusted prior
|
|
50
|
+
b.WriteString("\n\nHigh-confidence learnings (untrusted prior: live code always wins):\n")
|
|
51
51
|
for _, p := range picks {
|
|
52
52
|
b.WriteString(p)
|
|
53
53
|
b.WriteByte('\n')
|
|
@@ -59,7 +59,7 @@ func Digest(root string) (text string, has bool, err error) {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
// ActiveSlug reads and trims the active-feature pointer. A missing pointer file
|
|
62
|
-
// is not an error
|
|
62
|
+
// is not an error: it yields the empty slug (no active feature).
|
|
63
63
|
func ActiveSlug(root string) (string, error) {
|
|
64
64
|
return devritespaths.ActiveSlug(root)
|
|
65
65
|
}
|
|
@@ -18,7 +18,7 @@ import (
|
|
|
18
18
|
|
|
19
19
|
// TestAppendLogConcurrentNoInterleaveNoLoss spawns many concurrent appenders,
|
|
20
20
|
// each writing a distinct small record, and asserts every record landed exactly
|
|
21
|
-
// once and intact
|
|
21
|
+
// once and intact: no interleaving, no lost writes.
|
|
22
22
|
func TestAppendLogConcurrentNoInterleaveNoLoss(t *testing.T) {
|
|
23
23
|
path := filepath.Join(t.TempDir(), "events.log")
|
|
24
24
|
const n = 64
|
|
@@ -57,8 +57,8 @@ func TestAppendLogConcurrentNoInterleaveNoLoss(t *testing.T) {
|
|
|
57
57
|
|
|
58
58
|
// TestAtomicWriteReaderNeverSeesPartial has many writers overwrite one path with
|
|
59
59
|
// distinct full-size contents while readers read concurrently. A reader must
|
|
60
|
-
// always observe a complete, self-consistent file
|
|
61
|
-
// mixed one
|
|
60
|
+
// always observe a complete, self-consistent file: never a half-written or
|
|
61
|
+
// mixed one: which is exactly what temp-file + atomic rename guarantees.
|
|
62
62
|
func TestAtomicWriteReaderNeverSeesPartial(t *testing.T) {
|
|
63
63
|
if runtime.GOOS == "windows" {
|
|
64
64
|
t.Skip("Windows does not allow replacing a file while another handle is reading it")
|
|
@@ -166,7 +166,7 @@ func TestWithFeatureLockSerializesReadModifyWrite(t *testing.T) {
|
|
|
166
166
|
|
|
167
167
|
raw, _ := os.ReadFile(counter)
|
|
168
168
|
if got := strings.TrimSpace(string(raw)); got != strconv.Itoa(n) {
|
|
169
|
-
t.Fatalf("counter = %s, want %d
|
|
169
|
+
t.Fatalf("counter = %s, want %d: lost updates under contention", got, n)
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
|
|
@@ -64,8 +64,8 @@ func featureDir(root, slug string) string {
|
|
|
64
64
|
return devritespaths.FeatureDir(root, slug)
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
// ListFeatures returns the slugs of every feature under root
|
|
68
|
-
// canonical work/ plus compatibility features/ recognized as a feature
|
|
67
|
+
// ListFeatures returns the slugs of every feature under root: directories under
|
|
68
|
+
// canonical work/ plus compatibility features/ recognized as a feature: sorted.
|
|
69
69
|
// A directory is a feature if it has a workspace map OR the working-state
|
|
70
70
|
// ledger (state.md), so a live workspace the pack created without a map
|
|
71
71
|
// still lists. Missing layout directories yield an empty list, not an error.
|
|
@@ -178,7 +178,7 @@ func LoadFeature(root, slug string) (*Feature, error) {
|
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
// sectionPresentAny reports whether any file that can satisfy section s has real
|
|
181
|
-
// content
|
|
181
|
+
// content: the canonical name or a transitional alias.
|
|
182
182
|
func sectionPresentAny(dir string, s Section) bool {
|
|
183
183
|
for _, name := range sectionFiles[s] {
|
|
184
184
|
if sectionPresent(filepath.Join(dir, name)) {
|
|
@@ -207,7 +207,7 @@ func declaredPhaseFromLedger(path string) (Phase, bool) {
|
|
|
207
207
|
// ReadDeclaredSchemaVersion returns the schemaVersion declared in a feature's
|
|
208
208
|
// feature.md frontmatter, or 0 if the file, frontmatter, or field is
|
|
209
209
|
// absent/unparseable. Unlike LoadFeature it does NOT refuse a version newer than
|
|
210
|
-
// the engine supports
|
|
210
|
+
// the engine supports: doctor needs to observe a newer version to report skew,
|
|
211
211
|
// not fail on it.
|
|
212
212
|
func ReadDeclaredSchemaVersion(root, slug string) int {
|
|
213
213
|
raw, err := os.ReadFile(filepath.Join(featureDir(root, slug), "feature.md"))
|
|
@@ -239,7 +239,7 @@ func MaxDeclaredSchemaVersion(root string) (int, error) {
|
|
|
239
239
|
return max, nil
|
|
240
240
|
}
|
|
241
241
|
|
|
242
|
-
// blankOrHash reports whether a trimmed line carries no meaningful content
|
|
242
|
+
// blankOrHash reports whether a trimmed line carries no meaningful content:
|
|
243
243
|
// it is empty or starts with '#' (a Markdown ATX heading, or a comment inside a
|
|
244
244
|
// frontmatter block). Both the section-content scan and the frontmatter parser
|
|
245
245
|
// skip such lines.
|
|
@@ -285,7 +285,7 @@ func splitFrontmatter(raw []byte) (map[string]string, []byte) {
|
|
|
285
285
|
}
|
|
286
286
|
}
|
|
287
287
|
if end < 0 {
|
|
288
|
-
return fm, raw // no closing fence
|
|
288
|
+
return fm, raw // no closing fence: treat as if there were no frontmatter
|
|
289
289
|
}
|
|
290
290
|
for _, line := range lines[:end] {
|
|
291
291
|
t := strings.TrimSpace(line)
|
|
@@ -10,7 +10,7 @@ import (
|
|
|
10
10
|
|
|
11
11
|
// fileLock is an exclusive advisory lock held on an open lock file. On unix it
|
|
12
12
|
// uses flock(2), which the kernel releases automatically when the file is closed
|
|
13
|
-
// or the process exits
|
|
13
|
+
// or the process exits, so a crashed writer never strands the lock.
|
|
14
14
|
type fileLock struct{ f *os.File }
|
|
15
15
|
|
|
16
16
|
func acquireLock(path string) (*fileLock, error) {
|
|
@@ -45,7 +45,7 @@ var Sections = []Section{
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
// sectionFiles lists the filenames that can satisfy each section, canonical name
|
|
48
|
-
// first, then supported aliases
|
|
48
|
+
// first, then supported aliases: the same mapping `devrites-engine migrate`
|
|
49
49
|
// normalizes (proof→evidence, status→state). A section
|
|
50
50
|
// counts as present if ANY of its files has real content, so the engine reads a
|
|
51
51
|
// live workspace before the pack sweep converges the filenames. The workspace
|
|
@@ -28,8 +28,8 @@ var (
|
|
|
28
28
|
)
|
|
29
29
|
|
|
30
30
|
// WorkspaceSnapshot is the machine-readable DevRites workspace/status contract.
|
|
31
|
-
// It models DevRites' native unit of work
|
|
32
|
-
// section completeness
|
|
31
|
+
// It models DevRites' native unit of work: a feature workspace at a phase with
|
|
32
|
+
// section completeness: rather than a generic harness session/worker shape.
|
|
33
33
|
type WorkspaceSnapshot struct {
|
|
34
34
|
SchemaVersion string `json:"schemaVersion"`
|
|
35
35
|
Slug string `json:"slug"`
|
|
@@ -10,7 +10,7 @@ import (
|
|
|
10
10
|
)
|
|
11
11
|
|
|
12
12
|
// AtomicWrite writes data to path via a temp file in the same directory followed
|
|
13
|
-
// by an atomic rename, so a concurrent reader
|
|
13
|
+
// by an atomic rename, so a concurrent reader, or a writer killed mid-write:
|
|
14
14
|
// never observes a half-written structured file. The temp file is fsync'd before
|
|
15
15
|
// the rename so the content is durable before it becomes visible.
|
|
16
16
|
func AtomicWrite(path string, data []byte, perm os.FileMode) error {
|
|
@@ -16,7 +16,7 @@ var Version = "dev"
|
|
|
16
16
|
// Compare returns -1, 0, or +1 as semantic version a is less than, equal to, or
|
|
17
17
|
// greater than b, and ok=false when either side is not a plain dotted-number
|
|
18
18
|
// version (e.g. "dev"). A leading "v" is tolerated; pre-release/build suffixes
|
|
19
|
-
// are ignored. Callers use ok=false to mean "not comparable
|
|
19
|
+
// are ignored. Callers use ok=false to mean "not comparable: do not warn".
|
|
20
20
|
func Compare(a, b string) (cmp int, ok bool) {
|
|
21
21
|
pa, oka := parse(a)
|
|
22
22
|
pb, okb := parse(b)
|