devrites 3.2.3 → 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 CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  All notable changes to DevRites are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and DevRites adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Releases are generated automatically by [semantic-release](https://semantic-release.gitbook.io/) from Conventional Commits on `main`.
4
4
 
5
+ ## [3.2.4](https://github.com/ViktorsBaikers/DevRites/compare/v3.2.3...v3.2.4) (2026-07-25)
6
+
7
+ ### Fixed
8
+
9
+ * **agents:** handle hidden v2 agent_type schema ([31ece9a](https://github.com/ViktorsBaikers/DevRites/commit/31ece9aad686fa3a3fa0308d5a3ede11f5b58c07))
10
+
5
11
  ## [3.2.3](https://github.com/ViktorsBaikers/DevRites/compare/v3.2.2...v3.2.3) (2026-07-25)
6
12
 
7
13
  ### Fixed
package/README.md CHANGED
@@ -25,7 +25,7 @@ final commit, push, and tag, and it requires a typed `GO` confirmation.
25
25
  Unattended runs may create local WIP checkpoint commits along the way, but only
26
26
  Ship collapses and pushes them.
27
27
 
28
- **Status:** [`v3.2.3`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v3.2.3): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
28
+ **Status:** [`v3.2.4`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v3.2.4): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
29
29
 
30
30
  ## Quick start
31
31
 
@@ -802,7 +802,7 @@ func incompleteDispatchReason(armed map[string]struct{}, attempts []*agentDispat
802
802
  return "DevRites could not determine this skill's required agents because its installed required-agent-roles contract is invalid. Reinstall or repair the DevRites skill pack before continuing."
803
803
  }
804
804
  return fmt.Sprintf(
805
- "DevRites dispatch for %s is not complete. On MultiAgent V2 call spawn_agent with agent_type=%s, a unique task_name, and fork_turns=\"none\" so Codex loads .codex/agents/%s.toml natively. On V1 use agent_type=%s with fork_turns=\"none\" and name that role TOML in the message. Wait for the returned child and use its non-empty result. Do not call wait before spawn_agent and do not synthesize the agent result.",
805
+ "DevRites dispatch for %s is not complete. On MultiAgent V2 call spawn_agent with agent_type=%s, a unique task_name, and fork_turns=\"none\" so Codex loads .codex/agents/%s.toml natively. GPT-5.6 V2 may omit agent_type from the visible tool schema even though the runtime accepts it; send agent_type anyway rather than using a default child. On V1 use agent_type=%s with fork_turns=\"none\" and name that role TOML in the message. Wait for the returned child and use its non-empty result. Do not call wait before spawn_agent and do not synthesize the agent result.",
806
806
  role, role, role, expectedAgentType(role),
807
807
  )
808
808
  }
@@ -1218,7 +1218,10 @@ func TestCodexAgentDispatchBlocksFalseWaitAndStop(t *testing.T) {
1218
1218
  if err := json.Unmarshal([]byte(strings.TrimSpace(out)), &stopDecision); err != nil {
1219
1219
  t.Fatalf("invalid Stop response: %v\n%s", err, out)
1220
1220
  }
1221
- if stopDecision.Decision != "block" || !strings.Contains(stopDecision.Reason, "spawn_agent") {
1221
+ if stopDecision.Decision != "block" ||
1222
+ !strings.Contains(stopDecision.Reason, "spawn_agent") ||
1223
+ !strings.Contains(stopDecision.Reason, "visible tool schema") ||
1224
+ !strings.Contains(stopDecision.Reason, "send agent_type anyway") {
1222
1225
  t.Fatalf("false completion not blocked: %#v", stopDecision)
1223
1226
  }
1224
1227
 
@@ -67,11 +67,12 @@ field from the installed skill at `UserPromptSubmit` and arms a fail-closed comp
67
67
  receipt for every listed role; the engine derives roles from skill metadata.
68
68
  Conditional scouts and reviewers remain owned by their explicit phase triggers.
69
69
 
70
- Claude uses `Agent` (`Task` alias); Codex uses `spawn_agent`. V2 sends the exact named
71
- role, a unique `task_name`, and `fork_turns="none"`; Codex loads its TOML natively.
72
- Because V2 lifecycle calls bypass hooks, Stop/reconcile verify the durable rollout's
73
- role, instructions, wait, completion, and delivered result. V1 uses guarded
74
- `explorer`/`worker` with injected rules and a lifecycle receipt. Prose isn't evidence.
70
+ Claude: `Agent`; Codex: `spawn_agent`. V2 calls the named `agent_type` with
71
+ unique `task_name` and `fork_turns="none"`. GPT-5.6 may hide `agent_type` from the
72
+ schema, but runtime accepts it and loads the TOML; never use `default`. V2 bypasses
73
+ hooks, so Stop/reconcile verify role, native instructions, wait, completion, and result.
74
+ V1 uses guarded `explorer`/`worker` with injected rules and receipt. Prose
75
+ isn't evidence.
75
76
 
76
77
  ## File-backed dispatch contract
77
78
 
@@ -67,11 +67,12 @@ field from the installed skill at `UserPromptSubmit` and arms a fail-closed comp
67
67
  receipt for every listed role; the engine derives roles from skill metadata.
68
68
  Conditional scouts and reviewers remain owned by their explicit phase triggers.
69
69
 
70
- Claude uses `Agent` (`Task` alias); Codex uses `spawn_agent`. V2 sends the exact named
71
- role, a unique `task_name`, and `fork_turns="none"`; Codex loads its TOML natively.
72
- Because V2 lifecycle calls bypass hooks, Stop/reconcile verify the durable rollout's
73
- role, instructions, wait, completion, and delivered result. V1 uses guarded
74
- `explorer`/`worker` with injected rules and a lifecycle receipt. Prose isn't evidence.
70
+ Claude: `Agent`; Codex: `spawn_agent`. V2 calls the named `agent_type` with
71
+ unique `task_name` and `fork_turns="none"`. GPT-5.6 may hide `agent_type` from the
72
+ schema, but runtime accepts it and loads the TOML; never use `default`. V2 bypasses
73
+ hooks, so Stop/reconcile verify role, native instructions, wait, completion, and result.
74
+ V1 uses guarded `explorer`/`worker` with injected rules and receipt. Prose
75
+ isn't evidence.
75
76
 
76
77
  ## File-backed dispatch contract
77
78
 
@@ -67,11 +67,12 @@ field from the installed skill at `UserPromptSubmit` and arms a fail-closed comp
67
67
  receipt for every listed role; the engine derives roles from skill metadata.
68
68
  Conditional scouts and reviewers remain owned by their explicit phase triggers.
69
69
 
70
- Claude uses `Agent` (`spawn_agent` alias); Codex uses `spawn_agent`. V2 sends the exact named
71
- role, a unique `task_name`, and `fork_turns="none"`; Codex loads its TOML natively.
72
- Because V2 lifecycle calls bypass hooks, Stop/reconcile verify the durable rollout's
73
- role, instructions, wait, completion, and delivered result. V1 uses guarded
74
- `explorer`/`worker` with injected rules and a lifecycle receipt. Prose isn't evidence.
70
+ Claude: `Agent`; Codex: `spawn_agent`. V2 calls the named `agent_type` with
71
+ unique `task_name` and `fork_turns="none"`. GPT-5.6 may hide `agent_type` from the
72
+ schema, but runtime accepts it and loads the TOML; never use `default`. V2 bypasses
73
+ hooks, so Stop/reconcile verify role, native instructions, wait, completion, and result.
74
+ V1 uses guarded `explorer`/`worker` with injected rules and receipt. Prose
75
+ isn't evidence.
75
76
 
76
77
  ## File-backed dispatch contract
77
78
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devrites",
3
- "version": "3.2.3",
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",