devrites 6.10.0 → 7.0.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 +19 -0
- package/README.md +8 -4
- package/SECURITY.md +1 -1
- package/docs/adr/0038-engine-flags-unattributed-root-edits.md +67 -0
- package/docs/adr/README.md +2 -1
- package/docs/cli.md +19 -6
- package/docs/command-map.md +21 -19
- package/docs/engine/commands.md +22 -15
- package/docs/usage.md +3 -3
- package/engine/commands.go +8 -3
- package/engine/help.go +43 -16
- package/engine/internal/acceptance/approve.go +46 -7
- package/engine/internal/acceptance/cli.go +102 -0
- package/engine/internal/acceptance/exec.go +8 -6
- package/engine/internal/acceptance/ledger.go +16 -1
- package/engine/internal/acceptance/lint.go +9 -1
- package/engine/internal/acceptance/preconditions.go +201 -0
- package/engine/internal/anchor/anchor.go +76 -0
- package/engine/internal/gate/drivers.go +144 -0
- package/engine/internal/gate/gate.go +49 -13
- package/engine/internal/gate/preconditions.go +121 -0
- package/engine/internal/lib/anchors.go +270 -0
- package/engine/internal/lib/apply_bundle.go +2 -1
- package/engine/internal/lib/candidate.go +17 -8
- package/engine/internal/lib/claims.go +48 -33
- package/engine/internal/lib/context.go +337 -22
- package/engine/internal/lib/diffscope.go +201 -12
- package/engine/internal/lib/dispatch.go +393 -21
- package/engine/internal/lib/dispatch_contract.go +82 -2
- package/engine/internal/lib/dispatch_packet.go +224 -8
- package/engine/internal/lib/environment_report.go +2 -3
- package/engine/internal/lib/handoff.go +33 -3
- package/engine/internal/lib/metrics.go +119 -11
- package/engine/internal/lib/next.go +45 -5
- package/engine/internal/lib/observe_summary.go +2 -4
- package/engine/internal/lib/packet.go +319 -0
- package/engine/internal/lib/packet_freeze.go +227 -0
- package/engine/internal/lib/perturb.go +403 -0
- package/engine/internal/lib/questions_lint.go +99 -0
- package/engine/internal/lib/state_edit.go +396 -0
- package/engine/internal/lib/taskgraph.go +166 -0
- package/engine/internal/lib/treebaseline.go +331 -0
- package/engine/internal/lib/triggers.go +19 -0
- package/engine/internal/lib/windows.go +110 -5
- package/engine/internal/overhaul/admit/run.go +7 -30
- package/engine/internal/parallel/cli.go +27 -33
- package/engine/internal/parallel/git.go +10 -0
- package/engine/internal/parallel/select.go +36 -0
- package/engine/internal/state/budgets.go +60 -13
- package/engine/internal/state/observation.go +1 -1
- package/engine/main.go +61 -14
- package/pack/.claude/agents/devrites-code-reviewer.md +9 -5
- package/pack/.claude/agents/devrites-devex-reviewer.md +5 -4
- package/pack/.claude/agents/devrites-doubt-reviewer.md +4 -4
- package/pack/.claude/agents/devrites-evidence-scout.md +3 -2
- package/pack/.claude/agents/devrites-frontend-reviewer.md +5 -4
- package/pack/.claude/agents/devrites-performance-reviewer.md +5 -5
- package/pack/.claude/agents/devrites-plan-drafter.md +4 -2
- package/pack/.claude/agents/devrites-plan-reviewer.md +5 -5
- package/pack/.claude/agents/devrites-proof-runner.md +1 -1
- package/pack/.claude/agents/devrites-retrospector.md +1 -1
- package/pack/.claude/agents/devrites-security-auditor.md +4 -4
- package/pack/.claude/agents/devrites-simplifier-reviewer.md +5 -4
- package/pack/.claude/agents/devrites-slice-wright.md +18 -9
- package/pack/.claude/agents/devrites-spec-reviewer.md +4 -4
- package/pack/.claude/agents/devrites-strategy-reviewer.md +5 -6
- package/pack/.claude/agents/devrites-test-analyst.md +7 -4
- package/pack/.claude/agents/devrites-upgrade-planner.md +1 -1
- package/pack/.claude/agents/fast-builder.md +4 -2
- package/pack/.claude/agents/fast-checker.md +3 -2
- package/pack/.claude/agents/fast-critic.md +3 -2
- package/pack/.claude/agents/fast-planner.md +3 -3
- package/pack/.claude/agents/overhaul-recon.md +5 -4
- package/pack/.claude/settings.json +19 -7
- package/pack/.claude/skills/devrites-api-interface/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-audit/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-doubt/SKILL.md +5 -5
- package/pack/.claude/skills/devrites-frontend-craft/reference/reuse-first.md +3 -3
- package/pack/.claude/skills/devrites-interview/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-lib/SKILL.md +11 -6
- package/pack/.claude/skills/devrites-lib/reference/orchestration-profiles.md +2 -0
- package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +25 -14
- package/pack/.claude/skills/devrites-lib/reference/standards/README.md +2 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +11 -3
- package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +43 -19
- package/pack/.claude/skills/devrites-lib/reference/standards/architecture-health.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/code-index.md +111 -0
- package/pack/.claude/skills/devrites-lib/reference/standards/code-navigation.md +13 -63
- package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +8 -9
- package/pack/.claude/skills/devrites-lib/reference/standards/core.md +14 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/deprecation.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/gates.md +10 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/security.md +4 -0
- package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +3 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +9 -8
- package/pack/.claude/skills/devrites-lib/reference/standards/windows.md +3 -2
- package/pack/.claude/skills/devrites-lib/reference/standards/workflow-artifacts.md +2 -0
- package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +16 -16
- package/pack/.claude/skills/devrites-ux-shape/SKILL.md +1 -1
- package/pack/.claude/skills/overhaul/references/orchestration.md +3 -2
- package/pack/.claude/skills/rite/SKILL.md +1 -1
- package/pack/.claude/skills/rite-adopt/SKILL.md +1 -1
- package/pack/.claude/skills/rite-adopt/reference/adoption.md +1 -1
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +5 -4
- package/pack/.claude/skills/rite-build/SKILL.md +4 -3
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +2 -0
- package/pack/.claude/skills/rite-build/reference/checkpoint-protocol.md +4 -1
- package/pack/.claude/skills/rite-build/reference/checkpoint.md +2 -0
- package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +1 -1
- package/pack/.claude/skills/rite-build/reference/output.md +2 -0
- package/pack/.claude/skills/rite-build/reference/parallel-batch.md +22 -12
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +13 -3
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +42 -25
- package/pack/.claude/skills/rite-clarify/SKILL.md +1 -1
- package/pack/.claude/skills/rite-converge/SKILL.md +4 -4
- package/pack/.claude/skills/rite-converge/reference/convergence-assessment.md +3 -3
- package/pack/.claude/skills/rite-define/SKILL.md +10 -5
- package/pack/.claude/skills/rite-doctor/SKILL.md +17 -2
- package/pack/.claude/skills/rite-dogfood/SKILL.md +1 -1
- package/pack/.claude/skills/rite-explain/SKILL.md +1 -1
- package/pack/.claude/skills/rite-explain/reference/intake.md +1 -1
- package/pack/.claude/skills/rite-fast/SKILL.md +1 -1
- package/pack/.claude/skills/rite-handoff/SKILL.md +3 -3
- package/pack/.claude/skills/rite-handoff/reference/handoff-template.md +1 -1
- package/pack/.claude/skills/rite-plan/SKILL.md +4 -4
- package/pack/.claude/skills/rite-plan/reference/slicing.md +3 -2
- package/pack/.claude/skills/rite-polish/SKILL.md +6 -3
- package/pack/.claude/skills/rite-prove/SKILL.md +1 -1
- package/pack/.claude/skills/rite-quick/SKILL.md +1 -1
- package/pack/.claude/skills/rite-resolve/SKILL.md +1 -1
- package/pack/.claude/skills/rite-review/SKILL.md +4 -4
- package/pack/.claude/skills/rite-seal/SKILL.md +2 -2
- package/pack/.claude/skills/rite-ship/SKILL.md +1 -1
- package/pack/.claude/skills/rite-spec/SKILL.md +1 -1
- package/pack/.claude/skills/rite-spec/reference/investigation.md +5 -5
- package/pack/.claude/skills/rite-spec/reference/spec-template.md +1 -1
- package/pack/.claude/skills/rite-spec/reference/state-workspace.md +6 -4
- package/pack/.claude/skills/rite-status/SKILL.md +1 -1
- package/pack/.claude/skills/rite-temper/SKILL.md +1 -1
- package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +2 -2
- package/pack/.claude/skills/rite-temper/reference/scope-modes.md +2 -2
- package/pack/.claude/skills/rite-temper/reference/significance.md +2 -2
- package/pack/.claude/skills/rite-vet/SKILL.md +8 -4
- package/pack/.claude/skills/rite-vet/reference/artifacts.md +10 -3
- package/pack/.claude/skills/rite-vet/reference/depth.md +2 -2
- package/pack/.claude/skills/rite-vet/reference/review-axes.md +2 -2
- package/pack/.claude/skills/rite-zoom-out/SKILL.md +6 -6
- package/pack/generated/claude/agents/devrites-code-reviewer.md +9 -5
- package/pack/generated/claude/agents/devrites-devex-reviewer.md +5 -4
- package/pack/generated/claude/agents/devrites-doubt-reviewer.md +4 -4
- package/pack/generated/claude/agents/devrites-evidence-scout.md +3 -2
- package/pack/generated/claude/agents/devrites-frontend-reviewer.md +5 -4
- package/pack/generated/claude/agents/devrites-performance-reviewer.md +5 -5
- package/pack/generated/claude/agents/devrites-plan-drafter.md +4 -2
- package/pack/generated/claude/agents/devrites-plan-reviewer.md +5 -5
- package/pack/generated/claude/agents/devrites-proof-runner.md +1 -1
- package/pack/generated/claude/agents/devrites-retrospector.md +1 -1
- package/pack/generated/claude/agents/devrites-security-auditor.md +4 -4
- package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +5 -4
- package/pack/generated/claude/agents/devrites-slice-wright.md +18 -9
- package/pack/generated/claude/agents/devrites-spec-reviewer.md +4 -4
- package/pack/generated/claude/agents/devrites-strategy-reviewer.md +5 -6
- package/pack/generated/claude/agents/devrites-test-analyst.md +7 -4
- package/pack/generated/claude/agents/devrites-upgrade-planner.md +1 -1
- package/pack/generated/claude/agents/fast-builder.md +4 -2
- package/pack/generated/claude/agents/fast-checker.md +3 -2
- package/pack/generated/claude/agents/fast-critic.md +3 -2
- package/pack/generated/claude/agents/fast-planner.md +3 -3
- package/pack/generated/claude/agents/overhaul-recon.md +5 -4
- package/pack/generated/claude/settings.json +19 -7
- package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +1 -1
- package/pack/generated/claude/skills/devrites-audit/SKILL.md +1 -1
- package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +1 -1
- package/pack/generated/claude/skills/devrites-doubt/SKILL.md +5 -5
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/reuse-first.md +3 -3
- package/pack/generated/claude/skills/devrites-interview/SKILL.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/SKILL.md +11 -6
- package/pack/generated/claude/skills/devrites-lib/reference/orchestration-profiles.md +2 -0
- package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +25 -14
- package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +2 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +11 -3
- package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +43 -19
- package/pack/generated/claude/skills/devrites-lib/reference/standards/architecture-health.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/code-index.md +111 -0
- package/pack/generated/claude/skills/devrites-lib/reference/standards/code-navigation.md +13 -63
- package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +8 -9
- package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +14 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/deprecation.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/gates.md +10 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +4 -0
- package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +3 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +9 -8
- package/pack/generated/claude/skills/devrites-lib/reference/standards/windows.md +3 -2
- package/pack/generated/claude/skills/devrites-lib/reference/standards/workflow-artifacts.md +2 -0
- package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +16 -16
- package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +1 -1
- package/pack/generated/claude/skills/overhaul/references/orchestration.md +3 -2
- package/pack/generated/claude/skills/rite/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-adopt/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-adopt/reference/adoption.md +1 -1
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +5 -4
- package/pack/generated/claude/skills/rite-build/SKILL.md +4 -3
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +2 -0
- package/pack/generated/claude/skills/rite-build/reference/checkpoint-protocol.md +4 -1
- package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +2 -0
- package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/output.md +2 -0
- package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +22 -12
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +13 -3
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +42 -25
- package/pack/generated/claude/skills/rite-clarify/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-converge/SKILL.md +4 -4
- package/pack/generated/claude/skills/rite-converge/reference/convergence-assessment.md +3 -3
- package/pack/generated/claude/skills/rite-define/SKILL.md +10 -5
- package/pack/generated/claude/skills/rite-doctor/SKILL.md +17 -2
- package/pack/generated/claude/skills/rite-dogfood/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-explain/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-explain/reference/intake.md +1 -1
- package/pack/generated/claude/skills/rite-fast/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-handoff/SKILL.md +3 -3
- package/pack/generated/claude/skills/rite-handoff/reference/handoff-template.md +1 -1
- package/pack/generated/claude/skills/rite-plan/SKILL.md +4 -4
- package/pack/generated/claude/skills/rite-plan/reference/slicing.md +3 -2
- package/pack/generated/claude/skills/rite-polish/SKILL.md +6 -3
- package/pack/generated/claude/skills/rite-prove/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-quick/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-resolve/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-review/SKILL.md +4 -4
- package/pack/generated/claude/skills/rite-seal/SKILL.md +2 -2
- package/pack/generated/claude/skills/rite-ship/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-spec/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-spec/reference/investigation.md +5 -5
- package/pack/generated/claude/skills/rite-spec/reference/spec-template.md +1 -1
- package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +6 -4
- package/pack/generated/claude/skills/rite-status/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-temper/SKILL.md +1 -1
- package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +2 -2
- package/pack/generated/claude/skills/rite-temper/reference/scope-modes.md +2 -2
- package/pack/generated/claude/skills/rite-temper/reference/significance.md +2 -2
- package/pack/generated/claude/skills/rite-vet/SKILL.md +8 -4
- package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +10 -3
- package/pack/generated/claude/skills/rite-vet/reference/depth.md +2 -2
- package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +2 -2
- package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +6 -6
- package/pack/generated/codex/agents/devrites-code-reviewer.toml +8 -4
- package/pack/generated/codex/agents/devrites-devex-reviewer.toml +4 -3
- package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +3 -3
- package/pack/generated/codex/agents/devrites-evidence-scout.toml +2 -1
- package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +4 -3
- package/pack/generated/codex/agents/devrites-performance-reviewer.toml +4 -4
- package/pack/generated/codex/agents/devrites-plan-drafter.toml +3 -1
- package/pack/generated/codex/agents/devrites-plan-reviewer.toml +4 -4
- package/pack/generated/codex/agents/devrites-security-auditor.toml +3 -3
- package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +4 -3
- package/pack/generated/codex/agents/devrites-slice-wright.toml +17 -8
- package/pack/generated/codex/agents/devrites-spec-reviewer.toml +3 -3
- package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +4 -5
- package/pack/generated/codex/agents/devrites-test-analyst.toml +6 -3
- package/pack/generated/codex/agents/fast-builder.toml +3 -1
- package/pack/generated/codex/agents/fast-checker.toml +2 -1
- package/pack/generated/codex/agents/fast-critic.toml +2 -1
- package/pack/generated/codex/agents/fast-planner.toml +2 -2
- package/pack/generated/codex/agents/overhaul-recon.toml +5 -4
- package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +1 -1
- package/pack/generated/codex/skills/devrites-audit/SKILL.md +1 -1
- package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +1 -1
- package/pack/generated/codex/skills/devrites-doubt/SKILL.md +5 -5
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/reuse-first.md +3 -3
- package/pack/generated/codex/skills/devrites-interview/SKILL.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/SKILL.md +11 -6
- package/pack/generated/codex/skills/devrites-lib/reference/orchestration-profiles.md +2 -0
- package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +25 -14
- package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +2 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +11 -3
- package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +43 -19
- package/pack/generated/codex/skills/devrites-lib/reference/standards/architecture-health.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/code-index.md +111 -0
- package/pack/generated/codex/skills/devrites-lib/reference/standards/code-navigation.md +13 -63
- package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +8 -9
- package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +14 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/deprecation.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/gates.md +10 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +4 -0
- package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +3 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +9 -8
- package/pack/generated/codex/skills/devrites-lib/reference/standards/windows.md +3 -2
- package/pack/generated/codex/skills/devrites-lib/reference/standards/workflow-artifacts.md +2 -0
- package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +16 -16
- package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +1 -1
- package/pack/generated/codex/skills/overhaul/references/orchestration.md +3 -2
- package/pack/generated/codex/skills/rite/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-adopt/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-adopt/reference/adoption.md +1 -1
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +5 -4
- package/pack/generated/codex/skills/rite-build/SKILL.md +4 -3
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +2 -0
- package/pack/generated/codex/skills/rite-build/reference/checkpoint-protocol.md +4 -1
- package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +2 -0
- package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/output.md +2 -0
- package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +22 -12
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +13 -3
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +42 -25
- package/pack/generated/codex/skills/rite-clarify/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-converge/SKILL.md +4 -4
- package/pack/generated/codex/skills/rite-converge/reference/convergence-assessment.md +3 -3
- package/pack/generated/codex/skills/rite-define/SKILL.md +10 -5
- package/pack/generated/codex/skills/rite-doctor/SKILL.md +17 -2
- package/pack/generated/codex/skills/rite-dogfood/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-explain/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-explain/reference/intake.md +1 -1
- package/pack/generated/codex/skills/rite-fast/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-handoff/SKILL.md +3 -3
- package/pack/generated/codex/skills/rite-handoff/reference/handoff-template.md +1 -1
- package/pack/generated/codex/skills/rite-plan/SKILL.md +4 -4
- package/pack/generated/codex/skills/rite-plan/reference/slicing.md +3 -2
- package/pack/generated/codex/skills/rite-polish/SKILL.md +6 -3
- package/pack/generated/codex/skills/rite-prove/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-quick/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-resolve/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-review/SKILL.md +4 -4
- package/pack/generated/codex/skills/rite-seal/SKILL.md +2 -2
- package/pack/generated/codex/skills/rite-ship/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-spec/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-spec/reference/investigation.md +5 -5
- package/pack/generated/codex/skills/rite-spec/reference/spec-template.md +1 -1
- package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +6 -4
- package/pack/generated/codex/skills/rite-status/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-temper/SKILL.md +1 -1
- package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +2 -2
- package/pack/generated/codex/skills/rite-temper/reference/scope-modes.md +2 -2
- package/pack/generated/codex/skills/rite-temper/reference/significance.md +2 -2
- package/pack/generated/codex/skills/rite-vet/SKILL.md +8 -4
- package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +10 -3
- package/pack/generated/codex/skills/rite-vet/reference/depth.md +2 -2
- package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +2 -2
- package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +6 -6
- package/pack/generated/devin/agents/devrites-code-reviewer.md +8 -4
- package/pack/generated/devin/agents/devrites-devex-reviewer.md +4 -3
- package/pack/generated/devin/agents/devrites-doubt-reviewer.md +3 -3
- package/pack/generated/devin/agents/devrites-evidence-scout.md +2 -1
- package/pack/generated/devin/agents/devrites-frontend-reviewer.md +4 -3
- package/pack/generated/devin/agents/devrites-performance-reviewer.md +4 -4
- package/pack/generated/devin/agents/devrites-plan-drafter.md +3 -1
- package/pack/generated/devin/agents/devrites-plan-reviewer.md +4 -4
- package/pack/generated/devin/agents/devrites-security-auditor.md +3 -3
- package/pack/generated/devin/agents/devrites-simplifier-reviewer.md +4 -3
- package/pack/generated/devin/agents/devrites-slice-wright.md +17 -8
- package/pack/generated/devin/agents/devrites-spec-reviewer.md +3 -3
- package/pack/generated/devin/agents/devrites-strategy-reviewer.md +4 -5
- package/pack/generated/devin/agents/devrites-test-analyst.md +6 -3
- package/pack/generated/devin/agents/fast-builder.md +3 -1
- package/pack/generated/devin/agents/fast-checker.md +2 -1
- package/pack/generated/devin/agents/fast-critic.md +2 -1
- package/pack/generated/devin/agents/fast-planner.md +2 -2
- package/pack/generated/devin/agents/overhaul-recon.md +5 -4
- package/pack/generated/devin/skills/devrites-api-interface/SKILL.md +1 -1
- package/pack/generated/devin/skills/devrites-audit/SKILL.md +1 -1
- package/pack/generated/devin/skills/devrites-debug-recovery/SKILL.md +1 -1
- package/pack/generated/devin/skills/devrites-doubt/SKILL.md +5 -5
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/reuse-first.md +3 -3
- package/pack/generated/devin/skills/devrites-interview/SKILL.md +1 -1
- package/pack/generated/devin/skills/devrites-lib/SKILL.md +11 -6
- package/pack/generated/devin/skills/devrites-lib/reference/orchestration-profiles.md +2 -0
- package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +25 -14
- package/pack/generated/devin/skills/devrites-lib/reference/standards/README.md +2 -1
- package/pack/generated/devin/skills/devrites-lib/reference/standards/afk-hitl.md +11 -3
- package/pack/generated/devin/skills/devrites-lib/reference/standards/agents.md +43 -19
- package/pack/generated/devin/skills/devrites-lib/reference/standards/architecture-health.md +1 -1
- package/pack/generated/devin/skills/devrites-lib/reference/standards/code-index.md +111 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/code-navigation.md +13 -63
- package/pack/generated/devin/skills/devrites-lib/reference/standards/context-hygiene.md +8 -9
- package/pack/generated/devin/skills/devrites-lib/reference/standards/core.md +14 -1
- package/pack/generated/devin/skills/devrites-lib/reference/standards/deprecation.md +1 -1
- package/pack/generated/devin/skills/devrites-lib/reference/standards/gates.md +10 -1
- package/pack/generated/devin/skills/devrites-lib/reference/standards/security.md +4 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/testing.md +3 -1
- package/pack/generated/devin/skills/devrites-lib/reference/standards/tooling.md +9 -8
- package/pack/generated/devin/skills/devrites-lib/reference/standards/windows.md +3 -2
- package/pack/generated/devin/skills/devrites-lib/reference/standards/workflow-artifacts.md +2 -0
- package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +16 -16
- package/pack/generated/devin/skills/devrites-ux-shape/SKILL.md +1 -1
- package/pack/generated/devin/skills/overhaul/references/orchestration.md +3 -2
- package/pack/generated/devin/skills/rite/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-adopt/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-adopt/reference/adoption.md +1 -1
- package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +5 -4
- package/pack/generated/devin/skills/rite-build/SKILL.md +4 -3
- package/pack/generated/devin/skills/rite-build/reference/afk-discipline.md +2 -0
- package/pack/generated/devin/skills/rite-build/reference/checkpoint-protocol.md +4 -1
- package/pack/generated/devin/skills/rite-build/reference/checkpoint.md +2 -0
- package/pack/generated/devin/skills/rite-build/reference/one-slice-cycle.md +1 -1
- package/pack/generated/devin/skills/rite-build/reference/output.md +2 -0
- package/pack/generated/devin/skills/rite-build/reference/parallel-batch.md +22 -12
- package/pack/generated/devin/skills/rite-build/reference/phase-contract.md +13 -3
- package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +42 -25
- package/pack/generated/devin/skills/rite-clarify/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-converge/SKILL.md +4 -4
- package/pack/generated/devin/skills/rite-converge/reference/convergence-assessment.md +3 -3
- package/pack/generated/devin/skills/rite-define/SKILL.md +10 -5
- package/pack/generated/devin/skills/rite-doctor/SKILL.md +17 -2
- package/pack/generated/devin/skills/rite-dogfood/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-explain/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-explain/reference/intake.md +1 -1
- package/pack/generated/devin/skills/rite-fast/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-handoff/SKILL.md +3 -3
- package/pack/generated/devin/skills/rite-handoff/reference/handoff-template.md +1 -1
- package/pack/generated/devin/skills/rite-plan/SKILL.md +4 -4
- package/pack/generated/devin/skills/rite-plan/reference/slicing.md +3 -2
- package/pack/generated/devin/skills/rite-polish/SKILL.md +6 -3
- package/pack/generated/devin/skills/rite-prove/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-quick/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-resolve/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-review/SKILL.md +4 -4
- package/pack/generated/devin/skills/rite-seal/SKILL.md +2 -2
- package/pack/generated/devin/skills/rite-ship/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-spec/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-spec/reference/investigation.md +5 -5
- package/pack/generated/devin/skills/rite-spec/reference/spec-template.md +1 -1
- package/pack/generated/devin/skills/rite-spec/reference/state-workspace.md +6 -4
- package/pack/generated/devin/skills/rite-status/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-temper/SKILL.md +1 -1
- package/pack/generated/devin/skills/rite-temper/reference/review-dimensions.md +2 -2
- package/pack/generated/devin/skills/rite-temper/reference/scope-modes.md +2 -2
- package/pack/generated/devin/skills/rite-temper/reference/significance.md +2 -2
- package/pack/generated/devin/skills/rite-vet/SKILL.md +8 -4
- package/pack/generated/devin/skills/rite-vet/reference/artifacts.md +10 -3
- package/pack/generated/devin/skills/rite-vet/reference/depth.md +2 -2
- package/pack/generated/devin/skills/rite-vet/reference/review-axes.md +2 -2
- package/pack/generated/devin/skills/rite-zoom-out/SKILL.md +6 -6
- package/pack/generated/omp/agents/devrites-code-reviewer.md +9 -5
- package/pack/generated/omp/agents/devrites-devex-reviewer.md +5 -4
- package/pack/generated/omp/agents/devrites-doubt-reviewer.md +4 -4
- package/pack/generated/omp/agents/devrites-evidence-scout.md +3 -2
- package/pack/generated/omp/agents/devrites-frontend-reviewer.md +5 -4
- package/pack/generated/omp/agents/devrites-performance-reviewer.md +5 -5
- package/pack/generated/omp/agents/devrites-plan-drafter.md +4 -2
- package/pack/generated/omp/agents/devrites-plan-reviewer.md +5 -5
- package/pack/generated/omp/agents/devrites-proof-runner.md +1 -1
- package/pack/generated/omp/agents/devrites-retrospector.md +1 -1
- package/pack/generated/omp/agents/devrites-security-auditor.md +4 -4
- package/pack/generated/omp/agents/devrites-simplifier-reviewer.md +5 -4
- package/pack/generated/omp/agents/devrites-slice-wright.md +18 -9
- package/pack/generated/omp/agents/devrites-spec-reviewer.md +4 -4
- package/pack/generated/omp/agents/devrites-strategy-reviewer.md +5 -6
- package/pack/generated/omp/agents/devrites-test-analyst.md +7 -4
- package/pack/generated/omp/agents/devrites-upgrade-planner.md +1 -1
- package/pack/generated/omp/agents/fast-builder.md +4 -2
- package/pack/generated/omp/agents/fast-checker.md +3 -2
- package/pack/generated/omp/agents/fast-critic.md +3 -2
- package/pack/generated/omp/agents/fast-planner.md +3 -3
- package/pack/generated/omp/agents/overhaul-backend-engineer.md +1 -1
- package/pack/generated/omp/agents/overhaul-boundary.md +1 -1
- package/pack/generated/omp/agents/overhaul-craft.md +1 -1
- package/pack/generated/omp/agents/overhaul-frontend-engineer.md +1 -1
- package/pack/generated/omp/agents/overhaul-implementer.md +1 -1
- package/pack/generated/omp/agents/overhaul-recon.md +6 -5
- package/pack/generated/omp/agents/overhaul-specialist.md +1 -1
- package/pack/generated/omp/agents/overhaul-verifier.md +1 -1
- package/pack/generated/omp/skills/devrites-api-interface/SKILL.md +1 -1
- package/pack/generated/omp/skills/devrites-audit/SKILL.md +1 -1
- package/pack/generated/omp/skills/devrites-debug-recovery/SKILL.md +1 -1
- package/pack/generated/omp/skills/devrites-doubt/SKILL.md +5 -5
- package/pack/generated/omp/skills/devrites-frontend-craft/reference/reuse-first.md +3 -3
- package/pack/generated/omp/skills/devrites-interview/SKILL.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/SKILL.md +11 -6
- package/pack/generated/omp/skills/devrites-lib/reference/orchestration-profiles.md +2 -0
- package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +25 -14
- package/pack/generated/omp/skills/devrites-lib/reference/standards/README.md +2 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +11 -3
- package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +43 -19
- package/pack/generated/omp/skills/devrites-lib/reference/standards/architecture-health.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/code-index.md +111 -0
- package/pack/generated/omp/skills/devrites-lib/reference/standards/code-navigation.md +13 -63
- package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +8 -9
- package/pack/generated/omp/skills/devrites-lib/reference/standards/core.md +14 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/deprecation.md +1 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/gates.md +10 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/security.md +4 -0
- package/pack/generated/omp/skills/devrites-lib/reference/standards/testing.md +3 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/tooling.md +9 -8
- package/pack/generated/omp/skills/devrites-lib/reference/standards/windows.md +3 -2
- package/pack/generated/omp/skills/devrites-lib/reference/standards/workflow-artifacts.md +2 -0
- package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +16 -16
- package/pack/generated/omp/skills/devrites-ux-shape/SKILL.md +1 -1
- package/pack/generated/omp/skills/overhaul/references/orchestration.md +3 -2
- package/pack/generated/omp/skills/rite/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-adopt/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-adopt/reference/adoption.md +1 -1
- package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +5 -4
- package/pack/generated/omp/skills/rite-build/SKILL.md +4 -3
- package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +2 -0
- package/pack/generated/omp/skills/rite-build/reference/checkpoint-protocol.md +4 -1
- package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +2 -0
- package/pack/generated/omp/skills/rite-build/reference/one-slice-cycle.md +1 -1
- package/pack/generated/omp/skills/rite-build/reference/output.md +2 -0
- package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +22 -12
- package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +13 -3
- package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +42 -25
- package/pack/generated/omp/skills/rite-clarify/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-converge/SKILL.md +4 -4
- package/pack/generated/omp/skills/rite-converge/reference/convergence-assessment.md +3 -3
- package/pack/generated/omp/skills/rite-define/SKILL.md +10 -5
- package/pack/generated/omp/skills/rite-doctor/SKILL.md +17 -2
- package/pack/generated/omp/skills/rite-dogfood/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-explain/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-explain/reference/intake.md +1 -1
- package/pack/generated/omp/skills/rite-fast/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-handoff/SKILL.md +3 -3
- package/pack/generated/omp/skills/rite-handoff/reference/handoff-template.md +1 -1
- package/pack/generated/omp/skills/rite-plan/SKILL.md +4 -4
- package/pack/generated/omp/skills/rite-plan/reference/slicing.md +3 -2
- package/pack/generated/omp/skills/rite-polish/SKILL.md +6 -3
- package/pack/generated/omp/skills/rite-prove/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-quick/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-resolve/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-review/SKILL.md +4 -4
- package/pack/generated/omp/skills/rite-seal/SKILL.md +2 -2
- package/pack/generated/omp/skills/rite-ship/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-spec/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-spec/reference/investigation.md +5 -5
- package/pack/generated/omp/skills/rite-spec/reference/spec-template.md +1 -1
- package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +6 -4
- package/pack/generated/omp/skills/rite-status/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-temper/SKILL.md +1 -1
- package/pack/generated/omp/skills/rite-temper/reference/review-dimensions.md +2 -2
- package/pack/generated/omp/skills/rite-temper/reference/scope-modes.md +2 -2
- package/pack/generated/omp/skills/rite-temper/reference/significance.md +2 -2
- package/pack/generated/omp/skills/rite-vet/SKILL.md +8 -4
- package/pack/generated/omp/skills/rite-vet/reference/artifacts.md +10 -3
- package/pack/generated/omp/skills/rite-vet/reference/depth.md +2 -2
- package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +2 -2
- package/pack/generated/omp/skills/rite-zoom-out/SKILL.md +6 -6
- package/pack/generated/pi/agents/devrites-code-reviewer.md +9 -5
- package/pack/generated/pi/agents/devrites-devex-reviewer.md +5 -4
- package/pack/generated/pi/agents/devrites-doubt-reviewer.md +4 -4
- package/pack/generated/pi/agents/devrites-evidence-scout.md +3 -2
- package/pack/generated/pi/agents/devrites-frontend-reviewer.md +5 -4
- package/pack/generated/pi/agents/devrites-performance-reviewer.md +5 -5
- package/pack/generated/pi/agents/devrites-plan-drafter.md +4 -2
- package/pack/generated/pi/agents/devrites-plan-reviewer.md +5 -5
- package/pack/generated/pi/agents/devrites-proof-runner.md +1 -1
- package/pack/generated/pi/agents/devrites-retrospector.md +1 -1
- package/pack/generated/pi/agents/devrites-security-auditor.md +4 -4
- package/pack/generated/pi/agents/devrites-simplifier-reviewer.md +5 -4
- package/pack/generated/pi/agents/devrites-slice-wright.md +18 -9
- package/pack/generated/pi/agents/devrites-spec-reviewer.md +4 -4
- package/pack/generated/pi/agents/devrites-strategy-reviewer.md +5 -6
- package/pack/generated/pi/agents/devrites-test-analyst.md +7 -4
- package/pack/generated/pi/agents/devrites-upgrade-planner.md +1 -1
- package/pack/generated/pi/agents/fast-builder.md +4 -2
- package/pack/generated/pi/agents/fast-checker.md +3 -2
- package/pack/generated/pi/agents/fast-critic.md +3 -2
- package/pack/generated/pi/agents/fast-planner.md +3 -3
- package/pack/generated/pi/agents/overhaul-backend-engineer.md +1 -1
- package/pack/generated/pi/agents/overhaul-boundary.md +1 -1
- package/pack/generated/pi/agents/overhaul-craft.md +1 -1
- package/pack/generated/pi/agents/overhaul-frontend-engineer.md +1 -1
- package/pack/generated/pi/agents/overhaul-implementer.md +1 -1
- package/pack/generated/pi/agents/overhaul-recon.md +6 -5
- package/pack/generated/pi/agents/overhaul-specialist.md +1 -1
- package/pack/generated/pi/agents/overhaul-verifier.md +1 -1
- package/pack/generated/pi/skills/devrites-api-interface/SKILL.md +1 -1
- package/pack/generated/pi/skills/devrites-audit/SKILL.md +1 -1
- package/pack/generated/pi/skills/devrites-debug-recovery/SKILL.md +1 -1
- package/pack/generated/pi/skills/devrites-doubt/SKILL.md +5 -5
- package/pack/generated/pi/skills/devrites-frontend-craft/reference/reuse-first.md +3 -3
- package/pack/generated/pi/skills/devrites-interview/SKILL.md +1 -1
- package/pack/generated/pi/skills/devrites-lib/SKILL.md +11 -6
- package/pack/generated/pi/skills/devrites-lib/reference/orchestration-profiles.md +2 -0
- package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +25 -14
- package/pack/generated/pi/skills/devrites-lib/reference/standards/README.md +2 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +11 -3
- package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +43 -19
- package/pack/generated/pi/skills/devrites-lib/reference/standards/architecture-health.md +1 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/code-index.md +111 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/code-navigation.md +13 -63
- package/pack/generated/pi/skills/devrites-lib/reference/standards/context-hygiene.md +8 -9
- package/pack/generated/pi/skills/devrites-lib/reference/standards/core.md +14 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/deprecation.md +1 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/gates.md +10 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/security.md +4 -0
- package/pack/generated/pi/skills/devrites-lib/reference/standards/testing.md +3 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/tooling.md +9 -8
- package/pack/generated/pi/skills/devrites-lib/reference/standards/windows.md +3 -2
- package/pack/generated/pi/skills/devrites-lib/reference/standards/workflow-artifacts.md +2 -0
- package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +16 -16
- package/pack/generated/pi/skills/devrites-ux-shape/SKILL.md +1 -1
- package/pack/generated/pi/skills/overhaul/references/orchestration.md +3 -2
- package/pack/generated/pi/skills/rite/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-adopt/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-adopt/reference/adoption.md +1 -1
- package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +5 -4
- package/pack/generated/pi/skills/rite-build/SKILL.md +4 -3
- package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +2 -0
- package/pack/generated/pi/skills/rite-build/reference/checkpoint-protocol.md +4 -1
- package/pack/generated/pi/skills/rite-build/reference/checkpoint.md +2 -0
- package/pack/generated/pi/skills/rite-build/reference/one-slice-cycle.md +1 -1
- package/pack/generated/pi/skills/rite-build/reference/output.md +2 -0
- package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +22 -12
- package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +13 -3
- package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +42 -25
- package/pack/generated/pi/skills/rite-clarify/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-converge/SKILL.md +4 -4
- package/pack/generated/pi/skills/rite-converge/reference/convergence-assessment.md +3 -3
- package/pack/generated/pi/skills/rite-define/SKILL.md +10 -5
- package/pack/generated/pi/skills/rite-doctor/SKILL.md +17 -2
- package/pack/generated/pi/skills/rite-dogfood/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-explain/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-explain/reference/intake.md +1 -1
- package/pack/generated/pi/skills/rite-fast/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-handoff/SKILL.md +3 -3
- package/pack/generated/pi/skills/rite-handoff/reference/handoff-template.md +1 -1
- package/pack/generated/pi/skills/rite-plan/SKILL.md +4 -4
- package/pack/generated/pi/skills/rite-plan/reference/slicing.md +3 -2
- package/pack/generated/pi/skills/rite-polish/SKILL.md +6 -3
- package/pack/generated/pi/skills/rite-prove/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-quick/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-resolve/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-review/SKILL.md +4 -4
- package/pack/generated/pi/skills/rite-seal/SKILL.md +2 -2
- package/pack/generated/pi/skills/rite-ship/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-spec/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-spec/reference/investigation.md +5 -5
- package/pack/generated/pi/skills/rite-spec/reference/spec-template.md +1 -1
- package/pack/generated/pi/skills/rite-spec/reference/state-workspace.md +6 -4
- package/pack/generated/pi/skills/rite-status/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-temper/SKILL.md +1 -1
- package/pack/generated/pi/skills/rite-temper/reference/review-dimensions.md +2 -2
- package/pack/generated/pi/skills/rite-temper/reference/scope-modes.md +2 -2
- package/pack/generated/pi/skills/rite-temper/reference/significance.md +2 -2
- package/pack/generated/pi/skills/rite-vet/SKILL.md +8 -4
- package/pack/generated/pi/skills/rite-vet/reference/artifacts.md +10 -3
- package/pack/generated/pi/skills/rite-vet/reference/depth.md +2 -2
- package/pack/generated/pi/skills/rite-vet/reference/review-axes.md +2 -2
- package/pack/generated/pi/skills/rite-zoom-out/SKILL.md +6 -6
- package/package.json +1 -1
- package/scripts/build-host-artifacts.sh +5 -4
- package/scripts/omp-generate.sh +3 -12
- package/scripts/pi-generate.sh +5 -51
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
package lib
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"errors"
|
|
6
|
+
"fmt"
|
|
7
|
+
"io"
|
|
8
|
+
"os"
|
|
9
|
+
"path/filepath"
|
|
10
|
+
"slices"
|
|
11
|
+
"strings"
|
|
12
|
+
"time"
|
|
13
|
+
|
|
14
|
+
"github.com/devrites/devrites/internal/devritespaths"
|
|
15
|
+
"github.com/devrites/devrites/internal/state"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
// treeBaselineFile is the feature-root map of dirty product paths to their
|
|
19
|
+
// pathDigest fingerprint (ADR-0038). `dispatch open` writes it when absent
|
|
20
|
+
// (run start: pre-existing dirt is accepted user work), the return that
|
|
21
|
+
// completes a wright wave takes that wave's write set, and `dispatch
|
|
22
|
+
// attribute` takes the paths it names. Paths no longer dirty keep their
|
|
23
|
+
// recorded fingerprint, so a checkpoint commit later collapsed back into the
|
|
24
|
+
// work tree (git reset --soft) is not flagged. The engine never reverts a file.
|
|
25
|
+
const treeBaselineFile = "tree-baseline.json"
|
|
26
|
+
|
|
27
|
+
// treeProject returns the project directory and its path inside the git
|
|
28
|
+
// repository ("" at the top, else "sub/"). ok is false when root is not a
|
|
29
|
+
// project's .devrites tree or the project is not in a git work tree; the
|
|
30
|
+
// tripwire is then off.
|
|
31
|
+
func treeProject(root string) (project, prefix string, ok bool) {
|
|
32
|
+
if filepath.Base(root) != devritespaths.DevritesRootName {
|
|
33
|
+
return "", "", false
|
|
34
|
+
}
|
|
35
|
+
project = filepath.Dir(root)
|
|
36
|
+
out, err := runGitCommand(project, nil, "rev-parse", "--show-prefix")
|
|
37
|
+
if err != nil {
|
|
38
|
+
return "", "", false
|
|
39
|
+
}
|
|
40
|
+
return project, strings.TrimSpace(string(out)), true
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// productDirt fingerprints every dirty product path, project-relative: git
|
|
44
|
+
// status entries (tracked, staged, untracked; gitignored files never appear)
|
|
45
|
+
// outside .devrites/ and .scratch/.
|
|
46
|
+
func productDirt(project, prefix string) (map[string]string, error) {
|
|
47
|
+
paths, err := gitStatusPaths(project)
|
|
48
|
+
if err != nil {
|
|
49
|
+
return nil, err
|
|
50
|
+
}
|
|
51
|
+
dirt := make(map[string]string, len(paths))
|
|
52
|
+
for _, path := range paths {
|
|
53
|
+
rel, ok := strings.CutPrefix(path, prefix)
|
|
54
|
+
if !ok || rel == ".devrites" || rel == ".scratch" || strings.HasPrefix(rel, ".devrites/") || strings.HasPrefix(rel, ".scratch/") {
|
|
55
|
+
continue
|
|
56
|
+
}
|
|
57
|
+
dirt[rel] = pathDigest(project, rel)
|
|
58
|
+
}
|
|
59
|
+
return dirt, nil
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// loadTreeBaseline reads the feature's baseline; ok is false when it is absent.
|
|
63
|
+
func loadTreeBaseline(root, slug string) (map[string]string, bool, error) {
|
|
64
|
+
dir, err := devritespaths.ExistingFeatureDirChecked(root, slug)
|
|
65
|
+
if err != nil {
|
|
66
|
+
return nil, false, err
|
|
67
|
+
}
|
|
68
|
+
data, err := os.ReadFile(filepath.Join(dir, treeBaselineFile)) // #nosec G304 -- validated feature workspace artifact
|
|
69
|
+
if errors.Is(err, os.ErrNotExist) {
|
|
70
|
+
return nil, false, nil
|
|
71
|
+
}
|
|
72
|
+
if err != nil {
|
|
73
|
+
return nil, false, fmt.Errorf("%s: %w", treeBaselineFile, err)
|
|
74
|
+
}
|
|
75
|
+
var baseline map[string]string
|
|
76
|
+
if err := json.Unmarshal(data, &baseline); err != nil {
|
|
77
|
+
return nil, false, fmt.Errorf("%s is not valid JSON: %w", treeBaselineFile, err)
|
|
78
|
+
}
|
|
79
|
+
return baseline, true, nil
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// recordTreeBaseline rewrites the baseline from the current dirty set and
|
|
83
|
+
// carries clean paths' recorded values forward. A path
|
|
84
|
+
// whose fingerprint changed is taken when accept covers it (always when no
|
|
85
|
+
// baseline exists yet); otherwise it keeps its recorded value, or stays
|
|
86
|
+
// unrecorded, and remains flagged. It returns how many paths it took and
|
|
87
|
+
// writes nothing outside a git project. Callers hold the feature lock.
|
|
88
|
+
func recordTreeBaseline(root, slug string, accept func(string) bool) (int, error) {
|
|
89
|
+
project, prefix, ok := treeProject(root)
|
|
90
|
+
if !ok {
|
|
91
|
+
return 0, nil
|
|
92
|
+
}
|
|
93
|
+
baseline, exists, err := loadTreeBaseline(root, slug)
|
|
94
|
+
if err != nil {
|
|
95
|
+
return 0, err
|
|
96
|
+
}
|
|
97
|
+
dirt, err := productDirt(project, prefix)
|
|
98
|
+
if err != nil {
|
|
99
|
+
return 0, err
|
|
100
|
+
}
|
|
101
|
+
next := make(map[string]string, len(dirt))
|
|
102
|
+
taken := 0
|
|
103
|
+
for path, digest := range dirt {
|
|
104
|
+
was, recorded := baseline[path]
|
|
105
|
+
switch {
|
|
106
|
+
case recorded && was == digest:
|
|
107
|
+
next[path] = was
|
|
108
|
+
case !exists || accept(path):
|
|
109
|
+
next[path] = digest
|
|
110
|
+
taken++
|
|
111
|
+
case recorded:
|
|
112
|
+
next[path] = was
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
for path, was := range baseline {
|
|
116
|
+
if _, dirty := dirt[path]; !dirty {
|
|
117
|
+
next[path] = was
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
data, err := json.MarshalIndent(next, "", " ")
|
|
121
|
+
if err != nil {
|
|
122
|
+
return 0, err
|
|
123
|
+
}
|
|
124
|
+
return taken, state.AtomicWrite(filepath.Join(devritespaths.FeatureDir(root, slug), treeBaselineFile), append(data, '\n'), 0o600)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ensureTreeBaseline records the run-start baseline when none exists.
|
|
128
|
+
func ensureTreeBaseline(root, slug string, stdout io.Writer) error {
|
|
129
|
+
if _, exists, err := loadTreeBaseline(root, slug); err != nil || exists {
|
|
130
|
+
return err
|
|
131
|
+
}
|
|
132
|
+
if _, _, ok := treeProject(root); !ok {
|
|
133
|
+
return nil
|
|
134
|
+
}
|
|
135
|
+
n, err := recordTreeBaseline(root, slug, nil)
|
|
136
|
+
if err == nil {
|
|
137
|
+
fmt.Fprintf(stdout, "dispatch: tree baseline recorded (%d dirty product path(s) accepted as user work)\n", n)
|
|
138
|
+
}
|
|
139
|
+
return err
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// unattributedEdits lists, sorted, the dirty product paths whose fingerprint
|
|
143
|
+
// differs from the baseline and that neither a live claim nor an in-flight
|
|
144
|
+
// wright wave's slice write set covers. A workspace without a baseline,
|
|
145
|
+
// or a project outside git, has none.
|
|
146
|
+
func unattributedEdits(root, slug string) ([]string, error) {
|
|
147
|
+
baseline, exists, err := loadTreeBaseline(root, slug)
|
|
148
|
+
if err != nil || !exists {
|
|
149
|
+
return nil, err
|
|
150
|
+
}
|
|
151
|
+
project, prefix, ok := treeProject(root)
|
|
152
|
+
if !ok {
|
|
153
|
+
return nil, nil
|
|
154
|
+
}
|
|
155
|
+
dirt, err := productDirt(project, prefix)
|
|
156
|
+
if err != nil {
|
|
157
|
+
return nil, err
|
|
158
|
+
}
|
|
159
|
+
covered, err := liveAttribution(root, slug)
|
|
160
|
+
if err != nil {
|
|
161
|
+
return nil, err
|
|
162
|
+
}
|
|
163
|
+
var out []string
|
|
164
|
+
for path, digest := range dirt {
|
|
165
|
+
if was, recorded := baseline[path]; (!recorded || was != digest) && !covers(covered, path) {
|
|
166
|
+
out = append(out, path)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
slices.Sort(out)
|
|
170
|
+
return out, nil
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// liveAttribution is every path a wright may be writing now: live claims in
|
|
174
|
+
// the ledger plus the slice write sets of open or sealed wright waves, in
|
|
175
|
+
// any phase.
|
|
176
|
+
func liveAttribution(root, slug string) ([]string, error) {
|
|
177
|
+
latest, order, _, err := readClaims(claimsPath(root))
|
|
178
|
+
if err != nil {
|
|
179
|
+
return nil, err
|
|
180
|
+
}
|
|
181
|
+
var paths []string
|
|
182
|
+
for _, rec := range liveClaims(latest, order, time.Now().UTC()) {
|
|
183
|
+
paths = append(paths, rec.Paths...)
|
|
184
|
+
}
|
|
185
|
+
f, _, err := loadDispatch(root, slug)
|
|
186
|
+
if err != nil {
|
|
187
|
+
return nil, err
|
|
188
|
+
}
|
|
189
|
+
for _, w := range f.Waves {
|
|
190
|
+
if (w.State == "open" || w.State == "sealed") && isWrightWave(w) {
|
|
191
|
+
paths = append(paths, sliceWriteSet(root, slug, w.Slices)...)
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return paths, nil
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// waveWriteSet is what a completed wright wave owns: its slices' write
|
|
198
|
+
// sets plus the paths of its claim, released or not.
|
|
199
|
+
func waveWriteSet(root, slug string, w *dispatchWave) []string {
|
|
200
|
+
paths := sliceWriteSet(root, slug, w.Slices)
|
|
201
|
+
if w.Claim != "" {
|
|
202
|
+
if latest, _, _, err := readClaims(claimsPath(root)); err == nil && latest[w.Claim] != nil {
|
|
203
|
+
paths = append(paths, latest[w.Claim].Paths...)
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return paths
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// sliceWriteSet is the tasks.md write set (Writer allowlist, else Files likely
|
|
210
|
+
// touched) of each named slice; an unreadable tasks.md yields none.
|
|
211
|
+
func sliceWriteSet(root, slug string, ids []string) []string {
|
|
212
|
+
raw, err := readWorkspaceArtifact(root, slug, "tasks.md")
|
|
213
|
+
if err != nil {
|
|
214
|
+
return nil
|
|
215
|
+
}
|
|
216
|
+
byID, _ := sliceWritePaths(raw, ParseTaskGraph(raw))
|
|
217
|
+
var out []string
|
|
218
|
+
for id, paths := range byID {
|
|
219
|
+
if containsSlice(ids, id) {
|
|
220
|
+
out = append(out, paths...)
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return out
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// covers reports whether a held path (file or directory) covers path.
|
|
227
|
+
func covers(held []string, path string) bool {
|
|
228
|
+
return slices.ContainsFunc(held, func(h string) bool { return claimPathsOverlap(h, path) })
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// unattributedMessage names the flagged paths and both remedies; neither
|
|
232
|
+
// stops for a human and the engine reverts nothing.
|
|
233
|
+
func unattributedMessage(slug string, paths []string) string {
|
|
234
|
+
return fmt.Sprintf("unattributed root edit: %s; route each path through a bounded wright (its `dispatch open` names it with --claim <path>, or a slice write set covers it) or record the evidence that it is owner work, gate output, a returned wright outside a dispatch wave, or a protocol-sanctioned root write (Polish ADR promotion, DESIGN.md): devrites-engine dispatch %s attribute --reason <evidence> --path <path> (ADR-0038)",
|
|
235
|
+
strings.Join(paths, ", "), slug)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// recordUnattributed logs one tripwire finding to metrics.jsonl.
|
|
239
|
+
func recordUnattributed(root, slug, phase string, paths []string) {
|
|
240
|
+
recordMetricNote(root, slug, phase, "unattributed-edit", "", "paths="+strings.Join(paths, ","))
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// CheckTreeBaseline is the `check candidate` tripwire: it fails while a dirty
|
|
244
|
+
// product path changed since the tree baseline with no live wright
|
|
245
|
+
// attribution. A workspace without tree-baseline.json always passes.
|
|
246
|
+
func CheckTreeBaseline(root, slug string) error {
|
|
247
|
+
flagged, err := unattributedEdits(root, slug)
|
|
248
|
+
if err != nil {
|
|
249
|
+
return fmt.Errorf("tree baseline: %w", err)
|
|
250
|
+
}
|
|
251
|
+
if len(flagged) > 0 {
|
|
252
|
+
recordUnattributed(root, slug, cursorPhase(root, slug), flagged)
|
|
253
|
+
return errors.New(unattributedMessage(slug, flagged))
|
|
254
|
+
}
|
|
255
|
+
return nil
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// attributeEdits records evidence-backed attribution for flagged paths: each
|
|
259
|
+
// must be an unattributed edit now, and its current fingerprint joins the
|
|
260
|
+
// baseline. The reason and paths land in metrics.jsonl.
|
|
261
|
+
func attributeEdits(root, slug, reason string, paths []string, stdout, stderr io.Writer) int {
|
|
262
|
+
if strings.TrimSpace(reason) == "" || len(paths) == 0 {
|
|
263
|
+
fmt.Fprintln(stderr, "dispatch: attribute needs --reason <evidence> and at least one --path <path>")
|
|
264
|
+
return 2
|
|
265
|
+
}
|
|
266
|
+
code := 0
|
|
267
|
+
err := state.WithFeatureLock(root, slug, func() error {
|
|
268
|
+
flagged, err := unattributedEdits(root, slug)
|
|
269
|
+
if err != nil {
|
|
270
|
+
return err
|
|
271
|
+
}
|
|
272
|
+
for _, path := range paths {
|
|
273
|
+
if !slices.Contains(flagged, path) {
|
|
274
|
+
fmt.Fprintf(stderr, "dispatch: %s is not an unattributed edit (flagged: %s)\n", path, listOrNone(flagged))
|
|
275
|
+
code = 2
|
|
276
|
+
return nil
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if _, err := recordTreeBaseline(root, slug, func(p string) bool { return slices.Contains(paths, p) }); err != nil {
|
|
280
|
+
return err
|
|
281
|
+
}
|
|
282
|
+
recordMetricNote(root, slug, cursorPhase(root, slug), "unattributed-edit", "", "attributed="+strings.Join(paths, ",")+" reason="+reason)
|
|
283
|
+
for _, path := range paths {
|
|
284
|
+
fmt.Fprintf(stdout, "dispatch: attributed %s (%s)\n", path, reason)
|
|
285
|
+
}
|
|
286
|
+
return nil
|
|
287
|
+
})
|
|
288
|
+
if err != nil {
|
|
289
|
+
fmt.Fprintf(stderr, "dispatch: attribute: %v\n", err)
|
|
290
|
+
return 3
|
|
291
|
+
}
|
|
292
|
+
return code
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
func listOrNone(paths []string) string {
|
|
296
|
+
if len(paths) == 0 {
|
|
297
|
+
return "none"
|
|
298
|
+
}
|
|
299
|
+
return strings.Join(paths, ", ")
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// openTripwire refuses a wave open while an unattributed edit remains that
|
|
303
|
+
// the new wave does not take on: only a wright wave (any phase) takes on
|
|
304
|
+
// paths, through its --claim paths and its slices' write sets.
|
|
305
|
+
func openTripwire(root, slug string, w *dispatchWave, claimPaths []string) error {
|
|
306
|
+
flagged, err := unattributedEdits(root, slug)
|
|
307
|
+
if err != nil {
|
|
308
|
+
return fmt.Errorf("tree baseline: %w", err)
|
|
309
|
+
}
|
|
310
|
+
if isWrightWave(w) {
|
|
311
|
+
own := append(sliceWriteSet(root, slug, w.Slices), claimPaths...)
|
|
312
|
+
flagged = slices.DeleteFunc(flagged, func(p string) bool { return covers(own, p) })
|
|
313
|
+
}
|
|
314
|
+
if len(flagged) == 0 {
|
|
315
|
+
return nil
|
|
316
|
+
}
|
|
317
|
+
recordUnattributed(root, slug, w.Phase, flagged)
|
|
318
|
+
return errors.New(unattributedMessage(slug, flagged))
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// absorbWave takes a completed wright wave's write set into the
|
|
322
|
+
// baseline. A failure only warns: the return is already recorded.
|
|
323
|
+
func absorbWave(root, slug string, w *dispatchWave, stderr io.Writer) {
|
|
324
|
+
if !isWrightWave(w) {
|
|
325
|
+
return
|
|
326
|
+
}
|
|
327
|
+
own := waveWriteSet(root, slug, w)
|
|
328
|
+
if _, err := recordTreeBaseline(root, slug, func(p string) bool { return covers(own, p) }); err != nil {
|
|
329
|
+
fmt.Fprintf(stderr, "dispatch: WARNING: %s not updated: %v\n", treeBaselineFile, err)
|
|
330
|
+
}
|
|
331
|
+
}
|
|
@@ -24,6 +24,7 @@ type triggerFacts struct {
|
|
|
24
24
|
afk bool
|
|
25
25
|
afkParallel bool
|
|
26
26
|
principles bool
|
|
27
|
+
aiSpec bool // featureDir/ai-spec.md exists: the spec process marked an AI feature
|
|
27
28
|
corpus string // lowercased text of spec/plan/tasks/design brief
|
|
28
29
|
}
|
|
29
30
|
|
|
@@ -38,8 +39,23 @@ var (
|
|
|
38
39
|
tddSignalRe = regexp.MustCompile(`\b(tdd|test[- ]first|test driven)\b`)
|
|
39
40
|
topoSignalRe = regexp.MustCompile(`(migrat|\bschema\b|\bsql\b|database|postgres|mysql|sqlite|mongo|\bqueue\b|kafka|rabbitmq|redis|\bcache\b|webhook|monorepo|multi[- ]root|multi[- ]service|microservice|\bgrpc\b|graphql|\brest\b|\bapi\b|message broker)`)
|
|
40
41
|
wfaSignalRe = regexp.MustCompile(`workflow[- ]artifact`)
|
|
42
|
+
aiSignalRe = regexp.MustCompile(`\b(llms?|prompts?|rag|embeddings?|model output|agents?|agentic|tool[- ]use|skill packages?|mcp|chatbot)\b`)
|
|
43
|
+
// aiAnnexRe drops the spec template's always-present "AI-SPEC annex" section
|
|
44
|
+
// (its boilerplate names LLM/RAG/agent) up to the next heading, kept via $1.
|
|
45
|
+
aiAnnexRe = regexp.MustCompile(`(?ms)^#{1,6}[ \t]*ai-spec annex[^\n]*\n.*?(^#|\z)`)
|
|
41
46
|
)
|
|
42
47
|
|
|
48
|
+
// keepModelSurface reports whether a --role bundle inlines <!-- model-surface -->
|
|
49
|
+
// sections. Unlike suggestions this is decided by the engine, and it fails
|
|
50
|
+
// safe: the security auditor always keeps them, and so does any role whose
|
|
51
|
+
// spec/plan/tasks corpus is absent, whose feature has an ai-spec.md, or whose
|
|
52
|
+
// corpus (minus the template's AI-SPEC annex) names a model, agent, RAG, or
|
|
53
|
+
// tool surface.
|
|
54
|
+
func keepModelSurface(role string, facts triggerFacts) bool {
|
|
55
|
+
return role == "security-auditor" || facts.aiSpec || strings.TrimSpace(facts.corpus) == "" ||
|
|
56
|
+
aiSignalRe.MatchString(aiAnnexRe.ReplaceAllString(facts.corpus, "$1"))
|
|
57
|
+
}
|
|
58
|
+
|
|
43
59
|
// triggerSignals maps declared trigger-name shapes to facts. nameRe is matched
|
|
44
60
|
// case-insensitively against each declared (unselected) trigger name.
|
|
45
61
|
var triggerSignals = []struct {
|
|
@@ -100,6 +116,9 @@ func gatherTriggerFacts(root, featureDir, role string) triggerFacts {
|
|
|
100
116
|
}
|
|
101
117
|
}
|
|
102
118
|
if featureDir != "" {
|
|
119
|
+
if info, err := os.Stat(filepath.Join(featureDir, "ai-spec.md")); err == nil && info.Mode().IsRegular() {
|
|
120
|
+
facts.aiSpec = true
|
|
121
|
+
}
|
|
103
122
|
var corpus strings.Builder
|
|
104
123
|
for _, name := range triggerEvidenceFiles {
|
|
105
124
|
path := filepath.Join(featureDir, name)
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
package lib
|
|
2
2
|
|
|
3
3
|
import (
|
|
4
|
+
"bytes"
|
|
5
|
+
"context"
|
|
4
6
|
"fmt"
|
|
5
7
|
"io"
|
|
6
8
|
"os"
|
|
9
|
+
"os/exec"
|
|
7
10
|
"path"
|
|
8
11
|
"path/filepath"
|
|
9
12
|
"regexp"
|
|
10
13
|
"strconv"
|
|
11
14
|
"strings"
|
|
15
|
+
"time"
|
|
12
16
|
|
|
13
17
|
"github.com/devrites/devrites/internal/devritespaths"
|
|
18
|
+
"github.com/devrites/devrites/internal/gitenv"
|
|
14
19
|
)
|
|
15
20
|
|
|
16
21
|
// windows.go — the broken-windows check. Review prose flags a new TODO, stub,
|
|
@@ -20,7 +25,7 @@ import (
|
|
|
20
25
|
// recorded waiver row in the workspace's windows.md, or the check fails. A
|
|
21
26
|
// silent deferral or lowered bar is the bug.
|
|
22
27
|
//
|
|
23
|
-
// devrites-engine check windows <slug> [--worktree|--staged|--base <ref>] [--cwd <dir>]
|
|
28
|
+
// devrites-engine check windows <slug> [--worktree|--staged|--base <ref>|--since-dispatch <wave>] [--cwd <dir>]
|
|
24
29
|
//
|
|
25
30
|
// 0 no unwaived markers 2 usage error 3 unwaived markers or blocked
|
|
26
31
|
//
|
|
@@ -30,6 +35,10 @@ import (
|
|
|
30
35
|
// that remains (`removed-assertion`). Each windows.md row waives exactly one hit —
|
|
31
36
|
// one blanket row cannot cover a file's five new TODOs.
|
|
32
37
|
//
|
|
38
|
+
// --since-dispatch <wave> reports only those removals, against the work-tree
|
|
39
|
+
// snapshot that wave's build wright open recorded: same-tree repair rounds stay
|
|
40
|
+
// uncommitted, so a test an earlier round added is plain additions against HEAD.
|
|
41
|
+
//
|
|
33
42
|
// windows.md row grammar (one waiver per line):
|
|
34
43
|
//
|
|
35
44
|
// - <project-relative path> | <marker token> | <reason>
|
|
@@ -37,7 +46,7 @@ import (
|
|
|
37
46
|
// A row waives one hit at that path carrying that marker; empty reasons do not
|
|
38
47
|
// waive. Rows never suppress coverage — they explain it.
|
|
39
48
|
|
|
40
|
-
const windowsUsage = `usage: devrites-engine check windows <slug> [--worktree|--staged|--base <ref>] [--cwd <dir>]
|
|
49
|
+
const windowsUsage = `usage: devrites-engine check windows <slug> [--worktree|--staged|--base <ref>|--since-dispatch <wave>] [--cwd <dir>]
|
|
41
50
|
|
|
42
51
|
Reports deferral and bar-lowering markers introduced by the change (added lines:
|
|
43
52
|
TODO/stub/skip/focus idioms, checker suppressions, empty-catch; removals:
|
|
@@ -45,6 +54,8 @@ deleted-test, removed-assertion) and requires each to be waived by a row in
|
|
|
45
54
|
.devrites/work/<slug>/windows.md:
|
|
46
55
|
- <path> | <marker> | <reason>
|
|
47
56
|
Each row waives one hit at that path with that marker token.
|
|
57
|
+
--since-dispatch <wave> reports only removals since that build wright wave
|
|
58
|
+
opened (its recorded work-tree snapshot), untracked files included.
|
|
48
59
|
Exit 0 clean or fully waived, 3 unwaived markers or blocked.`
|
|
49
60
|
|
|
50
61
|
// deferralTokenRe catches uppercase comment markers: TODO, FIXME, XXX, HACK.
|
|
@@ -312,12 +323,22 @@ func windowsHits(opts diffScopeOpts) ([]windowHit, error) {
|
|
|
312
323
|
diffArgs = append(diffArgs, "--cached", "-M", "-U0", "--")
|
|
313
324
|
case "base":
|
|
314
325
|
diffArgs = append(diffArgs, opts.base, "-M", "-U0", "--")
|
|
326
|
+
case "since":
|
|
327
|
+
after, err := worktreeTree(dir)
|
|
328
|
+
if err != nil {
|
|
329
|
+
return nil, err
|
|
330
|
+
}
|
|
331
|
+
diffArgs = append(diffArgs, opts.base, after, "-M", "-U0", "--")
|
|
315
332
|
default:
|
|
316
333
|
diffArgs = append(diffArgs, "HEAD", "-M", "-U0", "--")
|
|
317
334
|
}
|
|
318
335
|
diff, err := runGitCommand(dir, nil, diffArgs...)
|
|
319
336
|
var diffPaths map[string]bool
|
|
320
337
|
switch {
|
|
338
|
+
case err == nil && opts.mode == "since":
|
|
339
|
+
// Added markers are the HEAD-based run's job; round over round only
|
|
340
|
+
// removals are new.
|
|
341
|
+
hits = removedTestHits(string(diff))
|
|
321
342
|
case err == nil:
|
|
322
343
|
hits, diffPaths = addedLinesFromDiff(string(diff))
|
|
323
344
|
hits = append(hits, removedTestHits(string(diff))...)
|
|
@@ -368,6 +389,55 @@ func windowsHits(opts diffScopeOpts) ([]windowHit, error) {
|
|
|
368
389
|
return kept, nil
|
|
369
390
|
}
|
|
370
391
|
|
|
392
|
+
// worktreeTree snapshots the work tree (tracked, staged, and untracked files
|
|
393
|
+
// git does not ignore) as a tree object and returns its id. It stages into a
|
|
394
|
+
// private copy of the index, so the real index, refs, and files stay untouched;
|
|
395
|
+
// the only trace is unreferenced objects git gc prunes.
|
|
396
|
+
func worktreeTree(dir string) (string, error) {
|
|
397
|
+
tmp, err := os.MkdirTemp("", "devrites-tree-")
|
|
398
|
+
if err != nil {
|
|
399
|
+
return "", err
|
|
400
|
+
}
|
|
401
|
+
defer func() { _ = os.RemoveAll(tmp) }()
|
|
402
|
+
index := filepath.Join(tmp, "index")
|
|
403
|
+
// Seeding from the real index reuses its stat cache: only changed files rehash.
|
|
404
|
+
if out, err := runGitCommand(dir, nil, "rev-parse", "--git-path", "index"); err == nil {
|
|
405
|
+
live := strings.TrimSpace(string(out))
|
|
406
|
+
if !filepath.IsAbs(live) {
|
|
407
|
+
live = filepath.Join(dir, live)
|
|
408
|
+
}
|
|
409
|
+
if raw, err := os.ReadFile(live); err == nil { // #nosec G304 -- git's own index path
|
|
410
|
+
if err := os.WriteFile(index, raw, 0o600); err != nil { // #nosec G703 -- index is a fixed name in our own MkdirTemp dir
|
|
411
|
+
return "", err
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
if _, err := gitWithIndex(dir, index, "add", "-A"); err != nil {
|
|
416
|
+
return "", err
|
|
417
|
+
}
|
|
418
|
+
tree, err := gitWithIndex(dir, index, "write-tree")
|
|
419
|
+
return strings.TrimSpace(tree), err
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// gitWithIndex runs git on a private index. runGitCommand strips
|
|
423
|
+
// GIT_INDEX_FILE with the other repository-targeting variables, so it is set
|
|
424
|
+
// here after sanitizing.
|
|
425
|
+
func gitWithIndex(dir, index string, args ...string) (string, error) {
|
|
426
|
+
ctx, cancel := context.WithTimeout(context.Background(), gitCommandTimeout)
|
|
427
|
+
defer cancel()
|
|
428
|
+
// #nosec G204 -- git -C <project dir>; fixed binary, sanitized env plus a private index
|
|
429
|
+
cmd := exec.CommandContext(ctx, "git", append([]string{"-C", dir}, args...)...)
|
|
430
|
+
cmd.Env = append(gitenv.Sanitize(os.Environ()), "GIT_INDEX_FILE="+index, "GIT_TERMINAL_PROMPT=0", "LC_ALL=C")
|
|
431
|
+
cmd.WaitDelay = 2 * time.Second
|
|
432
|
+
var stderr bytes.Buffer
|
|
433
|
+
cmd.Stderr = &stderr
|
|
434
|
+
out, err := cmd.Output()
|
|
435
|
+
if err != nil {
|
|
436
|
+
return "", fmt.Errorf("git %s: %w: %s", strings.Join(args, " "), err, strings.TrimSpace(stderr.String()))
|
|
437
|
+
}
|
|
438
|
+
return string(out), nil
|
|
439
|
+
}
|
|
440
|
+
|
|
371
441
|
func isUnbornHEAD(dir string) bool {
|
|
372
442
|
_, err := runGitCommand(dir, nil, "rev-parse", "--verify", "HEAD")
|
|
373
443
|
return err != nil
|
|
@@ -410,6 +480,7 @@ func parseWindowsWaivers(raw string) (map[windowWaiver]int, []string) {
|
|
|
410
480
|
func parseWindowsArgs(root string, args []string, stderr io.Writer) (diffScopeOpts, int) {
|
|
411
481
|
opts := diffScopeOpts{mode: "worktree", root: root}
|
|
412
482
|
var positional []string
|
|
483
|
+
var wave string
|
|
413
484
|
for i := 0; i < len(args); i++ {
|
|
414
485
|
switch args[i] {
|
|
415
486
|
case "--phase":
|
|
@@ -427,6 +498,14 @@ func parseWindowsArgs(root string, args []string, stderr io.Writer) (diffScopeOp
|
|
|
427
498
|
return opts, 2
|
|
428
499
|
}
|
|
429
500
|
i++
|
|
501
|
+
case "--since-dispatch":
|
|
502
|
+
opts.mode = "since"
|
|
503
|
+
wave = argAt(args, i+1)
|
|
504
|
+
if wave == "" || strings.HasPrefix(wave, "-") {
|
|
505
|
+
fmt.Fprintln(stderr, "windows: --since-dispatch requires a wave name (not a flag)")
|
|
506
|
+
return opts, 2
|
|
507
|
+
}
|
|
508
|
+
i++
|
|
430
509
|
case "--cwd":
|
|
431
510
|
opts.cwd = argAt(args, i+1)
|
|
432
511
|
i++
|
|
@@ -443,6 +522,28 @@ func parseWindowsArgs(root string, args []string, stderr io.Writer) (diffScopeOp
|
|
|
443
522
|
return opts, 2
|
|
444
523
|
}
|
|
445
524
|
opts.slug = positional[0]
|
|
525
|
+
if opts.mode == "since" {
|
|
526
|
+
if opts.cwd != "" {
|
|
527
|
+
fmt.Fprintln(stderr, "windows: --since-dispatch compares the project checkout; it takes no --cwd")
|
|
528
|
+
return opts, 2
|
|
529
|
+
}
|
|
530
|
+
// opts.base carries the wave's recorded tree: the diff's old side.
|
|
531
|
+
if _, err := devritespaths.ExistingFeatureDirChecked(root, opts.slug); err != nil {
|
|
532
|
+
fmt.Fprintf(stderr, "windows: workspace unavailable: %v\n", err)
|
|
533
|
+
return opts, 2
|
|
534
|
+
}
|
|
535
|
+
f, _, err := loadDispatch(root, opts.slug)
|
|
536
|
+
if err != nil {
|
|
537
|
+
fmt.Fprintf(stderr, "windows: %v\n", err)
|
|
538
|
+
return opts, 2
|
|
539
|
+
}
|
|
540
|
+
w := f.Waves[wave]
|
|
541
|
+
if w == nil || w.Tree == "" {
|
|
542
|
+
fmt.Fprintf(stderr, "windows: wave %q has no recorded tree snapshot (only a build wright wave opened in a git project records one)\n", wave)
|
|
543
|
+
return opts, 2
|
|
544
|
+
}
|
|
545
|
+
opts.base = w.Tree
|
|
546
|
+
}
|
|
446
547
|
if opts.phase == "" {
|
|
447
548
|
opts.phase = cursorPhase(root, opts.slug)
|
|
448
549
|
}
|
|
@@ -477,6 +578,10 @@ func RunCheckWindows(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
477
578
|
for _, w := range warnings {
|
|
478
579
|
fmt.Fprintf(stdout, "windows: %s\n", w)
|
|
479
580
|
}
|
|
581
|
+
event := "windows"
|
|
582
|
+
if opts.mode == "since" {
|
|
583
|
+
event = "windows-since" // per-round removals stay apart from HEAD-based runs
|
|
584
|
+
}
|
|
480
585
|
var unwaived, waived int
|
|
481
586
|
for _, h := range hits {
|
|
482
587
|
w := windowWaiver{Path: h.Path, Marker: h.Marker}
|
|
@@ -492,15 +597,15 @@ func RunCheckWindows(root string, args []string, stdout, stderr io.Writer) int {
|
|
|
492
597
|
switch {
|
|
493
598
|
case len(hits) == 0:
|
|
494
599
|
fmt.Fprintln(stdout, "windows: ok (no deferral markers introduced)")
|
|
495
|
-
recordMetric(root, opts.slug, opts.phase,
|
|
600
|
+
recordMetric(root, opts.slug, opts.phase, event, "", 0)
|
|
496
601
|
return 0
|
|
497
602
|
case unwaived == 0:
|
|
498
603
|
fmt.Fprintf(stdout, "windows: ok (%d marker(s), all waived in windows.md)\n", len(hits))
|
|
499
|
-
recordMetric(root, opts.slug, opts.phase,
|
|
604
|
+
recordMetric(root, opts.slug, opts.phase, event, "", int64(len(hits)))
|
|
500
605
|
return 0
|
|
501
606
|
default:
|
|
502
607
|
fmt.Fprintf(stdout, "windows: BLOCKED: %d unwaived deferral marker(s) introduced — remove them or record waivers in windows.md\n", unwaived)
|
|
503
|
-
recordMetric(root, opts.slug, opts.phase,
|
|
608
|
+
recordMetric(root, opts.slug, opts.phase, event, "", int64(unwaived))
|
|
504
609
|
return 3
|
|
505
610
|
}
|
|
506
611
|
}
|
|
@@ -22,8 +22,8 @@ import (
|
|
|
22
22
|
"strconv"
|
|
23
23
|
"strings"
|
|
24
24
|
"unicode/utf16"
|
|
25
|
-
"unicode/utf8"
|
|
26
25
|
|
|
26
|
+
"github.com/devrites/devrites/internal/anchor"
|
|
27
27
|
"github.com/devrites/devrites/internal/overhaul/ovio"
|
|
28
28
|
"github.com/devrites/devrites/internal/overhaul/packet"
|
|
29
29
|
"github.com/devrites/devrites/internal/overhaul/records"
|
|
@@ -56,7 +56,7 @@ func Run(args []string, stdout, stderr io.Writer) int {
|
|
|
56
56
|
case len(args) == 3 && args[0] == "packet":
|
|
57
57
|
code, err = packetAdmit(args[1], args[2], stdout)
|
|
58
58
|
case len(args) == 3 && args[0] == "anchor":
|
|
59
|
-
code, err =
|
|
59
|
+
code, err = anchorFindings(args[1], args[2], stdout, stderr)
|
|
60
60
|
default:
|
|
61
61
|
fmt.Fprint(stderr, usage)
|
|
62
62
|
return 2
|
|
@@ -332,28 +332,6 @@ func result(stdout io.Writer, why []string, ok string) int {
|
|
|
332
332
|
return 0
|
|
333
333
|
}
|
|
334
334
|
|
|
335
|
-
// splitlines is Python's str.splitlines().
|
|
336
|
-
func splitlines(s string) []string {
|
|
337
|
-
var out []string
|
|
338
|
-
start := 0
|
|
339
|
-
for i := 0; i < len(s); {
|
|
340
|
-
r, size := utf8.DecodeRuneInString(s[i:])
|
|
341
|
-
i += size
|
|
342
|
-
switch r {
|
|
343
|
-
case '\n', '\r', '\v', '\f', 0x1c, 0x1d, 0x1e, 0x85, 0x2028, 0x2029:
|
|
344
|
-
out = append(out, s[start:i-size])
|
|
345
|
-
if r == '\r' && i < len(s) && s[i] == '\n' {
|
|
346
|
-
i++
|
|
347
|
-
}
|
|
348
|
-
start = i
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
if start < len(s) {
|
|
352
|
-
out = append(out, s[start:])
|
|
353
|
-
}
|
|
354
|
-
return out
|
|
355
|
-
}
|
|
356
|
-
|
|
357
335
|
// pyInt is Python's int() on a decoded JSON value.
|
|
358
336
|
func pyInt(v any) (int, error) {
|
|
359
337
|
switch x := v.(type) {
|
|
@@ -381,7 +359,7 @@ func pyInt(v any) (int, error) {
|
|
|
381
359
|
return 0, fmt.Errorf("int() argument must be a string or a number, not %s", records.Repr(v))
|
|
382
360
|
}
|
|
383
361
|
|
|
384
|
-
func
|
|
362
|
+
func anchorFindings(root, path string, stdout, stderr io.Writer) (int, error) {
|
|
385
363
|
doc, err := ovio.LoadJSON(path)
|
|
386
364
|
if err != nil {
|
|
387
365
|
return 0, err
|
|
@@ -411,7 +389,7 @@ func anchor(root, path string, stdout, stderr io.Writer) (int, error) {
|
|
|
411
389
|
if err != nil {
|
|
412
390
|
return 0, err
|
|
413
391
|
}
|
|
414
|
-
lines :=
|
|
392
|
+
lines := anchor.Lines(b)
|
|
415
393
|
start, ok := loc["start"]
|
|
416
394
|
if !ok {
|
|
417
395
|
start = json.Number("0")
|
|
@@ -432,11 +410,10 @@ func anchor(root, path string, stdout, stderr io.Writer) (int, error) {
|
|
|
432
410
|
why = append(why, fmt.Sprintf("%s: %s lines %d-%d outside file (%d lines)", id, rel, s, e, len(lines)))
|
|
433
411
|
continue
|
|
434
412
|
}
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
if q == "" || !strings.Contains(w, q) {
|
|
413
|
+
switch anchor.At(lines, s, e, quote) {
|
|
414
|
+
case anchor.NotFound:
|
|
438
415
|
why = append(why, fmt.Sprintf("%s: quote not found at %s:%d-%d", id, rel, s, e))
|
|
439
|
-
|
|
416
|
+
case anchor.TooShort:
|
|
440
417
|
why = append(why, fmt.Sprintf("%s: quote at %s:%d is too short to anchor; quote the whole line", id, rel, s))
|
|
441
418
|
}
|
|
442
419
|
}
|