devrites 3.2.27 → 4.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 +22 -144
- package/NOTICE.md +6 -5
- package/README.md +187 -95
- package/SECURITY.md +103 -79
- package/bin/devrites.mjs +140 -24
- package/docs/adr/0003-gate-model-hitl-pause.md +1 -1
- package/docs/adr/0013-native-codex-agent-orchestration.md +74 -0
- package/docs/adr/0014-native-host-hook-boundary.md +64 -0
- package/docs/adr/0015-read-only-root-native-orchestration.md +96 -0
- package/docs/adr/0016-codex-writer-fail-closed.md +53 -0
- package/docs/adr/0017-native-codex-writer-agent.md +63 -0
- package/docs/adr/0018-native-sandbox-instruction-writer-boundary.md +66 -0
- package/docs/adr/0019-native-boundary-with-deterministic-gates.md +48 -0
- package/docs/adr/0020-thin-engine-native-orchestration-boundary.md +54 -0
- package/docs/adr/0021-observable-workspace-compatibility.md +49 -0
- package/docs/adr/0022-native-orchestration-thin-engine.md +90 -0
- package/docs/adr/0023-native-workspace-reads-line-output.md +71 -0
- package/docs/adr/0024-native-policy-offline-installer-boundary.md +111 -0
- package/docs/adr/0025-evidence-gated-workspace-upgrades.md +64 -0
- package/docs/adr/0026-content-bound-proof-and-bounded-inputs.md +169 -0
- package/docs/adr/0027-content-bound-build-readiness.md +77 -0
- package/docs/adr/README.md +26 -11
- package/docs/agents/domain.md +2 -1
- package/docs/agents/issue-driven-rites.md +1 -1
- package/docs/architecture.md +191 -103
- package/docs/candidate-integrity.md +138 -0
- package/docs/capability-surface-selection.md +15 -5
- package/docs/cli.md +139 -92
- package/docs/command-map.md +88 -63
- package/docs/engine/commands.md +115 -507
- package/docs/engine/state-schema.md +94 -113
- package/docs/engine/workspace-schema.md +169 -229
- package/docs/flow.md +113 -68
- package/docs/harness-compliance.md +29 -56
- package/docs/markdown-instruction-upgrade-2026-08-02.md +302 -0
- package/docs/orchestration.md +136 -149
- package/docs/porting-to-a-new-harness.md +22 -7
- package/docs/quick-reference.md +21 -8
- package/docs/release.md +47 -4
- package/docs/skills.md +111 -72
- package/docs/templates/CRITIC_REVIEW_PACKET_TEMPLATE.md +2 -0
- package/docs/upstream-workflow-benchmark-2026-08-01.md +655 -0
- package/docs/usage.md +99 -65
- package/engine/Makefile +1 -2
- package/engine/cmd/releasepack/main.go +45 -25
- package/engine/cmd/releasepack/main_test.go +69 -0
- package/engine/commands.go +8 -258
- package/engine/harnessmatrix_test.go +28 -41
- package/engine/internal/devritespaths/paths.go +12 -28
- package/engine/internal/fsutil/copy.go +8 -0
- package/engine/internal/gate/gate.go +104 -105
- package/engine/internal/gate/gate_test.go +94 -84
- package/engine/internal/gate/readiness_binding.go +203 -0
- package/engine/internal/gate/readiness_binding_test.go +271 -0
- package/engine/internal/gitenv/env.go +46 -0
- package/engine/internal/gitenv/env_test.go +48 -0
- package/engine/internal/hostpack/hostpack.go +16 -20
- package/engine/internal/hostpack/hostpack_test.go +6 -6
- package/engine/internal/install/install.go +289 -511
- package/engine/internal/install/install_test.go +218 -306
- package/engine/internal/lib/candidate.go +475 -0
- package/engine/internal/lib/candidate_test.go +503 -0
- package/engine/internal/lib/closeout.go +17 -21
- package/engine/internal/lib/closeout_test.go +23 -0
- package/engine/internal/lib/cursor_compat_test.go +12 -75
- package/engine/internal/lib/evidencefresh.go +58 -47
- package/engine/internal/lib/evidencefresh_test.go +120 -0
- package/engine/internal/lib/resolve.go +13 -35
- package/engine/internal/lib/resolve_remediation_test.go +5 -17
- package/engine/internal/lib/secretscan.go +432 -0
- package/engine/internal/lib/secretscan_test.go +555 -0
- package/engine/internal/lib/util.go +24 -65
- package/engine/internal/lib/util_test.go +44 -0
- package/engine/internal/markdowntext/markdowntext.go +108 -0
- package/engine/internal/markdowntext/markdowntext_test.go +58 -0
- package/engine/internal/markdowntext/testdata/structural.json +27 -0
- package/engine/internal/reason/reason.go +2 -123
- package/engine/internal/reason/reason_test.go +4 -2
- package/engine/internal/rootfacts/facts.go +6 -8
- package/engine/internal/rootfacts/facts_test.go +20 -0
- package/engine/internal/state/cmd/workflowmanifest/main.go +10 -12
- package/engine/internal/state/cursor.go +53 -14
- package/engine/internal/state/cursor_test.go +57 -0
- package/engine/internal/state/feature.go +64 -154
- package/engine/internal/state/schema.go +24 -50
- package/engine/internal/state/state_test.go +151 -140
- package/engine/internal/state/status.go +4 -17
- package/engine/internal/state/workflow_manifest.json +9 -89
- package/engine/main.go +73 -502
- package/engine/root_routing_test.go +183 -212
- package/engine/testdata/fixtures/basic/devrites-root/{features/auth-tokens/feature.md → work/auth-tokens/README.md} +0 -1
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/architecture.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/assumptions.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/brief.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/decision-coverage.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/eng-review.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/questions.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/{features/auth-tokens/status.md → work/auth-tokens/state.md} +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/test-plan.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/traceability.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/{features/search-ranking/feature.md → work/search-ranking/README.md} +0 -1
- package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/assumptions.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/brief.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/decisions.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/questions.md +3 -0
- package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/state.md +2 -0
- package/engine/testdata/golden/TestParityCloseOut/active_pointed_elsewhere.golden +1 -1
- package/engine/testdata/golden/TestParityCloseOut/active_slug_cleared.golden +1 -1
- package/engine/tests/adr_0003_gate_exit_code_test.go +2 -2
- package/engine/tests/adr_0011_define_plan_test.go +2 -2
- package/engine/tests/adr_0027_readiness_binding_test.go +106 -0
- package/engine/tests/cli_test.go +24 -107
- package/engine/tests/gate_test.go +177 -200
- package/engine/tests/meta_test.go +5 -35
- package/engine/tests/parity_closeout_test.go +12 -12
- package/engine/tests/parity_resolve_test.go +6 -16
- package/engine/tests/parity_test.go +8 -302
- package/install.sh +201 -34
- package/pack/.claude/agents/devrites-code-reviewer.md +9 -18
- package/pack/.claude/agents/devrites-devex-reviewer.md +10 -18
- package/pack/.claude/agents/devrites-doubt-reviewer.md +10 -20
- package/pack/.claude/agents/devrites-evidence-scout.md +14 -26
- package/pack/.claude/agents/devrites-frontend-reviewer.md +9 -15
- package/pack/.claude/agents/devrites-performance-reviewer.md +13 -21
- package/pack/.claude/agents/devrites-plan-drafter.md +24 -28
- package/pack/.claude/agents/devrites-plan-reviewer.md +30 -47
- package/pack/.claude/agents/devrites-proof-runner.md +41 -47
- package/pack/.claude/agents/devrites-retrospector.md +34 -79
- package/pack/.claude/agents/devrites-security-auditor.md +9 -17
- package/pack/.claude/agents/devrites-simplifier-reviewer.md +9 -18
- package/pack/.claude/agents/devrites-slice-wright.md +44 -62
- package/pack/.claude/agents/devrites-spec-reviewer.md +38 -50
- package/pack/.claude/agents/devrites-strategy-reviewer.md +10 -19
- package/pack/.claude/agents/devrites-test-analyst.md +22 -21
- package/pack/.claude/agents/devrites-upgrade-planner.md +52 -71
- package/pack/.claude/settings.json +12 -100
- package/pack/.claude/skills/devrites-api-interface/SKILL.md +1 -2
- package/pack/.claude/skills/devrites-audit/SKILL.md +6 -9
- package/pack/.claude/skills/devrites-browser-proof/SKILL.md +0 -1
- package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +21 -27
- package/pack/.claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +22 -33
- package/pack/.claude/skills/devrites-doubt/SKILL.md +4 -6
- package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +1 -2
- package/pack/.claude/skills/devrites-frontend-craft/reference/design-references.md +2 -1
- package/pack/.claude/skills/devrites-interview/SKILL.md +31 -36
- package/pack/.claude/skills/devrites-lib/SKILL.md +37 -66
- package/pack/.claude/skills/devrites-lib/reference/candidate-integrity.md +51 -0
- package/pack/.claude/skills/devrites-lib/reference/intent-map.md +20 -12
- package/pack/.claude/skills/devrites-lib/reference/orchestration-profiles.md +22 -0
- package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +35 -110
- package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +26 -93
- package/pack/.claude/skills/devrites-lib/reference/standards/README.md +6 -3
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +43 -34
- package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +90 -216
- package/pack/.claude/skills/devrites-lib/reference/standards/anti-patterns.md +1 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +9 -28
- package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +13 -11
- package/pack/.claude/skills/devrites-lib/reference/standards/core.md +59 -54
- package/pack/.claude/skills/devrites-lib/reference/standards/hooks.md +3 -5
- package/pack/.claude/skills/devrites-lib/reference/standards/principles.md +29 -143
- package/pack/.claude/skills/devrites-lib/reference/standards/release/ship-checklist.md +5 -6
- package/pack/.claude/skills/devrites-lib/reference/standards/security.md +13 -31
- package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +112 -82
- package/pack/.claude/skills/devrites-lib/reference/standards/spec-grammar.md +71 -45
- package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +22 -11
- package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +15 -24
- package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +106 -37
- package/pack/.claude/skills/devrites-prose-craft/SKILL.md +3 -4
- package/pack/.claude/skills/devrites-source-driven/SKILL.md +3 -4
- package/pack/.claude/skills/devrites-ux-shape/SKILL.md +3 -3
- package/pack/.claude/skills/rite/SKILL.md +12 -13
- package/pack/.claude/skills/rite/reference/menu.md +11 -11
- package/pack/.claude/skills/rite-adopt/SKILL.md +29 -84
- package/pack/.claude/skills/rite-adopt/reference/adoption.md +16 -50
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +65 -54
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +24 -17
- package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +18 -21
- package/pack/.claude/skills/rite-build/SKILL.md +28 -34
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +36 -34
- package/pack/.claude/skills/rite-build/reference/anti-patterns.md +5 -19
- package/pack/.claude/skills/rite-build/reference/checkpoint-protocol.md +10 -9
- package/pack/.claude/skills/rite-build/reference/checkpoint.md +17 -17
- package/pack/.claude/skills/rite-build/reference/frontend-trigger.md +3 -3
- package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +11 -14
- package/pack/.claude/skills/rite-build/reference/output.md +14 -24
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +49 -188
- package/pack/.claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +43 -133
- package/pack/.claude/skills/rite-clarify/SKILL.md +46 -40
- package/pack/.claude/skills/rite-clarify/reference/decision-coverage.md +4 -10
- package/pack/.claude/skills/rite-converge/SKILL.md +9 -33
- package/pack/.claude/skills/rite-converge/reference/convergence-assessment.md +2 -2
- package/pack/.claude/skills/rite-customize/SKILL.md +34 -50
- package/pack/.claude/skills/rite-define/SKILL.md +34 -58
- package/pack/.claude/skills/rite-define/reference/plan-template.md +15 -0
- package/pack/.claude/skills/rite-doctor/SKILL.md +52 -64
- package/pack/.claude/skills/rite-dogfood/SKILL.md +1 -2
- package/pack/.claude/skills/rite-explain/SKILL.md +1 -20
- package/pack/.claude/skills/rite-frame/SKILL.md +1 -7
- package/pack/.claude/skills/rite-frame/reference/failure-modes.md +1 -1
- package/pack/.claude/skills/rite-handoff/SKILL.md +1 -2
- package/pack/.claude/skills/rite-handoff/reference/handoff-template.md +1 -1
- package/pack/.claude/skills/rite-learn/SKILL.md +44 -104
- package/pack/.claude/skills/rite-plan/SKILL.md +14 -26
- package/pack/.claude/skills/rite-plan/reference/task-breakdown.md +4 -1
- package/pack/.claude/skills/rite-polish/SKILL.md +20 -28
- package/pack/.claude/skills/rite-polish/reference/adr-promotion.md +11 -0
- package/pack/{generated/claude/skills/rite-ship → .claude/skills/rite-polish}/reference/design-memory.md +23 -21
- package/pack/.claude/skills/rite-polish/reference/ledger.md +62 -0
- package/pack/.claude/skills/rite-pov/SKILL.md +28 -32
- package/pack/.claude/skills/rite-pr-feedback/SKILL.md +0 -1
- package/pack/.claude/skills/rite-pressure-test/SKILL.md +6 -13
- package/pack/.claude/skills/rite-prototype/SKILL.md +0 -6
- package/pack/.claude/skills/rite-prove/SKILL.md +73 -68
- package/pack/.claude/skills/rite-prove/reference/acceptance-proof.md +34 -30
- package/pack/.claude/skills/rite-prove/reference/test-command-discovery.md +15 -14
- package/pack/.claude/skills/rite-quick/SKILL.md +5 -19
- package/pack/.claude/skills/rite-resolve/SKILL.md +4 -21
- package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +2 -2
- package/pack/.claude/skills/rite-review/SKILL.md +34 -57
- package/pack/.claude/skills/rite-seal/SKILL.md +54 -87
- package/pack/.claude/skills/rite-seal/reference/anti-patterns.md +2 -2
- package/pack/.claude/skills/rite-seal/reference/final-evidence.md +31 -56
- package/pack/.claude/skills/rite-seal/reference/go-no-go.md +27 -51
- package/pack/.claude/skills/rite-seal/reference/output.md +2 -4
- package/pack/.claude/skills/rite-seal/reference/phase-contract.md +42 -140
- package/pack/.claude/skills/rite-seal/reference/risk-and-rollback.md +2 -2
- package/pack/.claude/skills/rite-seal/reference/seal-template.md +17 -28
- package/pack/.claude/skills/rite-ship/SKILL.md +65 -93
- package/pack/.claude/skills/rite-ship/reference/anti-patterns.md +4 -1
- package/pack/.claude/skills/rite-ship/reference/close-out.md +4 -12
- package/pack/.claude/skills/rite-ship/reference/git-ship.md +86 -48
- package/pack/.claude/skills/rite-ship/reference/ship-template.md +22 -16
- package/pack/.claude/skills/rite-spec/SKILL.md +62 -95
- package/pack/.claude/skills/rite-spec/reference/investigation.md +1 -4
- package/pack/.claude/skills/rite-spec/reference/question-protocol.md +21 -20
- package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +16 -17
- package/pack/.claude/skills/rite-spec/reference/spec-template.md +47 -49
- package/pack/.claude/skills/rite-spec/reference/state-workspace.md +28 -13
- package/pack/.claude/skills/rite-status/SKILL.md +30 -88
- package/pack/.claude/skills/rite-temper/SKILL.md +12 -31
- package/pack/.claude/skills/rite-upgrade/SKILL.md +86 -101
- package/pack/.claude/skills/rite-vet/SKILL.md +88 -117
- package/pack/.claude/skills/rite-vet/reference/artifacts.md +56 -50
- package/pack/.claude/skills/rite-vet/reference/cross-model.md +15 -39
- package/pack/.claude/skills/rite-vet/reference/depth.md +2 -2
- package/pack/.claude/skills/rite-vet/reference/review-axes.md +3 -6
- package/pack/.claude/skills/rite-zoom-out/SKILL.md +0 -6
- package/pack/generated/README.md +2 -2
- package/pack/generated/claude/agents/devrites-code-reviewer.md +9 -18
- package/pack/generated/claude/agents/devrites-devex-reviewer.md +10 -18
- package/pack/generated/claude/agents/devrites-doubt-reviewer.md +10 -20
- package/pack/generated/claude/agents/devrites-evidence-scout.md +14 -26
- package/pack/generated/claude/agents/devrites-frontend-reviewer.md +9 -15
- package/pack/generated/claude/agents/devrites-performance-reviewer.md +13 -21
- package/pack/generated/claude/agents/devrites-plan-drafter.md +24 -28
- package/pack/generated/claude/agents/devrites-plan-reviewer.md +30 -47
- package/pack/generated/claude/agents/devrites-proof-runner.md +41 -47
- package/pack/generated/claude/agents/devrites-retrospector.md +34 -79
- package/pack/generated/claude/agents/devrites-security-auditor.md +9 -17
- package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +9 -18
- package/pack/generated/claude/agents/devrites-slice-wright.md +44 -62
- package/pack/generated/claude/agents/devrites-spec-reviewer.md +38 -50
- package/pack/generated/claude/agents/devrites-strategy-reviewer.md +10 -19
- package/pack/generated/claude/agents/devrites-test-analyst.md +22 -21
- package/pack/generated/claude/agents/devrites-upgrade-planner.md +52 -71
- package/pack/generated/claude/settings.json +12 -100
- package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +1 -2
- package/pack/generated/claude/skills/devrites-audit/SKILL.md +6 -9
- package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +0 -1
- package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +21 -27
- package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +22 -33
- package/pack/generated/claude/skills/devrites-doubt/SKILL.md +4 -6
- package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +1 -2
- package/pack/generated/claude/skills/devrites-frontend-craft/reference/design-references.md +2 -1
- package/pack/generated/claude/skills/devrites-interview/SKILL.md +31 -36
- package/pack/generated/claude/skills/devrites-lib/SKILL.md +37 -66
- package/pack/generated/claude/skills/devrites-lib/reference/candidate-integrity.md +51 -0
- package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +20 -12
- package/pack/generated/claude/skills/devrites-lib/reference/orchestration-profiles.md +22 -0
- package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +35 -110
- package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +26 -93
- package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +6 -3
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +43 -34
- package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +90 -216
- package/pack/generated/claude/skills/devrites-lib/reference/standards/anti-patterns.md +1 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +9 -28
- package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +13 -11
- package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +59 -54
- package/pack/generated/claude/skills/devrites-lib/reference/standards/hooks.md +3 -5
- package/pack/generated/claude/skills/devrites-lib/reference/standards/principles.md +29 -143
- package/pack/generated/claude/skills/devrites-lib/reference/standards/release/ship-checklist.md +5 -6
- package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +13 -31
- package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +112 -82
- package/pack/generated/claude/skills/devrites-lib/reference/standards/spec-grammar.md +71 -45
- package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +22 -11
- package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +15 -24
- package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +106 -37
- package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +3 -4
- package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +3 -4
- package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +3 -3
- package/pack/generated/claude/skills/rite/SKILL.md +12 -13
- package/pack/generated/claude/skills/rite/reference/menu.md +11 -11
- package/pack/generated/claude/skills/rite-adopt/SKILL.md +29 -84
- package/pack/generated/claude/skills/rite-adopt/reference/adoption.md +16 -50
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +65 -54
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +24 -17
- package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +18 -21
- package/pack/generated/claude/skills/rite-build/SKILL.md +28 -34
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +36 -34
- package/pack/generated/claude/skills/rite-build/reference/anti-patterns.md +5 -19
- package/pack/generated/claude/skills/rite-build/reference/checkpoint-protocol.md +10 -9
- package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +17 -17
- package/pack/generated/claude/skills/rite-build/reference/frontend-trigger.md +3 -3
- package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +11 -14
- package/pack/generated/claude/skills/rite-build/reference/output.md +14 -24
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +49 -188
- package/pack/generated/claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +43 -133
- package/pack/generated/claude/skills/rite-clarify/SKILL.md +46 -40
- package/pack/generated/claude/skills/rite-clarify/reference/decision-coverage.md +4 -10
- package/pack/generated/claude/skills/rite-converge/SKILL.md +9 -33
- package/pack/generated/claude/skills/rite-converge/reference/convergence-assessment.md +2 -2
- package/pack/generated/claude/skills/rite-customize/SKILL.md +34 -50
- package/pack/generated/claude/skills/rite-define/SKILL.md +34 -58
- package/pack/generated/claude/skills/rite-define/reference/plan-template.md +15 -0
- package/pack/generated/claude/skills/rite-doctor/SKILL.md +52 -64
- package/pack/generated/claude/skills/rite-dogfood/SKILL.md +1 -2
- package/pack/generated/claude/skills/rite-explain/SKILL.md +1 -20
- package/pack/generated/claude/skills/rite-frame/SKILL.md +1 -7
- package/pack/generated/claude/skills/rite-frame/reference/failure-modes.md +1 -1
- package/pack/generated/claude/skills/rite-handoff/SKILL.md +1 -2
- package/pack/generated/claude/skills/rite-handoff/reference/handoff-template.md +1 -1
- package/pack/generated/claude/skills/rite-learn/SKILL.md +44 -104
- package/pack/generated/claude/skills/rite-plan/SKILL.md +14 -26
- package/pack/generated/claude/skills/rite-plan/reference/task-breakdown.md +4 -1
- package/pack/generated/claude/skills/rite-polish/SKILL.md +20 -28
- package/pack/generated/claude/skills/rite-polish/reference/adr-promotion.md +11 -0
- package/pack/generated/{codex/skills/rite-ship → claude/skills/rite-polish}/reference/design-memory.md +23 -21
- package/pack/generated/claude/skills/rite-polish/reference/ledger.md +62 -0
- package/pack/generated/claude/skills/rite-pov/SKILL.md +28 -32
- package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +0 -1
- package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +6 -13
- package/pack/generated/claude/skills/rite-prototype/SKILL.md +0 -6
- package/pack/generated/claude/skills/rite-prove/SKILL.md +73 -68
- package/pack/generated/claude/skills/rite-prove/reference/acceptance-proof.md +34 -30
- package/pack/generated/claude/skills/rite-prove/reference/test-command-discovery.md +15 -14
- package/pack/generated/claude/skills/rite-quick/SKILL.md +5 -19
- package/pack/generated/claude/skills/rite-resolve/SKILL.md +4 -21
- package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +2 -2
- package/pack/generated/claude/skills/rite-review/SKILL.md +34 -57
- package/pack/generated/claude/skills/rite-seal/SKILL.md +54 -87
- package/pack/generated/claude/skills/rite-seal/reference/anti-patterns.md +2 -2
- package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +31 -56
- package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +27 -51
- package/pack/generated/claude/skills/rite-seal/reference/output.md +2 -4
- package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +42 -140
- package/pack/generated/claude/skills/rite-seal/reference/risk-and-rollback.md +2 -2
- package/pack/generated/claude/skills/rite-seal/reference/seal-template.md +17 -28
- package/pack/generated/claude/skills/rite-ship/SKILL.md +65 -93
- package/pack/generated/claude/skills/rite-ship/reference/anti-patterns.md +4 -1
- package/pack/generated/claude/skills/rite-ship/reference/close-out.md +4 -12
- package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +86 -48
- package/pack/generated/claude/skills/rite-ship/reference/ship-template.md +22 -16
- package/pack/generated/claude/skills/rite-spec/SKILL.md +62 -95
- package/pack/generated/claude/skills/rite-spec/reference/investigation.md +1 -4
- package/pack/generated/claude/skills/rite-spec/reference/question-protocol.md +21 -20
- package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +16 -17
- package/pack/generated/claude/skills/rite-spec/reference/spec-template.md +47 -49
- package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +28 -13
- package/pack/generated/claude/skills/rite-status/SKILL.md +30 -88
- package/pack/generated/claude/skills/rite-temper/SKILL.md +12 -31
- package/pack/generated/claude/skills/rite-upgrade/SKILL.md +86 -101
- package/pack/generated/claude/skills/rite-vet/SKILL.md +88 -117
- package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +56 -50
- package/pack/generated/claude/skills/rite-vet/reference/cross-model.md +15 -39
- package/pack/generated/claude/skills/rite-vet/reference/depth.md +2 -2
- package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +3 -6
- package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +0 -6
- package/pack/generated/codex/AGENTS.md +5 -4
- package/pack/generated/codex/agents/devrites-code-reviewer.toml +8 -27
- package/pack/generated/codex/agents/devrites-devex-reviewer.toml +9 -27
- package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +9 -29
- package/pack/generated/codex/agents/devrites-evidence-scout.toml +14 -36
- package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +8 -24
- package/pack/generated/codex/agents/devrites-performance-reviewer.toml +12 -30
- package/pack/generated/codex/agents/devrites-plan-drafter.toml +24 -38
- package/pack/generated/codex/agents/devrites-plan-reviewer.toml +30 -57
- package/pack/generated/codex/agents/devrites-proof-runner.toml +41 -57
- package/pack/generated/codex/agents/devrites-retrospector.toml +34 -89
- package/pack/generated/codex/agents/devrites-security-auditor.toml +8 -26
- package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +8 -27
- package/pack/generated/codex/agents/devrites-slice-wright.toml +44 -71
- package/pack/generated/codex/agents/devrites-spec-reviewer.toml +38 -60
- package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +9 -28
- package/pack/generated/codex/agents/devrites-test-analyst.toml +21 -30
- package/pack/generated/codex/agents/devrites-upgrade-planner.toml +52 -81
- package/pack/generated/codex/config.toml +7 -0
- package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +1 -21
- package/pack/generated/codex/skills/devrites-audit/SKILL.md +6 -28
- package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +1 -21
- package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +21 -46
- package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +22 -33
- package/pack/generated/codex/skills/devrites-doubt/SKILL.md +4 -25
- package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +1 -21
- package/pack/generated/codex/skills/devrites-frontend-craft/reference/design-references.md +2 -1
- package/pack/generated/codex/skills/devrites-interview/SKILL.md +32 -56
- package/pack/generated/codex/skills/devrites-lib/SKILL.md +38 -86
- package/pack/generated/codex/skills/devrites-lib/reference/candidate-integrity.md +51 -0
- package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +20 -12
- package/pack/generated/codex/skills/devrites-lib/reference/orchestration-profiles.md +22 -0
- package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +35 -110
- package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +26 -93
- package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +6 -3
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +43 -34
- package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +90 -216
- package/pack/generated/codex/skills/devrites-lib/reference/standards/anti-patterns.md +1 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +9 -28
- package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +13 -11
- package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +59 -54
- package/pack/generated/codex/skills/devrites-lib/reference/standards/hooks.md +3 -5
- package/pack/generated/codex/skills/devrites-lib/reference/standards/principles.md +29 -143
- package/pack/generated/codex/skills/devrites-lib/reference/standards/release/ship-checklist.md +5 -6
- package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +13 -31
- package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +112 -82
- package/pack/generated/codex/skills/devrites-lib/reference/standards/spec-grammar.md +71 -45
- package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +22 -11
- package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +15 -24
- package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +106 -37
- package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +3 -23
- package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +3 -23
- package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +3 -22
- package/pack/generated/codex/skills/rite/SKILL.md +12 -32
- package/pack/generated/codex/skills/rite/reference/menu.md +11 -11
- package/pack/generated/codex/skills/rite-adopt/SKILL.md +29 -103
- package/pack/generated/codex/skills/rite-adopt/reference/adoption.md +16 -50
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +65 -73
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +24 -17
- package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +18 -21
- package/pack/generated/codex/skills/rite-build/SKILL.md +28 -53
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +36 -34
- package/pack/generated/codex/skills/rite-build/reference/anti-patterns.md +5 -19
- package/pack/generated/codex/skills/rite-build/reference/checkpoint-protocol.md +10 -9
- package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +17 -17
- package/pack/generated/codex/skills/rite-build/reference/frontend-trigger.md +3 -3
- package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +11 -14
- package/pack/generated/codex/skills/rite-build/reference/output.md +14 -24
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +49 -188
- package/pack/generated/codex/skills/rite-build/reference/spec-drift-guard.md +1 -1
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +43 -133
- package/pack/generated/codex/skills/rite-clarify/SKILL.md +46 -59
- package/pack/generated/codex/skills/rite-clarify/reference/decision-coverage.md +4 -10
- package/pack/generated/codex/skills/rite-converge/SKILL.md +9 -52
- package/pack/generated/codex/skills/rite-converge/reference/convergence-assessment.md +2 -2
- package/pack/generated/codex/skills/rite-customize/SKILL.md +32 -67
- package/pack/generated/codex/skills/rite-define/SKILL.md +34 -77
- package/pack/generated/codex/skills/rite-define/reference/plan-template.md +15 -0
- package/pack/generated/codex/skills/rite-doctor/SKILL.md +52 -83
- package/pack/generated/codex/skills/rite-dogfood/SKILL.md +1 -21
- package/pack/generated/codex/skills/rite-explain/SKILL.md +1 -39
- package/pack/generated/codex/skills/rite-frame/SKILL.md +1 -26
- package/pack/generated/codex/skills/rite-frame/reference/failure-modes.md +1 -1
- package/pack/generated/codex/skills/rite-handoff/SKILL.md +1 -21
- package/pack/generated/codex/skills/rite-handoff/reference/handoff-template.md +1 -1
- package/pack/generated/codex/skills/rite-learn/SKILL.md +44 -123
- package/pack/generated/codex/skills/rite-plan/SKILL.md +14 -45
- package/pack/generated/codex/skills/rite-plan/reference/task-breakdown.md +4 -1
- package/pack/generated/codex/skills/rite-polish/SKILL.md +20 -47
- package/pack/generated/codex/skills/rite-polish/reference/adr-promotion.md +11 -0
- package/pack/{.claude/skills/rite-ship → generated/codex/skills/rite-polish}/reference/design-memory.md +23 -21
- package/pack/generated/codex/skills/rite-polish/reference/ledger.md +62 -0
- package/pack/generated/codex/skills/rite-pov/SKILL.md +28 -51
- package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +0 -20
- package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +6 -32
- package/pack/generated/codex/skills/rite-prototype/SKILL.md +0 -25
- package/pack/generated/codex/skills/rite-prove/SKILL.md +73 -87
- package/pack/generated/codex/skills/rite-prove/reference/acceptance-proof.md +34 -30
- package/pack/generated/codex/skills/rite-prove/reference/test-command-discovery.md +15 -14
- package/pack/generated/codex/skills/rite-quick/SKILL.md +5 -38
- package/pack/generated/codex/skills/rite-resolve/SKILL.md +4 -40
- package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +2 -2
- package/pack/generated/codex/skills/rite-review/SKILL.md +34 -76
- package/pack/generated/codex/skills/rite-seal/SKILL.md +51 -103
- package/pack/generated/codex/skills/rite-seal/reference/anti-patterns.md +2 -2
- package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +31 -56
- package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +27 -51
- package/pack/generated/codex/skills/rite-seal/reference/output.md +2 -4
- package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +42 -140
- package/pack/generated/codex/skills/rite-seal/reference/risk-and-rollback.md +2 -2
- package/pack/generated/codex/skills/rite-seal/reference/seal-template.md +17 -28
- package/pack/generated/codex/skills/rite-ship/SKILL.md +65 -112
- package/pack/generated/codex/skills/rite-ship/reference/anti-patterns.md +4 -1
- package/pack/generated/codex/skills/rite-ship/reference/close-out.md +4 -12
- package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +86 -48
- package/pack/generated/codex/skills/rite-ship/reference/ship-template.md +22 -16
- package/pack/generated/codex/skills/rite-spec/SKILL.md +62 -114
- package/pack/generated/codex/skills/rite-spec/reference/investigation.md +1 -4
- package/pack/generated/codex/skills/rite-spec/reference/question-protocol.md +21 -20
- package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +16 -17
- package/pack/generated/codex/skills/rite-spec/reference/spec-template.md +47 -49
- package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +28 -13
- package/pack/generated/codex/skills/rite-status/SKILL.md +30 -107
- package/pack/generated/codex/skills/rite-temper/SKILL.md +12 -50
- package/pack/generated/codex/skills/rite-upgrade/SKILL.md +86 -120
- package/pack/generated/codex/skills/rite-vet/SKILL.md +88 -136
- package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +56 -50
- package/pack/generated/codex/skills/rite-vet/reference/cross-model.md +15 -39
- package/pack/generated/codex/skills/rite-vet/reference/depth.md +2 -2
- package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +3 -6
- package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +0 -25
- package/package.json +6 -5
- package/scripts/build-host-artifacts.sh +5 -9
- package/scripts/codex-generate.sh +18 -278
- package/scripts/install-lib.sh +121 -34
- package/uninstall.sh +19 -17
- package/update.sh +26 -18
- package/docs/engine/agent-contract.md +0 -172
- package/docs/extensions.md +0 -178
- package/engine/git_guard.go +0 -187
- package/engine/git_guard_test.go +0 -283
- package/engine/harnessmatrix.go +0 -60
- package/engine/hookpolicy.go +0 -113
- package/engine/hookpolicy_test.go +0 -160
- package/engine/hooks.go +0 -677
- package/engine/hooks_agent_dispatch.go +0 -1637
- package/engine/hooks_events_test.go +0 -431
- package/engine/hooks_workspace.go +0 -1196
- package/engine/internal/doctor/doctor.go +0 -306
- package/engine/internal/doctor/doctor_test.go +0 -252
- package/engine/internal/forge/forge.go +0 -938
- package/engine/internal/forge/forge_test.go +0 -576
- package/engine/internal/forge/git.go +0 -245
- package/engine/internal/forge/liveness_unix.go +0 -48
- package/engine/internal/forge/liveness_windows.go +0 -67
- package/engine/internal/forge/manifest.go +0 -402
- package/engine/internal/harness/compliance.go +0 -96
- package/engine/internal/harness/harness.go +0 -301
- package/engine/internal/harness/harness_test.go +0 -124
- package/engine/internal/iohooks/detach_other.go +0 -11
- package/engine/internal/iohooks/detach_unix.go +0 -11
- package/engine/internal/iohooks/iohooks.go +0 -839
- package/engine/internal/iohooks/iohooks_test.go +0 -561
- package/engine/internal/lib/adoption.go +0 -659
- package/engine/internal/lib/adoption_test.go +0 -121
- package/engine/internal/lib/analyze.go +0 -232
- package/engine/internal/lib/archivesearch.go +0 -125
- package/engine/internal/lib/archivesearch_test.go +0 -138
- package/engine/internal/lib/budget.go +0 -172
- package/engine/internal/lib/buildreadiness.go +0 -111
- package/engine/internal/lib/checkacceptance.go +0 -176
- package/engine/internal/lib/clarifyreturn.go +0 -91
- package/engine/internal/lib/clarifyreturn_test.go +0 -123
- package/engine/internal/lib/command_other.go +0 -7
- package/engine/internal/lib/command_unix.go +0 -24
- package/engine/internal/lib/context.go +0 -280
- package/engine/internal/lib/conventions.go +0 -449
- package/engine/internal/lib/coverage.go +0 -145
- package/engine/internal/lib/dispatchwaive.go +0 -31
- package/engine/internal/lib/dispatchwaive_test.go +0 -23
- package/engine/internal/lib/doubtcoverage.go +0 -78
- package/engine/internal/lib/extensions.go +0 -622
- package/engine/internal/lib/extensions_test.go +0 -305
- package/engine/internal/lib/footprint.go +0 -239
- package/engine/internal/lib/gitauthority.go +0 -601
- package/engine/internal/lib/gitauthority_test.go +0 -346
- package/engine/internal/lib/jsonout.go +0 -129
- package/engine/internal/lib/jsonout_test.go +0 -73
- package/engine/internal/lib/lanes.go +0 -112
- package/engine/internal/lib/learnings.go +0 -397
- package/engine/internal/lib/learnings_inject_test.go +0 -77
- package/engine/internal/lib/learnings_remediation_test.go +0 -24
- package/engine/internal/lib/ledger.go +0 -311
- package/engine/internal/lib/ledger_test.go +0 -186
- package/engine/internal/lib/mutationgate.go +0 -89
- package/engine/internal/lib/observability_test.go +0 -358
- package/engine/internal/lib/overrides.go +0 -164
- package/engine/internal/lib/overrides_test.go +0 -112
- package/engine/internal/lib/preamble.go +0 -159
- package/engine/internal/lib/preamble_questions_test.go +0 -10
- package/engine/internal/lib/progress.go +0 -210
- package/engine/internal/lib/provenance.go +0 -462
- package/engine/internal/lib/provenance_test.go +0 -154
- package/engine/internal/lib/readiness_contract.json +0 -118
- package/engine/internal/lib/readinessartifact.go +0 -533
- package/engine/internal/lib/readinessartifact_test.go +0 -422
- package/engine/internal/lib/reconcile.go +0 -1496
- package/engine/internal/lib/reconcile_test.go +0 -1071
- package/engine/internal/lib/recoveryattempts.go +0 -298
- package/engine/internal/lib/recoveryattempts_test.go +0 -215
- package/engine/internal/lib/reviewers.go +0 -143
- package/engine/internal/lib/reviewers_test.go +0 -45
- package/engine/internal/lib/reviewerstats.go +0 -199
- package/engine/internal/lib/reviewerstats_test.go +0 -104
- package/engine/internal/lib/reviewintegrity.go +0 -143
- package/engine/internal/lib/reviewintegrity_test.go +0 -103
- package/engine/internal/lib/runbook.go +0 -295
- package/engine/internal/lib/runbook_context_test.go +0 -182
- package/engine/internal/lib/session.go +0 -1020
- package/engine/internal/lib/session_test.go +0 -177
- package/engine/internal/lib/specparse.go +0 -125
- package/engine/internal/lib/specskeleton.go +0 -79
- package/engine/internal/lib/specvalidate.go +0 -391
- package/engine/internal/lib/specvalidate_test.go +0 -185
- package/engine/internal/lib/stuck.go +0 -206
- package/engine/internal/lib/templates/conventions_drift.tmpl +0 -6
- package/engine/internal/lib/templates/conventions_ledger_header.md +0 -6
- package/engine/internal/lib/templates/conventions_orient_header.txt +0 -1
- package/engine/internal/lib/testintegrity.go +0 -199
- package/engine/internal/lib/testintegrity_test.go +0 -149
- package/engine/internal/lib/tickafk.go +0 -86
- package/engine/internal/migrate/migrate.go +0 -279
- package/engine/internal/migrate/migrate_test.go +0 -157
- package/engine/internal/orient/firstrun.go +0 -50
- package/engine/internal/orient/firstrun_test.go +0 -72
- package/engine/internal/orient/orient.go +0 -69
- package/engine/internal/orient/orient_test.go +0 -25
- package/engine/internal/profile/profile.go +0 -284
- package/engine/internal/profile/profile_test.go +0 -13
- package/engine/internal/state/clarify_transition.go +0 -165
- package/engine/internal/state/clarify_transition_test.go +0 -130
- package/engine/internal/state/snapshot.go +0 -457
- package/engine/internal/toolpolicy/classifier.go +0 -533
- package/engine/internal/toolpolicy/classifier_test.go +0 -424
- package/engine/internal/toolpolicy/git.go +0 -616
- package/engine/internal/toolpolicy/scanner.go +0 -382
- package/engine/observability_cli_test.go +0 -52
- package/engine/profile_test.go +0 -76
- package/engine/subagent_orient_context.txt +0 -8
- package/engine/testdata/golden/TestParityA1Guard/devrites-edit-allowed.golden +0 -1
- package/engine/testdata/golden/TestParityA1Guard/no-window-silent.golden +0 -1
- package/engine/testdata/golden/TestParityA1Guard/non-edit-tool.golden +0 -1
- package/engine/testdata/golden/TestParityA1Guard/observe-mode-silent.golden +0 -1
- package/engine/testdata/golden/TestParityA1Guard/source-edit-enforce-denies.golden +0 -2
- package/engine/testdata/golden/TestParityA1Guard/subagent-allowed.golden +0 -1
- package/engine/testdata/golden/TestParityAnalyze/noactive.golden +0 -1
- package/engine/testdata/golden/TestParityAnalyze/slug=covered.golden +0 -15
- package/engine/testdata/golden/TestParityAnalyze/slug=dangling.golden +0 -16
- package/engine/testdata/golden/TestParityAnalyze/slug=ghost.golden +0 -1
- package/engine/testdata/golden/TestParityAnalyze/slug=noac.golden +0 -15
- package/engine/testdata/golden/TestParityAnalyze/slug=order.golden +0 -17
- package/engine/testdata/golden/TestParityAnalyze/slug=orphan.golden +0 -16
- package/engine/testdata/golden/TestParityAnalyze/slug=uncovered.golden +0 -16
- package/engine/testdata/golden/TestParityBudget/default-active.golden +0 -4
- package/engine/testdata/golden/TestParityBudget/extra-md.golden +0 -5
- package/engine/testdata/golden/TestParityBudget/no-active.golden +0 -1
- package/engine/testdata/golden/TestParityBudget/no-feature.golden +0 -1
- package/engine/testdata/golden/TestParityBudget/over-advisory.golden +0 -6
- package/engine/testdata/golden/TestParityBudget/over-strict.golden +0 -6
- package/engine/testdata/golden/TestParityBudget/within.golden +0 -6
- package/engine/testdata/golden/TestParityBuildReadiness/arg=approved.golden +0 -2
- package/engine/testdata/golden/TestParityBuildReadiness/arg=approvenone.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=await.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=blocked.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=clarifyopen.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=emptystatus.golden +0 -2
- package/engine/testdata/golden/TestParityBuildReadiness/arg=ghost.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=legacycontract.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=noapprove.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=noclarify.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=novet.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=stalevet.golden +0 -1
- package/engine/testdata/golden/TestParityBuildReadiness/arg=trailhash.golden +0 -2
- package/engine/testdata/golden/TestParityBuildReadiness/arg=trailpipe.golden +0 -2
- package/engine/testdata/golden/TestParityBuildReadiness/arg=vetnotready.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=blank-section.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=empty.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-dropped.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-ok.golden +0 -2
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-unchecked.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=id-gap.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=id-ok.golden +0 -2
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=no-seal.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=no-section.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance/arg=nonexistent.golden +0 -1
- package/engine/testdata/golden/TestParityCheckAcceptance.golden +0 -1
- package/engine/testdata/golden/TestParityCoverage/arg=flat.golden +0 -7
- package/engine/testdata/golden/TestParityCoverage/arg=full.golden +0 -10
- package/engine/testdata/golden/TestParityCoverage/arg=nonexistent.golden +0 -1
- package/engine/testdata/golden/TestParityCoverage/arg=nospec.golden +0 -1
- package/engine/testdata/golden/TestParityCoverage/arg=speconly.golden +0 -9
- package/engine/testdata/golden/TestParityCoverage.golden +0 -1
- package/engine/testdata/golden/TestParityCursor/bare.golden +0 -3
- package/engine/testdata/golden/TestParityCursor/full-afk.golden +0 -6
- package/engine/testdata/golden/TestParityCursor/full-hitl.golden +0 -5
- package/engine/testdata/golden/TestParityCursor/no-active.golden +0 -1
- package/engine/testdata/golden/TestParityCursor/red.golden +0 -5
- package/engine/testdata/golden/TestParityCursor/zerogates.golden +0 -5
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=doubted.golden +0 -2
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=ghost.golden +0 -2
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing.golden +0 -3
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=nodoubt.golden +0 -4
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=nolog.golden +0 -2
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=nowright.golden +0 -2
- package/engine/testdata/golden/TestParityDoubtCoverage.golden +0 -1
- package/engine/testdata/golden/TestParityMutationGate/active-slug.golden +0 -3
- package/engine/testdata/golden/TestParityMutationGate/explicit-slug.golden +0 -3
- package/engine/testdata/golden/TestParityMutationGate/ghost.golden +0 -1
- package/engine/testdata/golden/TestParityOrientSilentPath.golden +0 -1
- package/engine/testdata/golden/TestParityReconcile/bad-mode.golden +0 -1
- package/engine/testdata/golden/TestParityReconcile/check-clean/snapshot.golden +0 -2
- package/engine/testdata/golden/TestParityReconcile/check-clean.golden +0 -2
- package/engine/testdata/golden/TestParityReconcile/check-no-base.golden +0 -1
- package/engine/testdata/golden/TestParityReconcile/check-no-claimed/snapshot.golden +0 -2
- package/engine/testdata/golden/TestParityReconcile/check-violation/snapshot.golden +0 -2
- package/engine/testdata/golden/TestParityReconcile/check-violation.golden +0 -1
- package/engine/testdata/golden/TestParityReconcile/close-window/snapshot.golden +0 -2
- package/engine/testdata/golden/TestParityReconcile/close-window.golden +0 -3
- package/engine/testdata/golden/TestParityReconcile/not-git.golden +0 -1
- package/engine/testdata/golden/TestParityReconcile/snapshot/snapshot.golden +0 -2
- package/engine/testdata/golden/TestParityReconcile/snapshot-no-allowlist.golden +0 -1
- package/engine/testdata/golden/TestParityReconcile/snapshot.golden +0 -2
- package/engine/testdata/golden/TestParityRedwatch/fail-writes-red.golden +0 -2
- package/engine/testdata/golden/TestParityRedwatch/non-bash-tool.golden +0 -1
- package/engine/testdata/golden/TestParityRedwatch/non-test-command.golden +0 -1
- package/engine/testdata/golden/TestParityRedwatch/pass-clears-red.golden +0 -1
- package/engine/testdata/golden/TestParityResolve/next-qid.golden +0 -2
- package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-devrites-agent-denies.golden +0 -2
- package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-non-devrites-allows.golden +0 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-subagent-type-only-allows.golden +0 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-git-commit.golden +0 -2
- package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-mutating.golden +0 -2
- package/engine/testdata/golden/TestParityReviewerReadonly/non-bash-tool.golden +0 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/non-tool-input.golden +0 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/observe-mutating-silent.golden +0 -1
- package/engine/testdata/golden/TestParityReviewerReadonly/safe-bash-command.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=dup.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=empty.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=flat.golden +0 -2
- package/engine/testdata/golden/TestParitySpecValidate/arg=nonexistent.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=noscenario.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=noshall.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=nothen.golden +0 -1
- package/engine/testdata/golden/TestParitySpecValidate/arg=valid/spec.md.golden +0 -2
- package/engine/testdata/golden/TestParitySpecValidate/arg=valid.golden +0 -2
- package/engine/testdata/golden/TestParitySpecValidate.golden +0 -1
- package/engine/testdata/golden/TestParityStatusline/full-afk.golden +0 -2
- package/engine/testdata/golden/TestParityStatusline/full-hitl.golden +0 -2
- package/engine/testdata/golden/TestParityStatusline/no-active.golden +0 -1
- package/engine/testdata/golden/TestParityStatusline/nophase.golden +0 -2
- package/engine/testdata/golden/TestParityStatusline/red.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/bad-cmd.golden +0 -1
- package/engine/testdata/golden/TestParityStuckCheck/custom-window-2.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/dominant.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/few.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/ghost.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/identical.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/no-cmd.golden +0 -1
- package/engine/testdata/golden/TestParityStuckCheck/no-slug.golden +0 -1
- package/engine/testdata/golden/TestParityStuckCheck/nolog.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/pingpong.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/varied.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/window-04-identical.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/window-2.5-varied4.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/window-4x-varied4.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/window-leadspace-varied4.golden +0 -2
- package/engine/testdata/golden/TestParityStuckCheck/window-plus4-identical.golden +0 -2
- package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent-subagent-type-key.golden +0 -2
- package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent.golden +0 -2
- package/engine/testdata/golden/TestParitySubagentOrient/garbage-input.golden +0 -1
- package/engine/testdata/golden/TestParitySubagentOrient/non-devrites-agent.golden +0 -1
- package/engine/testdata/golden/TestParityTestIntegrity/assertion-dropped.golden +0 -1
- package/engine/testdata/golden/TestParityTestIntegrity/clean.golden +0 -2
- package/engine/testdata/golden/TestParityTestIntegrity/deleted.golden +0 -1
- package/engine/testdata/golden/TestParityTestIntegrity/ghost-workspace.golden +0 -1
- package/engine/testdata/golden/TestParityTestIntegrity/not-git.golden +0 -1
- package/engine/testdata/golden/TestParityTestIntegrity/skip-added.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/budget1/state.md.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/budget1.golden +0 -2
- package/engine/testdata/golden/TestParityTickAfk/budget3/state.md.golden +0 -5
- package/engine/testdata/golden/TestParityTickAfk/budget3.golden +0 -2
- package/engine/testdata/golden/TestParityTickAfk/bulletPipe/state.md.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/bulletPipe.golden +0 -2
- package/engine/testdata/golden/TestParityTickAfk/missingField/state.md.golden +0 -3
- package/engine/testdata/golden/TestParityTickAfk/missingField.golden +0 -2
- package/engine/testdata/golden/TestParityTickAfk/missingFile.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/nonNumeric/state.md.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/nonNumeric.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/none/state.md.golden +0 -1
- package/engine/testdata/golden/TestParityTickAfk/none.golden +0 -2
- package/engine/testdata/golden/TestParityWrightScope/agent-required-non-wright.golden +0 -1
- package/engine/testdata/golden/TestParityWrightScope/devrites-edit-denied.golden +0 -2
- package/engine/testdata/golden/TestParityWrightScope/in-scope-allowed.golden +0 -1
- package/engine/testdata/golden/TestParityWrightScope/non-edit-tool.golden +0 -1
- package/engine/testdata/golden/TestParityWrightScope/out-of-scope-enforce-denies.golden +0 -2
- package/engine/testdata/golden/TestParityWrightScope/out-of-scope-observe-silent.golden +0 -1
- package/engine/testdata/golden/TestSpecSkeleton/missing-some.golden +0 -2
- package/engine/testdata/golden/TestSpecSkeleton/present-all.golden +0 -2
- package/engine/testdata/golden/TestStuckLogHashParity.golden +0 -1
- package/engine/tests/adr_0006_clock_seam_test.go +0 -36
- package/engine/tests/budget_test.go +0 -88
- package/engine/tests/canonical_ac_ids_test.go +0 -44
- package/engine/tests/concurrency_cli_test.go +0 -131
- package/engine/tests/conventions_test.go +0 -106
- package/engine/tests/doctor_cli_test.go +0 -223
- package/engine/tests/forge_cli_test.go +0 -463
- package/engine/tests/hook_test.go +0 -2732
- package/engine/tests/hooks_io_test.go +0 -309
- package/engine/tests/json_contract_test.go +0 -224
- package/engine/tests/lib_parity_test.go +0 -930
- package/engine/tests/migrate_cli_test.go +0 -195
- package/engine/tests/parity_analyze_test.go +0 -55
- package/engine/tests/parity_buildreadiness_test.go +0 -199
- package/engine/tests/parity_learnings_test.go +0 -89
- package/engine/tests/parity_mutationgate_test.go +0 -36
- package/engine/tests/parity_reconcile_test.go +0 -94
- package/engine/tests/parity_testintegrity_test.go +0 -65
- package/engine/tests/parity_tickafk_test.go +0 -83
- package/engine/validatepack.go +0 -192
- package/engine/validatepack_test.go +0 -79
- package/engine/validatepackskills.go +0 -181
- package/engine/validatepackskills_test.go +0 -171
- package/pack/.claude/agents/devrites-forge-judge.md +0 -118
- package/pack/.claude/skills/devrites-lib/reference/model-tiers.md +0 -44
- package/pack/.claude/skills/devrites-refresh-indexes/SKILL.md +0 -52
- package/pack/.claude/skills/rite-build/reference/evidence-standard.md +0 -45
- package/pack/.claude/skills/rite-build/reference/forge.md +0 -210
- package/pack/.claude/skills/rite-seal/reference/conventions-ledger.md +0 -60
- package/pack/.claude/skills/rite-ship/reference/adr-promotion.md +0 -9
- package/pack/.claude/skills/rite-ship/reference/ledger.md +0 -56
- package/pack/generated/claude/agents/devrites-forge-judge.md +0 -118
- package/pack/generated/claude/skills/devrites-lib/reference/model-tiers.md +0 -44
- package/pack/generated/claude/skills/devrites-refresh-indexes/SKILL.md +0 -52
- package/pack/generated/claude/skills/rite-build/reference/evidence-standard.md +0 -45
- package/pack/generated/claude/skills/rite-build/reference/forge.md +0 -210
- package/pack/generated/claude/skills/rite-seal/reference/conventions-ledger.md +0 -60
- package/pack/generated/claude/skills/rite-ship/reference/adr-promotion.md +0 -9
- package/pack/generated/claude/skills/rite-ship/reference/ledger.md +0 -56
- package/pack/generated/codex/agents/devrites-forge-judge.toml +0 -128
- package/pack/generated/codex/hooks.json +0 -185
- package/pack/generated/codex/skills/devrites-api-interface/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-audit/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-browser-proof/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-debug-recovery/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-doubt/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-frontend-craft/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-interview/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-lib/reference/model-tiers.md +0 -44
- package/pack/generated/codex/skills/devrites-prose-craft/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +0 -71
- package/pack/generated/codex/skills/devrites-refresh-indexes/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-source-driven/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/devrites-ux-shape/agents/openai.yaml +0 -2
- package/pack/generated/codex/skills/rite-build/reference/evidence-standard.md +0 -45
- package/pack/generated/codex/skills/rite-build/reference/forge.md +0 -210
- package/pack/generated/codex/skills/rite-seal/reference/conventions-ledger.md +0 -60
- package/pack/generated/codex/skills/rite-ship/reference/adr-promotion.md +0 -9
- package/pack/generated/codex/skills/rite-ship/reference/ledger.md +0 -56
- package/scripts/build-binaries.sh +0 -75
- package/scripts/build-release-tarball.sh +0 -105
- package/scripts/check-authority-drift.py +0 -125
- package/scripts/check-cross-refs.py +0 -139
- package/scripts/check-generated-skill-budget.mjs +0 -42
- package/scripts/check-instruction-size-baseline.mjs +0 -88
- package/scripts/check-invocation-integrity.py +0 -115
- package/scripts/check-no-global-writes.sh +0 -66
- package/scripts/check-no-personal-paths.py +0 -50
- package/scripts/check-npm-audit.mjs +0 -110
- package/scripts/check-reference-governance.mjs +0 -83
- package/scripts/check-reply-contract.sh +0 -64
- package/scripts/check-rule-uniqueness.sh +0 -45
- package/scripts/devrites-detect.sh +0 -176
- package/scripts/grade-feature.sh +0 -204
- package/scripts/live-hosts/agent-result.schema.json +0 -231
- package/scripts/live-hosts/claude.sh +0 -87
- package/scripts/live-hosts/codex.sh +0 -85
- package/scripts/live-hosts/common.sh +0 -113
- package/scripts/live-hosts/fake-host.py +0 -257
- package/scripts/live-hosts/host-transport.py +0 -286
- package/scripts/npm-audit-exceptions.json +0 -26
- package/scripts/pin.sh +0 -249
- package/scripts/release-check.sh +0 -75
- package/scripts/run-agent-contract-evals.py +0 -1380
- package/scripts/run-behavioral-evals.sh +0 -196
- package/scripts/run-evals.sh +0 -132
- package/scripts/run-live-behavioral-evals.py +0 -1310
- package/scripts/run-outcome-evals.sh +0 -454
- package/scripts/run-routing-evals.py +0 -342
- package/scripts/run-tests.mjs +0 -232
- package/scripts/scan-pack-security.py +0 -209
- package/scripts/scan-supply-chain-iocs.py +0 -127
- package/scripts/skill-pruning-audit.mjs +0 -121
- package/scripts/skills-inventory.mjs +0 -125
- package/scripts/supply-chain-iocs.json +0 -11
- package/scripts/sync-version.sh +0 -54
- package/scripts/validate-agent-composition.py +0 -57
- package/scripts/validate-command-parity.py +0 -70
- package/scripts/validate-frontmatter.py +0 -218
- package/scripts/validate-skill-anatomy.py +0 -139
- package/scripts/validate-workflow-security.py +0 -184
- package/scripts/validate-workspace-schema.py +0 -800
- package/scripts/validate.sh +0 -354
- package/scripts/workflow_schema.py +0 -69
- /package/engine/testdata/fixtures/basic/devrites-root/{features → work}/auth-tokens/decisions.md +0 -0
- /package/engine/testdata/fixtures/basic/devrites-root/{features → work}/auth-tokens/plan.md +0 -0
- /package/engine/testdata/fixtures/basic/devrites-root/{features → work}/auth-tokens/spec.md +0 -0
- /package/engine/testdata/fixtures/basic/devrites-root/{features → work}/auth-tokens/tasks.md +0 -0
- /package/engine/testdata/fixtures/basic/devrites-root/{features → work}/search-ranking/spec.md +0 -0
package/SECURITY.md
CHANGED
|
@@ -14,7 +14,8 @@ Please include:
|
|
|
14
14
|
|
|
15
15
|
- A clear description of the vulnerability and its impact.
|
|
16
16
|
- A minimal reproduction (commands, files, or a target project layout).
|
|
17
|
-
- The DevRites version (commit SHA or release tag)
|
|
17
|
+
- The DevRites version (commit SHA or release tag), affected host, and host
|
|
18
|
+
version (Claude Code or Codex).
|
|
18
19
|
- Your name / handle for credit (optional).
|
|
19
20
|
|
|
20
21
|
You should receive an acknowledgement within **5 business days** and a triage
|
|
@@ -35,7 +36,8 @@ DevRites is a skills pack plus the local `devrites-engine` control-plane binary:
|
|
|
35
36
|
Markdown skill files, helper scripts, Bash bootstrap shims, and a native Node
|
|
36
37
|
`npx` shim (`bin/devrites.mjs`) that acquires and proxies the engine. It ships no
|
|
37
38
|
network service. The attack surface is the content of the skill files, bootstrap
|
|
38
|
-
and install paths, generated host artifacts,
|
|
39
|
+
and install paths, generated host artifacts, native permission profiles, legacy
|
|
40
|
+
hook cleanup, and the local engine binary.
|
|
39
41
|
|
|
40
42
|
### Supply-chain self-scan (shipped pack)
|
|
41
43
|
|
|
@@ -58,28 +60,23 @@ an entire file out of one class, use
|
|
|
58
60
|
Suppressions live in the file, so every exception is visible in the diff and
|
|
59
61
|
reviewable; never suppress a hidden-unicode finding you can't explain.
|
|
60
62
|
|
|
61
|
-
### State loading
|
|
63
|
+
### State loading
|
|
62
64
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
Workspace skills read `.devrites/ACTIVE`, `state.md`, and the phase artifacts
|
|
66
|
+
they need. No generated summary stands between the host and the authoritative
|
|
67
|
+
ledger.
|
|
68
|
+
Mutating engine commands are explicit and confined to DevRites state/artifacts;
|
|
69
|
+
the root owns workflow records, while source/tests route through the sole
|
|
70
|
+
wright. Claude enforces root non-writing with plan mode; Codex enforces it as
|
|
71
|
+
workflow policy on its workspace-capable root.
|
|
68
72
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
also read-only. Mutating commands are explicit and
|
|
77
|
-
scoped: for example, `resolve`, `tick-afk`, and `close-out` write only DevRites
|
|
78
|
-
state, while `/rite use <slug>` deliberately repoints `.devrites/ACTIVE` inline.
|
|
79
|
-
|
|
80
|
-
If your environment disallows shell commands started by skills, each skill reads
|
|
81
|
-
`state.md` directly through the `|| echo "(… unavailable …)"` fallback above.
|
|
82
|
-
The rest of the pack continues to work.
|
|
73
|
+
After Build, `touched-files.md` is the sole project-candidate authority. The
|
|
74
|
+
engine rejects malformed, escaped, symlinked, special-file, missing, ambiguous,
|
|
75
|
+
or oversized manifest inputs and computes one content-bound digest. Evidence,
|
|
76
|
+
optional browser evidence, review, and seal must contain the same exact binding.
|
|
77
|
+
The worktree digest is not an atomic snapshot against a malicious concurrent
|
|
78
|
+
same-size rewrite; Ship's exact Git-index checks own the final freeze.
|
|
79
|
+
See [`docs/candidate-integrity.md`](docs/candidate-integrity.md).
|
|
83
80
|
|
|
84
81
|
### User and model invocation are separate
|
|
85
82
|
|
|
@@ -90,16 +87,19 @@ flag and load only when the user invokes them. The checked-in frontmatter and
|
|
|
90
87
|
[`docs/command-map.md`](docs/command-map.md) are the source of truth. The safety
|
|
91
88
|
nets for model-invocable rites are:
|
|
92
89
|
|
|
93
|
-
- **Body discipline**: every skill stops at its phase boundary.
|
|
94
|
-
stops after one slice
|
|
95
|
-
|
|
90
|
+
- **Body discipline**: every skill stops at its phase boundary. In HITL,
|
|
91
|
+
`rite-build` stops after one slice; an explicit `.devrites/AFK` sentinel is
|
|
92
|
+
the bounded low-risk chaining exception. `rite-prove` runs proofs only when
|
|
93
|
+
all slices are built.
|
|
96
94
|
- **Readiness gates**: each rite reads `.devrites/work/<slug>/state.md`
|
|
97
95
|
before acting; phases out of order refuse to run.
|
|
98
|
-
- **Spec Drift Guard**:
|
|
99
|
-
|
|
96
|
+
- **Spec Drift Guard**: deviations are classified before routing. Settled
|
|
97
|
+
technical objective failures use bounded recovery in the active slice;
|
|
98
|
+
`rite-plan repair` owns a wrong durable plan; product, policy, and
|
|
99
|
+
irreversible-risk decisions pause for the human.
|
|
100
100
|
- **Interactive type-GO confirmation** in `rite-ship` before irreversible
|
|
101
|
-
git actions such as commit
|
|
102
|
-
invocation; `rite-seal` only decides GO/NO-GO.
|
|
101
|
+
git actions such as commit or an optional push, tag, or PR. This prompt
|
|
102
|
+
remains after model invocation; `rite-seal` only decides GO/NO-GO.
|
|
103
103
|
|
|
104
104
|
Claude documents the invocation controls in its official
|
|
105
105
|
[skills reference](https://code.claude.com/docs/en/slash-commands). DevRites uses
|
|
@@ -113,23 +113,45 @@ The Bash installer (`install.sh`) refuses any target under `~/.claude`
|
|
|
113
113
|
`.devrites/` runtime state in the target project is preserved across
|
|
114
114
|
uninstall.
|
|
115
115
|
|
|
116
|
-
Skills, agents, standards, and
|
|
116
|
+
Skills, agents, standards, and host configuration stay in the target project.
|
|
117
117
|
The installer merges DevRites entries into project-local `.claude/settings.json`
|
|
118
|
-
and `.codex/
|
|
118
|
+
and `.codex/config.toml` without replacing unrelated user settings. The shared
|
|
119
119
|
`devrites-engine` executable is the only allowed artifact outside the project.
|
|
120
120
|
It is installed to `DEVRITES_BIN_DIR`, a writable `~/.local/bin`, or a writable
|
|
121
121
|
`/usr/local/bin`; `--no-binary` / `DEVRITES_NO_BINARY=1` skips it. The bootstrap
|
|
122
122
|
path may fetch the release bundle and checksummed engine assets. It never invokes
|
|
123
123
|
`sudo` or edits shell startup files.
|
|
124
124
|
|
|
125
|
+
The documented Node-free boundary downloads the release-owned `install.sh` and
|
|
126
|
+
its exact-name sidecar before execution; mutable default-branch scripts are not
|
|
127
|
+
recommended. Legacy local and extracted shim invocations remain compatible, but
|
|
128
|
+
their exact-release guarantee begins at that verified asset. A piped shim never
|
|
129
|
+
treats current-directory siblings as its bundle.
|
|
130
|
+
|
|
131
|
+
Network acquisition accepts only an exact SemVer release asset and its mandatory
|
|
132
|
+
exact-filename SHA-256 sidecar. Every redirect hop must remain HTTPS, private
|
|
133
|
+
temporary-directory creation must succeed, and unchecked raw/source/default-
|
|
134
|
+
branch fallbacks are absent. Representative in-stream ceilings are 1 MiB for
|
|
135
|
+
release metadata, 4 KiB for a sidecar, and 64 MiB for an archive or binary, with
|
|
136
|
+
at most five Node redirect hops. Archive preflight streams metadata first and
|
|
137
|
+
paths second, permits at most 10,000 members, 4,096-byte paths, and 256 MiB of
|
|
138
|
+
expanded regular files, and aborts the producer on the first breach before
|
|
139
|
+
extraction. Failures retain only safe tag/asset and status, redirect, size,
|
|
140
|
+
checksum, or preflight context, never response bodies. The adversarial contract is exercised by
|
|
141
|
+
`tests/bootstrap-security-test.sh`, `tests/npx-pack-smoke.sh`, and
|
|
142
|
+
`tests/release-tarball-test.sh`; [ADR-0026](docs/adr/0026-content-bound-proof-and-bounded-inputs.md)
|
|
143
|
+
owns the rationale.
|
|
144
|
+
|
|
125
145
|
### npx install path
|
|
126
146
|
|
|
127
147
|
With `npx devrites@latest`, the CLI (`bin/devrites.mjs`) calls
|
|
128
148
|
`devrites-engine` directly instead of running `install.sh`. The bundled host
|
|
129
149
|
payload is pinned to the requested npm package version. The shim first tries the
|
|
130
|
-
matching release binary and its SHA-256 sidecar, then a
|
|
131
|
-
|
|
132
|
-
|
|
150
|
+
matching exact-release binary and its mandatory SHA-256 sidecar, then a
|
|
151
|
+
package-local Go build, and then an existing engine. Remote responses are
|
|
152
|
+
byte-bounded and every redirect is checked before following it. It has no
|
|
153
|
+
runtime npm dependencies. The same project and shared-binary boundaries apply
|
|
154
|
+
to the Bash installer.
|
|
133
155
|
|
|
134
156
|
### Recommended Claude Code permissions for managed deployments
|
|
135
157
|
|
|
@@ -152,61 +174,57 @@ Under the current
|
|
|
152
174
|
the host asks for confirmation before the git mutation ladder. DevRites'
|
|
153
175
|
separate type-`GO` workflow gate still applies.
|
|
154
176
|
|
|
155
|
-
###
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
`refresh-indexes` run through the engine. Guard hooks are fail-open or
|
|
177
|
-
observe-first unless explicitly enforced with the documented `DEVRITES_*`
|
|
178
|
-
controls; source-cache network I/O is the bounded exception in ADR-0008.
|
|
179
|
-
|
|
180
|
-
Delete the project-local hook file (`.claude/settings.json` for Claude Code, or
|
|
181
|
-
the DevRites-managed entries in `.codex/hooks.json` for Codex) to remove hooks.
|
|
182
|
-
Updates merge DevRites entries rather than replacing unrelated project settings,
|
|
183
|
-
so user permission rules remain intact.
|
|
177
|
+
### Native host policy and writer boundary
|
|
178
|
+
|
|
179
|
+
Reviewer profiles are natively read-only. Claude keeps the root in project plan
|
|
180
|
+
mode. Codex uses a workspace-capable root because a child cannot elevate above
|
|
181
|
+
its parent; root source/test non-writing is therefore a workflow rule, not a
|
|
182
|
+
Codex sandbox guarantee. On both hosts, `devrites-slice-wright` is the only
|
|
183
|
+
writable specialist. Its task states the exact project-relative paths. The root
|
|
184
|
+
waits, compares the returned file list and `git diff --name-only` with that
|
|
185
|
+
contract, and rejects out-of-scope work. Exact-path scope is instruction-backed,
|
|
186
|
+
not a per-task filesystem allowlist.
|
|
187
|
+
Agent lifecycle, session history, compaction, presentation, browsing, indexes,
|
|
188
|
+
and irreversible-action approval remain native host responsibilities.
|
|
189
|
+
|
|
190
|
+
Updates merge DevRites-owned permission/config blocks without replacing
|
|
191
|
+
unrelated user settings; uninstall removes only owned entries.
|
|
192
|
+
|
|
193
|
+
Production Git subprocesses apply one shared isolation policy before execution:
|
|
194
|
+
repository, worktree, index, object, ref, config, and pathspec-retargeting
|
|
195
|
+
`GIT_*` variables are removed, including dynamic config key/value pairs.
|
|
196
|
+
Unrelated Git variables are preserved. Go and shell parity is covered by
|
|
197
|
+
`engine/internal/gitenv` tests and `tests/git-env-sanitization-test.sh`.
|
|
184
198
|
|
|
185
199
|
### Third-party trust
|
|
186
200
|
|
|
187
|
-
DevRites vendors no third-party code (see `NOTICE.md`). It
|
|
188
|
-
Code
|
|
189
|
-
|
|
190
|
-
|
|
201
|
+
DevRites vendors no third-party code (see `NOTICE.md`). It runs through the
|
|
202
|
+
external Claude Code or Codex host selected by the user and is independent of
|
|
203
|
+
Anthropic and OpenAI. Codegraph, graphify, and Playwright MCP are optional
|
|
204
|
+
user-selected tools that DevRites calls through their documented interfaces
|
|
205
|
+
rather than bundling them.
|
|
206
|
+
|
|
207
|
+
Repository npm-audit exceptions are temporary trust records, not claims that an
|
|
208
|
+
upstream issue is fixed. Each entry in `scripts/npm-audit-exceptions.json` is
|
|
209
|
+
restricted to an exact advisory, package range, installed node path, owner,
|
|
210
|
+
reason, source, and near-term expiry; validation re-audits the live dependency
|
|
211
|
+
graph and fails stale, broadened, unmatched, or expired entries. In particular,
|
|
212
|
+
the `brace-expansion` advisory remains present in npm's bundled dependency chain
|
|
213
|
+
until a patched ancestor is available.
|
|
191
214
|
|
|
192
215
|
### Agentic trust boundaries
|
|
193
216
|
|
|
194
217
|
Treat every instruction-bearing file as a supply-chain input:
|
|
195
218
|
|
|
196
|
-
1. **Shipped pack**: `pack/.claude/**`, generated host artifacts,
|
|
219
|
+
1. **Shipped pack**: `pack/.claude/**`, generated host artifacts, native permission profiles, and the
|
|
197
220
|
engine are release-managed and scanned before publish.
|
|
198
|
-
2. **Project-local state**: `.devrites/work/**`,
|
|
221
|
+
2. **Project-local state**: `.devrites/work/**`, unvalidated
|
|
199
222
|
principles, and review artifacts are evidence, not authority. Live source and
|
|
200
223
|
engine gates win over stale state.
|
|
201
|
-
3. **
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
they must not weaken type-GO, seal/ship, AFK/HITL, security, or evidence
|
|
224
|
+
3. **Native skills/plugins/MCP configs**: project-local integrations are
|
|
225
|
+
optional instruction-bearing supply-chain inputs. Inspect them before trust;
|
|
226
|
+
they may not weaken type-GO, seal/ship, permissions, security, or evidence
|
|
205
227
|
gates.
|
|
206
|
-
4. **External capability configs**: MCP/tool configs are optional and
|
|
207
|
-
project-local. `/rite-doctor`/`devrites-engine doctor` reports readiness, but
|
|
208
|
-
missing tools degrade to file-system/engine gates instead of silently changing
|
|
209
|
-
workflow semantics.
|
|
210
228
|
|
|
211
229
|
<!-- authority:principles-trust:start -->
|
|
212
230
|
Project principles may become project policy only after explicit provenance and validation; arbitrary project-local Markdown is never inherently trusted executable instruction.
|
|
@@ -218,12 +236,18 @@ instructions. Hidden unicode, prompt-injection phrasing, personal absolute paths
|
|
|
218
236
|
and secret-like strings are release-blocking findings unless explicitly and
|
|
219
237
|
visibly justified.
|
|
220
238
|
|
|
239
|
+
Keep untrusted data out of shell source. Commands must come from fixed,
|
|
240
|
+
reviewed structure; validate or allowlist any external value passed as a
|
|
241
|
+
separate argument. Quoting repository, retrieved, tool, or model text does not
|
|
242
|
+
upgrade its trust level or make unconstrained interpolation safe.
|
|
243
|
+
|
|
221
244
|
### Known non-issues
|
|
222
245
|
|
|
223
246
|
- **Historical `!` injection in `/rite`**: no longer present; current state
|
|
224
247
|
orientation uses structurally bounded, read-only engine commands.
|
|
225
|
-
- **`Write` / `Edit` tool allowance in `rite-*` skills**: required to
|
|
226
|
-
|
|
248
|
+
- **`Write` / `Edit` tool allowance in `rite-*` skills**: required to author
|
|
249
|
+
`.devrites/` workflow records; source/tests still route through the sole
|
|
250
|
+
wright. No skill grants `Bash(*)`.
|
|
227
251
|
- **Per-skill model invocation**: deliberate and frontmatter-controlled;
|
|
228
252
|
model-invocable rites remain bounded by the gates above.
|
|
229
253
|
|
package/bin/devrites.mjs
CHANGED
|
@@ -2,13 +2,35 @@
|
|
|
2
2
|
// devrites - npx entry point for the engine-owned DevRites installer.
|
|
3
3
|
import { spawnSync } from 'node:child_process';
|
|
4
4
|
import { createHash } from 'node:crypto';
|
|
5
|
-
import { chmodSync, existsSync, mkdtempSync, readFileSync, rmSync
|
|
5
|
+
import { chmodSync, createReadStream, existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
|
|
6
|
+
import { open } from 'node:fs/promises';
|
|
6
7
|
import { tmpdir } from 'node:os';
|
|
7
8
|
import { dirname, join } from 'node:path';
|
|
8
9
|
import { fileURLToPath } from 'node:url';
|
|
9
10
|
|
|
10
11
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
11
12
|
const root = dirname(here);
|
|
13
|
+
const MAX_ENGINE_BYTES = 64 * 1024 * 1024;
|
|
14
|
+
const MAX_SIDECAR_BYTES = 4 * 1024;
|
|
15
|
+
const MAX_REDIRECTS = 5;
|
|
16
|
+
const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
|
|
17
|
+
const temporaryDirs = new Set();
|
|
18
|
+
let acquisitionFailure = null;
|
|
19
|
+
|
|
20
|
+
class DownloadError extends Error {}
|
|
21
|
+
|
|
22
|
+
function privateTempDir() {
|
|
23
|
+
const dir = mkdtempSync(join(tmpdir(), 'devrites-engine-'));
|
|
24
|
+
temporaryDirs.add(dir);
|
|
25
|
+
return dir;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function cleanupTemporaryDirs() {
|
|
29
|
+
for (const dir of temporaryDirs) rmSync(dir, { force: true, recursive: true });
|
|
30
|
+
temporaryDirs.clear();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
process.on('exit', cleanupTemporaryDirs);
|
|
12
34
|
|
|
13
35
|
const SUBCOMMAND_ALIASES = new Map([
|
|
14
36
|
['install', 'install'],
|
|
@@ -31,7 +53,7 @@ function printHelp() {
|
|
|
31
53
|
process.stdout.write(`devrites - install the DevRites pack into a project
|
|
32
54
|
|
|
33
55
|
Usage:
|
|
34
|
-
npx devrites [install] [flags] Install skills
|
|
56
|
+
npx devrites [install] [flags] Install skills, hook-free native agents, standards, and host settings (default)
|
|
35
57
|
npx devrites uninstall [flags] Remove a DevRites install (preserves .devrites/ state)
|
|
36
58
|
npx devrites update [flags] Upgrade an existing install in place
|
|
37
59
|
|
|
@@ -41,7 +63,7 @@ Common flags:
|
|
|
41
63
|
--force Overwrite existing non-DevRites files
|
|
42
64
|
--no-codex Skip Codex support files (.agents, .codex, AGENTS.md)
|
|
43
65
|
--short-aliases=all Also install /define /build /prove /seal
|
|
44
|
-
--no-agents Skip
|
|
66
|
+
--no-agents Skip hook-free native specialist profiles
|
|
45
67
|
--no-skills Skip skills and bundled engineering standards
|
|
46
68
|
--no-binary Skip installing the global devrites-engine binary
|
|
47
69
|
--no-rules Deprecated no-op; standards ship inside devrites-lib
|
|
@@ -68,20 +90,19 @@ function firstWorking(candidates, args, env = process.env) {
|
|
|
68
90
|
}
|
|
69
91
|
|
|
70
92
|
async function acquireEngine() {
|
|
93
|
+
const repo = process.env.DEVRITES_REPO || 'ViktorsBaikers/DevRites';
|
|
94
|
+
const tag = normalizeReleaseTag(process.env.DEVRITES_REF || pkgVersion());
|
|
95
|
+
if (!validRepository(repo) || !tag) throw new Error('DevRites repository and release tag must identify an exact release');
|
|
71
96
|
const envEngine = process.env.DEVRITES_ENGINE_CLI || process.env.DEVRITES_CLI;
|
|
72
97
|
if (envEngine && existsSync(envEngine)) return envEngine;
|
|
73
98
|
|
|
74
|
-
const localBuilt = join(root, 'engine', 'devrites-engine');
|
|
75
|
-
if (existsSync(localBuilt)) return localBuilt;
|
|
76
|
-
|
|
77
99
|
const downloaded = await downloadEngine();
|
|
78
100
|
if (downloaded) return downloaded;
|
|
79
101
|
|
|
80
102
|
const engineDir = join(root, 'engine');
|
|
81
103
|
if (existsSync(join(engineDir, 'go.mod'))) {
|
|
82
104
|
const goBin = findGo();
|
|
83
|
-
const out = join(
|
|
84
|
-
const tag = `v${pkgVersion().replace(/^v/, '')}`;
|
|
105
|
+
const out = join(privateTempDir(), process.platform === 'win32' ? 'devrites-engine.exe' : 'devrites-engine');
|
|
85
106
|
if (goBin) {
|
|
86
107
|
const env = { ...process.env, GOCACHE: join(dirname(out), 'go-cache'), CGO_ENABLED: '0' };
|
|
87
108
|
const build = run(goBin, [
|
|
@@ -111,32 +132,121 @@ async function downloadEngine() {
|
|
|
111
132
|
const arch = process.arch === 'x64' ? 'amd64' : process.arch === 'arm64' ? 'arm64' : null;
|
|
112
133
|
if (!platform || !arch) return null;
|
|
113
134
|
const repo = process.env.DEVRITES_REPO || 'ViktorsBaikers/DevRites';
|
|
114
|
-
|
|
135
|
+
if (!validRepository(repo)) return null;
|
|
136
|
+
const tag = normalizeReleaseTag(process.env.DEVRITES_REF || pkgVersion());
|
|
137
|
+
if (!tag) return null;
|
|
115
138
|
const name = `devrites-${platform}-${arch}${platform === 'windows' ? '.exe' : ''}`;
|
|
116
|
-
const dir =
|
|
139
|
+
const dir = privateTempDir();
|
|
117
140
|
const out = join(dir, platform === 'windows' ? 'devrites-engine.exe' : 'devrites-engine');
|
|
118
141
|
const url = `https://github.com/${repo}/releases/download/${tag}/${name}`;
|
|
119
|
-
|
|
120
|
-
if (
|
|
121
|
-
|
|
122
|
-
|
|
142
|
+
const assetFailure = await downloadURL(url, out, MAX_ENGINE_BYTES, 120_000, 0o755);
|
|
143
|
+
if (assetFailure) {
|
|
144
|
+
acquisitionFailure = `release ${tag} asset ${name}: ${assetFailure}`;
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const sidecarFailure = await downloadURL(`${url}.sha256`, `${out}.sha256`, MAX_SIDECAR_BYTES, 30_000);
|
|
148
|
+
if (sidecarFailure) {
|
|
149
|
+
acquisitionFailure = `release ${tag} asset ${name}.sha256: ${sidecarFailure}`;
|
|
150
|
+
rmSync(out, { force: true });
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
let want;
|
|
154
|
+
let got;
|
|
155
|
+
try {
|
|
156
|
+
const match = readFileSync(`${out}.sha256`, 'utf8').match(/^([0-9A-Fa-f]{64})[ \t]+([^\r\n]+)\r?\n?$/);
|
|
157
|
+
want = match && match[2] === name ? match[1].toLowerCase() : null;
|
|
158
|
+
got = await hashFile(out);
|
|
159
|
+
} catch {
|
|
160
|
+
acquisitionFailure = `release ${tag} asset ${name}: checksum read failed`;
|
|
161
|
+
rmSync(out, { force: true });
|
|
162
|
+
rmSync(`${out}.sha256`, { force: true });
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
123
165
|
if (!want || got !== want) {
|
|
166
|
+
acquisitionFailure = `release ${tag} asset ${name}: checksum failed`;
|
|
167
|
+
rmSync(out, { force: true });
|
|
168
|
+
rmSync(`${out}.sha256`, { force: true });
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
chmodSync(out, 0o755);
|
|
173
|
+
} catch {
|
|
174
|
+
acquisitionFailure = `release ${tag} asset ${name}: executable preparation failed`;
|
|
124
175
|
rmSync(out, { force: true });
|
|
176
|
+
rmSync(`${out}.sha256`, { force: true });
|
|
125
177
|
return null;
|
|
126
178
|
}
|
|
127
|
-
chmodSync(out, 0o755);
|
|
128
179
|
return out;
|
|
129
180
|
}
|
|
130
181
|
|
|
131
|
-
|
|
182
|
+
function normalizeReleaseTag(value) {
|
|
183
|
+
const version = String(value).replace(/^v/, '');
|
|
184
|
+
const semver = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
|
|
185
|
+
const match = version.match(semver);
|
|
186
|
+
if (!match || (match[4] && match[4].split('.').some((part) => /^\d+$/.test(part) && part.length > 1 && part.startsWith('0')))) return null;
|
|
187
|
+
return `v${version}`;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function validRepository(value) {
|
|
191
|
+
return /^[A-Za-z0-9][A-Za-z0-9_.-]*\/[A-Za-z0-9][A-Za-z0-9_.-]*$/.test(value);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
async function hashFile(path) {
|
|
195
|
+
const hash = createHash('sha256');
|
|
196
|
+
for await (const chunk of createReadStream(path)) hash.update(chunk);
|
|
197
|
+
return hash.digest('hex');
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async function downloadURL(url, out, maxBytes, timeoutMs, mode = 0o644) {
|
|
201
|
+
const controller = new AbortController();
|
|
202
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
203
|
+
let file;
|
|
132
204
|
try {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
205
|
+
let currentURL = new URL(url);
|
|
206
|
+
let res;
|
|
207
|
+
for (let redirects = 0; ; redirects += 1) {
|
|
208
|
+
if (currentURL.protocol !== 'https:') throw new DownloadError('redirect failed');
|
|
209
|
+
res = await fetch(currentURL.href, { redirect: 'manual', signal: controller.signal });
|
|
210
|
+
if (!REDIRECT_STATUSES.has(res.status)) break;
|
|
211
|
+
const location = res.headers.get('location');
|
|
212
|
+
await res.body?.cancel();
|
|
213
|
+
if (!location) throw new DownloadError('redirect failed');
|
|
214
|
+
if (redirects >= MAX_REDIRECTS) throw new DownloadError('redirect limit failed');
|
|
215
|
+
currentURL = new URL(location, currentURL);
|
|
216
|
+
}
|
|
217
|
+
if (!res.ok) throw new DownloadError(`HTTP status ${res.status} failed`);
|
|
218
|
+
const contentLength = Number(res.headers.get('content-length'));
|
|
219
|
+
if (Number.isFinite(contentLength) && contentLength > maxBytes) throw new DownloadError('size limit failed');
|
|
220
|
+
if (!res.body) throw new DownloadError('response body failed');
|
|
221
|
+
try {
|
|
222
|
+
file = await open(out, 'wx', mode);
|
|
223
|
+
} catch {
|
|
224
|
+
throw new DownloadError('local write failed');
|
|
225
|
+
}
|
|
226
|
+
let bytes = 0;
|
|
227
|
+
for await (const chunk of res.body) {
|
|
228
|
+
bytes += chunk.byteLength;
|
|
229
|
+
if (bytes > maxBytes) throw new DownloadError('size limit failed');
|
|
230
|
+
try {
|
|
231
|
+
await file.writeFile(Buffer.from(chunk));
|
|
232
|
+
} catch {
|
|
233
|
+
throw new DownloadError('local write failed');
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
try {
|
|
237
|
+
await file.close();
|
|
238
|
+
file = undefined;
|
|
239
|
+
} catch {
|
|
240
|
+
throw new DownloadError('local write failed');
|
|
241
|
+
}
|
|
242
|
+
return null;
|
|
243
|
+
} catch (error) {
|
|
244
|
+
await file?.close().catch(() => {});
|
|
138
245
|
rmSync(out, { force: true });
|
|
139
|
-
return
|
|
246
|
+
if (error instanceof DownloadError) return error.message;
|
|
247
|
+
return controller.signal.aborted ? 'timeout failed' : 'network failed';
|
|
248
|
+
} finally {
|
|
249
|
+
clearTimeout(timeout);
|
|
140
250
|
}
|
|
141
251
|
}
|
|
142
252
|
|
|
@@ -162,7 +272,13 @@ if (first && SUBCOMMAND_ALIASES.has(first)) {
|
|
|
162
272
|
rest = argv.slice(1);
|
|
163
273
|
}
|
|
164
274
|
|
|
165
|
-
|
|
275
|
+
let engine;
|
|
276
|
+
try {
|
|
277
|
+
engine = await acquireEngine();
|
|
278
|
+
} catch (error) {
|
|
279
|
+
console.error(`devrites: ${error.message}`);
|
|
280
|
+
process.exit(1);
|
|
281
|
+
}
|
|
166
282
|
const payloadDir = process.env.DEVRITES_HOST_ARTIFACT_DIR || join(root, 'pack', 'generated');
|
|
167
283
|
const installerCommand = command === 'install' || command === 'update' || command === 'uninstall';
|
|
168
284
|
const engineEnv = { ...process.env, DEVRITES_ENGINE_CLI: engine };
|
|
@@ -180,6 +296,6 @@ const lastError = firstWorking(candidates, args, engineEnv);
|
|
|
180
296
|
if (lastError && lastError.code !== 'ENOENT') {
|
|
181
297
|
console.error('devrites: failed to launch devrites-engine:', lastError.message);
|
|
182
298
|
} else {
|
|
183
|
-
console.error(
|
|
299
|
+
console.error(`devrites: devrites-engine was not found and could not be acquired${acquisitionFailure ? ` (${acquisitionFailure})` : ''}.`);
|
|
184
300
|
}
|
|
185
301
|
process.exit(127);
|
|
@@ -33,6 +33,6 @@ completion with empty proof, or with `.red` set, cannot end the turn.
|
|
|
33
33
|
## Consequences
|
|
34
34
|
|
|
35
35
|
- Exit 3 is a reserved, load-bearing contract — the harness and hooks branch on
|
|
36
|
-
it. Its guard test (`tests/adr_0003_gate_exit_code_test.go`) locks it.
|
|
36
|
+
it. Its guard test (`engine/tests/adr_0003_gate_exit_code_test.go`) locks it.
|
|
37
37
|
- Blocks are legible: the agent (and human) see exactly which section is missing.
|
|
38
38
|
- Gate authors must classify a stop as "incomplete" (exit 3) vs a true error.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# ADR-0013: Native Codex agent orchestration
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted
|
|
4
|
+
- **Date:** 2026-07-29
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
ADR-0010 established fresh, depth-one specialist agents with one write-capable
|
|
9
|
+
slice wright. At the time, Codex custom-agent routing varied across MultiAgent
|
|
10
|
+
versions, so DevRites added a Go state machine that parsed prompts and rollout
|
|
11
|
+
files, rewrote generic `explorer`/`worker` spawns, and tracked spawn, start,
|
|
12
|
+
wait, stop, and result receipts.
|
|
13
|
+
|
|
14
|
+
Current Codex releases load project agents from `.codex/agents/*.toml`, apply
|
|
15
|
+
their `developer_instructions` and sandbox settings, and own the
|
|
16
|
+
spawn/wait/result lifecycle. Keeping a second lifecycle in DevRites caused
|
|
17
|
+
false failures when the native child started correctly but the synthetic
|
|
18
|
+
receipt did not match.
|
|
19
|
+
|
|
20
|
+
Codex still cannot infer DevRites workflow state or the slice wright's
|
|
21
|
+
per-window exact file allowlist.
|
|
22
|
+
|
|
23
|
+
## Decision
|
|
24
|
+
|
|
25
|
+
For Codex, DevRites uses the host's named custom-agent orchestration directly:
|
|
26
|
+
|
|
27
|
+
- skills request the exact `devrites-<role>` agent with a fresh context and
|
|
28
|
+
wait for its result;
|
|
29
|
+
- Codex loads the role's generated `.codex/agents/*.toml` profile;
|
|
30
|
+
- read-only roles use native `sandbox_mode = "read-only"`; and
|
|
31
|
+
- an unavailable named role stops for human intervention instead of switching
|
|
32
|
+
to a version-specific or generic compatibility lane.
|
|
33
|
+
|
|
34
|
+
Generated Codex skills and agents translate the canonical Claude-authored
|
|
35
|
+
paths and file formats, but do not receive a repeated compatibility preamble.
|
|
36
|
+
Codex-wide operating guidance lives once in the installed project
|
|
37
|
+
`AGENTS.md`, which Codex loads natively.
|
|
38
|
+
|
|
39
|
+
The engine does not parse Codex rollout files or track parallel
|
|
40
|
+
spawn/start/wait/stop receipts. `required-agent-roles` and `dispatch-waive`
|
|
41
|
+
metadata exist only for that deleted receipt system and are removed. The skill
|
|
42
|
+
body is the source of truth for when a specialist is required.
|
|
43
|
+
|
|
44
|
+
DevRites hooks remain only where they enforce DevRites-owned state or policy.
|
|
45
|
+
In particular, the slice wright keeps its engine-backed exact allowlist and
|
|
46
|
+
reconcile boundary. A wright-only start hook captures canonical state before
|
|
47
|
+
writer work begins. Typed `agent-packet/v1` and `agent-result/v1` envelopes,
|
|
48
|
+
root-owned reconciliation, lifecycle gates, and destructive-action policy also
|
|
49
|
+
remain.
|
|
50
|
+
|
|
51
|
+
ADR-0010 still governs fresh-context ownership, depth, typed results, and the
|
|
52
|
+
single-writer model. This record replaces its generic Codex fallback and
|
|
53
|
+
receipt-based identity implementation.
|
|
54
|
+
|
|
55
|
+
## Alternatives considered
|
|
56
|
+
|
|
57
|
+
| Option | Why not |
|
|
58
|
+
|---|---|
|
|
59
|
+
| Keep the V1/V2 receipt state machine | It duplicates the host lifecycle, depends on unstable rollout internals, and can reject a correctly started native agent. |
|
|
60
|
+
| Keep generic `explorer`/`worker` fallback | It weakens exact role identity and preserves version-specific branches after named custom agents became the supported interface. |
|
|
61
|
+
| Remove all agent-related hooks | Codex cannot derive the active reconcile snapshot or enforce the wright's dynamic exact file allowlist. |
|
|
62
|
+
| Author separate Claude and Codex agent rosters | It creates two mutable sources of truth; generated Codex TOML remains the smaller dual-host adapter. |
|
|
63
|
+
|
|
64
|
+
## Consequences
|
|
65
|
+
|
|
66
|
+
- Codex agent dispatch has one path: the exact named custom agent.
|
|
67
|
+
- DevRites no longer blocks completion on synthetic collaboration receipts.
|
|
68
|
+
- Reviewer safety relies on Codex's native sandbox rather than a duplicative
|
|
69
|
+
Codex engine hook.
|
|
70
|
+
- Codex host guidance has one project-level copy instead of being injected
|
|
71
|
+
into every generated skill and agent.
|
|
72
|
+
- The engine surface and its tests shrink substantially.
|
|
73
|
+
- A future Codex API change is handled in generated profiles and guidance, not
|
|
74
|
+
by adding another runtime-version state machine.
|