arkaos 3.74.0 → 3.74.1

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/VERSION CHANGED
@@ -1 +1 @@
1
- 3.74.0
1
+ 3.74.1
@@ -150,12 +150,20 @@ For each item, in order:
150
150
  injection, missing auth, data exposure.
151
151
  - Fail → back to the todo.
152
152
  5. **Quality Gate** — Marta (CQO) orchestrates the right specialists
153
- for the area. After Marta returns the verdict, the orchestrator MUST
154
- call `core.governance.cqo_experience_recorder.record_from_verdict(...)`
155
- when verdict is REJECTED (constitution rule `agent-experience-persistence`,
156
- MUST level PR3 v3.74.0). The recorder parses the blockers and writes
157
- one Experience to the failing agent's log so the lesson is visible on
158
- the next dispatch via the L2.6 Synapse layer. If a specialist is
153
+ for the area.
154
+
155
+ **CQO dispatch convention (PR3.5 v3.74.1):** when invoking the `cqo`
156
+ subagent, the orchestrator MUST include the marker
157
+ `[arka:reviewing <agent_id>]` in the dispatch prompt, naming the
158
+ agent whose work is under review (e.g.
159
+ `[arka:reviewing tech-lead-paulo]`). On a REJECTED verdict, the
160
+ PostToolUse hook `config/hooks/post-tool-use.sh` reads the marker
161
+ plus the verdict text and auto-appends an `Experience` to that
162
+ agent's log — closing the QG learning loop without manual
163
+ bookkeeping. The L2.6 Synapse layer
164
+ (`core/synapse/agent_experiences_layer.py`) injects the lessons
165
+ into the next dispatch automatically. APPROVED verdicts produce no
166
+ record (only failures are lessons). If a specialist is
159
167
  missing, stop and advise the user
160
168
  to create one via `/arka personas` + provide the knowledge.
161
169
  - Fail → back to the todo.
@@ -122,6 +122,19 @@ ownership:
122
122
  owners: [devops-eng]
123
123
  reason: "Infrastructure-as-code requires devops specialist"
124
124
 
125
+ # PR3.5 v3.74.1 — installer + dashboard launcher coverage
126
+ - pattern: "installer/**/*.js"
127
+ owners: [devops-eng, senior-dev]
128
+ reason: "npx arkaos installer surface requires devops + backend review"
129
+
130
+ - pattern: "scripts/start-dashboard*"
131
+ owners: [devops-eng]
132
+ reason: "Dashboard launcher is operational devops surface"
133
+
134
+ - pattern: "scripts/dashboard-api.py"
135
+ owners: [devops-eng, senior-dev]
136
+ reason: "Dashboard API backend bridges installer ops + Python service code"
137
+
125
138
  # ─── Core architecture ──────────────────────────────────────────────
126
139
  - pattern: "core/workflow/**/*.py"
127
140
  owners: [architect, senior-dev]
@@ -72,6 +72,49 @@ except Exception:
72
72
  fi
73
73
  fi
74
74
 
75
+ # ─── CQO REJECTED auto-record (PR3.5 v3.74.1) ────────────────────────
76
+ # When a Task/Agent dispatch to subagent_type=cqo returns
77
+ # `Quality Gate Verdict: REJECTED`, append an Experience to the
78
+ # failing agent's log. The agent under review is identified by the
79
+ # `[arka:reviewing <agent_id>]` marker that the orchestrator MUST
80
+ # include in the CQO dispatch prompt (constitution rule
81
+ # `agent-experience-persistence`). Never blocks the hook.
82
+ if [ "$TOOL_NAME" = "Task" ] || [ "$TOOL_NAME" = "Agent" ]; then
83
+ SUBAGENT_TYPE=$(echo "$input" | jq -r '.tool_input.subagent_type // ""' 2>/dev/null)
84
+ if [ "$SUBAGENT_TYPE" = "cqo" ] && echo "$TOOL_OUTPUT" | grep -qE 'Quality Gate Verdict:[[:space:]]*REJECTED'; then
85
+ TOOL_INPUT_PROMPT=$(echo "$input" | jq -r '.tool_input.prompt // ""' 2>/dev/null)
86
+ REVIEWING_TARGET=$(printf '%s' "$TOOL_INPUT_PROMPT" \
87
+ | grep -oE '\[arka:reviewing[[:space:]]+[A-Za-z0-9_.-]+\]' \
88
+ | head -1 \
89
+ | sed -E 's/.*\[arka:reviewing[[:space:]]+([A-Za-z0-9_.-]+)\].*/\1/')
90
+ if [ -n "$REVIEWING_TARGET" ]; then
91
+ _AE_ROOT="${ARKAOS_ROOT:-}"
92
+ if [ -z "$_AE_ROOT" ] && [ -f "$HOME/.arkaos/.repo-path" ]; then
93
+ _AE_ROOT=$(cat "$HOME/.arkaos/.repo-path" 2>/dev/null)
94
+ fi
95
+ [ -z "$_AE_ROOT" ] && _AE_ROOT="$HOME/.arkaos"
96
+ VERDICT_TEXT="$TOOL_OUTPUT" \
97
+ AGENT_ID="$REVIEWING_TARGET" \
98
+ SESSION_ID="$SESSION_ID_PTU" \
99
+ ARKAOS_ROOT="$_AE_ROOT" \
100
+ python3 - <<'PY' 2>/dev/null || true
101
+ import os, sys
102
+ sys.path.insert(0, os.environ["ARKAOS_ROOT"])
103
+ try:
104
+ from core.governance.cqo_experience_recorder import record_from_verdict
105
+ record_from_verdict(
106
+ verdict_text=os.environ.get("VERDICT_TEXT", ""),
107
+ agent_id=os.environ.get("AGENT_ID", ""),
108
+ session_id=os.environ.get("SESSION_ID", ""),
109
+ context="auto-recorded via PostToolUse hook (cqo dispatch REJECTED)",
110
+ )
111
+ except Exception:
112
+ pass
113
+ PY
114
+ fi
115
+ fi
116
+ fi
117
+
75
118
  # Only process if there was an error
76
119
  if [ "$EXIT_CODE" = "0" ] || [ -z "$EXIT_CODE" ]; then
77
120
  # Also check for error patterns in output even with exit code 0
@@ -187,6 +187,7 @@ def create_default_engine(
187
187
  ForgeContextLayer,
188
188
  SessionContextLayer,
189
189
  )
190
+ from core.synapse.agent_experiences_layer import AgentExperiencesLayer
190
191
 
191
192
  engine = SynapseEngine()
192
193
 
@@ -194,6 +195,10 @@ def create_default_engine(
194
195
  engine.register_layer(l0)
195
196
  engine.register_layer(DepartmentLayer())
196
197
  engine.register_layer(AgentLayer(agents_registry=agents_registry))
198
+ # L2.6 (PR3.5 v3.74.1) — injects past Quality Gate experiences for the
199
+ # specialist named in `[arka:dispatch]`, so dispatched agents inherit
200
+ # prior REJECTED lessons across sessions. Closes the PR3 loop.
201
+ engine.register_layer(AgentExperiencesLayer())
197
202
  if vector_store is not None or kb_vault_path:
198
203
  engine.register_layer(
199
204
  KBContextLayer(
package/installer/cli.js CHANGED
@@ -21,6 +21,10 @@ const { values, positionals } = parseArgs({
21
21
  force: { type: "boolean", short: "f" },
22
22
  "no-system": { type: "boolean" },
23
23
  "with-ollama": { type: "boolean" },
24
+ // PR3.5 v3.74.1 — declared so `npx arkaos doctor --fix` lands in
25
+ // `values.fix` rather than as a free positional under strict:false.
26
+ // Eliminates the dead-branch fallback flagged by Marta in PR2's QG.
27
+ fix: { type: "boolean" },
24
28
  },
25
29
  allowPositionals: true,
26
30
  strict: false,
@@ -94,8 +98,7 @@ async function main() {
94
98
 
95
99
  case "doctor": {
96
100
  const { doctor } = await import("./doctor.js");
97
- const fixMode = positionals.slice(1).includes("--fix") || values.fix === true;
98
- await doctor({ fix: fixMode });
101
+ await doctor({ fix: values.fix === true });
99
102
  break;
100
103
  }
101
104
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkaos",
3
- "version": "3.74.0",
3
+ "version": "3.74.1",
4
4
  "description": "The Operating System for AI Agent Teams",
5
5
  "type": "module",
6
6
  "bin": {
package/pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "arkaos-core"
3
- version = "3.74.0"
3
+ version = "3.74.1"
4
4
  description = "Core engine for ArkaOS — The Operating System for AI Agent Teams"
5
5
  readme = "README.md"
6
6
  license = {text = "MIT"}