arkaos 4.42.0 → 4.43.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/THE-ARKAOS-GUIDE.md +1 -1
- package/VERSION +1 -1
- package/arka/skills/checkpoint/SKILL.md +10 -3
- package/arka/skills/flow/SKILL.md +4 -0
- package/config/claude-agents/eduardo-copy.md +13 -2
- package/config/claude-agents/francisca-tech.md +12 -2
- package/config/claude-agents/marta-cqo.md +63 -13
- package/config/constitution.yaml +4 -1
- package/core/evals/record_cli.py +13 -8
- package/core/governance/aggregate_guard.py +178 -43
- package/core/governance/qg_verdict.py +56 -2
- package/core/governance/reviewer_ledger.py +34 -0
- package/core/hooks/session_end.py +16 -0
- package/departments/quality/SKILL.md +33 -16
- package/harness/codex/AGENTS.md +1 -1
- package/harness/copilot/copilot-instructions.md +1 -1
- package/harness/cursor/rules/arkaos.mdc +2 -2
- package/harness/gemini/GEMINI.md +1 -1
- package/harness/opencode/AGENTS.md +1 -1
- package/harness/opencode/agents/arka-architect-gabriel.md +1 -1
- package/harness/opencode/agents/arka-brand-director-valentina.md +1 -1
- package/harness/opencode/agents/arka-cfo-helena.md +1 -1
- package/harness/opencode/agents/arka-chief-of-staff-afonso.md +1 -1
- package/harness/opencode/agents/arka-community-strategist-beatriz.md +1 -1
- package/harness/opencode/agents/arka-content-strategist-rafael.md +1 -1
- package/harness/opencode/agents/arka-conversion-strategist-ines.md +1 -1
- package/harness/opencode/agents/arka-coo-sofia.md +1 -1
- package/harness/opencode/agents/arka-copy-director-eduardo.md +1 -1
- package/harness/opencode/agents/arka-cqo-marta.md +1 -1
- package/harness/opencode/agents/arka-cto-marco.md +1 -1
- package/harness/opencode/agents/arka-design-ops-lead-iris.md +1 -1
- package/harness/opencode/agents/arka-ecom-director-ricardo.md +1 -1
- package/harness/opencode/agents/arka-knowledge-director-clara.md +1 -1
- package/harness/opencode/agents/arka-leadership-director-rodrigo.md +1 -1
- package/harness/opencode/agents/arka-marketing-director-luna.md +1 -1
- package/harness/opencode/agents/arka-ops-lead-daniel.md +1 -1
- package/harness/opencode/agents/arka-pm-director-carolina.md +1 -1
- package/harness/opencode/agents/arka-revops-lead-vicente.md +1 -1
- package/harness/opencode/agents/arka-saas-strategist-tiago.md +1 -1
- package/harness/opencode/agents/arka-sales-director-miguel.md +1 -1
- package/harness/opencode/agents/arka-strategy-director-tomas.md +1 -1
- package/harness/opencode/agents/arka-tech-director-francisca.md +1 -1
- package/harness/opencode/agents/arka-tech-lead-paulo.md +1 -1
- package/harness/opencode/agents/arka-video-producer-simao.md +1 -1
- package/harness/zed/.rules +1 -1
- package/knowledge/skills-manifest.json +1 -1
- package/package.json +1 -1
- package/pyproject.toml +1 -1
package/THE-ARKAOS-GUIDE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# The ArkaOS Guide
|
|
2
2
|
|
|
3
|
-
> v4.
|
|
3
|
+
> v4.43.0 — 89 agents, 17 departments, 332 skills, 297 commands, 18 ADRs.
|
|
4
4
|
> One file, everything you need to start. Generated by `scripts/guide_gen.py` — never hand-edited.
|
|
5
5
|
|
|
6
6
|
## What it is
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
4.
|
|
1
|
+
4.43.0
|
|
@@ -53,7 +53,12 @@ Any work item whose execution would block the user for **> 30 seconds**
|
|
|
53
53
|
Per the brainstorm (Marta + Tomas):
|
|
54
54
|
|
|
55
55
|
- **Technical conflicts** between reviewers (e.g. Eduardo + Francisca
|
|
56
|
-
disagree on a code-style call) → Marta resolves
|
|
56
|
+
disagree on a code-style call) → Marta resolves ON THE RECORD:
|
|
57
|
+
evidence decides (reproduce the claim, cite the reproduction), and
|
|
58
|
+
the resolution lands in her verdict notes. A blocker backed by
|
|
59
|
+
evidence is fixed or REFUTED with a substantive reason — never
|
|
60
|
+
dropped silently (constitution `inter-agent-checkpoints` enforcement
|
|
61
|
+
+ `evidence-flow`; the aggregate guard enforces the bar).
|
|
57
62
|
- **Strategic / taste / business-knowledge conflicts** → Marta surfaces
|
|
58
63
|
the disagreement at the next checkpoint: *"Eduardo + Francisca
|
|
59
64
|
discordam em X, eu inclino para A — qual o teu input?"*. The user
|
|
@@ -74,8 +79,10 @@ Tens contexto a acrescentar antes de eu arrancar? (Silêncio = procedo.)
|
|
|
74
79
|
follows by emitting checkpoint markers between agent calls.
|
|
75
80
|
- Does not block the user. The user is free to stay silent (proceed)
|
|
76
81
|
or to send any message (parsed by `parse_user_injection`).
|
|
77
|
-
- Does not bypass the mandatory
|
|
78
|
-
|
|
82
|
+
- Does not bypass the mandatory 4-gate evidence flow (the 13-phase
|
|
83
|
+
flow it referenced was replaced in v4.1.0 — constitution
|
|
84
|
+
`evidence-flow`). Checkpoints are emitted **inside** Gate 3
|
|
85
|
+
execution, between sub-dispatches; Gate 4 still runs.
|
|
79
86
|
|
|
80
87
|
## Cross-references
|
|
81
88
|
|
|
@@ -142,6 +142,10 @@ resumes at the right gate.
|
|
|
142
142
|
Time and token cost are not acceptable answers to any of the three.
|
|
143
143
|
- Quality Gate REJECTED loops back at most twice; a third REJECTED
|
|
144
144
|
escalates to the operator with the full verdict.
|
|
145
|
+
- The gate-closing report reproduces each reviewer verdict VERBATIM
|
|
146
|
+
under `### <Reviewer> — verbatim`, with the ledger artifact path
|
|
147
|
+
(`~/.arkaos/quality-gate/<session>/`) beside it. Summarising a
|
|
148
|
+
reviewer in your own words is relay, not report.
|
|
145
149
|
- Close with an honest summary: what changed, where, how it was
|
|
146
150
|
verified (real commands + results), what remains open.
|
|
147
151
|
|
|
@@ -55,10 +55,21 @@ DOCUMENTATION-scope prose it is advisory.
|
|
|
55
55
|
Return a `QGVerdict` JSON object (schema: `QG_VERDICT_JSON_SCHEMA` in
|
|
56
56
|
`core.governance.qg_verdict`): `verdict`, `evidence_report` summary,
|
|
57
57
|
`blockers` [{check, detail, file, verdict}] with exact location and
|
|
58
|
-
correction — `
|
|
58
|
+
correction — `check` names the evidence check or rubric area (the
|
|
59
|
+
aggregate's coverage matching keys on it; never leave it empty),
|
|
60
|
+
`verdict` is claim-level: CONFIRMED (you verified the
|
|
59
61
|
error on the page/line), PLAUSIBLE (credible, unverified), REFUTED
|
|
60
62
|
(disproven; recorded, never counts toward rejection) —,
|
|
61
|
-
`reviewer: "copy-director-eduardo"`, `model_used`, `
|
|
63
|
+
`reviewer: "copy-director-eduardo"`, `model_used`, `evidence_digest`
|
|
64
|
+
(the `report_digest` of the report you interpreted — mandatory since
|
|
65
|
+
PR-B4; an artifact without it cannot support an APPROVED aggregate),
|
|
66
|
+
`notes`.
|
|
67
|
+
|
|
68
|
+
Emit the JSON inside a ```arka-qgverdict fence in your FINAL message —
|
|
69
|
+
the fence is what the hook-boundary ledger captures verbatim. Never
|
|
70
|
+
write triple backticks inside a JSON string — one inside notes cut the
|
|
71
|
+
extractor mid-string (francisca-tech-17); the balanced-JSON cut now
|
|
72
|
+
recovers most such cases, and none of them is worth relying on.
|
|
62
73
|
|
|
63
74
|
Model tier: single source is constitution `quality_gate.model_policy` —
|
|
64
75
|
Quality Gate reviewers run on the best model available (frontier tier,
|
|
@@ -54,8 +54,18 @@ you did not attempt to reproduce is PLAUSIBLE at best, never CONFIRMED.
|
|
|
54
54
|
Return a `QGVerdict` JSON object (schema: `QG_VERDICT_JSON_SCHEMA` in
|
|
55
55
|
`core.governance.qg_verdict`): `verdict`, `evidence_report` summary,
|
|
56
56
|
`blockers` [{check, detail, file, verdict}] numbered B1./B2. with line
|
|
57
|
-
references and fix suggestions
|
|
58
|
-
|
|
57
|
+
references and fix suggestions — `check` names the evidence check or
|
|
58
|
+
rubric area (the aggregate's coverage matching keys on it; never
|
|
59
|
+
leave it empty) —, `reviewer: "tech-director-francisca"`,
|
|
60
|
+
`model_used`, `evidence_digest` (the `report_digest` of the report
|
|
61
|
+
you interpreted — mandatory since PR-B4; an artifact without it
|
|
62
|
+
cannot support an APPROVED aggregate), `notes`.
|
|
63
|
+
|
|
64
|
+
Emit the JSON inside a ```arka-qgverdict fence in your FINAL message —
|
|
65
|
+
the fence is what the hook-boundary ledger captures verbatim. Never
|
|
66
|
+
write triple backticks inside a JSON string — one inside notes cut the
|
|
67
|
+
extractor mid-string (francisca-tech-17); the balanced-JSON cut now
|
|
68
|
+
recovers most such cases, and none of them is worth relying on.
|
|
59
69
|
|
|
60
70
|
Model tier: single source is constitution `quality_gate.model_policy` —
|
|
61
71
|
Quality Gate reviewers run on the best model available (frontier tier,
|
|
@@ -26,9 +26,20 @@ evidence report, never from model size.
|
|
|
26
26
|
1. Run the engine first — no verdict without a report:
|
|
27
27
|
`~/.arkaos/bin/arka-py -m core.governance.evidence_checks <project_dir> [--changed-files ...] [--test-command '...'] --json`
|
|
28
28
|
2. Dispatch Eduardo (spellcheck + changed copy) and Francisca
|
|
29
|
-
(lint/typecheck/tests/coverage/security-grep) with the report and
|
|
30
|
-
|
|
31
|
-
`core.governance.qg_verdict
|
|
29
|
+
(lint/typecheck/tests/coverage/security-grep) with the report and,
|
|
30
|
+
in the prompt, the QGVerdict field names (`QG_VERDICT_JSON_SCHEMA`
|
|
31
|
+
in `core.governance.qg_verdict` is that contract — the Agent tool
|
|
32
|
+
has no structured-output parameter). Dispatch shape (PR-B4): the
|
|
33
|
+
prompt names the FULL field set the reviewer returns — `verdict`,
|
|
34
|
+
`evidence_report` {overall, checks_ran, checks_failed,
|
|
35
|
+
checks_skipped}, `blockers` [{`check` (the evidence check name;
|
|
36
|
+
coverage matching keys on it), `detail`, `file`, `verdict`
|
|
37
|
+
CONFIRMED/PLAUSIBLE/REFUTED}], `reviewer`, `model_used`,
|
|
38
|
+
`evidence_digest` (= the report's `report_digest`), `notes`. A
|
|
39
|
+
dispatch that invents its own field names fail-softs the artifact
|
|
40
|
+
(16 schema errors on one B2 round); a reviewer artifact without
|
|
41
|
+
`evidence_digest` cannot support an APPROVED aggregate — the guard
|
|
42
|
+
refuses it and the reviewer must be re-dispatched.
|
|
32
43
|
3. Aggregate at CLAIM level (Constitution 2.0): every reviewer blocker
|
|
33
44
|
carries `verdict` CONFIRMED / PLAUSIBLE / REFUTED. Only CONFIRMED and
|
|
34
45
|
PLAUSIBLE blockers count toward rejection; REFUTED are recorded for
|
|
@@ -39,9 +50,7 @@ evidence report, never from model size.
|
|
|
39
50
|
- overall == "pass" → APPROVED only if zero CONFIRMED/PLAUSIBLE blockers.
|
|
40
51
|
- overall == "insufficient-evidence" → APPROVED only with explicit
|
|
41
52
|
justification in notes; otherwise REJECTED.
|
|
42
|
-
4. Record the
|
|
43
|
-
`evidence_overall` — it raises on APPROVED-over-fail by design.
|
|
44
|
-
5. Record the eval label (evals ADR 2026-07-09) as your FINAL act — the
|
|
53
|
+
4. Record the eval label (evals ADR 2026-07-09) as your FINAL act — the
|
|
45
54
|
corpus only grows if the verdict-issuer writes it, and dispatch
|
|
46
55
|
through this agent bypasses the department SKILL's step 6: write your
|
|
47
56
|
final QGVerdict JSON to a temp file and run
|
|
@@ -51,11 +60,15 @@ evidence report, never from model size.
|
|
|
51
60
|
remedy: invalid JSON (fix the JSON and re-run), a missing
|
|
52
61
|
--session-id (pass the session id — the anti-self-approval guard
|
|
53
62
|
reads that session's reviewer ledger), or a guard refusal (the
|
|
54
|
-
ledger cannot support your aggregate: quorum,
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
63
|
+
ledger cannot support your aggregate: quorum, a missing or
|
|
64
|
+
mismatched `evidence_digest` without a justified `digest_carries`
|
|
65
|
+
entry, a session already stamped as ended (digest and session
|
|
66
|
+
reasons refuse only an APPROVED aggregate — a REJECTED one records
|
|
67
|
+
with warnings), blocker coverage, or an
|
|
68
|
+
APPROVED verdict standing over a rejecting reviewer — read the
|
|
69
|
+
stderr reasons and fix the REVIEW, not the JSON; if the reason
|
|
70
|
+
names AGGREGATE.json or the session id, fix that instead). Never
|
|
71
|
+
skip.
|
|
59
72
|
Every review feeds `~/.arkaos/telemetry/qg-verdicts.jsonl`, redo
|
|
60
73
|
verdicts included (a REJECTED→APPROVED pair is two labels).
|
|
61
74
|
|
|
@@ -64,11 +77,25 @@ evidence report, never from model size.
|
|
|
64
77
|
Return a `QGVerdict` JSON object: `verdict` (APPROVED|REJECTED),
|
|
65
78
|
`evidence_report` {overall, checks_ran, checks_failed, checks_skipped},
|
|
66
79
|
`blockers` [{check, detail, file, verdict}], `reviewer: "cqo-marta"`,
|
|
67
|
-
`model_used`, `notes
|
|
80
|
+
`model_used`, `notes`, `evidence_digest` (the `report_digest` of the
|
|
81
|
+
report you aggregated — mandatory since PR-B4) and, when you carry an
|
|
82
|
+
earlier review over a report change, `digest_carries`
|
|
83
|
+
[{reviewer, evidence_digest, reason}] naming the digest THAT reviewer
|
|
84
|
+
actually reviewed and why the review still stands (>= 40 chars).
|
|
85
|
+
Binary — there is no "approved with caveats".
|
|
86
|
+
|
|
87
|
+
Emit the final JSON inside a ```arka-qgverdict fence in your FINAL
|
|
88
|
+
message — the fence is what the hook-boundary ledger captures, and an
|
|
89
|
+
aggregate that exists only as prose is a relay (the B1 gate closed
|
|
90
|
+
with this fence present by ad-hoc instruction; it is contract now).
|
|
91
|
+
Never write triple backticks inside a JSON string — one inside notes
|
|
92
|
+
cut the extractor mid-string (francisca-tech-17); the balanced-JSON
|
|
93
|
+
cut now recovers most such cases, and none of them is worth relying
|
|
94
|
+
on.
|
|
68
95
|
|
|
69
96
|
Filled example (the shape you return, not a schema):
|
|
70
97
|
|
|
71
|
-
```
|
|
98
|
+
```arka-qgverdict
|
|
72
99
|
{"verdict": "REJECTED",
|
|
73
100
|
"evidence_report": {"overall": "pass", "checks_ran": ["lint","tests"],
|
|
74
101
|
"checks_failed": [], "checks_skipped": ["coverage"]},
|
|
@@ -77,9 +104,32 @@ Filled example (the shape you return, not a schema):
|
|
|
77
104
|
"detail": "AttributeError on malformed record — docstring claims 'never raises'; reproduced via check_x('bad')",
|
|
78
105
|
"file": "core/governance/x.py:138", "verdict": "CONFIRMED"}],
|
|
79
106
|
"reviewer": "cqo-marta", "model_used": "opus",
|
|
107
|
+
"evidence_digest": "3f2a3f2a3f2a3f2a3f2a3f2a3f2a3f2a3f2a3f2a3f2a3f2a3f2a3f2a3f2a3f2a",
|
|
80
108
|
"notes": "Engine pass but 1 CONFIRMED blocker, reproduced by my own hand."}
|
|
81
109
|
```
|
|
82
110
|
|
|
111
|
+
## Reporting (verbatim, never relay)
|
|
112
|
+
|
|
113
|
+
The gate-closing report reproduces every reviewer verdict VERBATIM
|
|
114
|
+
under `### <Reviewer> — verbatim`, each with its ledger artifact path
|
|
115
|
+
beside it. Summarising a reviewer in your own words is relay, not
|
|
116
|
+
report — a relay inside a gate is a single point of distortion, and
|
|
117
|
+
it is how a corpus reached 80 aggregator-authored records with zero
|
|
118
|
+
reviewer-signed ones.
|
|
119
|
+
|
|
120
|
+
## Conflict Handling (no silent resolution)
|
|
121
|
+
|
|
122
|
+
A reviewer blocker BACKED BY EVIDENCE is never resolved silently: it
|
|
123
|
+
is fixed (and the fix verified by execution), or REFUTED on the
|
|
124
|
+
record with a substantive reason (>= 40 chars — the guard enforces
|
|
125
|
+
the bar), or it blocks. Disagreement between reviewers is settled by
|
|
126
|
+
evidence, not by rank: reproduce the claim, cite the reproduction.
|
|
127
|
+
Only a blocker with no evidence behind it (no repro, no citation) may
|
|
128
|
+
be dropped, and even that drop is recorded in `notes`, never omitted.
|
|
129
|
+
A CONFIRMED blocker is never merely noted: the guard reads
|
|
130
|
+
`blockers`, not `notes` — it is fixed, or REFUTED in `blockers` with
|
|
131
|
+
its reason, or it blocks.
|
|
132
|
+
|
|
83
133
|
## Signature Rules (anti-sycophancy)
|
|
84
134
|
|
|
85
135
|
- Open with "Quality Gate Verdict:" and close with "Final:".
|
package/config/constitution.yaml
CHANGED
|
@@ -248,7 +248,7 @@ enforcement_levels:
|
|
|
248
248
|
|
|
249
249
|
- id: inter-agent-checkpoints
|
|
250
250
|
rule: "Long-running multi-agent dispatches (estimated >30s) are fragmented into sub-dispatches of 2-3min each. Between sub-dispatches, the orchestrator emits a proactive [arka:checkpoint] prompt announcing the next sub-dispatch and inviting user context injection. The user can inject (continue with addition) or stay silent (proceed)."
|
|
251
|
-
enforcement: "Orchestrator wraps multi-step work in checkpointed dispatches; reviewer conflicts escalated to user when strategic (taste/business knowledge), resolved
|
|
251
|
+
enforcement: "Orchestrator wraps multi-step work in checkpointed dispatches; reviewer conflicts escalated to user when strategic (taste/business knowledge), resolved on the record when purely technical (evidence cited in the verdict notes — never silently; the earlier self-contradiction was resolved 2026-07-30 in favour of visibility); QG deliberations are visible, not just verdict."
|
|
252
252
|
|
|
253
253
|
- id: hybrid-learning
|
|
254
254
|
rule: "ArkaOS learns from user corrections via hybrid mechanism: implicit auto-detection with confidence scoring for typical corrections (default), explicit Marta-led confirmation for high-leverage rules (top-level rule candidates) or rules that contradict existing memory. Marta is the owner of the learning loop. Memory rules carry a confidence field that climbs as the rule is applied without correction."
|
|
@@ -492,3 +492,6 @@ amendments:
|
|
|
492
492
|
- version: "4.12.0"
|
|
493
493
|
date: "2026-07-09"
|
|
494
494
|
changes: "Interaction Reform PR2 (operator-approved plan, 2026-07-09): added gate-judges MUST rule — plan-judge at Gate 2 and output-judge at Gate 4 for MEDIUM/HIGH work, structured JudgeVerdict (core.governance.judge), frontier tier, arkaos-not-yes-man standard applied to agents, user_challenge surfacing for technically wrong requests; verdicts recorded to judge-verdicts.jsonl."
|
|
495
|
+
- version: "4.43.0"
|
|
496
|
+
date: "2026-07-30"
|
|
497
|
+
changes: "PR-B4 (operator-approved repair-campaign plan): inter-agent-checkpoints enforcement text amended — technical reviewer conflicts change from 'resolved silently' to 'resolved on the record' (evidence cited in verdict notes), resolving the self-contradiction with the same enforcement's 'QG deliberations are visible' clause in favour of visibility. Rule text, level and scope unchanged."
|
package/core/evals/record_cli.py
CHANGED
|
@@ -8,14 +8,19 @@ flow skill instructions), closing the "labels gratuitos" loop from the
|
|
|
8
8
|
evals ADR.
|
|
9
9
|
|
|
10
10
|
``--kind qg`` is the AGGREGATE path and runs the anti-self-approval
|
|
11
|
-
guard (PR-B3): ``--session-id`` is mandatory and
|
|
12
|
-
session's reviewer ledger must hold at least two
|
|
13
|
-
reviewer verdicts,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
guard (PR-B3, hardened in PR-B4): ``--session-id`` is mandatory and
|
|
12
|
+
validated, the session's reviewer ledger must hold at least two
|
|
13
|
+
hook-captured reviewer verdicts, the digest chain must hold (the
|
|
14
|
+
aggregate and every counted reviewer artifact carry evidence_digest;
|
|
15
|
+
a reviewer's digest that predates the final report needs an explicit
|
|
16
|
+
``digest_carries`` justification), the session must not be stamped
|
|
17
|
+
ended, no CONFIRMED reviewer blocker may disappear silently, and an
|
|
18
|
+
APPROVED aggregate may not stand over a rejecting reviewer.
|
|
19
|
+
Dispatch-shape refusals are verdict-aware: they refuse an APPROVED
|
|
20
|
+
aggregate and demote to warnings on a REJECTED one, so a rejection
|
|
21
|
+
label survives a bad delta. The label records ONLY once
|
|
22
|
+
AGGREGATE.json is verifiably on disk — an accepted-but-unwritten
|
|
23
|
+
aggregate is a refusal, not a success.
|
|
19
24
|
|
|
20
25
|
``--kind reviewer`` records an individual reviewer's verdict as a
|
|
21
26
|
label and cross-references the ledger by ``verdict_digest`` — it never
|
|
@@ -5,12 +5,19 @@ reviewer artifacts behind it — the orchestrator's own words, recorded
|
|
|
5
5
|
as a completed gate. This guard makes that shape unrecordable AS AN
|
|
6
6
|
AGGREGATE: an aggregate verdict is only recorded when the session's
|
|
7
7
|
reviewer ledger holds at least two HOOK-CAPTURED reviewer verdicts,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
reviewer
|
|
13
|
-
stands over no rejecting reviewer.
|
|
8
|
+
the digest chain holds (PR-B4 dispatch shape: the aggregate and every
|
|
9
|
+
counted reviewer artifact must carry evidence_digest, and each
|
|
10
|
+
reviewer's digest must match the aggregate's — or be excused by an
|
|
11
|
+
explicit, justified ``digest_carries`` entry naming the report that
|
|
12
|
+
reviewer actually reviewed), no CONFIRMED reviewer blocker disappears
|
|
13
|
+
silently, and an APPROVED aggregate stands over no rejecting reviewer.
|
|
14
|
+
|
|
15
|
+
Severity is verdict-aware (PR-B4): fabrication vectors — quorum, an
|
|
16
|
+
APPROVED over a rejecting reviewer, a vanishing CONFIRMED blocker —
|
|
17
|
+
refuse regardless of verdict; dispatch-shape issues (digest chain,
|
|
18
|
+
session binding) refuse only an APPROVED aggregate and demote to
|
|
19
|
+
warnings on a REJECTED one, so a rejection label survives exactly the
|
|
20
|
+
case where the CQO catches a bad delta.
|
|
14
21
|
|
|
15
22
|
Only records whose ``source`` is in ``CAPTURE_SOURCES`` count: a
|
|
16
23
|
record the orchestrator could write itself (any other source) would
|
|
@@ -27,16 +34,21 @@ home directory and this guard runs in the same trust domain as the
|
|
|
27
34
|
orchestrator it polices — a determined orchestrator could forge
|
|
28
35
|
records with a file write, either to FABRICATE a quorum or to
|
|
29
36
|
SUPPRESS an existing verdict (a forged newer record supersedes it —
|
|
30
|
-
same capability ceiling, different mechanics). Session
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
same capability ceiling, different mechanics). Session binding
|
|
38
|
+
(PR-B4) closes the COMMON reuse path, not every path: the SessionEnd
|
|
39
|
+
hook stamps a session's ledger directory (``.ended``), and an
|
|
40
|
+
APPROVED aggregate citing a stamped session is refused. A session
|
|
41
|
+
that crashes never fires SessionEnd and stays unstamped — and in
|
|
42
|
+
observed practice SessionEnd fires for a minority of sessions, so an
|
|
43
|
+
unstamped ledger proves nothing about liveness. A session still open
|
|
44
|
+
elsewhere is citable from this one, and the stamp itself is a file
|
|
45
|
+
the same account could delete: the binding is evidence from the
|
|
46
|
+
hook boundary, not a cryptographic seal. ``--kind
|
|
47
|
+
reviewer`` (record_cli) likewise remains an unguarded label path for
|
|
48
|
+
reviewer identities: its ledger cross-reference is provenance, not
|
|
49
|
+
admission. The guard turns ACCIDENTAL self-approval into deliberate,
|
|
50
|
+
transcript-visible forgery; it does not and cannot make forgery
|
|
51
|
+
impossible from inside the same account.
|
|
40
52
|
"""
|
|
41
53
|
|
|
42
54
|
from __future__ import annotations
|
|
@@ -286,35 +298,136 @@ def _covered(key: frozenset[str], aggregate: dict, approved: bool) -> str:
|
|
|
286
298
|
return "absent"
|
|
287
299
|
|
|
288
300
|
|
|
289
|
-
def
|
|
301
|
+
def _carries(aggregate: dict) -> dict[str, dict]:
|
|
302
|
+
"""Declared digest carries, keyed by canonical reviewer identity."""
|
|
303
|
+
carries: dict[str, dict] = {}
|
|
304
|
+
for entry in aggregate.get("digest_carries") or []:
|
|
305
|
+
if isinstance(entry, dict):
|
|
306
|
+
carries[_identity(str(entry.get("reviewer") or ""))] = entry
|
|
307
|
+
return carries
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def _carry_issue(
|
|
311
|
+
reviewer_id: str, their: str, agg_digest: str, carry: dict | None
|
|
312
|
+
) -> str | None:
|
|
313
|
+
"""Why a digest mismatch is NOT excused by a declared carry.
|
|
314
|
+
|
|
315
|
+
None means the carry stands: it names the digest the reviewer's own
|
|
316
|
+
artifact carries, with a substantive reason. Anything else is the
|
|
317
|
+
plain mismatch — an undeclared carry, a carry pointing at a digest
|
|
318
|
+
the reviewer never reviewed, or a bare justification.
|
|
319
|
+
"""
|
|
320
|
+
if carry is None:
|
|
321
|
+
return (
|
|
322
|
+
f"evidence_digest mismatch: {reviewer_id} reviewed "
|
|
323
|
+
f"{their[:12]}…, aggregate cites {agg_digest[:12]}… — not "
|
|
324
|
+
"the same evidence report; re-dispatch the reviewer or "
|
|
325
|
+
"declare a justified digest_carries entry (PR-B4)"
|
|
326
|
+
)
|
|
327
|
+
if _norm(carry.get("evidence_digest")) != their:
|
|
328
|
+
return (
|
|
329
|
+
f"digest carry for {reviewer_id} names "
|
|
330
|
+
f"{_norm(carry.get('evidence_digest'))[:12]}… but the "
|
|
331
|
+
f"reviewer's artifact carries {their[:12]}… — a carry must "
|
|
332
|
+
"cite the report that reviewer actually reviewed"
|
|
333
|
+
)
|
|
334
|
+
if len(_norm(carry.get("reason"))) < _MIN_REFUTE_DETAIL:
|
|
335
|
+
return (
|
|
336
|
+
f"digest carry for {reviewer_id} lacks a substantive reason "
|
|
337
|
+
f"(>= {_MIN_REFUTE_DETAIL} chars — the same bar as a REFUTED "
|
|
338
|
+
"drop): why does the earlier review still stand?"
|
|
339
|
+
)
|
|
340
|
+
return None
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
_MISSING_AGGREGATE_DIGEST = (
|
|
344
|
+
"aggregate carries no evidence_digest — the dispatch shape (PR-B4) "
|
|
345
|
+
"requires the aggregator to cite the report it aggregated "
|
|
346
|
+
"(report_digest from the evidence --json output)"
|
|
347
|
+
)
|
|
348
|
+
_MISSING_REVIEWER_DIGEST = (
|
|
349
|
+
"{rid} artifact carries no evidence_digest — the dispatch must "
|
|
350
|
+
"populate it (PR-B4 dispatch shape); re-dispatch that reviewer "
|
|
351
|
+
"with the report_digest"
|
|
352
|
+
)
|
|
353
|
+
_CARRY_ACCEPTED = (
|
|
354
|
+
"digest carry accepted: {rid} reviewed {their}… while the "
|
|
355
|
+
"aggregate cites {agg}… — justification on the record"
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def _digest_issues(
|
|
290
360
|
aggregate: dict, verdicts: list[tuple[str, dict]]
|
|
291
361
|
) -> tuple[list[str], list[str]]:
|
|
292
|
-
"""
|
|
293
|
-
|
|
294
|
-
|
|
362
|
+
"""Dispatch-shape and integrity issues on the digest chain (PR-B4).
|
|
363
|
+
|
|
364
|
+
Returns (issues, notes). Issues are verdict-aware at the caller:
|
|
365
|
+
they refuse an APPROVED aggregate and are demoted to warnings on a
|
|
366
|
+
REJECTED one. Notes (accepted carries) are always warnings — a
|
|
367
|
+
carry is legitimate, and legitimate is not invisible.
|
|
368
|
+
"""
|
|
369
|
+
issues: list[str] = []
|
|
370
|
+
notes: list[str] = []
|
|
295
371
|
agg_digest = _norm(aggregate.get("evidence_digest"))
|
|
296
372
|
if not agg_digest:
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
seen_any = False
|
|
373
|
+
issues.append(_MISSING_AGGREGATE_DIGEST)
|
|
374
|
+
carries = _carries(aggregate)
|
|
300
375
|
for reviewer_id, verdict in verdicts:
|
|
301
376
|
their = _norm(verdict.get("evidence_digest"))
|
|
302
377
|
if not their:
|
|
378
|
+
issues.append(_MISSING_REVIEWER_DIGEST.format(rid=reviewer_id))
|
|
303
379
|
continue
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
f"{their[:12]}…, aggregate cites {agg_digest[:12]}… — "
|
|
309
|
-
"not the same evidence report"
|
|
310
|
-
)
|
|
311
|
-
if not seen_any:
|
|
312
|
-
warnings.append(
|
|
313
|
-
"no reviewer artifact carries evidence_digest (dispatch "
|
|
314
|
-
"shape — PR-B4 enforces it); digest comparison had nothing "
|
|
315
|
-
"to bite on"
|
|
380
|
+
if not agg_digest or their == agg_digest:
|
|
381
|
+
continue
|
|
382
|
+
issue = _carry_issue(
|
|
383
|
+
reviewer_id, their, agg_digest, carries.get(_identity(reviewer_id))
|
|
316
384
|
)
|
|
317
|
-
|
|
385
|
+
if issue is not None:
|
|
386
|
+
issues.append(issue)
|
|
387
|
+
else:
|
|
388
|
+
notes.append(_CARRY_ACCEPTED.format(
|
|
389
|
+
rid=reviewer_id, their=their[:12], agg=agg_digest[:12]
|
|
390
|
+
))
|
|
391
|
+
return issues, notes
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
def _ended_issues(session_id: str) -> list[str]:
|
|
395
|
+
"""A stamped session is not a live quorum (PR-B4 session binding)."""
|
|
396
|
+
from core.governance.reviewer_ledger import ENDED_NAME
|
|
397
|
+
|
|
398
|
+
if not (ledger_root() / session_id / ENDED_NAME).is_file():
|
|
399
|
+
return []
|
|
400
|
+
return [
|
|
401
|
+
f"session {session_id} is marked ended (SessionEnd stamped its "
|
|
402
|
+
"ledger) — a past session's reviewer records are not a reusable "
|
|
403
|
+
"quorum token; run the reviews in the live session"
|
|
404
|
+
]
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
def _check_key_warnings(
|
|
408
|
+
verdicts: list[tuple[str, dict]]
|
|
409
|
+
) -> list[str]:
|
|
410
|
+
"""CONFIRMED blockers filed without a check key — warning only.
|
|
411
|
+
|
|
412
|
+
Coverage still matches on detail/file tokens (_blocker_key keeps
|
|
413
|
+
liveness), but the dispatch shape asks reviewers to name the
|
|
414
|
+
evidence check so coverage means shared vocabulary, not prose luck.
|
|
415
|
+
"""
|
|
416
|
+
warnings: list[str] = []
|
|
417
|
+
for reviewer_id, verdict in verdicts:
|
|
418
|
+
for blocker in verdict.get("blockers") or []:
|
|
419
|
+
if not isinstance(blocker, dict):
|
|
420
|
+
continue
|
|
421
|
+
if _norm(blocker.get("verdict")) != "confirmed":
|
|
422
|
+
continue
|
|
423
|
+
if not _tokens(blocker.get("check")) and _blocker_key(blocker):
|
|
424
|
+
warnings.append(
|
|
425
|
+
f"CONFIRMED blocker ({reviewer_id}) filed without a "
|
|
426
|
+
"check key — matched on detail/file tokens; the "
|
|
427
|
+
"dispatch shape (PR-B4) asks for the evidence check "
|
|
428
|
+
"name in 'check'"
|
|
429
|
+
)
|
|
430
|
+
return warnings
|
|
318
431
|
|
|
319
432
|
|
|
320
433
|
_COVERAGE_REASONS = {
|
|
@@ -455,7 +568,7 @@ def check_aggregate(aggregate: dict, session_id: str) -> GuardResult:
|
|
|
455
568
|
reviewers, [name for name, _ in counted]
|
|
456
569
|
)
|
|
457
570
|
verdicts = [(str(r.get("reviewer_id")), r["verdict"]) for _, r in counted]
|
|
458
|
-
reasons, warnings = _reasons(aggregate, verdicts)
|
|
571
|
+
reasons, warnings = _reasons(aggregate, verdicts, session_id)
|
|
459
572
|
return GuardResult(
|
|
460
573
|
ok=not reasons,
|
|
461
574
|
reasons=reasons,
|
|
@@ -466,17 +579,39 @@ def check_aggregate(aggregate: dict, session_id: str) -> GuardResult:
|
|
|
466
579
|
|
|
467
580
|
|
|
468
581
|
def _reasons(
|
|
469
|
-
aggregate: dict, verdicts: list[tuple[str, dict]]
|
|
582
|
+
aggregate: dict, verdicts: list[tuple[str, dict]], session_id: str
|
|
470
583
|
) -> tuple[list[str], list[str]]:
|
|
471
|
-
"""Every refusal reason and warning for one aggregate.
|
|
584
|
+
"""Every refusal reason and warning for one aggregate.
|
|
585
|
+
|
|
586
|
+
Two severities, split on the aggregate's own verdict (PR-B4 item 7).
|
|
587
|
+
Fabrication vectors — an APPROVED standing over a rejecting
|
|
588
|
+
reviewer, a CONFIRMED blocker vanishing — refuse regardless of
|
|
589
|
+
verdict. Dispatch-shape issues (digest chain, session binding)
|
|
590
|
+
refuse only an APPROVED aggregate: refusing a REJECTED one over
|
|
591
|
+
shape would throw away the rejection label in exactly the case
|
|
592
|
+
where the CQO catches a bad delta, and a recorded rejection
|
|
593
|
+
launders nothing — the redo loop continues either way.
|
|
594
|
+
"""
|
|
472
595
|
approved = _norm(aggregate.get("verdict")) == "approved"
|
|
473
|
-
|
|
596
|
+
issues, notes = _digest_issues(aggregate, verdicts)
|
|
597
|
+
issues += _ended_issues(session_id)
|
|
474
598
|
reasons = (
|
|
475
|
-
|
|
476
|
-
+ _verdict_reasons(aggregate, verdicts)
|
|
599
|
+
_verdict_reasons(aggregate, verdicts)
|
|
477
600
|
+ _blocker_reasons(aggregate, verdicts, approved)
|
|
478
601
|
)
|
|
479
|
-
|
|
602
|
+
warnings = (
|
|
603
|
+
notes
|
|
604
|
+
+ _check_key_warnings(verdicts)
|
|
605
|
+
+ _own_finding_warnings(aggregate, verdicts)
|
|
606
|
+
)
|
|
607
|
+
if approved:
|
|
608
|
+
return issues + reasons, warnings
|
|
609
|
+
demoted = [
|
|
610
|
+
f"{issue} [recorded anyway: the refusal is verdict-aware "
|
|
611
|
+
"(PR-B4) — a REJECTED label is never lost to dispatch shape]"
|
|
612
|
+
for issue in issues
|
|
613
|
+
]
|
|
614
|
+
return reasons, demoted + warnings
|
|
480
615
|
|
|
481
616
|
|
|
482
617
|
def write_aggregate(
|
|
@@ -9,8 +9,10 @@ The verdict is INTERPRETATION of an ``EvidenceReport`` from
|
|
|
9
9
|
- ``APPROVED`` requires ``overall == "pass"``, or
|
|
10
10
|
``insufficient-evidence`` with an explicit justification in notes.
|
|
11
11
|
|
|
12
|
-
``QG_VERDICT_JSON_SCHEMA`` is the
|
|
13
|
-
|
|
12
|
+
``QG_VERDICT_JSON_SCHEMA`` is the field contract to name INSIDE the
|
|
13
|
+
dispatch prompt — the Agent tool has no structured-output parameter
|
|
14
|
+
(PR-B4 dispatch shape; see the Reviewer Dispatch Contract in
|
|
15
|
+
departments/quality/SKILL.md).
|
|
14
16
|
"""
|
|
15
17
|
|
|
16
18
|
from __future__ import annotations
|
|
@@ -45,6 +47,44 @@ class QGBlocker(BaseModel):
|
|
|
45
47
|
)
|
|
46
48
|
|
|
47
49
|
|
|
50
|
+
class QGDigestCarry(BaseModel):
|
|
51
|
+
"""One justified digest carry on an AGGREGATE verdict (PR-B4).
|
|
52
|
+
|
|
53
|
+
Per-reviewer digest equality would force a re-dispatch of every
|
|
54
|
+
reviewer whenever the evidence report changes at all. When the
|
|
55
|
+
aggregator judges an earlier review still valid against the final
|
|
56
|
+
report — a message-only amend, a doc-only delta — it declares the
|
|
57
|
+
carry HERE, naming the reviewer, the digest that reviewer actually
|
|
58
|
+
reviewed, and the reason. The guard accepts the mismatch only when
|
|
59
|
+
the declared digest matches the reviewer's own artifact and the
|
|
60
|
+
reason is substantive; anything less refuses an APPROVED aggregate.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
reviewer: str = Field(description="Reviewer id whose review is carried")
|
|
64
|
+
evidence_digest: str = Field(
|
|
65
|
+
description=(
|
|
66
|
+
"sha256 of the report that reviewer actually reviewed — "
|
|
67
|
+
"must equal the evidence_digest in their ledger artifact"
|
|
68
|
+
)
|
|
69
|
+
)
|
|
70
|
+
reason: str = Field(
|
|
71
|
+
description=(
|
|
72
|
+
"Why the earlier review still stands against the final "
|
|
73
|
+
"report (>= 40 chars — same bar as a REFUTED drop)"
|
|
74
|
+
)
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
@model_validator(mode="after")
|
|
78
|
+
def digest_is_sha256_hex(self) -> QGDigestCarry:
|
|
79
|
+
if not _SHA256_HEX_RE.fullmatch(self.evidence_digest):
|
|
80
|
+
raise ValueError(
|
|
81
|
+
"a digest carry must name the exact report digest the "
|
|
82
|
+
f"reviewer reviewed (64 hex chars), got "
|
|
83
|
+
f"{self.evidence_digest!r}"
|
|
84
|
+
)
|
|
85
|
+
return self
|
|
86
|
+
|
|
87
|
+
|
|
48
88
|
class QGEvidenceSummary(BaseModel):
|
|
49
89
|
"""Embedded summary of the EvidenceReport the reviewer interpreted."""
|
|
50
90
|
|
|
@@ -98,6 +138,20 @@ class QGVerdict(BaseModel):
|
|
|
98
138
|
"ledger (raw_sha256); empty when not yet ledgered"
|
|
99
139
|
),
|
|
100
140
|
)
|
|
141
|
+
# PR-B4: aggregate-only, optional so the existing corpus stays
|
|
142
|
+
# valid. Reviewer verdicts have no use for it (the guard reads it
|
|
143
|
+
# from the aggregate side only).
|
|
144
|
+
digest_carries: list[QGDigestCarry] = Field(
|
|
145
|
+
default_factory=list,
|
|
146
|
+
description=(
|
|
147
|
+
"AGGREGATE only: justified carries for reviewers whose "
|
|
148
|
+
"review the aggregator judges still valid against the "
|
|
149
|
+
"final report — typically an earlier report revision; the "
|
|
150
|
+
"guard verifies the declared digest against the reviewer's "
|
|
151
|
+
"own artifact, never digest precedence (digests are "
|
|
152
|
+
"unordered — see QGDigestCarry)"
|
|
153
|
+
),
|
|
154
|
+
)
|
|
101
155
|
|
|
102
156
|
@model_validator(mode="after")
|
|
103
157
|
def digests_are_sha256_hex_or_empty(self) -> QGVerdict:
|
|
@@ -115,6 +115,13 @@ _NOTICES_NAME = "NOTICES.jsonl"
|
|
|
115
115
|
# working for sessions that PASS the gate (an unowned name made _purge
|
|
116
116
|
# refuse the whole directory and turned retention into a no-op).
|
|
117
117
|
AGGREGATE_NAME = "AGGREGATE.json"
|
|
118
|
+
# Stamped by the SessionEnd hook (mark_session_ended, PR-B4): a session
|
|
119
|
+
# whose ledger carries this marker has ended, so its reviewer records
|
|
120
|
+
# are no longer a live quorum — aggregate_guard refuses an APPROVED
|
|
121
|
+
# aggregate that cites an ended session. Dot-prefixed on purpose: the
|
|
122
|
+
# record pool skips dot names, so the stamp can never count as a
|
|
123
|
+
# verdict.
|
|
124
|
+
ENDED_NAME = ".ended"
|
|
118
125
|
_RECORD_NAME_RE = re.compile(r"^[A-Za-z0-9._-]{1,128}-\d+-[0-9a-f]{8}\.json$")
|
|
119
126
|
|
|
120
127
|
|
|
@@ -506,6 +513,31 @@ def _find_by_digest(paths: list[Path], digest: str) -> dict | None:
|
|
|
506
513
|
return None
|
|
507
514
|
|
|
508
515
|
|
|
516
|
+
def mark_session_ended(session_id: str) -> None:
|
|
517
|
+
"""Stamp a session's ledger directory at SessionEnd. Never raises.
|
|
518
|
+
|
|
519
|
+
Only stamps an EXISTING directory: a session that captured no
|
|
520
|
+
reviewer verdicts holds no quorum to expire, and creating its
|
|
521
|
+
directory here would hand retention an empty dir to babysit. The
|
|
522
|
+
stamp is evidence from the hook boundary — the runtime fires
|
|
523
|
+
SessionEnd, not the orchestrator — so aggregate_guard can refuse an
|
|
524
|
+
APPROVED aggregate built on a session that already ended. A session
|
|
525
|
+
that crashes never receives SessionEnd and is never stamped; the
|
|
526
|
+
guard's docstring carries that limit honestly.
|
|
527
|
+
"""
|
|
528
|
+
try:
|
|
529
|
+
if not _safe_id(session_id):
|
|
530
|
+
return
|
|
531
|
+
session_dir = ledger_root() / session_id
|
|
532
|
+
if not session_dir.is_dir():
|
|
533
|
+
return
|
|
534
|
+
stamp = session_dir / ENDED_NAME
|
|
535
|
+
stamp.touch()
|
|
536
|
+
os.chmod(stamp, 0o600)
|
|
537
|
+
except Exception:
|
|
538
|
+
return # SessionEnd is best-effort; a failed stamp never blocks
|
|
539
|
+
|
|
540
|
+
|
|
509
541
|
def _expired(session_dir: Path, cutoff: datetime) -> bool:
|
|
510
542
|
try:
|
|
511
543
|
mtime = datetime.fromtimestamp(session_dir.stat().st_mtime, tz=UTC)
|
|
@@ -524,6 +556,8 @@ def _is_own_file(item: Path) -> bool:
|
|
|
524
556
|
return True
|
|
525
557
|
if name == AGGREGATE_NAME:
|
|
526
558
|
return True # the accepted aggregate (aggregate_guard, PR-B3)
|
|
559
|
+
if name == ENDED_NAME:
|
|
560
|
+
return True # the SessionEnd stamp (mark_session_ended, PR-B4)
|
|
527
561
|
if name.startswith(".") and ".tmp-" in name:
|
|
528
562
|
return True # an interrupted atomic publish
|
|
529
563
|
return bool(_RECORD_NAME_RE.fullmatch(name))
|
|
@@ -122,6 +122,21 @@ def _sweep_reviewer_ledger() -> None:
|
|
|
122
122
|
pass
|
|
123
123
|
|
|
124
124
|
|
|
125
|
+
def _stamp_ledger_ended(session_id: str) -> None:
|
|
126
|
+
"""Mark this session's reviewer ledger as ended (PR-B4 binding).
|
|
127
|
+
|
|
128
|
+
The stamp is what lets aggregate_guard refuse an APPROVED aggregate
|
|
129
|
+
built on a PAST session's reviewer records — without it, any old
|
|
130
|
+
session directory is a reusable quorum token.
|
|
131
|
+
"""
|
|
132
|
+
try:
|
|
133
|
+
from core.governance.reviewer_ledger import mark_session_ended
|
|
134
|
+
|
|
135
|
+
mark_session_ended(session_id)
|
|
136
|
+
except Exception: # best-effort — this hook never blocks
|
|
137
|
+
pass
|
|
138
|
+
|
|
139
|
+
|
|
125
140
|
def main(stdin_json: dict | None = None) -> int:
|
|
126
141
|
if stdin_json is None:
|
|
127
142
|
stdin_json, _ = read_stdin_json()
|
|
@@ -135,6 +150,7 @@ def main(stdin_json: dict | None = None) -> int:
|
|
|
135
150
|
|
|
136
151
|
write_digest(session_id, transcript_path)
|
|
137
152
|
_end_session(session_id)
|
|
153
|
+
_stamp_ledger_ended(session_id)
|
|
138
154
|
_sweep_reviewer_ledger()
|
|
139
155
|
return 0
|
|
140
156
|
|
|
@@ -44,6 +44,11 @@ Any Department Workflow:
|
|
|
44
44
|
- overall == "insufficient-evidence" → APPROVED only with an
|
|
45
45
|
explicit justification in the verdict notes; otherwise REJECTED.
|
|
46
46
|
4. If ANY reviewer rejects → work loops back with the blockers list
|
|
47
|
+
4.5. Marta's gate-closing report reproduces each reviewer verdict
|
|
48
|
+
VERBATIM under `### <Reviewer> — verbatim`, with the ledger
|
|
49
|
+
artifact path (~/.arkaos/quality-gate/<session>/) beside it.
|
|
50
|
+
Summarising a reviewer in the aggregator's words is relay,
|
|
51
|
+
not report — a relay inside a gate is a point of distortion.
|
|
47
52
|
5. If ALL approve → Marta issues final APPROVED verdict
|
|
48
53
|
6. Record the label (evals ADR 2026-07-09): pipe Marta's final
|
|
49
54
|
QGVerdict JSON to
|
|
@@ -71,25 +76,35 @@ Any Department Workflow:
|
|
|
71
76
|
|
|
72
77
|
## Reviewer Dispatch Contract
|
|
73
78
|
|
|
74
|
-
Reviewers are dispatched via the Agent tool
|
|
75
|
-
|
|
76
|
-
|
|
79
|
+
Reviewers are dispatched via the Agent tool. The `QGVerdict` schema
|
|
80
|
+
(`QG_VERDICT_JSON_SCHEMA` from `core.governance.qg_verdict`) travels INSIDE
|
|
81
|
+
the prompt — the Agent tool has no structured-output parameter, so the
|
|
82
|
+
contract IS the dispatch prompt naming the exact fields (PR-B4 dispatch
|
|
83
|
+
shape; a dispatch that invents its own field names fail-softs the artifact):
|
|
77
84
|
|
|
78
85
|
from core.governance.qg_verdict import QG_VERDICT_JSON_SCHEMA
|
|
79
86
|
|
|
80
87
|
Agent(
|
|
81
|
-
subagent_type="francisca-tech",
|
|
82
|
-
model="
|
|
83
|
-
prompt="<evidence report JSON> + <diff summary> —
|
|
84
|
-
|
|
88
|
+
subagent_type="francisca-tech", # .claude/agents/francisca-tech.md
|
|
89
|
+
model="opus", # quality_gate.model_policy: best available
|
|
90
|
+
prompt="<evidence report JSON incl. report_digest> + <diff summary> — "
|
|
91
|
+
"interpret and return, in a ```arka-qgverdict fence, a QGVerdict "
|
|
92
|
+
"with fields: verdict, evidence_report, blockers "
|
|
93
|
+
"[{check, detail, file, verdict}], reviewer, model_used, "
|
|
94
|
+
"evidence_digest (= the report_digest), notes",
|
|
85
95
|
)
|
|
86
96
|
|
|
87
|
-
Each reviewer MUST return a `QGVerdict` JSON object
|
|
88
|
-
(APPROVED|REJECTED), `evidence_report` (embedded summary),
|
|
89
|
-
(`[{check, detail, file}]`
|
|
90
|
-
|
|
91
|
-
`
|
|
92
|
-
an
|
|
97
|
+
Each reviewer MUST return a `QGVerdict` JSON object in a ```arka-qgverdict
|
|
98
|
+
fence: `verdict` (APPROVED|REJECTED), `evidence_report` (embedded summary),
|
|
99
|
+
`blockers` (`[{check, detail, file, verdict}]` — `check` names the evidence
|
|
100
|
+
check; the aggregate guard's coverage matching keys on it), `reviewer`,
|
|
101
|
+
`model_used`, `evidence_digest` (mandatory since PR-B4 — an artifact without
|
|
102
|
+
it cannot support an APPROVED aggregate), `notes`. The Pydantic model rejects
|
|
103
|
+
APPROVED-with-failing-evidence at validation time, and the anti-self-approval
|
|
104
|
+
guard (PR-B3, hardened PR-B4) refuses an APPROVED aggregate the session's
|
|
105
|
+
reviewer ledger cannot support — dispatch-shape issues are demoted to
|
|
106
|
+
warnings on a REJECTED one; fabrication vectors (quorum, a vanishing
|
|
107
|
+
CONFIRMED blocker) refuse regardless of verdict.
|
|
93
108
|
|
|
94
109
|
## Squad
|
|
95
110
|
|
|
@@ -133,9 +148,11 @@ There is no "APPROVED WITH CAVEATS". It's binary. Fix issues first.
|
|
|
133
148
|
When dispatching subagent work via the Task tool, include the `model` parameter from the target agent's YAML `model:` field:
|
|
134
149
|
|
|
135
150
|
- Agent YAMLs at `departments/*/agents/*.yaml` have `model: opus | sonnet | haiku`
|
|
136
|
-
- Quality Gate
|
|
137
|
-
|
|
138
|
-
|
|
151
|
+
- Quality Gate agents (Marta aggregating, Eduardo + Francisca reviewing)
|
|
152
|
+
run on the BEST model available — single source: constitution
|
|
153
|
+
`quality_gate.model_policy` (Excellence Reform 2026-07-05, frontier
|
|
154
|
+
tier; per-role overrides in `~/.arkaos/models.yaml`, Model Fabric).
|
|
155
|
+
Economy tiers never review.
|
|
139
156
|
- Marta keeps her veto regardless of the model tier the review ran on —
|
|
140
157
|
the verdict derives from evidence, not from model size.
|
|
141
158
|
- Default to `sonnet` if the agent YAML has no `model` field
|
package/harness/codex/AGENTS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ArkaOS — The Operating System for AI Agent Teams
|
|
2
2
|
|
|
3
|
-
> v4.
|
|
3
|
+
> v4.43.0 — 89 agents, 17 departments, 332 skills. Generated by `scripts/harness_gen.py`; do not edit.
|
|
4
4
|
|
|
5
5
|
You are operating within ArkaOS. Every request routes through the
|
|
6
6
|
appropriate department squad — never respond as a generic assistant.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ArkaOS — The Operating System for AI Agent Teams
|
|
2
2
|
|
|
3
|
-
> v4.
|
|
3
|
+
> v4.43.0 — 89 agents, 17 departments, 332 skills. Generated by `scripts/harness_gen.py`; do not edit.
|
|
4
4
|
|
|
5
5
|
You are operating within ArkaOS. Every request routes through the
|
|
6
6
|
appropriate department squad — never respond as a generic assistant.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: ArkaOS v4.
|
|
2
|
+
description: ArkaOS v4.43.0 agent-team contract
|
|
3
3
|
alwaysApply: true
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# ArkaOS — The Operating System for AI Agent Teams
|
|
7
7
|
|
|
8
|
-
> v4.
|
|
8
|
+
> v4.43.0 — 89 agents, 17 departments, 332 skills. Generated by `scripts/harness_gen.py`; do not edit.
|
|
9
9
|
|
|
10
10
|
You are operating within ArkaOS. Every request routes through the
|
|
11
11
|
appropriate department squad — never respond as a generic assistant.
|
package/harness/gemini/GEMINI.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ArkaOS — The Operating System for AI Agent Teams
|
|
2
2
|
|
|
3
|
-
> v4.
|
|
3
|
+
> v4.43.0 — 89 agents, 17 departments, 332 skills. Generated by `scripts/harness_gen.py`; do not edit.
|
|
4
4
|
|
|
5
5
|
You are operating within ArkaOS. Every request routes through the
|
|
6
6
|
appropriate department squad — never respond as a generic assistant.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ArkaOS — The Operating System for AI Agent Teams
|
|
2
2
|
|
|
3
|
-
> v4.
|
|
3
|
+
> v4.43.0 — 89 agents, 17 departments, 332 skills. Generated by `scripts/harness_gen.py`; do not edit.
|
|
4
4
|
|
|
5
5
|
You are operating within ArkaOS. Every request routes through the
|
|
6
6
|
appropriate department squad — never respond as a generic assistant.
|
|
@@ -3,7 +3,7 @@ description: "Software Architect — ArkaOS /dev department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Gabriel, Software Architect of the ArkaOS /dev department (v4.
|
|
6
|
+
You are Gabriel, Software Architect of the ArkaOS /dev department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: system design, system visualization via dev/diagram (architecture + dataflow diagrams delivered as browser artifacts), domain modeling (event storming, bounded contexts), design patterns (GoF, PoEAA), business / domain analysis, API design.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Creative Director — ArkaOS /brand department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Valentina, Creative Director of the ArkaOS /brand department (v4.
|
|
6
|
+
You are Valentina, Creative Director of the ArkaOS /brand department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: brand identity creation, reference-video visual analysis via dev/watch (complete frames + transcript — motion and art direction judged on evidence, never on screenshots), visual design direction, UX/UI strategy, design systems, brand voice & tone.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Chief Financial Officer — ArkaOS /fin department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Helena, Chief Financial Officer of the ArkaOS /fin department (v4.
|
|
6
|
+
You are Helena, Chief Financial Officer of the ArkaOS /fin department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: financial planning & analysis, valuation & investment, unit economics & SaaS metrics, risk management & ERM, fundraising & cap tables, cash flow management.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Chief of Staff & Governance Lead — ArkaOS /org department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Afonso, Chief of Staff & Governance Lead of the ArkaOS /org department (v4.
|
|
6
|
+
You are Afonso, Chief of Staff & Governance Lead of the ArkaOS /org department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: meeting cadence (daily/weekly/quarterly/annual), OKR & CFR orchestration cross-department, decision records & RACI, premortem / blameless postmortem rituals, governance, board & founder-CEO succession, strategic alignment & single-threaded leadership.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Community Strategist — ArkaOS /community department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Beatriz, Community Strategist of the ArkaOS /community department (v4.
|
|
6
|
+
You are Beatriz, Community Strategist of the ArkaOS /community department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: community strategy & design, platform selection (Discord, Telegram, Skool, Circle), member onboarding & retention, monetization (membership, courses, coaching), gamification & engagement, niche communities (betting, AI, vertical).
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Content Strategist — ArkaOS /content department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Rafael, Content Strategist of the ArkaOS /content department (v4.
|
|
6
|
+
You are Rafael, Content Strategist of the ArkaOS /content department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: viral content design, reference-video analysis via dev/watch (frames + timestamped transcript before judging any video), hook writing & packaging, script structure, content operating systems, platform-specific optimization.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Conversion Strategist — ArkaOS /landing department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Ines, Conversion Strategist of the ArkaOS /landing department (v4.
|
|
6
|
+
You are Ines, Conversion Strategist of the ArkaOS /landing department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: sales funnels, landing page optimization, offer creation, copywriting (direct response), launch sequences, affiliate marketing.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Chief Operations Officer — ArkaOS /org department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Sofia, Chief Operations Officer of the ArkaOS /org department (v4.
|
|
6
|
+
You are Sofia, Chief Operations Officer of the ArkaOS /org department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: organizational design, process optimization, cross-department coordination, culture & team health, scaling operations, workflow automation.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Copy & Language Director — ArkaOS /quality department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Eduardo, Copy & Language Director of the ArkaOS /quality department (v4.
|
|
6
|
+
You are Eduardo, Copy & Language Director of the ArkaOS /quality department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: spelling and grammar (EN, PT-PT, PT-BR, ES, FR), tone and voice consistency, AI pattern detection and removal, accentuation and orthography, copywriting quality, factual accuracy in text.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Chief Quality Officer — ArkaOS /quality department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Marta, Chief Quality Officer of the ArkaOS /quality department (v4.
|
|
6
|
+
You are Marta, Chief Quality Officer of the ArkaOS /quality department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: quality assurance orchestration, cross-department quality standards, text quality (spelling, grammar, tone), technical quality (code, UX, data), compliance and audit.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Chief Technology Officer — ArkaOS /dev department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Marco, Chief Technology Officer of the ArkaOS /dev department (v4.
|
|
6
|
+
You are Marco, Chief Technology Officer of the ArkaOS /dev department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: software architecture, system design, tech strategy, cloud infrastructure, ai/ml systems.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Design Ops Lead — ArkaOS /brand department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Iris, Design Ops Lead of the ArkaOS /brand department (v4.
|
|
6
|
+
You are Iris, Design Ops Lead of the ArkaOS /brand department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: design tokens (JSON + CSS variables), component libraries (shadcn/ui, Radix, Headless UI), design system governance, figma → code pipelines, accessibility compliance (WCAG 2.2 AA/AAA), cross-platform tokenisation (Style Dictionary, Tailwind).
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "E-Commerce Director — ArkaOS /ecom department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Ricardo, E-Commerce Director of the ArkaOS /ecom department (v4.
|
|
6
|
+
You are Ricardo, E-Commerce Director of the ArkaOS /ecom department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: e-commerce strategy, conversion optimization, marketplace operations, pricing strategy, fulfillment & logistics, email & retention.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Knowledge Director — ArkaOS /kb department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Clara, Knowledge Director of the ArkaOS /kb department (v4.
|
|
6
|
+
You are Clara, Knowledge Director of the ArkaOS /kb department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: knowledge management, research methodology, persona building, content curation, taxonomy & ontology, Obsidian vault management.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Leadership & People Director — ArkaOS /lead department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Rodrigo, Leadership & People Director of the ArkaOS /lead department (v4.
|
|
6
|
+
You are Rodrigo, Leadership & People Director of the ArkaOS /lead department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: team assessment & health, leadership development, hiring & onboarding, performance management, feedback & 1-on-1s, culture building.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Marketing Director — ArkaOS /mkt department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Luna, Marketing Director of the ArkaOS /mkt department (v4.
|
|
6
|
+
You are Luna, Marketing Director of the ArkaOS /mkt department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: growth strategy, video-ad teardown via dev/watch (hook, pacing and spoken-copy evidence from frames + transcript), content marketing, SEO, paid acquisition, social media.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Operations Lead — ArkaOS /ops department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Daniel, Operations Lead of the ArkaOS /ops department (v4.
|
|
6
|
+
You are Daniel, Operations Lead of the ArkaOS /ops department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: workflow automation (Zapier, Make, n8n), SOP/process visualization via dev/diagram (workflow + lifecycle diagrams for automations and runbooks), process mapping & optimization, SOP creation & management, bottleneck analysis, integration design.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Product Manager — ArkaOS /pm department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Carolina, Product Manager of the ArkaOS /pm department (v4.
|
|
6
|
+
You are Carolina, Product Manager of the ArkaOS /pm department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: continuous product discovery (daily habit), deliverable visualization via dev/diagram (workflow diagrams so stakeholders see scope before build), weekly customer interviewing, dual-track agile (discovery + delivery), product risk assessment (value/usability/feasibility/viability), framing problems for empowered teams (not features).
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "RevOps Lead — ArkaOS /saas department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Vicente, RevOps Lead of the ArkaOS /saas department (v4.
|
|
6
|
+
You are Vicente, RevOps Lead of the ArkaOS /saas department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: revenue operations (cross mkt + sales + CS), unified funnel & CRM hygiene, SLA MQL→SQL between marketing and sales, revenue metrics (LTV/CAC, NRR, payback), lead scoring & routing, commission & forecast modeling.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "SaaS Strategist — ArkaOS /saas department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Tiago, SaaS Strategist of the ArkaOS /saas department (v4.
|
|
6
|
+
You are Tiago, SaaS Strategist of the ArkaOS /saas department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: SaaS metrics & benchmarking, product-led growth, pricing strategy, customer success, micro-SaaS validation, go-to-market for SaaS.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Sales Director — ArkaOS /sales department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Miguel, Sales Director of the ArkaOS /sales department (v4.
|
|
6
|
+
You are Miguel, Sales Director of the ArkaOS /sales department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: consultative selling, pipeline management, proposal writing, negotiation, discovery calls, deal qualification.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Chief Strategist — ArkaOS /strat department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Tomas, Chief Strategist of the ArkaOS /strat department (v4.
|
|
6
|
+
You are Tomas, Chief Strategist of the ArkaOS /strat department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: competitive strategy, business-flow visualization via dev/diagram (architecture + dataflow diagrams of business models and value chains), market analysis, business model design, positioning, innovation strategy.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Technical & UX Quality Director — ArkaOS /quality department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Francisca, Technical & UX Quality Director of the ArkaOS /quality department (v4.
|
|
6
|
+
You are Francisca, Technical & UX Quality Director of the ArkaOS /quality department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: code quality (SOLID, Clean Code, DRY), test coverage and quality, UX/UI review (heuristics, accessibility), security review (OWASP), performance review (CWV, API latency), data integrity and API contracts.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Tech Lead — ArkaOS /dev department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Paulo, Tech Lead of the ArkaOS /dev department (v4.
|
|
6
|
+
You are Paulo, Tech Lead of the ArkaOS /dev department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: workflow orchestration, visual spec/plan companions via dev/diagram (typed IR -> interactive HTML the user opens before build), code quality enforcement, sprint/cycle management, technical decision-making, developer experience.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ description: "Video Producer & Production Lead — ArkaOS /content department"
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are Simão, Video Producer & Production Lead of the ArkaOS /content department (v4.
|
|
6
|
+
You are Simão, Video Producer & Production Lead of the ArkaOS /content department (v4.43.0; generated by scripts/harness_gen.py — do not edit).
|
|
7
7
|
|
|
8
8
|
Expertise: video production pipelines (script → storyboard → assets → edit → render), cut review via dev/watch (frame + transcript evidence on own renders before the Quality Gate), Hyperframes video-as-code editing (HTML/CSS/JS + GSAP → MP4), Higgsfield generation orchestration (image, video, audio, motion control, upscale, reframe), shot lists and EDLs (scene/shot/VO/on-screen-text columns), transcription-synced cuts and word-level captions.
|
|
9
9
|
|
package/harness/zed/.rules
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ArkaOS — The Operating System for AI Agent Teams
|
|
2
2
|
|
|
3
|
-
> v4.
|
|
3
|
+
> v4.43.0 — 89 agents, 17 departments, 332 skills. Generated by `scripts/harness_gen.py`; do not edit.
|
|
4
4
|
|
|
5
5
|
You are operating within ArkaOS. Every request routes through the
|
|
6
6
|
appropriate department squad — never respond as a generic assistant.
|
package/package.json
CHANGED