devrites 5.4.0 → 5.6.0
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 +12 -0
- package/README.md +8 -6
- package/docs/command-map.md +2 -2
- package/docs/engine/state-schema.md +12 -0
- package/docs/flow.md +4 -0
- package/docs/orchestration.md +5 -2
- package/engine/commands.go +2 -2
- package/engine/internal/devritespaths/paths.go +18 -0
- package/engine/internal/gate/gate.go +78 -0
- package/engine/internal/gate/gate_test.go +118 -0
- package/engine/internal/hostpack/hostpack.go +45 -6
- package/engine/internal/hostpack/hostpack_test.go +29 -13
- package/engine/internal/install/apply.go +14 -5
- package/engine/internal/install/install.go +8 -2
- package/engine/internal/install/install_test.go +12 -5
- package/engine/internal/install/merge.go +5 -0
- package/engine/internal/install/preflight.go +20 -2
- package/engine/internal/install/uninstall.go +5 -0
- package/engine/internal/install/update.go +1 -1
- package/engine/internal/lib/candidate.go +7 -3
- package/engine/internal/lib/manifest_union.go +326 -0
- package/engine/internal/lib/manifest_union_test.go +214 -0
- package/engine/internal/lib/observe_budgets.go +73 -0
- package/engine/internal/lib/observe_budgets_test.go +142 -0
- package/engine/internal/lib/observe_summary.go +74 -13
- package/engine/internal/lib/workspace_read.go +11 -6
- package/engine/internal/state/budgets.go +163 -0
- package/engine/internal/state/budgets_test.go +42 -0
- package/engine/internal/state/cursor.go +16 -10
- package/engine/internal/state/observation.go +50 -4
- package/engine/internal/state/status.go +38 -26
- package/engine/internal/state/taskgraph.go +23 -0
- package/engine/main.go +32 -13
- package/engine/root_routing_test.go +3 -1
- package/install.sh +4 -1
- package/pack/.claude/agents/devrites-code-reviewer.md +9 -6
- package/pack/.claude/agents/devrites-doubt-reviewer.md +6 -0
- package/pack/.claude/agents/devrites-plan-reviewer.md +7 -1
- package/pack/.claude/agents/devrites-slice-wright.md +42 -46
- package/pack/.claude/agents/devrites-test-analyst.md +9 -4
- package/pack/.claude/agents/devrites-upgrade-planner.md +9 -1
- package/pack/.claude/settings.json +17 -0
- package/pack/.claude/skills/devrites-api-interface/SKILL.md +2 -2
- package/pack/.claude/skills/devrites-doubt/SKILL.md +9 -17
- package/pack/.claude/skills/devrites-lib/reference/candidate-integrity.md +34 -35
- package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +11 -12
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +104 -51
- package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +1 -0
- package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +45 -25
- package/pack/.claude/skills/devrites-lib/reference/standards/core.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +80 -41
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +19 -8
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +33 -1
- package/pack/.claude/skills/rite-build/SKILL.md +26 -19
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +1 -1
- package/pack/.claude/skills/rite-build/reference/parallel-batch.md +90 -40
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +79 -59
- package/pack/.claude/skills/rite-build/reference/spec-drift-guard.md +14 -15
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +8 -8
- package/pack/.claude/skills/rite-define/SKILL.md +4 -1
- package/pack/.claude/skills/rite-plan/SKILL.md +4 -1
- package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +21 -0
- package/pack/.claude/skills/rite-plan/reference/slicing.md +117 -15
- package/pack/.claude/skills/rite-prove/SKILL.md +20 -22
- package/pack/.claude/skills/rite-review/SKILL.md +23 -16
- package/pack/.claude/skills/rite-seal/SKILL.md +8 -8
- package/pack/.claude/skills/rite-seal/reference/final-evidence.md +6 -5
- package/pack/.claude/skills/rite-seal/reference/phase-contract.md +13 -13
- package/pack/.claude/skills/rite-ship/SKILL.md +3 -0
- package/pack/.claude/skills/rite-ship/reference/close-out.md +16 -2
- package/pack/.claude/skills/rite-ship/reference/git-ship.md +14 -5
- package/pack/.claude/skills/rite-spec/SKILL.md +6 -0
- package/pack/.claude/skills/rite-spec/reference/state-workspace.md +6 -0
- package/pack/.claude/skills/rite-status/SKILL.md +4 -1
- package/pack/.claude/skills/rite-temper/SKILL.md +14 -11
- package/pack/.claude/skills/rite-temper/reference/anti-patterns.md +14 -13
- package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +3 -4
- package/pack/.claude/skills/rite-upgrade/SKILL.md +11 -2
- package/pack/.claude/skills/rite-vet/SKILL.md +22 -15
- package/pack/.claude/skills/rite-vet/reference/anti-patterns.md +11 -9
- package/pack/.claude/skills/rite-vet/reference/depth.md +6 -7
- package/pack/.claude/skills/rite-vet/reference/review-axes.md +39 -14
- package/pack/generated/README.md +5 -1
- package/pack/generated/claude/agents/devrites-code-reviewer.md +9 -6
- package/pack/generated/claude/agents/devrites-doubt-reviewer.md +6 -0
- package/pack/generated/claude/agents/devrites-plan-reviewer.md +7 -1
- package/pack/generated/claude/agents/devrites-slice-wright.md +42 -46
- package/pack/generated/claude/agents/devrites-test-analyst.md +9 -4
- package/pack/generated/claude/agents/devrites-upgrade-planner.md +9 -1
- package/pack/generated/claude/settings.json +17 -0
- package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +2 -2
- package/pack/generated/claude/skills/devrites-doubt/SKILL.md +9 -17
- package/pack/generated/claude/skills/devrites-lib/reference/candidate-integrity.md +34 -35
- package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +11 -12
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +104 -51
- package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +1 -0
- package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +45 -25
- package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +80 -41
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +19 -8
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +33 -1
- package/pack/generated/claude/skills/rite-build/SKILL.md +26 -19
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +90 -40
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +79 -59
- package/pack/generated/claude/skills/rite-build/reference/spec-drift-guard.md +14 -15
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +8 -8
- package/pack/generated/claude/skills/rite-define/SKILL.md +4 -1
- package/pack/generated/claude/skills/rite-plan/SKILL.md +4 -1
- package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +21 -0
- package/pack/generated/claude/skills/rite-plan/reference/slicing.md +117 -15
- package/pack/generated/claude/skills/rite-prove/SKILL.md +20 -22
- package/pack/generated/claude/skills/rite-review/SKILL.md +23 -16
- package/pack/generated/claude/skills/rite-seal/SKILL.md +8 -8
- package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +6 -5
- package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +13 -13
- package/pack/generated/claude/skills/rite-ship/SKILL.md +3 -0
- package/pack/generated/claude/skills/rite-ship/reference/close-out.md +16 -2
- package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +14 -5
- package/pack/generated/claude/skills/rite-spec/SKILL.md +6 -0
- package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +6 -0
- package/pack/generated/claude/skills/rite-status/SKILL.md +4 -1
- package/pack/generated/claude/skills/rite-temper/SKILL.md +14 -11
- package/pack/generated/claude/skills/rite-temper/reference/anti-patterns.md +14 -13
- package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +3 -4
- package/pack/generated/claude/skills/rite-upgrade/SKILL.md +11 -2
- package/pack/generated/claude/skills/rite-vet/SKILL.md +22 -15
- package/pack/generated/claude/skills/rite-vet/reference/anti-patterns.md +11 -9
- package/pack/generated/claude/skills/rite-vet/reference/depth.md +6 -7
- package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +39 -14
- package/pack/generated/codex/agents/devrites-code-reviewer.toml +9 -6
- package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +6 -0
- package/pack/generated/codex/agents/devrites-plan-reviewer.toml +7 -1
- package/pack/generated/codex/agents/devrites-slice-wright.toml +42 -46
- package/pack/generated/codex/agents/devrites-test-analyst.toml +9 -4
- package/pack/generated/codex/agents/devrites-upgrade-planner.toml +9 -1
- package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +2 -2
- package/pack/generated/codex/skills/devrites-doubt/SKILL.md +9 -17
- package/pack/generated/codex/skills/devrites-lib/reference/candidate-integrity.md +34 -35
- package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +11 -12
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +104 -51
- package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +1 -0
- package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +45 -25
- package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +80 -41
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +19 -8
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +33 -1
- package/pack/generated/codex/skills/rite-build/SKILL.md +26 -19
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +90 -40
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +79 -59
- package/pack/generated/codex/skills/rite-build/reference/spec-drift-guard.md +14 -15
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +8 -8
- package/pack/generated/codex/skills/rite-define/SKILL.md +4 -1
- package/pack/generated/codex/skills/rite-plan/SKILL.md +4 -1
- package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +21 -0
- package/pack/generated/codex/skills/rite-plan/reference/slicing.md +117 -15
- package/pack/generated/codex/skills/rite-prove/SKILL.md +20 -22
- package/pack/generated/codex/skills/rite-review/SKILL.md +23 -16
- package/pack/generated/codex/skills/rite-seal/SKILL.md +8 -8
- package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +6 -5
- package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +13 -13
- package/pack/generated/codex/skills/rite-ship/SKILL.md +3 -0
- package/pack/generated/codex/skills/rite-ship/reference/close-out.md +16 -2
- package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +14 -5
- package/pack/generated/codex/skills/rite-spec/SKILL.md +6 -0
- package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +6 -0
- package/pack/generated/codex/skills/rite-status/SKILL.md +4 -1
- package/pack/generated/codex/skills/rite-temper/SKILL.md +14 -11
- package/pack/generated/codex/skills/rite-temper/reference/anti-patterns.md +14 -13
- package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +3 -4
- package/pack/generated/codex/skills/rite-upgrade/SKILL.md +11 -2
- package/pack/generated/codex/skills/rite-vet/SKILL.md +22 -15
- package/pack/generated/codex/skills/rite-vet/reference/anti-patterns.md +11 -9
- package/pack/generated/codex/skills/rite-vet/reference/depth.md +6 -7
- package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +39 -14
- package/pack/generated/omp/agents/devrites-code-reviewer.md +9 -6
- package/pack/generated/omp/agents/devrites-doubt-reviewer.md +6 -0
- package/pack/generated/omp/agents/devrites-plan-reviewer.md +7 -1
- package/pack/generated/omp/agents/devrites-slice-wright.md +42 -46
- package/pack/generated/omp/agents/devrites-test-analyst.md +9 -4
- package/pack/generated/omp/agents/devrites-upgrade-planner.md +9 -1
- package/pack/generated/omp/skills/devrites-api-interface/SKILL.md +2 -2
- package/pack/generated/omp/skills/devrites-doubt/SKILL.md +9 -17
- package/pack/generated/omp/skills/devrites-lib/reference/candidate-integrity.md +34 -35
- package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +11 -12
- package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +104 -51
- package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +1 -0
- package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +45 -25
- package/pack/generated/omp/skills/devrites-lib/reference/standards/core.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +80 -41
- package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +19 -8
- package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +33 -1
- package/pack/generated/omp/skills/rite-build/SKILL.md +26 -19
- package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +1 -1
- package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +90 -40
- package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +79 -59
- package/pack/generated/omp/skills/rite-build/reference/spec-drift-guard.md +14 -15
- package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +8 -8
- package/pack/generated/omp/skills/rite-define/SKILL.md +4 -1
- package/pack/generated/omp/skills/rite-plan/SKILL.md +4 -1
- package/pack/generated/omp/skills/rite-plan/reference/replan-and-repair.md +21 -0
- package/pack/generated/omp/skills/rite-plan/reference/slicing.md +117 -15
- package/pack/generated/omp/skills/rite-prove/SKILL.md +20 -22
- package/pack/generated/omp/skills/rite-review/SKILL.md +23 -16
- package/pack/generated/omp/skills/rite-seal/SKILL.md +8 -8
- package/pack/generated/omp/skills/rite-seal/reference/final-evidence.md +6 -5
- package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +13 -13
- package/pack/generated/omp/skills/rite-ship/SKILL.md +3 -0
- package/pack/generated/omp/skills/rite-ship/reference/close-out.md +16 -2
- package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +14 -5
- package/pack/generated/omp/skills/rite-spec/SKILL.md +6 -0
- package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +6 -0
- package/pack/generated/omp/skills/rite-status/SKILL.md +4 -1
- package/pack/generated/omp/skills/rite-temper/SKILL.md +14 -11
- package/pack/generated/omp/skills/rite-temper/reference/anti-patterns.md +14 -13
- package/pack/generated/omp/skills/rite-temper/reference/review-dimensions.md +3 -4
- package/pack/generated/omp/skills/rite-upgrade/SKILL.md +11 -2
- package/pack/generated/omp/skills/rite-vet/SKILL.md +22 -15
- package/pack/generated/omp/skills/rite-vet/reference/anti-patterns.md +11 -9
- package/pack/generated/omp/skills/rite-vet/reference/depth.md +6 -7
- package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +39 -14
- package/pack/generated/pi/AGENTS.md +22 -0
- package/pack/generated/pi/agents/devrites-code-reviewer.md +142 -0
- package/pack/generated/pi/agents/devrites-devex-reviewer.md +124 -0
- package/pack/generated/pi/agents/devrites-doubt-reviewer.md +88 -0
- package/pack/generated/pi/agents/devrites-evidence-scout.md +72 -0
- package/pack/generated/pi/agents/devrites-frontend-reviewer.md +116 -0
- package/pack/generated/pi/agents/devrites-performance-reviewer.md +115 -0
- package/pack/generated/pi/agents/devrites-plan-drafter.md +99 -0
- package/pack/generated/pi/agents/devrites-plan-reviewer.md +142 -0
- package/pack/generated/pi/agents/devrites-proof-runner.md +74 -0
- package/pack/generated/pi/agents/devrites-retrospector.md +61 -0
- package/pack/generated/pi/agents/devrites-security-auditor.md +109 -0
- package/pack/generated/pi/agents/devrites-simplifier-reviewer.md +94 -0
- package/pack/generated/pi/agents/devrites-slice-wright.md +204 -0
- package/pack/generated/pi/agents/devrites-spec-reviewer.md +96 -0
- package/pack/generated/pi/agents/devrites-strategy-reviewer.md +100 -0
- package/pack/generated/pi/agents/devrites-test-analyst.md +94 -0
- package/pack/generated/pi/agents/devrites-upgrade-planner.md +89 -0
- package/pack/generated/pi/prompts/rite-adopt.md +5 -0
- package/pack/generated/pi/prompts/rite-autocomplete.md +5 -0
- package/pack/generated/pi/prompts/rite-build.md +5 -0
- package/pack/generated/pi/prompts/rite-clarify.md +5 -0
- package/pack/generated/pi/prompts/rite-converge.md +5 -0
- package/pack/generated/pi/prompts/rite-customize.md +5 -0
- package/pack/generated/pi/prompts/rite-define.md +5 -0
- package/pack/generated/pi/prompts/rite-doctor.md +5 -0
- package/pack/generated/pi/prompts/rite-dogfood.md +5 -0
- package/pack/generated/pi/prompts/rite-explain.md +5 -0
- package/pack/generated/pi/prompts/rite-frame.md +5 -0
- package/pack/generated/pi/prompts/rite-handoff.md +5 -0
- package/pack/generated/pi/prompts/rite-learn.md +5 -0
- package/pack/generated/pi/prompts/rite-plan.md +5 -0
- package/pack/generated/pi/prompts/rite-polish.md +5 -0
- package/pack/generated/pi/prompts/rite-pov.md +5 -0
- package/pack/generated/pi/prompts/rite-pr-feedback.md +5 -0
- package/pack/generated/pi/prompts/rite-pressure-test.md +5 -0
- package/pack/generated/pi/prompts/rite-prototype.md +5 -0
- package/pack/generated/pi/prompts/rite-prove.md +5 -0
- package/pack/generated/pi/prompts/rite-quick.md +5 -0
- package/pack/generated/pi/prompts/rite-resolve.md +5 -0
- package/pack/generated/pi/prompts/rite-review.md +5 -0
- package/pack/generated/pi/prompts/rite-seal.md +5 -0
- package/pack/generated/pi/prompts/rite-ship.md +5 -0
- package/pack/generated/pi/prompts/rite-spec.md +5 -0
- package/pack/generated/pi/prompts/rite-status.md +5 -0
- package/pack/generated/pi/prompts/rite-temper.md +5 -0
- package/pack/generated/pi/prompts/rite-upgrade.md +5 -0
- package/pack/generated/pi/prompts/rite-vet.md +5 -0
- package/pack/generated/pi/prompts/rite-watch-pr.md +5 -0
- package/pack/generated/pi/prompts/rite-zoom-out.md +5 -0
- package/pack/generated/pi/prompts/rite.md +5 -0
- package/pack/generated/pi/skills/devrites-api-interface/SKILL.md +63 -0
- package/pack/generated/pi/skills/devrites-audit/SKILL.md +50 -0
- package/pack/generated/pi/skills/devrites-browser-proof/SKILL.md +76 -0
- package/pack/generated/pi/skills/devrites-browser-proof/reference/browser-performance.md +15 -0
- package/pack/generated/pi/skills/devrites-browser-proof/reference/visual-verdict.md +34 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/SKILL.md +96 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/reference/build-the-loop.md +58 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/reference/hypotheses.md +17 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/reference/instrumentation.md +21 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/reference/regression-test.md +30 -0
- package/pack/generated/pi/skills/devrites-debug-recovery/reference/trace.md +25 -0
- package/pack/generated/pi/skills/devrites-doubt/SKILL.md +79 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/SKILL.md +86 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/craft.md +63 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/design-references.md +116 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/fullstack.md +46 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/quality-standards.md +294 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/reuse-first.md +53 -0
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/shape.md +56 -0
- package/pack/generated/pi/skills/devrites-interview/SKILL.md +102 -0
- package/pack/generated/pi/skills/devrites-lib/SKILL.md +58 -0
- package/pack/generated/pi/skills/devrites-lib/reference/candidate-integrity.md +42 -0
- package/pack/generated/pi/skills/devrites-lib/reference/intent-map.md +64 -0
- package/pack/generated/pi/skills/devrites-lib/reference/orchestration-profiles.md +27 -0
- package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +73 -0
- package/pack/generated/pi/skills/devrites-lib/reference/reply-contract.md +88 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/README.md +60 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/acceptance-preserving-reslice.md +30 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +398 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +99 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/anti-patterns.md +48 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/browser-proof-checklist.md +24 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/ci-cd.md +50 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/code-review.md +108 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/coding-style.md +48 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/context-hygiene.md +109 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/core.md +167 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/data-integrity.md +118 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/debug-recovery.md +28 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/definition-of-done.md +19 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/deprecation.md +31 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/developer-experience.md +119 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/development-workflow.md +29 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/documentation.md +43 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/edge-case-trace.md +92 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/elicitation.md +85 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/error-handling.md +47 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/git-workflow.md +49 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/hooks.md +25 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/integration-reliability.md +102 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/loop-operations.md +85 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/observability.md +88 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/one-shot-actions.md +97 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/patterns.md +68 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/performance.md +51 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/principles.md +42 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/prose-style.md +123 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/release/ship-checklist.md +8 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/repository-topology.md +80 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/review-checklist.md +12 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/security-checklist.md +25 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/security.md +202 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/skill-authoring.md +209 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/spec-grammar.md +197 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/test-proof-checklist.md +13 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/testing.md +212 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/tooling.md +92 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/workflow-artifacts.md +427 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/code.md +44 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/comparison.md +42 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/diagram.md +51 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/index.md +66 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/input.md +46 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/outline-template.md +106 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/plan.md +48 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/slides.md +40 -0
- package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/table.md +42 -0
- package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +267 -0
- package/pack/generated/pi/skills/devrites-prose-craft/SKILL.md +73 -0
- package/pack/generated/pi/skills/devrites-prose-craft/reference/banned-phrases.md +132 -0
- package/pack/generated/pi/skills/devrites-prose-craft/reference/examples.md +131 -0
- package/pack/generated/pi/skills/devrites-prose-craft/reference/structures.md +196 -0
- package/pack/generated/pi/skills/devrites-source-driven/SKILL.md +52 -0
- package/pack/generated/pi/skills/devrites-ux-shape/SKILL.md +134 -0
- package/pack/generated/pi/skills/devrites-ux-shape/reference/brief-template.md +108 -0
- package/pack/generated/pi/skills/devrites-ux-shape/reference/visual-direction-probe.md +48 -0
- package/pack/generated/pi/skills/rite/SKILL.md +148 -0
- package/pack/generated/pi/skills/rite/reference/menu.md +48 -0
- package/pack/generated/pi/skills/rite-adopt/SKILL.md +52 -0
- package/pack/generated/pi/skills/rite-adopt/reference/adoption.md +19 -0
- package/pack/generated/pi/skills/rite-adopt/reference/anti-patterns.md +19 -0
- package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +132 -0
- package/pack/generated/pi/skills/rite-autocomplete/reference/decision-policy.md +41 -0
- package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +148 -0
- package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +92 -0
- package/pack/generated/pi/skills/rite-build/SKILL.md +96 -0
- package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +145 -0
- package/pack/generated/pi/skills/rite-build/reference/anti-patterns.md +23 -0
- package/pack/generated/pi/skills/rite-build/reference/checkpoint-protocol.md +120 -0
- package/pack/generated/pi/skills/rite-build/reference/checkpoint.md +44 -0
- package/pack/generated/pi/skills/rite-build/reference/frontend-trigger.md +39 -0
- package/pack/generated/pi/skills/rite-build/reference/one-slice-cycle.md +50 -0
- package/pack/generated/pi/skills/rite-build/reference/output.md +33 -0
- package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +205 -0
- package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +87 -0
- package/pack/generated/pi/skills/rite-build/reference/spec-drift-guard.md +84 -0
- package/pack/generated/pi/skills/rite-build/reference/tdd.md +27 -0
- package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +89 -0
- package/pack/generated/pi/skills/rite-clarify/SKILL.md +99 -0
- package/pack/generated/pi/skills/rite-clarify/reference/anti-patterns.md +24 -0
- package/pack/generated/pi/skills/rite-clarify/reference/decision-coverage.md +55 -0
- package/pack/generated/pi/skills/rite-converge/SKILL.md +145 -0
- package/pack/generated/pi/skills/rite-converge/reference/anti-patterns.md +35 -0
- package/pack/generated/pi/skills/rite-converge/reference/convergence-assessment.md +65 -0
- package/pack/generated/pi/skills/rite-customize/SKILL.md +60 -0
- package/pack/generated/pi/skills/rite-define/SKILL.md +169 -0
- package/pack/generated/pi/skills/rite-define/reference/anti-patterns.md +26 -0
- package/pack/generated/pi/skills/rite-define/reference/gates.md +154 -0
- package/pack/generated/pi/skills/rite-define/reference/plan-template.md +149 -0
- package/pack/generated/pi/skills/rite-doctor/SKILL.md +69 -0
- package/pack/generated/pi/skills/rite-dogfood/SKILL.md +55 -0
- package/pack/generated/pi/skills/rite-explain/SKILL.md +152 -0
- package/pack/generated/pi/skills/rite-explain/reference/intake.md +89 -0
- package/pack/generated/pi/skills/rite-frame/SKILL.md +115 -0
- package/pack/generated/pi/skills/rite-frame/reference/failure-modes.md +66 -0
- package/pack/generated/pi/skills/rite-handoff/SKILL.md +97 -0
- package/pack/generated/pi/skills/rite-handoff/reference/handoff-template.md +44 -0
- package/pack/generated/pi/skills/rite-learn/SKILL.md +72 -0
- package/pack/generated/pi/skills/rite-plan/SKILL.md +186 -0
- package/pack/generated/pi/skills/rite-plan/reference/anti-patterns.md +34 -0
- package/pack/generated/pi/skills/rite-plan/reference/dependency-graph.md +48 -0
- package/pack/generated/pi/skills/rite-plan/reference/replan-and-repair.md +105 -0
- package/pack/generated/pi/skills/rite-plan/reference/slicing.md +167 -0
- package/pack/generated/pi/skills/rite-plan/reference/task-breakdown.md +42 -0
- package/pack/generated/pi/skills/rite-polish/SKILL.md +104 -0
- package/pack/generated/pi/skills/rite-polish/reference/adr-promotion.md +11 -0
- package/pack/generated/pi/skills/rite-polish/reference/anti-ai-slop.md +187 -0
- package/pack/generated/pi/skills/rite-polish/reference/anti-patterns.md +30 -0
- package/pack/generated/pi/skills/rite-polish/reference/backend-polish.md +80 -0
- package/pack/generated/pi/skills/rite-polish/reference/browser-polish-evidence.md +33 -0
- package/pack/generated/pi/skills/rite-polish/reference/code.md +82 -0
- package/pack/generated/pi/skills/rite-polish/reference/design-memory.md +117 -0
- package/pack/generated/pi/skills/rite-polish/reference/design-system-discovery.md +8 -0
- package/pack/generated/pi/skills/rite-polish/reference/harden-checklist.md +109 -0
- package/pack/generated/pi/skills/rite-polish/reference/ledger.md +65 -0
- package/pack/generated/pi/skills/rite-polish/reference/ui.md +137 -0
- package/pack/generated/pi/skills/rite-pov/SKILL.md +58 -0
- package/pack/generated/pi/skills/rite-pr-feedback/SKILL.md +54 -0
- package/pack/generated/pi/skills/rite-pressure-test/SKILL.md +67 -0
- package/pack/generated/pi/skills/rite-prototype/SKILL.md +104 -0
- package/pack/generated/pi/skills/rite-prove/SKILL.md +120 -0
- package/pack/generated/pi/skills/rite-prove/reference/acceptance-proof.md +88 -0
- package/pack/generated/pi/skills/rite-prove/reference/anti-patterns.md +25 -0
- package/pack/generated/pi/skills/rite-prove/reference/browser-proof.md +51 -0
- package/pack/generated/pi/skills/rite-prove/reference/failure-triage.md +43 -0
- package/pack/generated/pi/skills/rite-prove/reference/proof-ladder.md +28 -0
- package/pack/generated/pi/skills/rite-prove/reference/test-command-discovery.md +30 -0
- package/pack/generated/pi/skills/rite-quick/SKILL.md +82 -0
- package/pack/generated/pi/skills/rite-resolve/SKILL.md +95 -0
- package/pack/generated/pi/skills/rite-resolve/reference/answer-protocol.md +118 -0
- package/pack/generated/pi/skills/rite-review/SKILL.md +170 -0
- package/pack/generated/pi/skills/rite-review/reference/anti-patterns.md +32 -0
- package/pack/generated/pi/skills/rite-review/reference/cognitive-load.md +90 -0
- package/pack/generated/pi/skills/rite-review/reference/feature-scoped-review.md +26 -0
- package/pack/generated/pi/skills/rite-review/reference/five-axis-review.md +66 -0
- package/pack/generated/pi/skills/rite-review/reference/nielsen-heuristics.md +126 -0
- package/pack/generated/pi/skills/rite-review/reference/performance-checklist.md +80 -0
- package/pack/generated/pi/skills/rite-review/reference/performance-review.md +14 -0
- package/pack/generated/pi/skills/rite-review/reference/security-review.md +42 -0
- package/pack/generated/pi/skills/rite-seal/SKILL.md +75 -0
- package/pack/generated/pi/skills/rite-seal/reference/anti-patterns.md +29 -0
- package/pack/generated/pi/skills/rite-seal/reference/final-evidence.md +41 -0
- package/pack/generated/pi/skills/rite-seal/reference/go-no-go.md +29 -0
- package/pack/generated/pi/skills/rite-seal/reference/output.md +5 -0
- package/pack/generated/pi/skills/rite-seal/reference/phase-contract.md +47 -0
- package/pack/generated/pi/skills/rite-seal/reference/risk-and-rollback.md +56 -0
- package/pack/generated/pi/skills/rite-seal/reference/seal-template.md +27 -0
- package/pack/generated/pi/skills/rite-ship/SKILL.md +88 -0
- package/pack/generated/pi/skills/rite-ship/reference/anti-patterns.md +28 -0
- package/pack/generated/pi/skills/rite-ship/reference/close-out.md +68 -0
- package/pack/generated/pi/skills/rite-ship/reference/git-ship.md +120 -0
- package/pack/generated/pi/skills/rite-ship/reference/rollout.md +62 -0
- package/pack/generated/pi/skills/rite-ship/reference/ship-template.md +39 -0
- package/pack/generated/pi/skills/rite-spec/SKILL.md +150 -0
- package/pack/generated/pi/skills/rite-spec/reference/acceptance-criteria.md +31 -0
- package/pack/generated/pi/skills/rite-spec/reference/ai-spec-template.md +40 -0
- package/pack/generated/pi/skills/rite-spec/reference/anti-patterns.md +27 -0
- package/pack/generated/pi/skills/rite-spec/reference/interview-patterns.md +56 -0
- package/pack/generated/pi/skills/rite-spec/reference/investigation.md +83 -0
- package/pack/generated/pi/skills/rite-spec/reference/question-protocol.md +36 -0
- package/pack/generated/pi/skills/rite-spec/reference/references-intake.md +62 -0
- package/pack/generated/pi/skills/rite-spec/reference/spec-checklists.md +89 -0
- package/pack/generated/pi/skills/rite-spec/reference/spec-template.md +154 -0
- package/pack/generated/pi/skills/rite-spec/reference/state-workspace.md +227 -0
- package/pack/generated/pi/skills/rite-status/SKILL.md +57 -0
- package/pack/generated/pi/skills/rite-temper/SKILL.md +130 -0
- package/pack/generated/pi/skills/rite-temper/reference/anti-patterns.md +30 -0
- package/pack/generated/pi/skills/rite-temper/reference/review-dimensions.md +66 -0
- package/pack/generated/pi/skills/rite-temper/reference/scope-modes.md +53 -0
- package/pack/generated/pi/skills/rite-temper/reference/significance.md +46 -0
- package/pack/generated/pi/skills/rite-temper/reference/strategy-template.md +90 -0
- package/pack/generated/pi/skills/rite-upgrade/SKILL.md +121 -0
- package/pack/generated/pi/skills/rite-vet/SKILL.md +193 -0
- package/pack/generated/pi/skills/rite-vet/reference/anti-patterns.md +43 -0
- package/pack/generated/pi/skills/rite-vet/reference/artifacts.md +202 -0
- package/pack/generated/pi/skills/rite-vet/reference/cross-model.md +19 -0
- package/pack/generated/pi/skills/rite-vet/reference/depth.md +59 -0
- package/pack/generated/pi/skills/rite-vet/reference/eng-lenses.md +48 -0
- package/pack/generated/pi/skills/rite-vet/reference/review-axes.md +201 -0
- package/pack/generated/pi/skills/rite-watch-pr/SKILL.md +85 -0
- package/pack/generated/pi/skills/rite-zoom-out/SKILL.md +69 -0
- package/package.json +3 -2
- package/scripts/build-host-artifacts.sh +54 -4
- package/scripts/codex-generate.sh +6 -0
- package/scripts/pi-generate.sh +198 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
package state
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"bytes"
|
|
5
|
+
"strings"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
// Artifact budgets mirror workspace-artifact-schema.md "What each file owns".
|
|
9
|
+
// A line budget also bounds bytes at BudgetBytesPerLine per budgeted line so a
|
|
10
|
+
// few very long lines cannot evade it.
|
|
11
|
+
const (
|
|
12
|
+
BudgetBytesPerLine = 400
|
|
13
|
+
// BudgetBlockFactor is the material-overshoot threshold. At or above this
|
|
14
|
+
// multiple of a line or byte budget a gate blocks unless the artifact
|
|
15
|
+
// records a structural `Budget override:` line; smaller overshoots are
|
|
16
|
+
// reported by `orient` and stay advisory.
|
|
17
|
+
BudgetBlockFactor = 1.5
|
|
18
|
+
// MaxArtifactBytes is the per-artifact read cap. A larger artifact cannot be
|
|
19
|
+
// observed and blocks as file_too_large, so callers that explain a size
|
|
20
|
+
// problem quote the same number the observer enforced.
|
|
21
|
+
MaxArtifactBytes = maxArtifactBytes
|
|
22
|
+
// PacketMaxBytes is the serialized-packet ceiling from context-hygiene.md:
|
|
23
|
+
// "A serialized packet stays <= 64 KiB; larger means the scope is wrong".
|
|
24
|
+
// A non-canonical workspace-root file over it is unsanctioned placement.
|
|
25
|
+
PacketMaxBytes = 64 << 10
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
var artifactLineBudgets = map[string]int{
|
|
29
|
+
"README.md": 120,
|
|
30
|
+
"brief.md": 80,
|
|
31
|
+
"spec.md": 260,
|
|
32
|
+
"decision-coverage.md": 200,
|
|
33
|
+
"strategy.md": 180,
|
|
34
|
+
"architecture.md": 180,
|
|
35
|
+
"flows.md": 160,
|
|
36
|
+
"decisions.md": 200,
|
|
37
|
+
"assumptions.md": 160,
|
|
38
|
+
"questions.md": 180,
|
|
39
|
+
"plan.md": 220,
|
|
40
|
+
"tasks.md": 280,
|
|
41
|
+
"traceability.md": 220,
|
|
42
|
+
"eng-review.md": 240,
|
|
43
|
+
"test-plan.md": 260,
|
|
44
|
+
"state.md": 120,
|
|
45
|
+
"evidence.md": 280,
|
|
46
|
+
"browser-evidence.md": 220,
|
|
47
|
+
"drift.md": 160,
|
|
48
|
+
"touched-files.md": 160,
|
|
49
|
+
"design-brief.md": 160,
|
|
50
|
+
"handoff.md": 120,
|
|
51
|
+
"polish-report.md": 200,
|
|
52
|
+
"ship.md": 120,
|
|
53
|
+
"review.md": 240,
|
|
54
|
+
"seal.md": 200,
|
|
55
|
+
"ai-spec.md": 160,
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// advisoryOnlyArtifacts are append-only proof ledgers: they scale with proof
|
|
59
|
+
// volume, not with planning surface, so their budget stays advisory in `orient`
|
|
60
|
+
// and never blocks a gate. touched-files.md keeps its own deterministic
|
|
61
|
+
// manifest limits.
|
|
62
|
+
var advisoryOnlyArtifacts = map[string]bool{
|
|
63
|
+
"evidence.md": true,
|
|
64
|
+
"browser-evidence.md": true,
|
|
65
|
+
"touched-files.md": true,
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ArtifactLineBudget returns the documented line budget for a canonical artifact.
|
|
69
|
+
func ArtifactLineBudget(name string) (int, bool) {
|
|
70
|
+
budget, ok := artifactLineBudgets[name]
|
|
71
|
+
return budget, ok
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// sanctionedRootFiles are workspace-root files the schema places there without a
|
|
75
|
+
// line budget: conditional artifacts (`references.md`, `investigation-map.md`,
|
|
76
|
+
// `dogfood.md`) and the engine-owned parallel lease. Anything else in the root
|
|
77
|
+
// is unsanctioned placement — `packets/` and `history/` own by-reference
|
|
78
|
+
// packets and relocated narrative (workspace-artifact-schema.md "Required by
|
|
79
|
+
// phase").
|
|
80
|
+
var sanctionedRootFiles = map[string]bool{
|
|
81
|
+
"references.md": true,
|
|
82
|
+
"investigation-map.md": true,
|
|
83
|
+
"dogfood.md": true,
|
|
84
|
+
"parallel-lease.md": true,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// SanctionedRootFile reports whether name is a legitimate workspace-root file:
|
|
88
|
+
// a budgeted canonical artifact or a documented unbudgeted one.
|
|
89
|
+
func SanctionedRootFile(name string) bool {
|
|
90
|
+
if _, ok := artifactLineBudgets[name]; ok {
|
|
91
|
+
return true
|
|
92
|
+
}
|
|
93
|
+
return sanctionedRootFiles[name]
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ArtifactBudgetGateApplies reports whether the deterministic material-overshoot
|
|
97
|
+
// gate covers this artifact (canonical and not an advisory-only proof ledger).
|
|
98
|
+
func ArtifactBudgetGateApplies(name string) bool {
|
|
99
|
+
_, ok := artifactLineBudgets[name]
|
|
100
|
+
return ok && !advisoryOnlyArtifacts[name]
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ArtifactBudgetStatus is one canonical artifact measured against its budget.
|
|
104
|
+
type ArtifactBudgetStatus struct {
|
|
105
|
+
File string
|
|
106
|
+
Lines int
|
|
107
|
+
Bytes int64
|
|
108
|
+
LineBudget int
|
|
109
|
+
ByteBudget int64
|
|
110
|
+
Over bool
|
|
111
|
+
Material bool
|
|
112
|
+
Override bool
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// ArtifactBudget measures raw against the named artifact's budget. ok is false
|
|
116
|
+
// for a non-canonical file name.
|
|
117
|
+
func ArtifactBudget(name string, raw []byte) (ArtifactBudgetStatus, bool) {
|
|
118
|
+
lineBudget, ok := artifactLineBudgets[name]
|
|
119
|
+
if !ok {
|
|
120
|
+
return ArtifactBudgetStatus{}, false
|
|
121
|
+
}
|
|
122
|
+
status := ArtifactBudgetStatus{
|
|
123
|
+
File: name,
|
|
124
|
+
Lines: CountLines(raw),
|
|
125
|
+
Bytes: int64(len(raw)),
|
|
126
|
+
LineBudget: lineBudget,
|
|
127
|
+
ByteBudget: int64(lineBudget) * BudgetBytesPerLine,
|
|
128
|
+
}
|
|
129
|
+
status.Over = status.Lines > lineBudget || status.Bytes > status.ByteBudget
|
|
130
|
+
status.Material = float64(status.Lines) >= float64(lineBudget)*BudgetBlockFactor ||
|
|
131
|
+
float64(status.Bytes) >= float64(status.ByteBudget)*BudgetBlockFactor
|
|
132
|
+
status.Override = HasBudgetOverride(raw)
|
|
133
|
+
return status, true
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// CountLines counts newline-terminated lines plus a final unterminated line.
|
|
137
|
+
func CountLines(raw []byte) int {
|
|
138
|
+
if len(raw) == 0 {
|
|
139
|
+
return 0
|
|
140
|
+
}
|
|
141
|
+
lines := bytes.Count(raw, []byte{'\n'})
|
|
142
|
+
if raw[len(raw)-1] != '\n' {
|
|
143
|
+
lines++
|
|
144
|
+
}
|
|
145
|
+
return lines
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// HasBudgetOverride reports a structural `Budget override:` line outside fenced
|
|
149
|
+
// code blocks; a fenced example never counts.
|
|
150
|
+
func HasBudgetOverride(raw []byte) bool {
|
|
151
|
+
fenced := false
|
|
152
|
+
for _, line := range strings.Split(string(raw), "\n") {
|
|
153
|
+
trimmed := strings.TrimSpace(line)
|
|
154
|
+
if strings.HasPrefix(trimmed, "```") {
|
|
155
|
+
fenced = !fenced
|
|
156
|
+
continue
|
|
157
|
+
}
|
|
158
|
+
if !fenced && strings.HasPrefix(trimmed, "Budget override:") {
|
|
159
|
+
return true
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return false
|
|
163
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
package state
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"strings"
|
|
5
|
+
"testing"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
func TestArtifactBudgetMeasuresLinesBytesAndMateriality(t *testing.T) {
|
|
9
|
+
if _, ok := ArtifactBudget("notes.json", []byte("x")); ok {
|
|
10
|
+
t.Fatal("non-canonical files have no budget")
|
|
11
|
+
}
|
|
12
|
+
within, ok := ArtifactBudget("tasks.md", []byte("# Tasks\n## SLICE-001 A\nDependencies: none\n"))
|
|
13
|
+
if !ok || within.Over || within.Material {
|
|
14
|
+
t.Fatalf("within=%+v", within)
|
|
15
|
+
}
|
|
16
|
+
over, _ := ArtifactBudget("tasks.md", []byte(strings.Repeat("x\n", 300)))
|
|
17
|
+
if !over.Over || over.Material {
|
|
18
|
+
t.Fatalf("300 lines against a 280-line budget must be over but not material: %+v", over)
|
|
19
|
+
}
|
|
20
|
+
material, _ := ArtifactBudget("tasks.md", []byte(strings.Repeat("x\n", 500)))
|
|
21
|
+
if !material.Material {
|
|
22
|
+
t.Fatalf("500 lines must be material: %+v", material)
|
|
23
|
+
}
|
|
24
|
+
longLine, _ := ArtifactBudget("state.md", []byte(strings.Repeat("y", 100_000)+"\n"))
|
|
25
|
+
if !longLine.Material || longLine.Lines != 1 {
|
|
26
|
+
t.Fatalf("one very long line must trip the byte budget: %+v", longLine)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
func TestHasBudgetOverrideIgnoresFencedExamples(t *testing.T) {
|
|
31
|
+
if HasBudgetOverride([]byte("plain text\nBudget override: relocation pending\n")) != true {
|
|
32
|
+
t.Fatal("structural override line must be recognized")
|
|
33
|
+
}
|
|
34
|
+
fenced := "See the schema:\n\n```markdown\nBudget override: <reason>\n```\n\nNothing recorded.\n"
|
|
35
|
+
if HasBudgetOverride([]byte(fenced)) {
|
|
36
|
+
t.Fatal("a fenced example is not an override")
|
|
37
|
+
}
|
|
38
|
+
indented := " Budget override: table form is required\n"
|
|
39
|
+
if !HasBudgetOverride([]byte(indented)) {
|
|
40
|
+
t.Fatal("leading whitespace must not hide a real override line")
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -12,15 +12,19 @@ import (
|
|
|
12
12
|
// remain local to the cursor package; normalizeCursorKey still accepts legacy
|
|
13
13
|
// presentation aliases at the text boundary.
|
|
14
14
|
const (
|
|
15
|
-
CursorPhase
|
|
16
|
-
CursorStatus
|
|
17
|
-
CursorNextAction
|
|
18
|
-
CursorQuestionID
|
|
19
|
-
CursorActiveSlice
|
|
20
|
-
CursorAFKSlicesRemaining
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
CursorPhase = "phase"
|
|
16
|
+
CursorStatus = "status"
|
|
17
|
+
CursorNextAction = "next_action"
|
|
18
|
+
CursorQuestionID = "question_id"
|
|
19
|
+
CursorActiveSlice = "active_slice"
|
|
20
|
+
CursorAFKSlicesRemaining = "afk_slices_remaining"
|
|
21
|
+
CursorSequenceParent = "sequence_parent"
|
|
22
|
+
CursorSequencePosition = "sequence_position"
|
|
23
|
+
CursorSequenceWorkspacesRemain = "sequence_workspaces_remaining"
|
|
24
|
+
CursorSequenceRole = "sequence_role"
|
|
25
|
+
CursorReturnPhase = "return_phase"
|
|
26
|
+
CursorReturnNextAction = "return_next_action"
|
|
27
|
+
CursorSchema = "schema"
|
|
24
28
|
)
|
|
25
29
|
|
|
26
30
|
var cursorKeyAliases = map[string]string{
|
|
@@ -273,7 +277,9 @@ func isMigratableCursorKey(key string) bool {
|
|
|
273
277
|
func canonicalCursorSpelling(key string) (string, bool) {
|
|
274
278
|
normalized := normalizeCursorKey(key)
|
|
275
279
|
canonicals := []string{CursorPhase, CursorStatus, CursorNextAction, CursorQuestionID,
|
|
276
|
-
CursorActiveSlice, CursorAFKSlicesRemaining,
|
|
280
|
+
CursorActiveSlice, CursorAFKSlicesRemaining, CursorSequenceParent,
|
|
281
|
+
CursorSequencePosition, CursorSequenceWorkspacesRemain, CursorSequenceRole,
|
|
282
|
+
CursorReturnPhase,
|
|
277
283
|
CursorReturnNextAction, CursorSchema}
|
|
278
284
|
for _, canonical := range canonicals {
|
|
279
285
|
if normalized == normalizeCursorKey(canonical) {
|
|
@@ -8,6 +8,7 @@ import (
|
|
|
8
8
|
"os"
|
|
9
9
|
"path"
|
|
10
10
|
"path/filepath"
|
|
11
|
+
"sort"
|
|
11
12
|
"strings"
|
|
12
13
|
|
|
13
14
|
"github.com/devrites/devrites/internal/devritespaths"
|
|
@@ -90,9 +91,22 @@ func (f ArtifactFact) Diagnostic() (ArtifactDiagnostic, bool) {
|
|
|
90
91
|
}
|
|
91
92
|
|
|
92
93
|
type WorkspaceObservation struct {
|
|
93
|
-
slug
|
|
94
|
-
facts
|
|
95
|
-
index
|
|
94
|
+
slug string
|
|
95
|
+
facts []ArtifactFact
|
|
96
|
+
index map[ArtifactPath]int
|
|
97
|
+
rootFiles []RootFile
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// RootFile is one regular file directly inside the workspace root.
|
|
101
|
+
type RootFile struct {
|
|
102
|
+
Name string
|
|
103
|
+
Bytes int64
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// RootFiles lists the workspace root's regular files so a consumer can judge
|
|
107
|
+
// placement without acquiring the directory itself.
|
|
108
|
+
func (o *WorkspaceObservation) RootFiles() []RootFile {
|
|
109
|
+
return append([]RootFile(nil), o.rootFiles...)
|
|
96
110
|
}
|
|
97
111
|
|
|
98
112
|
func (o *WorkspaceObservation) Slug() string { return o.slug }
|
|
@@ -296,7 +310,39 @@ func observeWorkspace(root, slug string, callback observationCallback) (*Workspa
|
|
|
296
310
|
for i, fact := range facts {
|
|
297
311
|
index[fact.path] = i
|
|
298
312
|
}
|
|
299
|
-
|
|
313
|
+
rootFiles, err := readRootFiles(roots.workspace)
|
|
314
|
+
if err != nil {
|
|
315
|
+
return nil, ObservationWorkspaceInvalid
|
|
316
|
+
}
|
|
317
|
+
return &WorkspaceObservation{slug: slug, facts: facts, index: index, rootFiles: rootFiles}, nil
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// readRootFiles lists the workspace directory's regular entries through the
|
|
321
|
+
// already-verified root handle, so the list describes the same snapshot as the
|
|
322
|
+
// artifact facts.
|
|
323
|
+
func readRootFiles(root *os.Root) ([]RootFile, error) {
|
|
324
|
+
dir, err := root.Open(".")
|
|
325
|
+
if err != nil {
|
|
326
|
+
return nil, err
|
|
327
|
+
}
|
|
328
|
+
defer func() { _ = dir.Close() }()
|
|
329
|
+
entries, err := dir.ReadDir(-1)
|
|
330
|
+
if err != nil {
|
|
331
|
+
return nil, err
|
|
332
|
+
}
|
|
333
|
+
files := make([]RootFile, 0, len(entries))
|
|
334
|
+
for _, entry := range entries {
|
|
335
|
+
if !entry.Type().IsRegular() {
|
|
336
|
+
continue
|
|
337
|
+
}
|
|
338
|
+
info, err := entry.Info()
|
|
339
|
+
if err != nil {
|
|
340
|
+
return nil, err
|
|
341
|
+
}
|
|
342
|
+
files = append(files, RootFile{Name: entry.Name(), Bytes: info.Size()})
|
|
343
|
+
}
|
|
344
|
+
sort.Slice(files, func(i, j int) bool { return files[i].Name < files[j].Name })
|
|
345
|
+
return files, nil
|
|
300
346
|
}
|
|
301
347
|
|
|
302
348
|
func observationWorkspaceOverrideValid(root, slug string) bool {
|
|
@@ -7,17 +7,21 @@ import (
|
|
|
7
7
|
|
|
8
8
|
// Report is the computed completeness status of a feature at its current phase.
|
|
9
9
|
type Report struct {
|
|
10
|
-
Slug
|
|
11
|
-
Phase
|
|
12
|
-
Status
|
|
13
|
-
NextAction
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
10
|
+
Slug string
|
|
11
|
+
Phase Phase
|
|
12
|
+
Status string
|
|
13
|
+
NextAction string
|
|
14
|
+
SequenceParent string
|
|
15
|
+
SequencePosition string
|
|
16
|
+
SequenceWorkspacesRemaining string
|
|
17
|
+
SequenceRole string
|
|
18
|
+
PrinciplesPresent bool
|
|
19
|
+
Required map[Section]bool
|
|
20
|
+
Missing []Section // required-but-empty sections, in policy order
|
|
21
|
+
RequiredFiles map[string]bool
|
|
22
|
+
MissingFiles []string // required-but-empty workspace files, in lifecycle order
|
|
23
|
+
present map[Section]bool
|
|
24
|
+
diagnostics []ArtifactDiagnostic
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
// Status computes phase-relative completeness from one retained workspace observation.
|
|
@@ -38,13 +42,13 @@ func statusWithCallback(root, slug string, callback observationCallback) (*Repor
|
|
|
38
42
|
return newObservationReport(observation, phase, policy), nil
|
|
39
43
|
}
|
|
40
44
|
|
|
41
|
-
func observationCursorFields(observation *WorkspaceObservation) (status, nextAction string, principlesPresent bool) {
|
|
45
|
+
func observationCursorFields(observation *WorkspaceObservation) (status, nextAction, sequenceParent, sequencePosition, sequenceRemaining, sequenceRole string, principlesPresent bool) {
|
|
42
46
|
if fact, ok := observation.Fact(".devrites/principles.md"); ok && fact.State() == ArtifactPresent {
|
|
43
47
|
principlesPresent = true
|
|
44
48
|
}
|
|
45
49
|
fact, ok := observation.Fact(LedgerFile)
|
|
46
50
|
if !ok || fact.State() != ArtifactPresent {
|
|
47
|
-
return "", "", principlesPresent
|
|
51
|
+
return "", "", "", "", "", "", principlesPresent
|
|
48
52
|
}
|
|
49
53
|
lines := strings.Split(string(fact.Bytes()), "\n")
|
|
50
54
|
if value, ok := CursorField(lines, CursorStatus); ok {
|
|
@@ -53,7 +57,11 @@ func observationCursorFields(observation *WorkspaceObservation) (status, nextAct
|
|
|
53
57
|
if value, ok := CursorField(lines, CursorNextAction); ok {
|
|
54
58
|
nextAction = value
|
|
55
59
|
}
|
|
56
|
-
|
|
60
|
+
sequenceParent, _ = CursorField(lines, CursorSequenceParent)
|
|
61
|
+
sequencePosition, _ = CursorField(lines, CursorSequencePosition)
|
|
62
|
+
sequenceRemaining, _ = CursorField(lines, CursorSequenceWorkspacesRemain)
|
|
63
|
+
sequenceRole, _ = CursorField(lines, CursorSequenceRole)
|
|
64
|
+
return status, nextAction, sequenceParent, sequencePosition, sequenceRemaining, sequenceRole, principlesPresent
|
|
57
65
|
}
|
|
58
66
|
|
|
59
67
|
func newObservationReport(observation *WorkspaceObservation, phase Phase, policy PhasePolicy) *Report {
|
|
@@ -65,19 +73,23 @@ func newObservationReport(observation *WorkspaceObservation, phase Phase, policy
|
|
|
65
73
|
for i, artifact := range missingArtifacts {
|
|
66
74
|
missingFiles[i] = string(artifact)
|
|
67
75
|
}
|
|
68
|
-
status, nextAction, principlesPresent := observationCursorFields(observation)
|
|
76
|
+
status, nextAction, sequenceParent, sequencePosition, sequenceRemaining, sequenceRole, principlesPresent := observationCursorFields(observation)
|
|
69
77
|
return &Report{
|
|
70
|
-
Slug:
|
|
71
|
-
Phase:
|
|
72
|
-
Status:
|
|
73
|
-
NextAction:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
Slug: observation.Slug(),
|
|
79
|
+
Phase: phase,
|
|
80
|
+
Status: status,
|
|
81
|
+
NextAction: nextAction,
|
|
82
|
+
SequenceParent: sequenceParent,
|
|
83
|
+
SequencePosition: sequencePosition,
|
|
84
|
+
SequenceWorkspacesRemaining: sequenceRemaining,
|
|
85
|
+
SequenceRole: sequenceRole,
|
|
86
|
+
PrinciplesPresent: principlesPresent,
|
|
87
|
+
Required: required,
|
|
88
|
+
Missing: missingObservationSections(present, policy.RequiredSections),
|
|
89
|
+
RequiredFiles: requiredFiles,
|
|
90
|
+
MissingFiles: missingFiles,
|
|
91
|
+
present: present,
|
|
92
|
+
diagnostics: diagnostics,
|
|
81
93
|
}
|
|
82
94
|
}
|
|
83
95
|
|
|
@@ -23,11 +23,34 @@ type TaskGraphResult struct {
|
|
|
23
23
|
|
|
24
24
|
var (
|
|
25
25
|
sliceHeaderRE = regexp.MustCompile(`(?m)^##\s+(SLICE-\d+)\b`)
|
|
26
|
+
anyH2HeaderRE = regexp.MustCompile(`(?m)^##\s`)
|
|
26
27
|
dependenciesRE = regexp.MustCompile(`(?m)^Dependencies:\s*(.+)\s*$`)
|
|
27
28
|
dependsOnRE = regexp.MustCompile(`(?m)^depends_on:\s*(.+)\s*$`)
|
|
28
29
|
sliceIDValidRE = regexp.MustCompile(`^SLICE-\d+$`)
|
|
29
30
|
)
|
|
30
31
|
|
|
32
|
+
// ValidSliceID reports whether id has the canonical SLICE-### shape.
|
|
33
|
+
func ValidSliceID(id string) bool { return sliceIDValidRE.MatchString(id) }
|
|
34
|
+
|
|
35
|
+
// ExtractTaskSlice returns the first `## SLICE-###` section of tasks.md whose ID
|
|
36
|
+
// equals id, from its heading up to the next level-2 heading. It lets a phase read
|
|
37
|
+
// one slice instead of the whole file.
|
|
38
|
+
func ExtractTaskSlice(tasksMarkdown []byte, id string) (string, bool) {
|
|
39
|
+
text := string(tasksMarkdown)
|
|
40
|
+
for _, match := range sliceHeaderRE.FindAllStringSubmatchIndex(text, -1) {
|
|
41
|
+
if text[match[2]:match[3]] != id {
|
|
42
|
+
continue
|
|
43
|
+
}
|
|
44
|
+
rest := text[match[1]:]
|
|
45
|
+
end := len(text)
|
|
46
|
+
if next := anyH2HeaderRE.FindStringIndex(rest); next != nil {
|
|
47
|
+
end = match[1] + next[0]
|
|
48
|
+
}
|
|
49
|
+
return strings.TrimRight(text[match[0]:end], "\n") + "\n", true
|
|
50
|
+
}
|
|
51
|
+
return "", false
|
|
52
|
+
}
|
|
53
|
+
|
|
31
54
|
// ParseTaskGraph reads tasks.md content and validates the slice dependency DAG.
|
|
32
55
|
func ParseTaskGraph(tasksMarkdown []byte) TaskGraphResult {
|
|
33
56
|
text := string(tasksMarkdown)
|
package/engine/main.go
CHANGED
|
@@ -30,9 +30,11 @@ Usage:
|
|
|
30
30
|
devrites-engine check skill-trust <path> Scan one skill/agent Markdown for trust violations
|
|
31
31
|
devrites-engine observe summary <slug> Emit sanitized JSON workspace summary
|
|
32
32
|
devrites-engine orient <slug> Alias for observe summary
|
|
33
|
+
devrites-engine observe slice <slug> <SLICE-ID> Print one SLICE-### section of tasks.md
|
|
33
34
|
devrites-engine check indexes [--root <dir>] Report manifest and code-index presence as JSON
|
|
34
35
|
devrites-engine parallel <subcommand> Deterministic parallel worktree lease/create/integrate/cleanup
|
|
35
36
|
devrites-engine state resolve <qid> "<ans>" Resolve an open question and update state atomically
|
|
37
|
+
devrites-engine state merge-manifest <slug> [pred...] Fold the recorded predecessor chain's manifests into the release candidate manifest
|
|
36
38
|
devrites-engine state close <slug> Archive a shipped feature and clear ACTIVE
|
|
37
39
|
devrites-engine migrate <slug> [--dry-run] Normalize a pre-v5 workspace to the current schema
|
|
38
40
|
devrites-engine secret-scan [--staged] [--stdin] [slug] Scan exact staged blobs, stdin, or touched files; HIGH blocks
|
|
@@ -144,18 +146,24 @@ func cmdCandidate(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
144
146
|
fmt.Fprintf(stderr, "candidate: BLOCKED: %v\n", err)
|
|
145
147
|
return exitBlocked
|
|
146
148
|
}
|
|
149
|
+
if err := lib.VerifyReleaseUnion(root, args[0]); err != nil {
|
|
150
|
+
fmt.Fprintf(stderr, "candidate: BLOCKED: %v\n", err)
|
|
151
|
+
return exitBlocked
|
|
152
|
+
}
|
|
147
153
|
fmt.Fprintf(stdout, "candidate-sha256: %s\ncandidate-files: %d\n", digest, files)
|
|
148
154
|
return exitOK
|
|
149
155
|
}
|
|
150
156
|
|
|
151
157
|
func cmdState(root string, args []string, stdout, stderr io.Writer) int {
|
|
152
158
|
if len(args) == 0 {
|
|
153
|
-
fmt.Fprintln(stderr, "usage: devrites-engine state <resolve|close> ...")
|
|
159
|
+
fmt.Fprintln(stderr, "usage: devrites-engine state <resolve|merge-manifest|close> ...")
|
|
154
160
|
return exitUsage
|
|
155
161
|
}
|
|
156
162
|
switch args[0] {
|
|
157
163
|
case "resolve":
|
|
158
164
|
return lib.Resolve(root, args[1:], stdout, stderr)
|
|
165
|
+
case "merge-manifest":
|
|
166
|
+
return lib.RunMergeManifest(root, args[1:], stdout, stderr)
|
|
159
167
|
case "close":
|
|
160
168
|
return lib.CloseOut(root, args[1:], stdout, stderr)
|
|
161
169
|
default:
|
|
@@ -192,6 +200,10 @@ func cmdGate(root string, kind gate.Kind, args []string, stdout, stderr io.Write
|
|
|
192
200
|
return exitBlocked
|
|
193
201
|
}
|
|
194
202
|
if kind == gate.Seal {
|
|
203
|
+
if err := lib.VerifyReleaseUnion(root, args[0]); err != nil {
|
|
204
|
+
fmt.Fprintf(stdout, "release-union: BLOCKED: %v\nreason: %s\n", err, gate.ResultReasonID(kind, true))
|
|
205
|
+
return exitBlocked
|
|
206
|
+
}
|
|
195
207
|
code := lib.EvidenceFresh(root, []string{args[0]}, stdout, stderr)
|
|
196
208
|
if code == exitUsage {
|
|
197
209
|
return exitUsage
|
|
@@ -223,22 +235,29 @@ func cmdSkillTrust(args []string, stdout, stderr io.Writer) int {
|
|
|
223
235
|
|
|
224
236
|
func cmdObserve(root string, args []string, stdout, stderr io.Writer) int {
|
|
225
237
|
if len(args) == 0 {
|
|
226
|
-
fmt.Fprintln(stderr, "usage: devrites-engine observe summary <slug>")
|
|
227
|
-
return exitUsage
|
|
228
|
-
}
|
|
229
|
-
if args[0] != "summary" {
|
|
230
|
-
fmt.Fprintf(stderr, "devrites: unknown observe command %q\n", args[0])
|
|
238
|
+
fmt.Fprintln(stderr, "usage: devrites-engine observe summary <slug> | observe slice <slug> <SLICE-ID>")
|
|
231
239
|
return exitUsage
|
|
232
240
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
if
|
|
237
|
-
|
|
241
|
+
switch args[0] {
|
|
242
|
+
case "summary":
|
|
243
|
+
slug, code, err := lib.ActiveSlug(root, args[1:])
|
|
244
|
+
if err != nil {
|
|
245
|
+
fmt.Fprintf(stderr, "observe: %v\n", err)
|
|
246
|
+
if code == 0 {
|
|
247
|
+
code = exitUsage
|
|
248
|
+
}
|
|
249
|
+
return code
|
|
238
250
|
}
|
|
239
|
-
return
|
|
251
|
+
return lib.RunObserveSummary(root, slug, stdout, stderr)
|
|
252
|
+
case "slice":
|
|
253
|
+
if len(args) != 3 {
|
|
254
|
+
fmt.Fprintln(stderr, "usage: devrites-engine observe slice <slug> <SLICE-ID>")
|
|
255
|
+
return exitUsage
|
|
256
|
+
}
|
|
257
|
+
return lib.RunObserveSlice(root, args[1], args[2], stdout, stderr)
|
|
240
258
|
}
|
|
241
|
-
|
|
259
|
+
fmt.Fprintf(stderr, "devrites: unknown observe command %q\n", args[0])
|
|
260
|
+
return exitUsage
|
|
242
261
|
}
|
|
243
262
|
|
|
244
263
|
func cmdOrient(root string, args []string, stdout, stderr io.Writer) int {
|
|
@@ -23,6 +23,7 @@ func TestRootModeForCoversReadAndWriteSurfaces(t *testing.T) {
|
|
|
23
23
|
{name: "check path-disjoint", command: "check", args: []string{"path-disjoint"}, want: rootUnused},
|
|
24
24
|
{name: "check skill-trust", command: "check", args: []string{"skill-trust"}, want: rootUnused},
|
|
25
25
|
{name: "observe summary", command: "observe", args: []string{"summary"}, want: rootStrictUsage},
|
|
26
|
+
{name: "observe slice", command: "observe", args: []string{"slice"}, want: rootStrictUsage},
|
|
26
27
|
{name: "orient", command: "orient", want: rootStrictUsage},
|
|
27
28
|
{name: "check indexes", command: "check", args: []string{"indexes"}, want: rootLenient},
|
|
28
29
|
{name: "resolve", command: "state", args: []string{"resolve"}, want: rootStrict},
|
|
@@ -115,6 +116,7 @@ func TestNestedCommandFamiliesAreRoutedAndAdvertised(t *testing.T) {
|
|
|
115
116
|
{"check", "indexes"},
|
|
116
117
|
{"orient", "feature"},
|
|
117
118
|
{"observe", "summary", "feature"},
|
|
119
|
+
{"observe", "slice", "feature", "SLICE-001"},
|
|
118
120
|
{"state", "resolve"},
|
|
119
121
|
{"state", "close"},
|
|
120
122
|
} {
|
|
@@ -145,7 +147,7 @@ func TestNestedCommandFamilyUsageListsOnlyRetainedCommands(t *testing.T) {
|
|
|
145
147
|
removed []string
|
|
146
148
|
}{
|
|
147
149
|
{args: []string{"check"}, want: "check <candidate|readiness|seal|path-disjoint|task-graph|skill-trust|indexes>", removed: []string{"spec"}},
|
|
148
|
-
{args: []string{"state"}, want: "state <resolve|close>", removed: []string{"clarify", "tick-afk", "recovery"}},
|
|
150
|
+
{args: []string{"state"}, want: "state <resolve|merge-manifest|close>", removed: []string{"clarify", "tick-afk", "recovery"}},
|
|
149
151
|
} {
|
|
150
152
|
t.Run(test.args[0], func(t *testing.T) {
|
|
151
153
|
var stdout, stderr bytes.Buffer
|
package/install.sh
CHANGED
|
@@ -245,9 +245,12 @@ dr_acquire_engine "$SELF_DIR" install "$DEVRITES_REPO" || { echo "error: could n
|
|
|
245
245
|
ENGINE="$DR_ENGINE_PATH"
|
|
246
246
|
PAYLOAD="${DEVRITES_HOST_ARTIFACT_DIR:-$SELF_DIR/pack/generated}"
|
|
247
247
|
if [ ! -d "$PAYLOAD/claude/skills" ] || [ ! -d "$PAYLOAD/codex/skills" ] \
|
|
248
|
+
|| [ ! -d "$PAYLOAD/pi/skills" ] || [ ! -d "$PAYLOAD/pi/agents" ] \
|
|
249
|
+
|| [ ! -d "$PAYLOAD/pi/prompts" ] \
|
|
248
250
|
|| [ ! -f "$PAYLOAD/claude/skills/devrites-lib/reference/standards/agents.md" ] \
|
|
249
251
|
|| [ ! -f "$PAYLOAD/codex/skills/devrites-lib/reference/standards/agents.md" ] \
|
|
250
|
-
|| [ ! -f "$PAYLOAD/
|
|
252
|
+
|| [ ! -f "$PAYLOAD/pi/skills/devrites-lib/reference/standards/agents.md" ] \
|
|
253
|
+
|| [ ! -f "$PAYLOAD/codex/config.toml" ] || [ ! -f "$PAYLOAD/pi/AGENTS.md" ]; then
|
|
251
254
|
BUILDER="$SELF_DIR/scripts/build-host-artifacts.sh"
|
|
252
255
|
[ -f "$BUILDER" ] || { echo "error: generated install payload missing at $PAYLOAD and builder missing at $BUILDER" >&2; exit 1; }
|
|
253
256
|
DEVRITES_HOST_ARTIFACT_DIR="$PAYLOAD" bash "$BUILDER" >/dev/null || { echo "error: could not generate install payload at $PAYLOAD" >&2; exit 1; }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: devrites-code-reviewer
|
|
3
|
-
description: Reviews
|
|
3
|
+
description: Reviews a full DevRites feature diff once for /rite-review and /rite-seal. Checks tests, correctness, readability, architecture, maintainability, and standards; returns every supported finding.
|
|
4
4
|
tools: Read, Grep, Glob, Bash
|
|
5
5
|
permissionMode: plan
|
|
6
6
|
---
|
|
@@ -40,9 +40,11 @@ From `spec.md`'s applicability map, load only triggered `repository-topology.md`
|
|
|
40
40
|
|
|
41
41
|
You receive a feature slug or workspace path (`.devrites/work/<slug>/`) and the
|
|
42
42
|
diff scope. Read `spec.md` for the objective and acceptance criteria, then
|
|
43
|
-
`
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
`decisions.md` and `.devrites/principles.md` if present. Read `tasks.md` and
|
|
44
|
+
`touched-files.md` by the schema's bounded rule: when `devrites-engine orient <slug>`
|
|
45
|
+
reports one over budget, index it (`grep -n`) and load only entries naming this
|
|
46
|
+
candidate's AC/slice IDs. The principles are binding project invariants. Run `git diff`
|
|
47
|
+
for the feature scope and read the touched files.
|
|
46
48
|
|
|
47
49
|
## Review (feature scope only)
|
|
48
50
|
|
|
@@ -108,12 +110,13 @@ not as a blocker on this diff.
|
|
|
108
110
|
|
|
109
111
|
## Rules
|
|
110
112
|
|
|
111
|
-
-
|
|
113
|
+
- Out-of-scope problems → FYI.
|
|
112
114
|
- Do **not** edit code. Return findings only.
|
|
113
115
|
- Read surrounding source (call sites, existing guards, nearest consumer) before assigning severity; don't rate impact from the diff hunk alone.
|
|
114
116
|
- Label each finding **Critical / Important / Suggestion / Nit / FYI** with `file:line`
|
|
115
117
|
and a concrete fix. No praise padding.
|
|
116
|
-
-
|
|
118
|
+
- Return every supported in-scope finding from the full inspected diff in this one pass, not only the first. Repeat canonical `Finding:`/`Basis:` rows; unverified → gap. Complete means evidenced coverage, not guaranteed defect-free.
|
|
119
|
+
- In a recheck (the packet names open findings and a correction diff), your verdict covers those findings, the changed hunks, and their dependents. Anything else on hunks unchanged since your previous pass goes under `Late:` with severity and `file:line`; it is recorded for `/rite-review`, not verdict-bearing.
|
|
117
120
|
- **Non-trigger (UI anti-slop):** if the diff touches no rendered UI surface, do not
|
|
118
121
|
fire UI anti-slop (Inter, lavender, gradient, emoji headers). Code anti-slop still
|
|
119
122
|
applies. The UI catalog is `devrites-frontend-reviewer`.
|
|
@@ -59,6 +59,12 @@ mirror.
|
|
|
59
59
|
|
|
60
60
|
- Don't edit anything. Return findings only.
|
|
61
61
|
- Be concrete: the exact scenario that breaks it, with `file:line` where relevant.
|
|
62
|
+
- Tag every `valid & actionable` finding `kind: contract` (the claim's guarantee is
|
|
63
|
+
wrong or unpinned) or `kind: mechanism` (the guarantee stands; a named test would
|
|
64
|
+
catch the wrong implementation — propose that case).
|
|
65
|
+
- When the packet names prior fingerprints and a correction diff, your verdict covers
|
|
66
|
+
those and the dependents of each changed clause. Other observations on unchanged
|
|
67
|
+
text go under `Late:` with severity and site; they are recorded, not verdict-bearing.
|
|
62
68
|
|
|
63
69
|
## Output
|
|
64
70
|
|
|
@@ -107,7 +107,13 @@ criterion, slice, or proof.
|
|
|
107
107
|
pad the report with praise. In a recheck, also mark each finding
|
|
108
108
|
`new_failure_mode` or name the already-pinned clause/fingerprint it refines —
|
|
109
109
|
the packet lists prior repairs; the mark makes alias-detection and
|
|
110
|
-
`convergence_pressure` eligibility mechanical.
|
|
110
|
+
`convergence_pressure` eligibility mechanical. Tag every Critical/Important
|
|
111
|
+
`kind: contract` (an implementer could build it differently and still pass the
|
|
112
|
+
planned tests) or `kind: mechanism` (a named test can discriminate the wrong
|
|
113
|
+
implementation; propose that case as the fix, not new plan prose).
|
|
114
|
+
- In a recheck, your verdict covers the listed fingerprints, the correction diff, and
|
|
115
|
+
the dependents of each changed clause. Anything else you notice on unchanged text
|
|
116
|
+
goes under `Late:` with severity and site; it is recorded, not verdict-bearing.
|
|
111
117
|
- When a dimension has no issue, say "strong: <why>" instead of inventing a
|
|
112
118
|
finding.
|
|
113
119
|
- If a claim cannot be verified, such as blast radius without an index, say so and
|