devrites 3.2.2 → 3.2.4
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 +14 -0
- package/README.md +1 -1
- package/docs/architecture.md +6 -2
- package/docs/command-map.md +3 -3
- package/docs/engine/agent-contract.md +3 -2
- package/docs/harness-compliance.md +2 -2
- package/docs/orchestration.md +15 -12
- package/docs/porting-to-a-new-harness.md +2 -1
- package/docs/skills.md +7 -2
- package/engine/hooks.go +39 -4
- package/engine/hooks_agent_dispatch.go +1193 -0
- package/engine/hooks_workspace.go +78 -10
- package/engine/internal/forge/forge.go +0 -2
- package/engine/internal/harness/compliance.go +1 -1
- package/engine/internal/harness/harness.go +3 -0
- package/engine/internal/lib/doubtcoverage.go +2 -12
- package/engine/internal/lib/reconcile.go +4 -29
- package/engine/internal/lib/reconcile_test.go +14 -10
- package/engine/main.go +4 -1
- package/engine/tests/hook_test.go +877 -1
- package/engine/tests/lib_parity_test.go +5 -17
- package/engine/tests/parity_reconcile_test.go +1 -1
- package/engine/tests/parity_test.go +2 -6
- package/pack/.claude/skills/devrites-api-interface/SKILL.md +1 -0
- package/pack/.claude/skills/devrites-audit/SKILL.md +5 -6
- package/pack/.claude/skills/devrites-browser-proof/SKILL.md +1 -0
- package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +1 -0
- package/pack/.claude/skills/devrites-doubt/SKILL.md +2 -1
- package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +1 -0
- package/pack/.claude/skills/devrites-interview/SKILL.md +1 -0
- package/pack/.claude/skills/devrites-lib/SKILL.md +1 -0
- package/pack/.claude/skills/devrites-lib/reference/model-tiers.md +4 -3
- package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -5
- package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +15 -8
- package/pack/.claude/skills/devrites-prose-craft/SKILL.md +1 -0
- package/pack/.claude/skills/devrites-refresh-indexes/SKILL.md +1 -0
- package/pack/.claude/skills/devrites-source-driven/SKILL.md +1 -0
- package/pack/.claude/skills/devrites-ux-shape/SKILL.md +1 -0
- package/pack/.claude/skills/rite/SKILL.md +1 -0
- package/pack/.claude/skills/rite-adopt/SKILL.md +1 -0
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +1 -0
- package/pack/.claude/skills/rite-build/SKILL.md +2 -1
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +3 -4
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +11 -12
- package/pack/.claude/skills/rite-clarify/SKILL.md +1 -0
- package/pack/.claude/skills/rite-converge/SKILL.md +1 -0
- package/pack/.claude/skills/rite-customize/SKILL.md +1 -0
- package/pack/.claude/skills/rite-define/SKILL.md +1 -0
- package/pack/.claude/skills/rite-doctor/SKILL.md +1 -0
- package/pack/.claude/skills/rite-dogfood/SKILL.md +1 -0
- package/pack/.claude/skills/rite-explain/SKILL.md +4 -2
- package/pack/.claude/skills/rite-frame/SKILL.md +1 -0
- package/pack/.claude/skills/rite-handoff/SKILL.md +1 -0
- package/pack/.claude/skills/rite-learn/SKILL.md +1 -0
- package/pack/.claude/skills/rite-plan/SKILL.md +1 -0
- package/pack/.claude/skills/rite-polish/SKILL.md +1 -0
- package/pack/.claude/skills/rite-pov/SKILL.md +1 -0
- package/pack/.claude/skills/rite-pr-feedback/SKILL.md +1 -0
- package/pack/.claude/skills/rite-pressure-test/SKILL.md +1 -0
- package/pack/.claude/skills/rite-prototype/SKILL.md +1 -0
- package/pack/.claude/skills/rite-prove/SKILL.md +1 -0
- package/pack/.claude/skills/rite-quick/SKILL.md +1 -0
- package/pack/.claude/skills/rite-resolve/SKILL.md +1 -0
- package/pack/.claude/skills/rite-review/SKILL.md +1 -0
- package/pack/.claude/skills/rite-seal/SKILL.md +1 -0
- package/pack/.claude/skills/rite-seal/reference/phase-contract.md +2 -3
- package/pack/.claude/skills/rite-seal/reference/risk-and-rollback.md +10 -12
- package/pack/.claude/skills/rite-ship/SKILL.md +1 -0
- package/pack/.claude/skills/rite-spec/SKILL.md +1 -0
- package/pack/.claude/skills/rite-status/SKILL.md +1 -0
- package/pack/.claude/skills/rite-temper/SKILL.md +3 -2
- package/pack/.claude/skills/rite-upgrade/SKILL.md +3 -1
- package/pack/.claude/skills/rite-vet/SKILL.md +1 -0
- package/pack/.claude/skills/rite-zoom-out/SKILL.md +1 -0
- package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +1 -0
- package/pack/generated/claude/skills/devrites-audit/SKILL.md +5 -6
- package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +1 -0
- package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +1 -0
- package/pack/generated/claude/skills/devrites-doubt/SKILL.md +2 -1
- package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +1 -0
- package/pack/generated/claude/skills/devrites-interview/SKILL.md +1 -0
- package/pack/generated/claude/skills/devrites-lib/SKILL.md +1 -0
- package/pack/generated/claude/skills/devrites-lib/reference/model-tiers.md +4 -3
- package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -5
- package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +15 -8
- package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +1 -0
- package/pack/generated/claude/skills/devrites-refresh-indexes/SKILL.md +1 -0
- package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +1 -0
- package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-adopt/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-build/SKILL.md +2 -1
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +3 -4
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +11 -12
- package/pack/generated/claude/skills/rite-clarify/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-converge/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-customize/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-define/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-doctor/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-dogfood/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-explain/SKILL.md +4 -2
- package/pack/generated/claude/skills/rite-frame/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-handoff/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-learn/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-plan/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-polish/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-pov/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-prototype/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-prove/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-quick/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-resolve/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-review/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-seal/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +2 -3
- package/pack/generated/claude/skills/rite-seal/reference/risk-and-rollback.md +10 -12
- package/pack/generated/claude/skills/rite-ship/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-spec/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-status/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-temper/SKILL.md +3 -2
- package/pack/generated/claude/skills/rite-upgrade/SKILL.md +3 -1
- package/pack/generated/claude/skills/rite-vet/SKILL.md +1 -0
- package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +1 -0
- package/pack/generated/codex/AGENTS.md +2 -4
- package/pack/generated/codex/hooks.json +24 -5
- package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +6 -4
- package/pack/generated/codex/skills/devrites-audit/SKILL.md +10 -10
- package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +6 -4
- package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +6 -4
- package/pack/generated/codex/skills/devrites-doubt/SKILL.md +7 -5
- package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +6 -4
- package/pack/generated/codex/skills/devrites-interview/SKILL.md +6 -4
- package/pack/generated/codex/skills/devrites-lib/SKILL.md +6 -4
- package/pack/generated/codex/skills/devrites-lib/reference/model-tiers.md +4 -3
- package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +4 -5
- package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +15 -8
- package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +6 -4
- package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +6 -4
- package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +6 -4
- package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-adopt/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-build/SKILL.md +7 -5
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +3 -4
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +11 -12
- package/pack/generated/codex/skills/rite-clarify/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-converge/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-customize/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-define/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-doctor/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-dogfood/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-explain/SKILL.md +9 -6
- package/pack/generated/codex/skills/rite-frame/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-handoff/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-learn/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-plan/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-polish/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-pov/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-prototype/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-prove/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-quick/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-resolve/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-review/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-seal/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +2 -3
- package/pack/generated/codex/skills/rite-seal/reference/risk-and-rollback.md +10 -12
- package/pack/generated/codex/skills/rite-ship/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-spec/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-status/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-temper/SKILL.md +8 -6
- package/pack/generated/codex/skills/rite-upgrade/SKILL.md +8 -5
- package/pack/generated/codex/skills/rite-vet/SKILL.md +6 -4
- package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +6 -4
- package/package.json +1 -1
- package/scripts/codex-generate.sh +32 -18
- package/scripts/live-hosts/agent-result.schema.json +2 -1
- package/scripts/live-hosts/claude.sh +2 -2
- package/scripts/live-hosts/codex.sh +4 -0
- package/scripts/live-hosts/fake-host.py +1 -8
- package/scripts/live-hosts/host-transport.py +1 -2
- package/scripts/run-agent-contract-evals.py +3 -3
- package/scripts/run-evals.sh +3 -34
- package/scripts/validate-frontmatter.py +34 -1
- package/engine/testdata/golden/TestParityA1Guard/inline-fallback-silent.golden +0 -1
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=inline.golden +0 -3
- package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing-inline.golden +0 -3
- package/scripts/eval-runner.py +0 -275
- package/scripts/eval-scorer.mjs +0 -46
- package/scripts/render-eval-summary.py +0 -48
- /package/engine/testdata/golden/TestParityReconcile/{inline-fallback → close-window}/snapshot.golden +0 -0
- /package/engine/testdata/golden/TestParityReconcile/{inline-fallback.golden → close-window.golden} +0 -0
|
@@ -3,6 +3,7 @@ name: rite-seal
|
|
|
3
3
|
description: Decide GO / NO-GO readiness on the active feature. Use when the user asks "seal this", "GO / NO-GO", "decide if we can ship", "can we ship", or "safe to merge". Not for commit/push/tag/close; use $rite-ship.
|
|
4
4
|
argument-hint: "[feature-slug] [--full]"
|
|
5
5
|
user-invocable: true
|
|
6
|
+
required-agent-roles: devrites-test-analyst
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
## Codex compatibility
|
|
@@ -12,10 +13,11 @@ This is the Codex mirror of a DevRites skill. In Codex:
|
|
|
12
13
|
- Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Read `.agents/skills/devrites-lib/reference/standards/core.md` before workflow work, then load the other `.agents/skills/devrites-lib/reference/standards/*.md` files exactly when this skill asks for them.
|
|
13
14
|
- Use the installed `devrites-engine` binary as the canonical runtime helper surface for orientation, gates, and state mutation.
|
|
14
15
|
- **Invocation and dispatch are different:** invoke means run a skill in this context; dispatch means start a fresh agent with `spawn_agent`, await it, and reconcile its result. Never describe inline skill work as a dispatch.
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
16
|
+
- On MultiAgent V2, call `spawn_agent` with the exact named `agent_type=devrites-<role>`, a unique `task_name`, and `fork_turns="none"`. Codex loads that role TOML's `developer_instructions` natively. Because V2 collaboration lifecycle calls bypass hooks, DevRites verifies the current durable parent/child rollout for the exact role, wait, completion, and non-empty delivered result.
|
|
17
|
+
- On MultiAgent V1, when the named role is not exposed, use generic `explorer` for a read-only role with `fork_turns="none"` and name exactly one `.codex/agents/devrites-<role>.toml` contract in the message. Trusted `.codex/hooks.json` injects that contract's exact `developer_instructions` and binds the child to the fail-closed reviewer read-only guard.
|
|
18
|
+
- On MultiAgent V1, `devrites-slice-wright` uses generic `worker` with `fork_turns="none"` and the exact role TOML named in the message. Trusted `.codex/hooks.json` binds it to the active reconcile window and `.wright-allowlist`; do not substitute `worker` for an exposed V2 named role.
|
|
19
|
+
- The invoked skill's `required-agent-roles` frontmatter arms the fail-closed Stop receipt. Every listed role must have a confirmed start, wait, and non-empty result in this turn.
|
|
20
|
+
- If any required named or generic agent dispatch is unavailable or rejected, stop for HITL. Never execute a DevRites specialist role in the root context.
|
|
19
21
|
- Wait for every required fresh-context dispatch before reconciling or advancing. A backgrounded or lost result is incomplete.
|
|
20
22
|
- Codex project hooks are installed in `.codex/hooks.json`; declared-leaf hooks are scoped inside `.codex/agents/devrites-*.toml`. Review and trust them with `/hooks` before relying on hook enforcement.
|
|
21
23
|
- When this skill asks a HITL question via `AskUserQuestion`: Codex's equivalent (`request_user_input`) exists only in Plan mode. Outside Plan mode, render the option set as a plain numbered list in chat and **end the turn** so the human answers: NEVER silently pick an option yourself; auto-picking is AFK's contract, gated by the `.devrites/AFK` sentinel.
|
|
@@ -45,8 +45,7 @@
|
|
|
45
45
|
against the ledger: an every-slice-trivial feature (`- none`) is a valid pass; a stood triggering
|
|
46
46
|
decision (boundary / data-model / auth / public-API / migration / branching) with no verdict is
|
|
47
47
|
the finding, same severity as rc=3.
|
|
48
|
-
- **rc=0:** covered, or not assessable
|
|
49
|
-
verdicts by hand).
|
|
48
|
+
- **rc=0:** covered, or not assessable because no wright was logged.
|
|
50
49
|
Either way, walk the `## Decisions stood` ledger yourself: severity rides the unverified
|
|
51
50
|
**decision**, never the exit code alone.
|
|
52
51
|
5. Check **security, data, migration, rollback**, strategy scope, principles,
|
|
@@ -61,7 +60,7 @@
|
|
|
61
60
|
[`parallel-dispatch.md`](../../devrites-lib/reference/parallel-dispatch.md). Await
|
|
62
61
|
fresh-context batches of at most three and give reviewers only the workspace path plus
|
|
63
62
|
immutable diff, without author reasoning. Use named role → safely enforced generic fresh
|
|
64
|
-
agent
|
|
63
|
+
agent; if neither is available, seal remains NO-GO. Carry Spec/Code verdicts only
|
|
65
64
|
for an unchanged post-review diff; rerun the other applicable axes.
|
|
66
65
|
**Footprint: account for the whole roster.** For each reviewer you dispatch, append
|
|
67
66
|
`devrites-engine footprint log <slug> reviewer devrites-<x>-reviewer` (the reviewer's **exact agent name**:
|
|
@@ -25,18 +25,16 @@ For each risky step, state how to back it out:
|
|
|
25
25
|
- A new external dependency with no failure handling is at least **Important**.
|
|
26
26
|
- Record the chosen rollback path in `seal.md` → "Rollback / Recovery".
|
|
27
27
|
|
|
28
|
-
## Fresh-context
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
-
|
|
33
|
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
- Security or irreversible-risk scope has no reduced-assurance override: unavailable
|
|
39
|
-
independent review remains NO-GO.
|
|
28
|
+
## Fresh-context availability
|
|
29
|
+
|
|
30
|
+
A required review must run in a fresh spawned agent:
|
|
31
|
+
|
|
32
|
+
- If neither a named role nor a guarded generic agent is available, record the roster
|
|
33
|
+
skip reason and keep seal **NO-GO**.
|
|
34
|
+
- Never run the reviewer in the root context or log root work as a dispatched review.
|
|
35
|
+
- AFK never auto-accepts a missing reviewer.
|
|
36
|
+
- Security or irreversible-risk scope remains NO-GO while independent review is
|
|
37
|
+
unavailable.
|
|
40
38
|
|
|
41
39
|
## Destructive operations
|
|
42
40
|
Confirm any destructive step with the user before shipping. Verify backups exist where
|
|
@@ -3,6 +3,7 @@ name: rite-ship
|
|
|
3
3
|
description: Ship the sealed feature: commit, push, tag, archive, close. Use when the user says "ship it", "push the branch", "tag the release", or "close the task" after $rite-seal GO. Not for GO/NO-GO readiness.
|
|
4
4
|
argument-hint: "[feature-slug]"
|
|
5
5
|
user-invocable: true
|
|
6
|
+
required-agent-roles: none
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
## Codex compatibility
|
|
@@ -12,10 +13,11 @@ This is the Codex mirror of a DevRites skill. In Codex:
|
|
|
12
13
|
- Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Read `.agents/skills/devrites-lib/reference/standards/core.md` before workflow work, then load the other `.agents/skills/devrites-lib/reference/standards/*.md` files exactly when this skill asks for them.
|
|
13
14
|
- Use the installed `devrites-engine` binary as the canonical runtime helper surface for orientation, gates, and state mutation.
|
|
14
15
|
- **Invocation and dispatch are different:** invoke means run a skill in this context; dispatch means start a fresh agent with `spawn_agent`, await it, and reconcile its result. Never describe inline skill work as a dispatch.
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
16
|
+
- On MultiAgent V2, call `spawn_agent` with the exact named `agent_type=devrites-<role>`, a unique `task_name`, and `fork_turns="none"`. Codex loads that role TOML's `developer_instructions` natively. Because V2 collaboration lifecycle calls bypass hooks, DevRites verifies the current durable parent/child rollout for the exact role, wait, completion, and non-empty delivered result.
|
|
17
|
+
- On MultiAgent V1, when the named role is not exposed, use generic `explorer` for a read-only role with `fork_turns="none"` and name exactly one `.codex/agents/devrites-<role>.toml` contract in the message. Trusted `.codex/hooks.json` injects that contract's exact `developer_instructions` and binds the child to the fail-closed reviewer read-only guard.
|
|
18
|
+
- On MultiAgent V1, `devrites-slice-wright` uses generic `worker` with `fork_turns="none"` and the exact role TOML named in the message. Trusted `.codex/hooks.json` binds it to the active reconcile window and `.wright-allowlist`; do not substitute `worker` for an exposed V2 named role.
|
|
19
|
+
- The invoked skill's `required-agent-roles` frontmatter arms the fail-closed Stop receipt. Every listed role must have a confirmed start, wait, and non-empty result in this turn.
|
|
20
|
+
- If any required named or generic agent dispatch is unavailable or rejected, stop for HITL. Never execute a DevRites specialist role in the root context.
|
|
19
21
|
- Wait for every required fresh-context dispatch before reconciling or advancing. A backgrounded or lost result is incomplete.
|
|
20
22
|
- Codex project hooks are installed in `.codex/hooks.json`; declared-leaf hooks are scoped inside `.codex/agents/devrites-*.toml`. Review and trust them with `/hooks` before relying on hook enforcement.
|
|
21
23
|
- When this skill asks a HITL question via `AskUserQuestion`: Codex's equivalent (`request_user_input`) exists only in Plan mode. Outside Plan mode, render the option set as a plain numbered list in chat and **end the turn** so the human answers: NEVER silently pick an option yourself; auto-picking is AFK's contract, gated by the `.devrites/AFK` sentinel.
|
|
@@ -3,6 +3,7 @@ name: rite-spec
|
|
|
3
3
|
description: Spec new or high-risk behavior before code and write its `.devrites/work/<slug>/` workspace. Use for a feature/app, vague product idea, auth or migration work, or a public-API change. Not for approved-spec planning.
|
|
4
4
|
argument-hint: "<feature or idea>"
|
|
5
5
|
user-invocable: true
|
|
6
|
+
required-agent-roles: none
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
## Codex compatibility
|
|
@@ -12,10 +13,11 @@ This is the Codex mirror of a DevRites skill. In Codex:
|
|
|
12
13
|
- Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Read `.agents/skills/devrites-lib/reference/standards/core.md` before workflow work, then load the other `.agents/skills/devrites-lib/reference/standards/*.md` files exactly when this skill asks for them.
|
|
13
14
|
- Use the installed `devrites-engine` binary as the canonical runtime helper surface for orientation, gates, and state mutation.
|
|
14
15
|
- **Invocation and dispatch are different:** invoke means run a skill in this context; dispatch means start a fresh agent with `spawn_agent`, await it, and reconcile its result. Never describe inline skill work as a dispatch.
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
16
|
+
- On MultiAgent V2, call `spawn_agent` with the exact named `agent_type=devrites-<role>`, a unique `task_name`, and `fork_turns="none"`. Codex loads that role TOML's `developer_instructions` natively. Because V2 collaboration lifecycle calls bypass hooks, DevRites verifies the current durable parent/child rollout for the exact role, wait, completion, and non-empty delivered result.
|
|
17
|
+
- On MultiAgent V1, when the named role is not exposed, use generic `explorer` for a read-only role with `fork_turns="none"` and name exactly one `.codex/agents/devrites-<role>.toml` contract in the message. Trusted `.codex/hooks.json` injects that contract's exact `developer_instructions` and binds the child to the fail-closed reviewer read-only guard.
|
|
18
|
+
- On MultiAgent V1, `devrites-slice-wright` uses generic `worker` with `fork_turns="none"` and the exact role TOML named in the message. Trusted `.codex/hooks.json` binds it to the active reconcile window and `.wright-allowlist`; do not substitute `worker` for an exposed V2 named role.
|
|
19
|
+
- The invoked skill's `required-agent-roles` frontmatter arms the fail-closed Stop receipt. Every listed role must have a confirmed start, wait, and non-empty result in this turn.
|
|
20
|
+
- If any required named or generic agent dispatch is unavailable or rejected, stop for HITL. Never execute a DevRites specialist role in the root context.
|
|
19
21
|
- Wait for every required fresh-context dispatch before reconciling or advancing. A backgrounded or lost result is incomplete.
|
|
20
22
|
- Codex project hooks are installed in `.codex/hooks.json`; declared-leaf hooks are scoped inside `.codex/agents/devrites-*.toml`. Review and trust them with `/hooks` before relying on hook enforcement.
|
|
21
23
|
- When this skill asks a HITL question via `AskUserQuestion`: Codex's equivalent (`request_user_input`) exists only in Plan mode. Outside Plan mode, render the option set as a plain numbered list in chat and **end the turn** so the human answers: NEVER silently pick an option yourself; auto-picking is AFK's contract, gated by the `.devrites/AFK` sentinel.
|
|
@@ -4,6 +4,7 @@ description: User-invoked read-only active-feature report: phase, active slice,
|
|
|
4
4
|
argument-hint: "[feature-slug]"
|
|
5
5
|
user-invocable: true
|
|
6
6
|
disable-model-invocation: true
|
|
7
|
+
required-agent-roles: none
|
|
7
8
|
---
|
|
8
9
|
|
|
9
10
|
## Codex compatibility
|
|
@@ -13,10 +14,11 @@ This is the Codex mirror of a DevRites skill. In Codex:
|
|
|
13
14
|
- Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Read `.agents/skills/devrites-lib/reference/standards/core.md` before workflow work, then load the other `.agents/skills/devrites-lib/reference/standards/*.md` files exactly when this skill asks for them.
|
|
14
15
|
- Use the installed `devrites-engine` binary as the canonical runtime helper surface for orientation, gates, and state mutation.
|
|
15
16
|
- **Invocation and dispatch are different:** invoke means run a skill in this context; dispatch means start a fresh agent with `spawn_agent`, await it, and reconcile its result. Never describe inline skill work as a dispatch.
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
17
|
+
- On MultiAgent V2, call `spawn_agent` with the exact named `agent_type=devrites-<role>`, a unique `task_name`, and `fork_turns="none"`. Codex loads that role TOML's `developer_instructions` natively. Because V2 collaboration lifecycle calls bypass hooks, DevRites verifies the current durable parent/child rollout for the exact role, wait, completion, and non-empty delivered result.
|
|
18
|
+
- On MultiAgent V1, when the named role is not exposed, use generic `explorer` for a read-only role with `fork_turns="none"` and name exactly one `.codex/agents/devrites-<role>.toml` contract in the message. Trusted `.codex/hooks.json` injects that contract's exact `developer_instructions` and binds the child to the fail-closed reviewer read-only guard.
|
|
19
|
+
- On MultiAgent V1, `devrites-slice-wright` uses generic `worker` with `fork_turns="none"` and the exact role TOML named in the message. Trusted `.codex/hooks.json` binds it to the active reconcile window and `.wright-allowlist`; do not substitute `worker` for an exposed V2 named role.
|
|
20
|
+
- The invoked skill's `required-agent-roles` frontmatter arms the fail-closed Stop receipt. Every listed role must have a confirmed start, wait, and non-empty result in this turn.
|
|
21
|
+
- If any required named or generic agent dispatch is unavailable or rejected, stop for HITL. Never execute a DevRites specialist role in the root context.
|
|
20
22
|
- Wait for every required fresh-context dispatch before reconciling or advancing. A backgrounded or lost result is incomplete.
|
|
21
23
|
- Codex project hooks are installed in `.codex/hooks.json`; declared-leaf hooks are scoped inside `.codex/agents/devrites-*.toml`. Review and trust them with `/hooks` before relying on hook enforcement.
|
|
22
24
|
- When this skill asks a HITL question via `AskUserQuestion`: Codex's equivalent (`request_user_input`) exists only in Plan mode. Outside Plan mode, render the option set as a plain numbered list in chat and **end the turn** so the human answers: NEVER silently pick an option yourself; auto-picking is AFK's contract, gated by the `.devrites/AFK` sentinel.
|
|
@@ -3,6 +3,7 @@ name: rite-temper
|
|
|
3
3
|
description: Temper a readied spec before planning. Use when the user says "temper this", "strategy review", "pre-mortem the spec", or asks if we are over/under-building. Not for code review or final seal.
|
|
4
4
|
argument-hint: "[feature-slug] [--mode expand|selective|hold|reduce]"
|
|
5
5
|
user-invocable: true
|
|
6
|
+
required-agent-roles: devrites-strategy-reviewer
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
## Codex compatibility
|
|
@@ -12,10 +13,11 @@ This is the Codex mirror of a DevRites skill. In Codex:
|
|
|
12
13
|
- Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Read `.agents/skills/devrites-lib/reference/standards/core.md` before workflow work, then load the other `.agents/skills/devrites-lib/reference/standards/*.md` files exactly when this skill asks for them.
|
|
13
14
|
- Use the installed `devrites-engine` binary as the canonical runtime helper surface for orientation, gates, and state mutation.
|
|
14
15
|
- **Invocation and dispatch are different:** invoke means run a skill in this context; dispatch means start a fresh agent with `spawn_agent`, await it, and reconcile its result. Never describe inline skill work as a dispatch.
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
16
|
+
- On MultiAgent V2, call `spawn_agent` with the exact named `agent_type=devrites-<role>`, a unique `task_name`, and `fork_turns="none"`. Codex loads that role TOML's `developer_instructions` natively. Because V2 collaboration lifecycle calls bypass hooks, DevRites verifies the current durable parent/child rollout for the exact role, wait, completion, and non-empty delivered result.
|
|
17
|
+
- On MultiAgent V1, when the named role is not exposed, use generic `explorer` for a read-only role with `fork_turns="none"` and name exactly one `.codex/agents/devrites-<role>.toml` contract in the message. Trusted `.codex/hooks.json` injects that contract's exact `developer_instructions` and binds the child to the fail-closed reviewer read-only guard.
|
|
18
|
+
- On MultiAgent V1, `devrites-slice-wright` uses generic `worker` with `fork_turns="none"` and the exact role TOML named in the message. Trusted `.codex/hooks.json` binds it to the active reconcile window and `.wright-allowlist`; do not substitute `worker` for an exposed V2 named role.
|
|
19
|
+
- The invoked skill's `required-agent-roles` frontmatter arms the fail-closed Stop receipt. Every listed role must have a confirmed start, wait, and non-empty result in this turn.
|
|
20
|
+
- If any required named or generic agent dispatch is unavailable or rejected, stop for HITL. Never execute a DevRites specialist role in the root context.
|
|
19
21
|
- Wait for every required fresh-context dispatch before reconciling or advancing. A backgrounded or lost result is incomplete.
|
|
20
22
|
- Codex project hooks are installed in `.codex/hooks.json`; declared-leaf hooks are scoped inside `.codex/agents/devrites-*.toml`. Review and trust them with `/hooks` before relying on hook enforcement.
|
|
21
23
|
- When this skill asks a HITL question via `AskUserQuestion`: Codex's equivalent (`request_user_input`) exists only in Plan mode. Outside Plan mode, render the option set as a plain numbered list in chat and **end the turn** so the human answers: NEVER silently pick an option yourself; auto-picking is AFK's contract, gated by the `.devrites/AFK` sentinel.
|
|
@@ -128,8 +130,8 @@ that needs more than the default pre-mortem) selected by the section's risk).
|
|
|
128
130
|
dimension still below bar after 3 is classified by decision ownership: a product/scope/risk
|
|
129
131
|
choice becomes a blocking question; an objective spec defect stays blocked with the exact
|
|
130
132
|
required edit and routes to `$rite-spec`, not `$rite-resolve`. Irreversible-risk findings
|
|
131
|
-
always pause. Use the shared capability ladder;
|
|
132
|
-
|
|
133
|
+
always pause. Use the shared capability ladder; if no fresh-agent rung is available,
|
|
134
|
+
stop for HITL. After an accepted edit to a
|
|
133
135
|
coverage-bound input, repeat step 6's revalidation and digest refresh before handoff.
|
|
134
136
|
8. **STOP.** Report the mode, the scope deltas, and the floor verdict; recommend `$rite-define`.
|
|
135
137
|
|
|
@@ -4,6 +4,7 @@ description: User-invoked semantic upgrade for an active legacy DevRites workspa
|
|
|
4
4
|
argument-hint: "[feature-slug]"
|
|
5
5
|
user-invocable: true
|
|
6
6
|
disable-model-invocation: true
|
|
7
|
+
required-agent-roles: devrites-upgrade-planner
|
|
7
8
|
---
|
|
8
9
|
|
|
9
10
|
## Codex compatibility
|
|
@@ -13,10 +14,11 @@ This is the Codex mirror of a DevRites skill. In Codex:
|
|
|
13
14
|
- Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Read `.agents/skills/devrites-lib/reference/standards/core.md` before workflow work, then load the other `.agents/skills/devrites-lib/reference/standards/*.md` files exactly when this skill asks for them.
|
|
14
15
|
- Use the installed `devrites-engine` binary as the canonical runtime helper surface for orientation, gates, and state mutation.
|
|
15
16
|
- **Invocation and dispatch are different:** invoke means run a skill in this context; dispatch means start a fresh agent with `spawn_agent`, await it, and reconcile its result. Never describe inline skill work as a dispatch.
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
17
|
+
- On MultiAgent V2, call `spawn_agent` with the exact named `agent_type=devrites-<role>`, a unique `task_name`, and `fork_turns="none"`. Codex loads that role TOML's `developer_instructions` natively. Because V2 collaboration lifecycle calls bypass hooks, DevRites verifies the current durable parent/child rollout for the exact role, wait, completion, and non-empty delivered result.
|
|
18
|
+
- On MultiAgent V1, when the named role is not exposed, use generic `explorer` for a read-only role with `fork_turns="none"` and name exactly one `.codex/agents/devrites-<role>.toml` contract in the message. Trusted `.codex/hooks.json` injects that contract's exact `developer_instructions` and binds the child to the fail-closed reviewer read-only guard.
|
|
19
|
+
- On MultiAgent V1, `devrites-slice-wright` uses generic `worker` with `fork_turns="none"` and the exact role TOML named in the message. Trusted `.codex/hooks.json` binds it to the active reconcile window and `.wright-allowlist`; do not substitute `worker` for an exposed V2 named role.
|
|
20
|
+
- The invoked skill's `required-agent-roles` frontmatter arms the fail-closed Stop receipt. Every listed role must have a confirmed start, wait, and non-empty result in this turn.
|
|
21
|
+
- If any required named or generic agent dispatch is unavailable or rejected, stop for HITL. Never execute a DevRites specialist role in the root context.
|
|
20
22
|
- Wait for every required fresh-context dispatch before reconciling or advancing. A backgrounded or lost result is incomplete.
|
|
21
23
|
- Codex project hooks are installed in `.codex/hooks.json`; declared-leaf hooks are scoped inside `.codex/agents/devrites-*.toml`. Review and trust them with `/hooks` before relying on hook enforcement.
|
|
22
24
|
- When this skill asks a HITL question via `AskUserQuestion`: Codex's equivalent (`request_user_input`) exists only in Plan mode. Outside Plan mode, render the option set as a plain numbered list in chat and **end the turn** so the human answers: NEVER silently pick an option yourself; auto-picking is AFK's contract, gated by the `.devrites/AFK` sentinel.
|
|
@@ -74,7 +76,8 @@ Plan, Vet, Converge, and Build phase contracts needed by the assessment.
|
|
|
74
76
|
devrites-engine snapshot [feature-slug]
|
|
75
77
|
```
|
|
76
78
|
If every semantic artifact names the current contract and `build-readiness` passes,
|
|
77
|
-
|
|
79
|
+
mark the candidate as a likely no-op; the fresh upgrade assessment in step 2 must
|
|
80
|
+
confirm that before reporting it.
|
|
78
81
|
1. **Freeze the preservation baseline.** Create the standard orchestrator-controlled
|
|
79
82
|
`agent-packet/v1` baseline. Include exact paths for current phase/artifact contracts,
|
|
80
83
|
`state.md`, `spec.md`, `decision-coverage.md`, `architecture.md`, `plan.md`, `tasks.md`,
|
|
@@ -3,6 +3,7 @@ name: rite-vet
|
|
|
3
3
|
description: Vet a defined plan before code with senior-engineer engineering review. Use when the user says "vet the plan", "engineering review", "lock in the plan", or before building. Not for code review or final seal.
|
|
4
4
|
argument-hint: "[slug] [--cross-model] [--full]"
|
|
5
5
|
user-invocable: true
|
|
6
|
+
required-agent-roles: devrites-plan-reviewer
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
## Codex compatibility
|
|
@@ -12,10 +13,11 @@ This is the Codex mirror of a DevRites skill. In Codex:
|
|
|
12
13
|
- Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Read `.agents/skills/devrites-lib/reference/standards/core.md` before workflow work, then load the other `.agents/skills/devrites-lib/reference/standards/*.md` files exactly when this skill asks for them.
|
|
13
14
|
- Use the installed `devrites-engine` binary as the canonical runtime helper surface for orientation, gates, and state mutation.
|
|
14
15
|
- **Invocation and dispatch are different:** invoke means run a skill in this context; dispatch means start a fresh agent with `spawn_agent`, await it, and reconcile its result. Never describe inline skill work as a dispatch.
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
16
|
+
- On MultiAgent V2, call `spawn_agent` with the exact named `agent_type=devrites-<role>`, a unique `task_name`, and `fork_turns="none"`. Codex loads that role TOML's `developer_instructions` natively. Because V2 collaboration lifecycle calls bypass hooks, DevRites verifies the current durable parent/child rollout for the exact role, wait, completion, and non-empty delivered result.
|
|
17
|
+
- On MultiAgent V1, when the named role is not exposed, use generic `explorer` for a read-only role with `fork_turns="none"` and name exactly one `.codex/agents/devrites-<role>.toml` contract in the message. Trusted `.codex/hooks.json` injects that contract's exact `developer_instructions` and binds the child to the fail-closed reviewer read-only guard.
|
|
18
|
+
- On MultiAgent V1, `devrites-slice-wright` uses generic `worker` with `fork_turns="none"` and the exact role TOML named in the message. Trusted `.codex/hooks.json` binds it to the active reconcile window and `.wright-allowlist`; do not substitute `worker` for an exposed V2 named role.
|
|
19
|
+
- The invoked skill's `required-agent-roles` frontmatter arms the fail-closed Stop receipt. Every listed role must have a confirmed start, wait, and non-empty result in this turn.
|
|
20
|
+
- If any required named or generic agent dispatch is unavailable or rejected, stop for HITL. Never execute a DevRites specialist role in the root context.
|
|
19
21
|
- Wait for every required fresh-context dispatch before reconciling or advancing. A backgrounded or lost result is incomplete.
|
|
20
22
|
- Codex project hooks are installed in `.codex/hooks.json`; declared-leaf hooks are scoped inside `.codex/agents/devrites-*.toml`. Review and trust them with `/hooks` before relying on hook enforcement.
|
|
21
23
|
- When this skill asks a HITL question via `AskUserQuestion`: Codex's equivalent (`request_user_input`) exists only in Plan mode. Outside Plan mode, render the option set as a plain numbered list in chat and **end the turn** so the human answers: NEVER silently pick an option yourself; auto-picking is AFK's contract, gated by the `.devrites/AFK` sentinel.
|
|
@@ -4,6 +4,7 @@ description: User-invoked read-only structural map of unfamiliar code: modules,
|
|
|
4
4
|
argument-hint: "[symbol | file | area to map]"
|
|
5
5
|
user-invocable: true
|
|
6
6
|
disable-model-invocation: true
|
|
7
|
+
required-agent-roles: none
|
|
7
8
|
---
|
|
8
9
|
|
|
9
10
|
## Codex compatibility
|
|
@@ -13,10 +14,11 @@ This is the Codex mirror of a DevRites skill. In Codex:
|
|
|
13
14
|
- Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Read `.agents/skills/devrites-lib/reference/standards/core.md` before workflow work, then load the other `.agents/skills/devrites-lib/reference/standards/*.md` files exactly when this skill asks for them.
|
|
14
15
|
- Use the installed `devrites-engine` binary as the canonical runtime helper surface for orientation, gates, and state mutation.
|
|
15
16
|
- **Invocation and dispatch are different:** invoke means run a skill in this context; dispatch means start a fresh agent with `spawn_agent`, await it, and reconcile its result. Never describe inline skill work as a dispatch.
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
17
|
+
- On MultiAgent V2, call `spawn_agent` with the exact named `agent_type=devrites-<role>`, a unique `task_name`, and `fork_turns="none"`. Codex loads that role TOML's `developer_instructions` natively. Because V2 collaboration lifecycle calls bypass hooks, DevRites verifies the current durable parent/child rollout for the exact role, wait, completion, and non-empty delivered result.
|
|
18
|
+
- On MultiAgent V1, when the named role is not exposed, use generic `explorer` for a read-only role with `fork_turns="none"` and name exactly one `.codex/agents/devrites-<role>.toml` contract in the message. Trusted `.codex/hooks.json` injects that contract's exact `developer_instructions` and binds the child to the fail-closed reviewer read-only guard.
|
|
19
|
+
- On MultiAgent V1, `devrites-slice-wright` uses generic `worker` with `fork_turns="none"` and the exact role TOML named in the message. Trusted `.codex/hooks.json` binds it to the active reconcile window and `.wright-allowlist`; do not substitute `worker` for an exposed V2 named role.
|
|
20
|
+
- The invoked skill's `required-agent-roles` frontmatter arms the fail-closed Stop receipt. Every listed role must have a confirmed start, wait, and non-empty result in this turn.
|
|
21
|
+
- If any required named or generic agent dispatch is unavailable or rejected, stop for HITL. Never execute a DevRites specialist role in the root context.
|
|
20
22
|
- Wait for every required fresh-context dispatch before reconciling or advancing. A backgrounded or lost result is incomplete.
|
|
21
23
|
- Codex project hooks are installed in `.codex/hooks.json`; declared-leaf hooks are scoped inside `.codex/agents/devrites-*.toml`. Review and trust them with `/hooks` before relying on hook enforcement.
|
|
22
24
|
- When this skill asks a HITL question via `AskUserQuestion`: Codex's equivalent (`request_user_input`) exists only in Plan mode. Outside Plan mode, render the option set as a plain numbered list in chat and **end the turn** so the human answers: NEVER silently pick an option yourself; auto-picking is AFK's contract, gated by the `.devrites/AFK` sentinel.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devrites",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.4",
|
|
4
4
|
"description": "DevRites: a disciplined senior-engineer workflow pack for Claude Code and Codex",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"homepage": "https://github.com/ViktorsBaikers/DevRites#readme",
|
|
@@ -60,10 +60,11 @@ gen_codex_skill_file() {
|
|
|
60
60
|
print "- Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Read `.agents/skills/devrites-lib/reference/standards/core.md` before workflow work, then load the other `.agents/skills/devrites-lib/reference/standards/*.md` files exactly when this skill asks for them."
|
|
61
61
|
print "- Use the installed `devrites-engine` binary as the canonical runtime helper surface for orientation, gates, and state mutation."
|
|
62
62
|
print "- **Invocation and dispatch are different:** invoke means run a skill in this context; dispatch means start a fresh agent with `spawn_agent`, await it, and reconcile its result. Never describe inline skill work as a dispatch."
|
|
63
|
-
print "-
|
|
64
|
-
print "-
|
|
65
|
-
print "-
|
|
66
|
-
print "-
|
|
63
|
+
print "- On MultiAgent V2, call `spawn_agent` with the exact named `agent_type=devrites-<role>`, a unique `task_name`, and `fork_turns=\"none\"`. Codex loads that role TOML'\''s `developer_instructions` natively. Because V2 collaboration lifecycle calls bypass hooks, DevRites verifies the current durable parent/child rollout for the exact role, wait, completion, and non-empty delivered result."
|
|
64
|
+
print "- On MultiAgent V1, when the named role is not exposed, use generic `explorer` for a read-only role with `fork_turns=\"none\"` and name exactly one `.codex/agents/devrites-<role>.toml` contract in the message. Trusted `.codex/hooks.json` injects that contract'\''s exact `developer_instructions` and binds the child to the fail-closed reviewer read-only guard."
|
|
65
|
+
print "- On MultiAgent V1, `devrites-slice-wright` uses generic `worker` with `fork_turns=\"none\"` and the exact role TOML named in the message. Trusted `.codex/hooks.json` binds it to the active reconcile window and `.wright-allowlist`; do not substitute `worker` for an exposed V2 named role."
|
|
66
|
+
print "- The invoked skill'\''s `required-agent-roles` frontmatter arms the fail-closed Stop receipt. Every listed role must have a confirmed start, wait, and non-empty result in this turn."
|
|
67
|
+
print "- If any required named or generic agent dispatch is unavailable or rejected, stop for HITL. Never execute a DevRites specialist role in the root context."
|
|
67
68
|
print "- Wait for every required fresh-context dispatch before reconciling or advancing. A backgrounded or lost result is incomplete."
|
|
68
69
|
print "- Codex project hooks are installed in `.codex/hooks.json`; declared-leaf hooks are scoped inside `.codex/agents/devrites-*.toml`. Review and trust them with `/hooks` before relying on hook enforcement."
|
|
69
70
|
print "- When this skill asks a HITL question via `AskUserQuestion`: Codex'\''s equivalent (`request_user_input`) exists only in Plan mode. Outside Plan mode, render the option set as a plain numbered list in chat and **end the turn** so the human answers: NEVER silently pick an option yourself; auto-picking is AFK'\''s contract, gated by the `.devrites/AFK` sentinel."
|
|
@@ -78,7 +79,7 @@ gen_codex_skill_file() {
|
|
|
78
79
|
print ""
|
|
79
80
|
print "## Codex compatibility"
|
|
80
81
|
print ""
|
|
81
|
-
print "Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Invocation runs a skill inline; dispatch starts a fresh agent with `spawn_agent` and must be awaited.
|
|
82
|
+
print "Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Invocation runs a skill inline; dispatch starts a fresh agent with `spawn_agent` and must be awaited. On V2 use the exact named `agent_type=devrites-<role>`, a unique `task_name`, and `fork_turns=\"none\"`; on V1 use guarded `explorer`/`worker` with the unchanged packet and exact role TOML. If any required dispatch is unavailable or rejected, stop for HITL; never execute the specialist role in the root context."
|
|
82
83
|
}
|
|
83
84
|
}
|
|
84
85
|
' "$_src" > "$_tmp"
|
|
@@ -170,10 +171,8 @@ This project has DevRites installed for both Claude Code and Codex.
|
|
|
170
171
|
- Before using any DevRites workflow skill, read `.agents/skills/devrites-lib/reference/standards/core.md`. Load other `.agents/skills/devrites-lib/reference/standards/*.md` files when the skill or rule index asks for them. These are DevRites engineering standards, not Codex exec-policy `.rules` files.
|
|
171
172
|
- Custom Codex subagents generated from the DevRites review agents live in `.codex/agents`.
|
|
172
173
|
- In DevRites guidance, **invoke** means run a skill inline in the current context; **dispatch** means start a fresh agent with `spawn_agent`, wait for it, and reconcile its result.
|
|
173
|
-
-
|
|
174
|
-
-
|
|
175
|
-
- For `devrites-slice-wright`, trusted `.codex/hooks.json` binds generic `worker` (`agent_type=worker`) to the active reconcile window and exact `.wright-allowlist`. Dispatch it with `fork_turns="none"`, the unchanged packet, and `.codex/agents/devrites-slice-wright.toml`.
|
|
176
|
-
- A missing custom role is not evidence that spawning is unavailable. Use the labelled inline `.reconcile-inline` path only when project hooks are unavailable or untrusted, spawning is unavailable, or higher-priority policy rejects the safe rung.
|
|
174
|
+
- Follow the invoked skill's generated **Codex compatibility** section for exact dispatch mechanics: V2 uses the named `devrites-<role>`; V1 alone may use the guarded generic compatibility path. Both use `fork_turns="none"`.
|
|
175
|
+
- The invoked skill's `required-agent-roles` frontmatter arms a fail-closed receipt. If a required dispatch is unavailable or rejected, stop for HITL; never execute a DevRites specialist role in the root context.
|
|
177
176
|
- Claude Code agent hook metadata is not active in Codex. The generated Codex agents preserve read-only intent with Codex sandbox settings where possible; still follow DevRites' scope and no-mutation rules explicitly.
|
|
178
177
|
|
|
179
178
|
## Workflow contract
|
|
@@ -211,14 +210,19 @@ gen_codex_hooks_json() {
|
|
|
211
210
|
"hooks": [
|
|
212
211
|
{
|
|
213
212
|
"type": "command",
|
|
214
|
-
"command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec devrites-engine hook a1-guard --harness=codex",
|
|
213
|
+
"command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec env DEVRITES_A1_HOOK=enforce devrites-engine hook a1-guard --harness=codex",
|
|
215
214
|
"statusMessage": "DevRites: checking build write boundary"
|
|
216
215
|
}
|
|
217
216
|
]
|
|
218
217
|
},
|
|
219
218
|
{
|
|
220
|
-
"matcher": "Bash|Shell|sh|exec_command|run_command|Edit|Write|MultiEdit|NotebookEdit|apply_patch|exec|js|python|computer|computer_use|write_stdin|run_code|Agent|Task|spawn_agent|delegate|dispatch_agent|create_agent",
|
|
219
|
+
"matcher": "Bash|Shell|sh|exec_command|run_command|Edit|Write|MultiEdit|NotebookEdit|apply_patch|exec|js|python|computer|computer_use|write_stdin|run_code|Agent|Task|spawn_agent|delegate|dispatch_agent|create_agent|wait|wait_agent",
|
|
221
220
|
"hooks": [
|
|
221
|
+
{
|
|
222
|
+
"type": "command",
|
|
223
|
+
"command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec devrites-engine hook agent-dispatch --harness=codex",
|
|
224
|
+
"statusMessage": "DevRites: verifying agent dispatch receipt"
|
|
225
|
+
},
|
|
222
226
|
{
|
|
223
227
|
"type": "command",
|
|
224
228
|
"command": "payload=\"$(cat)\"; if ! command -v devrites-engine >/dev/null 2>&1; then if printf '%s' \"$payload\" | grep -Eq '\"agent_type\"[[:space:]]*:[[:space:]]*\"(explorer|worker)\"'; then printf '%s\\n' 'DevRites: generic Codex leaf guard unavailable; install or repair devrites-engine. (devrites-codex-generic-guard)' >&2; exit 2; fi; exit 0; fi; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || { printf '%s\\n' 'DevRites: cannot resolve the project root for a generic Codex leaf. (devrites-codex-generic-guard)' >&2; exit 2; }; printf '%s' \"$payload\" | DEVRITES_CODEX_GENERIC_AGENT_COMPAT=1 devrites-engine hook reviewer-readonly --harness=codex; rc=$?; case \"$rc\" in 0) exit 0 ;; 2) exit 2 ;; *) printf '%s\\n' 'DevRites: generic Codex reviewer guard unavailable or crashed; install or repair devrites-engine. (devrites-codex-generic-guard)' >&2; exit 2 ;; esac",
|
|
@@ -256,6 +260,15 @@ gen_codex_hooks_json() {
|
|
|
256
260
|
}
|
|
257
261
|
],
|
|
258
262
|
"Stop": [
|
|
263
|
+
{
|
|
264
|
+
"hooks": [
|
|
265
|
+
{
|
|
266
|
+
"type": "command",
|
|
267
|
+
"command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec devrites-engine hook agent-dispatch --harness=codex",
|
|
268
|
+
"statusMessage": "DevRites: checking agent completion receipt"
|
|
269
|
+
}
|
|
270
|
+
]
|
|
271
|
+
},
|
|
259
272
|
{
|
|
260
273
|
"hooks": [
|
|
261
274
|
{
|
|
@@ -278,6 +291,10 @@ gen_codex_hooks_json() {
|
|
|
278
291
|
"UserPromptSubmit": [
|
|
279
292
|
{
|
|
280
293
|
"hooks": [
|
|
294
|
+
{
|
|
295
|
+
"type": "command",
|
|
296
|
+
"command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec devrites-engine hook agent-dispatch --harness=codex"
|
|
297
|
+
},
|
|
281
298
|
{
|
|
282
299
|
"type": "command",
|
|
283
300
|
"command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec devrites-engine hook cursor --harness=codex"
|
|
@@ -287,7 +304,7 @@ gen_codex_hooks_json() {
|
|
|
287
304
|
],
|
|
288
305
|
"SubagentStart": [
|
|
289
306
|
{
|
|
290
|
-
"matcher": "devrites
|
|
307
|
+
"matcher": "devrites-.*|explorer|worker",
|
|
291
308
|
"hooks": [
|
|
292
309
|
{
|
|
293
310
|
"type": "command",
|
|
@@ -317,11 +334,12 @@ gen_codex_hooks_json() {
|
|
|
317
334
|
],
|
|
318
335
|
"SubagentStop": [
|
|
319
336
|
{
|
|
320
|
-
"matcher": "devrites
|
|
337
|
+
"matcher": "devrites-.*|explorer|worker",
|
|
321
338
|
"hooks": [
|
|
322
339
|
{
|
|
323
340
|
"type": "command",
|
|
324
|
-
"command": "
|
|
341
|
+
"command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec devrites-engine hook agent-dispatch --harness=codex",
|
|
342
|
+
"statusMessage": "DevRites: recording subagent result"
|
|
325
343
|
},
|
|
326
344
|
{
|
|
327
345
|
"type": "command",
|
|
@@ -345,8 +363,4 @@ gen_codex_hooks_json() {
|
|
|
345
363
|
}
|
|
346
364
|
}
|
|
347
365
|
EOF
|
|
348
|
-
# Codex has no SessionEnd hook event. Its lifecycle events are
|
|
349
|
-
# SessionStart/SubagentStart/PreToolUse/PermissionRequest/PostToolUse/PreCompact/
|
|
350
|
-
# PostCompact/UserPromptSubmit/SubagentStop/Stop. The `hook event session-end`
|
|
351
|
-
# trace remains Claude-only until Codex adds that event.
|
|
352
366
|
}
|
|
@@ -33,8 +33,8 @@ tools="Agent,Read,Glob,Grep"
|
|
|
33
33
|
if [ "$role_class" = "wright" ]; then
|
|
34
34
|
tools="$tools,Edit,Write,Bash"
|
|
35
35
|
fi
|
|
36
|
-
if [ "$simulate" = "
|
|
37
|
-
|
|
36
|
+
if [ "$simulate" = "dispatch-unavailable" ]; then
|
|
37
|
+
exit 0
|
|
38
38
|
fi
|
|
39
39
|
schema="$(cat "$DIR/agent-result.schema.json")"
|
|
40
40
|
mkdir -p "$XDG_CONFIG_HOME/claude"
|
|
@@ -27,6 +27,10 @@ actual_version="$(env -i "PATH=$PATH" "LANG=C" "LC_ALL=C" codex --version 2>/dev
|
|
|
27
27
|
[ "$actual_version" = "$DEVRITES_CONTRACT_HOST_VERSION_PIN" ] \
|
|
28
28
|
|| contract_die "Codex version pin changed"
|
|
29
29
|
|
|
30
|
+
simulate="$(python3 "$CONTRACT_HELPER" field simulate)"
|
|
31
|
+
if [ "$simulate" = "dispatch-unavailable" ]; then
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
30
34
|
role_class="$(python3 "$CONTRACT_HELPER" field role_class)"
|
|
31
35
|
sandbox="read-only"
|
|
32
36
|
if [ "$role_class" = "wright" ]; then
|
|
@@ -132,11 +132,6 @@ def mode_and_reasons(simulate: str) -> tuple[str, str, bool, str, str, str]:
|
|
|
132
132
|
if simulate == "generic-fallback":
|
|
133
133
|
mode = "generic"
|
|
134
134
|
dispatch = "DRV-AGENT-GENERIC-FALLBACK"
|
|
135
|
-
elif simulate == "inline-fallback":
|
|
136
|
-
mode = "inline"
|
|
137
|
-
guard = "observed"
|
|
138
|
-
independence = False
|
|
139
|
-
dispatch = "DRV-AGENT-INLINE-FALLBACK"
|
|
140
135
|
elif simulate in {"reviewer-denied", "wright-denied"}:
|
|
141
136
|
result = "DRV-AGENT-RESULT-OUT-OF-SCOPE"
|
|
142
137
|
outcome = "denied"
|
|
@@ -152,7 +147,7 @@ def run() -> int:
|
|
|
152
147
|
packet = json.loads(packet_path.read_text(encoding="utf-8"))
|
|
153
148
|
simulate = packet["simulate"]
|
|
154
149
|
fault = os.environ.get("DEVRITES_CONTRACT_FAKE_FAULT", "")
|
|
155
|
-
if simulate
|
|
150
|
+
if simulate in {"dispatch-unavailable", "missing"}:
|
|
156
151
|
return 0
|
|
157
152
|
if simulate == "malformed":
|
|
158
153
|
result_path.write_text("not-json-compatible-yaml\n", encoding="utf-8")
|
|
@@ -170,8 +165,6 @@ def run() -> int:
|
|
|
170
165
|
signals.add("declared_side_effects")
|
|
171
166
|
elif simulate == "generic-fallback":
|
|
172
167
|
signals.add("fresh_context")
|
|
173
|
-
elif simulate == "inline-fallback":
|
|
174
|
-
signals.add("inline_labelled")
|
|
175
168
|
elif simulate == "reviewer-denied":
|
|
176
169
|
signals.add("mutation_denied")
|
|
177
170
|
elif simulate == "wright-denied":
|
|
@@ -207,7 +207,6 @@ def interrupted() -> int:
|
|
|
207
207
|
dispatch = {
|
|
208
208
|
"named": "DRV-AGENT-NAMED",
|
|
209
209
|
"generic": "DRV-AGENT-GENERIC-FALLBACK",
|
|
210
|
-
"inline": "DRV-AGENT-INLINE-FALLBACK",
|
|
211
210
|
}[mode]
|
|
212
211
|
result = {
|
|
213
212
|
"result_version": value["result_schema"],
|
|
@@ -233,7 +232,7 @@ def interrupted() -> int:
|
|
|
233
232
|
"execution": {
|
|
234
233
|
"mode": mode,
|
|
235
234
|
"guard_strength": value["expected_guard"],
|
|
236
|
-
"independence":
|
|
235
|
+
"independence": True,
|
|
237
236
|
},
|
|
238
237
|
"signals": sorted(
|
|
239
238
|
MANDATORY_SIGNALS | {"progress_recorded", "partial_metadata"}
|