arkaos 4.25.0 → 4.26.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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  **The Operating System for AI Agent Teams.**
4
4
 
5
- 86 agents. 17 departments. 298 skills. Enterprise frameworks. Multi-runtime. One install.
5
+ 86 agents. 17 departments. 302 skills. Enterprise frameworks. Multi-runtime. One install.
6
6
 
7
7
  ```bash
8
8
  npx arkaos install
@@ -1,6 +1,6 @@
1
1
  # The ArkaOS Guide
2
2
 
3
- > v4.25.0 — 86 agents, 17 departments, 298 skills, 270 commands, 16 ADRs.
3
+ > v4.26.0 — 86 agents, 17 departments, 302 skills, 270 commands, 16 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.25.0
1
+ 4.26.0
package/arka/SKILL.md CHANGED
@@ -47,7 +47,7 @@ complementary, not alternatives.
47
47
  # ArkaOS — Main Orchestrator
48
48
 
49
49
  > **The Operating System for AI Agent Teams**
50
- > 86 agents. 17 departments. 298 skills. Multi-runtime. Dashboard. Knowledge RAG.
50
+ > 86 agents. 17 departments. 302 skills. Multi-runtime. Dashboard. Knowledge RAG.
51
51
 
52
52
  ## ⛔ Evidence flow — 4 gates (NON-NEGOTIABLE)
53
53
 
package/bin/arka CHANGED
@@ -68,7 +68,7 @@ case "${1:-}" in
68
68
  shift
69
69
  # Issue #358: the node doctor is canonical (engine/venv/hooks/security
70
70
  # + the migrated Claude-layer checks). The bash doctor only audits the
71
- # legacy v1 layout — keep it strictly as the no-node fallback.
71
+ # legacy v1 layout — keep it strictly as the no-npx fallback.
72
72
  if command -v npx &>/dev/null; then
73
73
  npx arkaos doctor "$@"
74
74
  exit $?
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  name: dba
3
3
  description: >
4
- Vasco — Data Platform Lead (Database & Data Engineer) (dev squad). Executes: PostgreSQL (advanced), Supabase, schema design & normalization, migration planning.
4
+ Vasco — Data Platform Lead Database & Data Engineer (dev squad). Executes: PostgreSQL (advanced), Supabase, schema design & normalization, migration planning.
5
5
  model: sonnet
6
6
  ---
7
7
 
8
8
  <!-- generated by core/agents/behavioral_compiler.py from departments/dev/agents/dba.yaml — DO NOT EDIT; edit the YAML and re-run -->
9
9
 
10
- # Vasco — Data Platform Lead (Database & Data Engineer)
10
+ # Vasco — Data Platform Lead Database & Data Engineer
11
11
 
12
- You are Vasco, Data Platform Lead (Database & Data Engineer) of the dev squad (Tier 2). What drives you: Data systems that are fast, reliable, and correctly modeled. The failure you exist to prevent: Data loss, corruption, or slow queries bringing down production.
12
+ You are Vasco, Data Platform Lead Database & Data Engineer of the dev squad (Tier 2). What drives you: Data systems that are fast, reliable, and correctly modeled. The failure you exist to prevent: Data loss, corruption, or slow queries bringing down production.
13
13
 
14
14
  ## How you work
15
15
 
@@ -1,6 +1,6 @@
1
1
  id: dba-data-eng
2
2
  name: Vasco
3
- role: Data Platform Lead (Database & Data Engineer)
3
+ role: Data Platform Lead Database & Data Engineer
4
4
  department: dev
5
5
  tier: 2
6
6
  model: sonnet
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: dev/opensource-release
3
+ description: >
4
+ Takes an internal module or repo public WITHOUT taking its secrets
5
+ with it: extract the component, scrub content AND history (secrets,
6
+ client identifiers, internal URLs, embarrassing commits), package it
7
+ as a standalone citizen (license, README, CI, versioning), and verify
8
+ the published artifact with an adversarial re-scan before anyone
9
+ else can. TRIGGER: "/dev opensource-release", "open-source this",
10
+ "vamos abrir este módulo", "prepara isto para publicar",
11
+ "extrai isto para um repo público", any internal-to-public extraction.
12
+ SKIP: releasing a version of an already-public package ->
13
+ dev/release wins; secrets hygiene inside a private repo ->
14
+ dev/env-secrets wins; redacting a document, not a repo ->
15
+ kb/doc-redaction wins.
16
+ allowed-tools: [Read, Grep, Glob, Bash]
17
+ metadata:
18
+ origin: arkaos
19
+ ---
20
+
21
+ # Open-Source Release — `/dev opensource-release`
22
+
23
+ > **Agent:** Bruno (Security Engineer) | **Framework:** History-aware scrubbing, adversarial pre-publication review
24
+
25
+ Publishing is the one deploy you cannot roll back. The moment a repo
26
+ goes public, every commit it ever had goes public with it — the API key
27
+ someone removed in 2024 but never rotated, the client name in a test
28
+ fixture, the TODO that names an unshipped product. Mirrors and scrapers
29
+ archive within minutes; deleting the repo afterwards deletes your copy,
30
+ not theirs.
31
+
32
+ ## Phase 1 — Extract
33
+
34
+ 1. Decide the boundary: what goes public, and what the public part is
35
+ allowed to import. An internal dependency that cannot come along
36
+ must be replaced by an interface or the boundary is wrong.
37
+ 2. Extract into a FRESH repository with a FRESH history. Carrying the
38
+ internal git history into the public repo is the default disaster —
39
+ the scrub target becomes every blob ever committed instead of the
40
+ current tree. Start public history at the first public commit;
41
+ record the internal provenance (repo + commit hash) in a private
42
+ note, not in the public tree.
43
+
44
+ ## Phase 2 — Scrub, then prove the scrub
45
+
46
+ Sweep the candidate tree for, at minimum:
47
+
48
+ | Class | Examples |
49
+ |---|---|
50
+ | Credentials | keys, tokens, connection strings, `.env*`, CI secrets |
51
+ | Identity leaks | client names, internal hostnames/URLs, employee data in fixtures |
52
+ | Business leaks | pricing internals, unshipped product names, internal roadmap refs |
53
+ | Path leaks | absolute paths exposing usernames or internal layout |
54
+
55
+ Two rules make the scrub real:
56
+
57
+ - **Scan the ARTIFACT, not the intention** — after packaging, run the
58
+ full sweep again on the exact tarball/tree that will be published
59
+ (the `npm pack --dry-run` + grep discipline). A scrub verified on the
60
+ working tree and published from a different state proves nothing.
61
+ - **Found secrets get ROTATED, not just removed.** A credential that
62
+ ever sat in a candidate tree is compromised-by-assumption; removal
63
+ cleans the repo, rotation cleans the risk.
64
+
65
+ ## Phase 3 — Package as a citizen
66
+
67
+ - LICENSE chosen deliberately (permissive vs copyleft is a strategy
68
+ decision — route it to the operator, never default silently).
69
+ - README that stands alone: what it does, install, quickstart, no
70
+ internal context assumed.
71
+ - CI on the public repo running the public tests; versioning from
72
+ 1.0.0 or 0.x with the same discipline as any product.
73
+ - Contribution surface decided explicitly: issues on/off, PR policy,
74
+ security contact.
75
+
76
+ ## Phase 4 — Adversarial verification
77
+
78
+ Before flipping visibility, a second pass in a fresh context reviews
79
+ the exact publishable state as a hostile outsider: what can I learn
80
+ about the company from this tree that I should not? Only after that
81
+ pass returns clean does the repo go public — and the first
82
+ post-publication act is re-running the sweep against the LIVE public
83
+ artifact.
84
+
85
+ ## Output
86
+
87
+ ```markdown
88
+ ## Open-Source Release Report
89
+
90
+ **Component:** {name} · **Boundary:** {what ships / what stayed}
91
+ **History:** fresh (internal provenance recorded privately at {ref})
92
+ **Scrub:** {classes swept} · findings {n} · rotations {n, with owners}
93
+ **Package:** {license} · README ✓ · CI ✓ · version {v}
94
+ **Adversarial pass:** {clean / findings and their fixes}
95
+ **Published:** {url} · post-publication re-scan: {clean}
96
+ ```
@@ -36,7 +36,7 @@ what it captures, and what survives to the next one.
36
36
  | 1 | Stale closure | callback reads state captured N renders ago | functional updater (`setX(v => ...)`) or include the dep and let the callback re-create |
37
37
  | 2 | Lying dependency array | effect reads `a`, deps say `[b]` | list what the effect READS; if that loops, the effect does too much — split it |
38
38
  | 3 | Derived state stored | `useState` mirroring a computable value, synced by effect | compute during render (`useMemo` if costly); delete the effect |
39
- | 4 | Key-forced remounts | `key={index}` on reorderable lists, or key changing identity every render | stable identity key; component state survives reorders |
39
+ | 4 | Keys without identity | `key={index}` on reorderable lists (state mis-binds to the POSITION after a reorder), or key changing identity every render (full remount each time) | stable identity key; component state follows the item |
40
40
  | 5 | Effects doing render work | formatting/filtering in `useEffect` + `setState` | that is render logic — move it into render; effects are for the outside world |
41
41
  | 6 | Boundary leak (App Router) | `"use client"` at the top of a tree because one leaf needs a hook | push the directive to the leaf; a client parent drags every child into the bundle |
42
42
  | 7 | Context re-render storm | one broad context carrying fast-changing values | split contexts by change rate, memoize the provider value |
@@ -0,0 +1,79 @@
1
+ ---
2
+ name: ops/harness-tune
3
+ description: >
4
+ Telemetry-driven tuning of the ArkaOS harness itself: reads the
5
+ recorded usage (MCP call telemetry, LLM cost lines, skill-budget
6
+ report, curated-mode leftovers) and proposes the cuts and switches
7
+ the data supports — MCP servers nothing called, skill surface beyond
8
+ the context budget, department packs installed but idle. Propose-only;
9
+ the operator applies. TRIGGER: "/ops harness-tune", "tune my setup",
10
+ "otimiza o meu harness", "o que posso cortar?", "porque está o
11
+ contexto tão cheio?", "que MCPs não uso?". SKIP: install health ->
12
+ the doctor (npx arkaos doctor) wins; cost VISIBILITY without action
13
+ -> /arka costs wins; business-process bottlenecks ->
14
+ ops/bottleneck-find wins.
15
+ allowed-tools: [Read, Grep, Glob, Bash]
16
+ metadata:
17
+ origin: arkaos
18
+ ---
19
+
20
+ # Harness Tune — `/ops harness-tune`
21
+
22
+ > **Agent:** Daniel (Operations Lead) | **Framework:** Usage-evidence pruning, propose-only changes
23
+
24
+ Every MCP server registered, every skill deployed, every pack installed
25
+ pays rent in the scarcest currency the harness has — context — whether
26
+ it gets used or not. The bill arrives silently, every single turn. This
27
+ skill reads the meters before proposing anything: a recommendation that
28
+ is not backed by a telemetry line is an opinion, and opinions do not
29
+ get to delete configuration.
30
+
31
+ ## Read the meters
32
+
33
+ | Meter | Source | Answers |
34
+ |---|---|---|
35
+ | MCP usage | `~/.arkaos/telemetry/mcp-usage.jsonl` (aggregate: `core.runtime.mcp_telemetry`) | which servers were actually called, when last |
36
+ | LLM cost | `core.runtime.llm_cost_telemetry` summaries | which sessions burn, cache hit rate |
37
+ | Skill surface | skill-budget linter + `skills-mode.json` + manifest | deployed vs curated cut, leftovers on a curated machine |
38
+ | Enforcement | `core.governance.enforcement_telemetry` | gates that fire often (candidates for tuning, not removal) |
39
+
40
+ A meter that has no data is reported as "no data", never extrapolated —
41
+ two days of telemetry cannot justify removing anything.
42
+
43
+ ## Propose (never apply)
44
+
45
+ For each finding, the proposal names the evidence, the change, the
46
+ saving, and the reversal:
47
+
48
+ - MCP server with zero calls in the observation window → propose
49
+ removing it from the project `.mcp.json` files that carry it; note
50
+ the one-line restore.
51
+ - Curated-mode machine carrying plugin-eligible leftovers → propose the
52
+ pack-by-pack install path instead (the doctor's skills-surface check
53
+ names them).
54
+ - Full-mode machine using two departments → propose curated + the two
55
+ packs.
56
+ - A gate firing constantly with high compliance → nothing to remove;
57
+ flag as healthy enforcement, not noise. Tuning never trades
58
+ governance for tokens.
59
+
60
+ Hard line: user-added MCPs and project-specific servers are proposed
61
+ for removal ONLY on zero usage, and always labeled as user-added —
62
+ the harness does not know why the operator installed them, so the
63
+ proposal says that too.
64
+
65
+ ## Output
66
+
67
+ ```markdown
68
+ ## Harness Tune Report — {date}
69
+
70
+ **Observation window:** {days}d of telemetry ({lines} events)
71
+
72
+ | # | Evidence | Proposal | Saves | Restore |
73
+ |---|---|---|---|---|
74
+ | 1 | {server}: 0 calls in {n}d | remove from {k} projects | {context/startup} | {one-liner} |
75
+
76
+ **No-data meters:** {list, or none}
77
+ **Healthy, untouched:** {enforcement surfaces left alone, and why}
78
+ **Apply:** every change above is a diff the operator runs — nothing was changed by this audit.
79
+ ```
@@ -0,0 +1,81 @@
1
+ ---
2
+ name: ops/session-retro
3
+ description: >
4
+ Post-session friction analysis over the actual transcript: finds the
5
+ corrections the operator made more than once, the tool loops, the
6
+ redone work, and the vague asks that cost a round-trip — and turns
7
+ each recurring pattern into its structural fix (a hookify predicate,
8
+ a recipe, a refined prompt template, a missing skill). TRIGGER:
9
+ "/ops session-retro", "analisa esta sessão", "what went wrong this
10
+ session", "porque é que isto demorou tanto?", "retro da sessão", end
11
+ of a long or frustrating working session. SKIP: capturing an
12
+ APPROVED feature build for reuse -> arka-recipes wins; you already
13
+ know the predicate to enforce -> ops/hookify wins; team/human
14
+ retrospectives -> lead/team-health wins.
15
+ allowed-tools: [Read, Grep, Glob, Bash]
16
+ metadata:
17
+ origin: arkaos
18
+ ---
19
+
20
+ # Session Retro — `/ops session-retro`
21
+
22
+ > **Agent:** Daniel (Operations Lead) | **Framework:** Transcript friction mining, pattern-to-fix routing
23
+
24
+ You shipped. The tests are green, the PR is merged, and nobody asks
25
+ what the session cost to get there — the correction typed three times,
26
+ the file re-read five, the plan that bounced twice for the same reason.
27
+ That cost repeats next session, and the one after, until someone reads
28
+ the transcript looking for it. The deliverable was reviewed; the
29
+ PROCESS never is. This is that review.
30
+
31
+ ## Mine the transcript
32
+
33
+ Sources, in order of reliability: the session transcript itself, the
34
+ telemetry the hooks recorded during it (`~/.arkaos/telemetry/` —
35
+ stop-lint events, tool-loop detections, compliance lines), and the git
36
+ reflog of the period. Findings must quote their instances — a friction
37
+ claim without at least two concrete occurrences is an anecdote and is
38
+ reported as such or dropped.
39
+
40
+ | Pattern | Signature in the transcript |
41
+ |---|---|
42
+ | Repeated correction | operator states the same guidance ≥2 times, any phrasing |
43
+ | Tool loop | same call, same target, no state change between (the tool-loop detector's events, plus manual scan) |
44
+ | Redone work | an artifact written, then rewritten from scratch after a bounce that named a knowable-in-advance defect |
45
+ | Vague-ask round-trip | request → clarification exchange → the ACTUAL request (the refine pattern, observed after the fact) |
46
+ | Context churn | the same file read repeatedly far apart — a sign the fact belonged in memory or a doc |
47
+
48
+ ## Route each pattern to its structural fix
49
+
50
+ The retro's output is not a list of regrets — every confirmed pattern
51
+ maps to exactly one fix owner:
52
+
53
+ - Repeated correction with a decidable predicate → **ops/hookify**
54
+ (hand it the instances; they are the evidence Step 1 needs).
55
+ - Correction that needs judgment → memory entry or department skill
56
+ gap, named explicitly.
57
+ - Redone work after a preventable bounce → the checklist/skill that
58
+ would have caught it BEFORE the first attempt.
59
+ - Vague-ask round-trips → the prompt template or refine flow that
60
+ front-loads the missing parameters.
61
+ - Context churn → the doc, memory, or CLAUDE.md line where the fact
62
+ should permanently live.
63
+
64
+ A pattern with no viable fix is stated as accepted cost — visible,
65
+ priced, and chosen, rather than silently paid again.
66
+
67
+ ## Output
68
+
69
+ ```markdown
70
+ ## Session Retro — {session/date}
71
+
72
+ **Shipped:** {what the session delivered} · **Friction cost:** {rough
73
+ turns/time attributable to the patterns below}
74
+
75
+ | # | Pattern | Instances | Fix | Owner |
76
+ |---|---|---|---|---|
77
+ | 1 | {repeated correction: "stage by explicit path"} | {turn refs} | hookify predicate | ops/hookify |
78
+
79
+ **Accepted costs:** {none, or the priced list}
80
+ **One change for next session:** {the single highest-leverage fix}
81
+ ```
@@ -0,0 +1,88 @@
1
+ ---
2
+ name: ops/workspace-audit
3
+ description: >
4
+ Sweeps every repository in the workspace for the entropy that
5
+ accumulates between projects: dirty working trees, unpushed commits,
6
+ orphaned branches, forgotten stashes, repos without remotes, and
7
+ secrets sitting outside .gitignore — then reports per repo with the
8
+ one command that clears each finding. TRIGGER: "/ops workspace-audit",
9
+ "audit my workspace", "varre os meus projetos", "que repos estão
10
+ sujos?", "o que tenho por commitar?", periodic hygiene, and after any
11
+ tool that mass-edits files across projects. SKIP: branch/merge
12
+ discipline within one change -> ops/github-ops wins; ArkaOS install
13
+ health -> the doctor (npx arkaos doctor) wins; one project's
14
+ dependency risk -> dev/dependency-audit wins.
15
+ allowed-tools: [Read, Grep, Glob, Bash]
16
+ metadata:
17
+ origin: arkaos
18
+ ---
19
+
20
+ # Workspace Audit — `/ops workspace-audit`
21
+
22
+ > **Agent:** Daniel (Operations Lead) | **Framework:** Read-only sweep, finding-to-command mapping
23
+
24
+ Workspaces do not break; they silt. One repo keeps a dirty tree from a
25
+ config sync, another holds a commit that never got pushed, a third has
26
+ a stash nobody remembers making — each harmless alone, none announced,
27
+ all invisible until the day one of them eats an afternoon or, worse, a
28
+ piece of work. The sweep exists because no single project's tooling
29
+ looks ACROSS projects.
30
+
31
+ ## Sweep
32
+
33
+ For every git repository under the workspace roots (honoring the
34
+ operator's project layout — e.g. `~/Herd` for Laravel, `~/Work` for
35
+ Node/Nuxt/Python — plus any explicitly given path):
36
+
37
+ | # | Check | Finding when |
38
+ |---|---|---|
39
+ | 1 | Working tree | `git status --porcelain` non-empty |
40
+ | 2 | Unpushed work | commits ahead of upstream, or branch with no upstream |
41
+ | 3 | Stashes | `git stash list` non-empty (each stash is work in limbo) |
42
+ | 4 | Orphaned branches | local branches fully merged into the default branch, or with no activity beyond an age threshold |
43
+ | 5 | No remote | repository with zero remotes (single-disk work) |
44
+ | 6 | Secrets exposure | `.env*` / key files present AND not matched by .gitignore |
45
+ | 7 | Detached HEAD | repo parked on no branch |
46
+
47
+ **The audit is strictly read-only.** It runs inspection commands only
48
+ and never fixes anything itself — a sweep that mutates sixty repos to
49
+ "help" is a bigger incident than anything it would find. Every finding
50
+ ships with the exact command that clears it; running them is the
51
+ operator's call, repo by repo.
52
+
53
+ ## Triage
54
+
55
+ Findings are ranked by loss potential, not by count:
56
+
57
+ 1. **Work at risk** — dirty trees, unpushed commits, stashes, detached
58
+ HEADs, no-remote repos: things that can LOSE work.
59
+ 2. **Exposure** — secrets outside .gitignore: things that can LEAK.
60
+ 3. **Clutter** — orphaned branches: things that cost attention only.
61
+
62
+ A workspace with 40 clutter findings and one unpushed repo leads with
63
+ the unpushed repo.
64
+
65
+ ## Output
66
+
67
+ ```markdown
68
+ ## Workspace Audit — {date}
69
+
70
+ **Roots:** {paths} · **Repos scanned:** {n} · **Clean:** {n}
71
+
72
+ ### Work at risk ({n})
73
+ | Repo | Finding | Clear with |
74
+ |---|---|---|
75
+ | {path} | {e.g. 3 commits unpushed on feat/x} | `git push origin feat/x` |
76
+
77
+ ### Exposure ({n})
78
+ | Repo | Finding | Clear with |
79
+
80
+ ### Clutter ({n})
81
+ {collapsed list: repo — branches}
82
+
83
+ **Verdict:** {the one thing to do first, and why it outranks the rest}
84
+ ```
85
+
86
+ Repeated audits should trend toward boring: a finding that reappears
87
+ every sweep is a process gap — route it to ops/hookify or an SOP
88
+ instead of clearing it by hand a fourth time.
@@ -1,6 +1,6 @@
1
1
  # ArkaOS — The Operating System for AI Agent Teams
2
2
 
3
- > v4.25.0 — 86 agents, 17 departments, 298 skills. Generated by `scripts/harness_gen.py`; do not edit.
3
+ > v4.26.0 — 86 agents, 17 departments, 302 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.
@@ -46,7 +46,7 @@ Adopt the matching persona when executing department work:
46
46
  - **brand**: Iris (Design Ops Lead) · Valentina (Creative Director) · Isabel (Visual Designer) · Júlia (UX Strategist) · Leo (Component Library Standardizer) · Mateus (Brand Strategist) · Nia (Design Extraction Engineer) · Oren (Accessibility Auditor) · Renata (UX Researcher) · Sofia D. (UX/UI Designer)
47
47
  - **community**: Beatriz (Community Strategist) · Maria (Community Manager) · Tania (Engagement & Gamification Designer)
48
48
  - **content**: Rafael (Content Strategist) · Simão (Video Producer & Production Lead) · Dinis (Information Compiler) · Filipe (Viral Content Engineer) · Joana (Scriptwriter) · Madalena (Content Researcher) · Margarida (Trends & Niche Analyst) · Nuno (Repurpose & Distribution Specialist)
49
- - **dev**: Marco (Chief Technology Officer) · Gabriel (Software Architect) · Paulo (Tech Lead) · Andre (Backend Core Lead) · Bruno (Security Engineer) · Carlos (DevOps Lead) · Diana (Senior Frontend Developer) · Diogo (Python Backend Specialist) · Duarte (Data / ETL Engineer) · Gonçalo (Laravel Specialist) · Rita (QA Engineer) · Salvador (AI Engineering Specialist) · Vasco (Data Platform Lead (Database & Data Engineer)) · Vera (Node.js / TypeScript Backend Specialist) · Maria (Research Assistant)
49
+ - **dev**: Marco (Chief Technology Officer) · Gabriel (Software Architect) · Paulo (Tech Lead) · Andre (Backend Core Lead) · Bruno (Security Engineer) · Carlos (DevOps Lead) · Diana (Senior Frontend Developer) · Diogo (Python Backend Specialist) · Duarte (Data / ETL Engineer) · Gonçalo (Laravel Specialist) · Rita (QA Engineer) · Salvador (AI Engineering Specialist) · Vasco (Data Platform Lead Database & Data Engineer) · Vera (Node.js / TypeScript Backend Specialist) · Maria (Research Assistant)
50
50
  - **ecom**: Ricardo (E-Commerce Director) · Alice (CRO Specialist) · Catarina (Lifecycle & Retention Manager) · David (Commerce Engineer)
51
51
  - **fin**: Helena (Chief Financial Officer) · Leonor (Financial Analyst) · Rui (Investment & Fundraising Strategist)
52
52
  - **kb**: Clara (Knowledge Director) · Francisco (Research Analyst) · Helena C. (Knowledge Curator) · Tomas Jr (Data Collector)
@@ -61,7 +61,7 @@ Adopt the matching persona when executing department work:
61
61
  - **sales**: Miguel (Sales Director) · Ines S. (Sales Operations Analyst) · Joao (Sales Closer) · Martim (SDR / Pre-Sales)
62
62
  - **strat**: Tomas (Chief Strategist) · Guilherme (Decision Quality & Strategic Foresight) · Lucas (Market & Competitive Intelligence Analyst) · Marta S. (Business Model Designer)
63
63
 
64
- ## Stack conventions
64
+ ## Stack Conventions
65
65
 
66
66
  Apply the section matching the files you touch.
67
67
 
@@ -1,6 +1,6 @@
1
1
  # ArkaOS — The Operating System for AI Agent Teams
2
2
 
3
- > v4.25.0 — 86 agents, 17 departments, 298 skills. Generated by `scripts/harness_gen.py`; do not edit.
3
+ > v4.26.0 — 86 agents, 17 departments, 302 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.
@@ -46,7 +46,7 @@ Adopt the matching persona when executing department work:
46
46
  - **brand**: Iris (Design Ops Lead) · Valentina (Creative Director) · Isabel (Visual Designer) · Júlia (UX Strategist) · Leo (Component Library Standardizer) · Mateus (Brand Strategist) · Nia (Design Extraction Engineer) · Oren (Accessibility Auditor) · Renata (UX Researcher) · Sofia D. (UX/UI Designer)
47
47
  - **community**: Beatriz (Community Strategist) · Maria (Community Manager) · Tania (Engagement & Gamification Designer)
48
48
  - **content**: Rafael (Content Strategist) · Simão (Video Producer & Production Lead) · Dinis (Information Compiler) · Filipe (Viral Content Engineer) · Joana (Scriptwriter) · Madalena (Content Researcher) · Margarida (Trends & Niche Analyst) · Nuno (Repurpose & Distribution Specialist)
49
- - **dev**: Marco (Chief Technology Officer) · Gabriel (Software Architect) · Paulo (Tech Lead) · Andre (Backend Core Lead) · Bruno (Security Engineer) · Carlos (DevOps Lead) · Diana (Senior Frontend Developer) · Diogo (Python Backend Specialist) · Duarte (Data / ETL Engineer) · Gonçalo (Laravel Specialist) · Rita (QA Engineer) · Salvador (AI Engineering Specialist) · Vasco (Data Platform Lead (Database & Data Engineer)) · Vera (Node.js / TypeScript Backend Specialist) · Maria (Research Assistant)
49
+ - **dev**: Marco (Chief Technology Officer) · Gabriel (Software Architect) · Paulo (Tech Lead) · Andre (Backend Core Lead) · Bruno (Security Engineer) · Carlos (DevOps Lead) · Diana (Senior Frontend Developer) · Diogo (Python Backend Specialist) · Duarte (Data / ETL Engineer) · Gonçalo (Laravel Specialist) · Rita (QA Engineer) · Salvador (AI Engineering Specialist) · Vasco (Data Platform Lead Database & Data Engineer) · Vera (Node.js / TypeScript Backend Specialist) · Maria (Research Assistant)
50
50
  - **ecom**: Ricardo (E-Commerce Director) · Alice (CRO Specialist) · Catarina (Lifecycle & Retention Manager) · David (Commerce Engineer)
51
51
  - **fin**: Helena (Chief Financial Officer) · Leonor (Financial Analyst) · Rui (Investment & Fundraising Strategist)
52
52
  - **kb**: Clara (Knowledge Director) · Francisco (Research Analyst) · Helena C. (Knowledge Curator) · Tomas Jr (Data Collector)
@@ -61,7 +61,7 @@ Adopt the matching persona when executing department work:
61
61
  - **sales**: Miguel (Sales Director) · Ines S. (Sales Operations Analyst) · Joao (Sales Closer) · Martim (SDR / Pre-Sales)
62
62
  - **strat**: Tomas (Chief Strategist) · Guilherme (Decision Quality & Strategic Foresight) · Lucas (Market & Competitive Intelligence Analyst) · Marta S. (Business Model Designer)
63
63
 
64
- ## Stack conventions
64
+ ## Stack Conventions
65
65
 
66
66
  Apply the section matching the files you touch.
67
67
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: ArkaOS laravel stack conventions
2
+ description: ArkaOS Laravel stack conventions
3
3
  globs: app/**/*.php, routes/**/*.php, database/**/*.php, config/**/*.php, tests/**/*.php
4
4
  alwaysApply: false
5
5
  ---
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: ArkaOS node stack conventions
2
+ description: ArkaOS Node stack conventions
3
3
  globs: **/*.js, **/*.mjs, **/*.cjs, **/*.ts
4
4
  alwaysApply: false
5
5
  ---
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: ArkaOS nuxt stack conventions
2
+ description: ArkaOS Nuxt stack conventions
3
3
  globs: **/*.vue, composables/**, pages/**, layouts/**, server/**, nuxt.config.*
4
4
  alwaysApply: false
5
5
  ---
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: ArkaOS php stack conventions
2
+ description: ArkaOS PHP stack conventions
3
3
  globs: **/*.php
4
4
  alwaysApply: false
5
5
  ---
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: ArkaOS python stack conventions
2
+ description: ArkaOS Python stack conventions
3
3
  globs: **/*.py
4
4
  alwaysApply: false
5
5
  ---
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: ArkaOS react stack conventions
2
+ description: ArkaOS React stack conventions
3
3
  globs: **/*.tsx, **/*.jsx
4
4
  alwaysApply: false
5
5
  ---
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: ArkaOS vue stack conventions
2
+ description: ArkaOS Vue stack conventions
3
3
  globs: **/*.vue
4
4
  alwaysApply: false
5
5
  ---
@@ -1,11 +1,11 @@
1
1
  ---
2
- description: ArkaOS v4.25.0 agent-team contract
2
+ description: ArkaOS v4.26.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.25.0 — 86 agents, 17 departments, 298 skills. Generated by `scripts/harness_gen.py`; do not edit.
8
+ > v4.26.0 — 86 agents, 17 departments, 302 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.
@@ -51,7 +51,7 @@ Adopt the matching persona when executing department work:
51
51
  - **brand**: Iris (Design Ops Lead) · Valentina (Creative Director) · Isabel (Visual Designer) · Júlia (UX Strategist) · Leo (Component Library Standardizer) · Mateus (Brand Strategist) · Nia (Design Extraction Engineer) · Oren (Accessibility Auditor) · Renata (UX Researcher) · Sofia D. (UX/UI Designer)
52
52
  - **community**: Beatriz (Community Strategist) · Maria (Community Manager) · Tania (Engagement & Gamification Designer)
53
53
  - **content**: Rafael (Content Strategist) · Simão (Video Producer & Production Lead) · Dinis (Information Compiler) · Filipe (Viral Content Engineer) · Joana (Scriptwriter) · Madalena (Content Researcher) · Margarida (Trends & Niche Analyst) · Nuno (Repurpose & Distribution Specialist)
54
- - **dev**: Marco (Chief Technology Officer) · Gabriel (Software Architect) · Paulo (Tech Lead) · Andre (Backend Core Lead) · Bruno (Security Engineer) · Carlos (DevOps Lead) · Diana (Senior Frontend Developer) · Diogo (Python Backend Specialist) · Duarte (Data / ETL Engineer) · Gonçalo (Laravel Specialist) · Rita (QA Engineer) · Salvador (AI Engineering Specialist) · Vasco (Data Platform Lead (Database & Data Engineer)) · Vera (Node.js / TypeScript Backend Specialist) · Maria (Research Assistant)
54
+ - **dev**: Marco (Chief Technology Officer) · Gabriel (Software Architect) · Paulo (Tech Lead) · Andre (Backend Core Lead) · Bruno (Security Engineer) · Carlos (DevOps Lead) · Diana (Senior Frontend Developer) · Diogo (Python Backend Specialist) · Duarte (Data / ETL Engineer) · Gonçalo (Laravel Specialist) · Rita (QA Engineer) · Salvador (AI Engineering Specialist) · Vasco (Data Platform Lead Database & Data Engineer) · Vera (Node.js / TypeScript Backend Specialist) · Maria (Research Assistant)
55
55
  - **ecom**: Ricardo (E-Commerce Director) · Alice (CRO Specialist) · Catarina (Lifecycle & Retention Manager) · David (Commerce Engineer)
56
56
  - **fin**: Helena (Chief Financial Officer) · Leonor (Financial Analyst) · Rui (Investment & Fundraising Strategist)
57
57
  - **kb**: Clara (Knowledge Director) · Francisco (Research Analyst) · Helena C. (Knowledge Curator) · Tomas Jr (Data Collector)
@@ -66,7 +66,7 @@ Adopt the matching persona when executing department work:
66
66
  - **sales**: Miguel (Sales Director) · Ines S. (Sales Operations Analyst) · Joao (Sales Closer) · Martim (SDR / Pre-Sales)
67
67
  - **strat**: Tomas (Chief Strategist) · Guilherme (Decision Quality & Strategic Foresight) · Lucas (Market & Competitive Intelligence Analyst) · Marta S. (Business Model Designer)
68
68
 
69
- ## Stack conventions
69
+ ## Stack Conventions
70
70
 
71
71
  Path-scoped rules in this directory (`arkaos-stack-*.mdc`) apply automatically to matching files.
72
72
 
@@ -1,6 +1,6 @@
1
1
  # ArkaOS — The Operating System for AI Agent Teams
2
2
 
3
- > v4.25.0 — 86 agents, 17 departments, 298 skills. Generated by `scripts/harness_gen.py`; do not edit.
3
+ > v4.26.0 — 86 agents, 17 departments, 302 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.
@@ -46,7 +46,7 @@ Adopt the matching persona when executing department work:
46
46
  - **brand**: Iris (Design Ops Lead) · Valentina (Creative Director) · Isabel (Visual Designer) · Júlia (UX Strategist) · Leo (Component Library Standardizer) · Mateus (Brand Strategist) · Nia (Design Extraction Engineer) · Oren (Accessibility Auditor) · Renata (UX Researcher) · Sofia D. (UX/UI Designer)
47
47
  - **community**: Beatriz (Community Strategist) · Maria (Community Manager) · Tania (Engagement & Gamification Designer)
48
48
  - **content**: Rafael (Content Strategist) · Simão (Video Producer & Production Lead) · Dinis (Information Compiler) · Filipe (Viral Content Engineer) · Joana (Scriptwriter) · Madalena (Content Researcher) · Margarida (Trends & Niche Analyst) · Nuno (Repurpose & Distribution Specialist)
49
- - **dev**: Marco (Chief Technology Officer) · Gabriel (Software Architect) · Paulo (Tech Lead) · Andre (Backend Core Lead) · Bruno (Security Engineer) · Carlos (DevOps Lead) · Diana (Senior Frontend Developer) · Diogo (Python Backend Specialist) · Duarte (Data / ETL Engineer) · Gonçalo (Laravel Specialist) · Rita (QA Engineer) · Salvador (AI Engineering Specialist) · Vasco (Data Platform Lead (Database & Data Engineer)) · Vera (Node.js / TypeScript Backend Specialist) · Maria (Research Assistant)
49
+ - **dev**: Marco (Chief Technology Officer) · Gabriel (Software Architect) · Paulo (Tech Lead) · Andre (Backend Core Lead) · Bruno (Security Engineer) · Carlos (DevOps Lead) · Diana (Senior Frontend Developer) · Diogo (Python Backend Specialist) · Duarte (Data / ETL Engineer) · Gonçalo (Laravel Specialist) · Rita (QA Engineer) · Salvador (AI Engineering Specialist) · Vasco (Data Platform Lead Database & Data Engineer) · Vera (Node.js / TypeScript Backend Specialist) · Maria (Research Assistant)
50
50
  - **ecom**: Ricardo (E-Commerce Director) · Alice (CRO Specialist) · Catarina (Lifecycle & Retention Manager) · David (Commerce Engineer)
51
51
  - **fin**: Helena (Chief Financial Officer) · Leonor (Financial Analyst) · Rui (Investment & Fundraising Strategist)
52
52
  - **kb**: Clara (Knowledge Director) · Francisco (Research Analyst) · Helena C. (Knowledge Curator) · Tomas Jr (Data Collector)
@@ -61,7 +61,7 @@ Adopt the matching persona when executing department work:
61
61
  - **sales**: Miguel (Sales Director) · Ines S. (Sales Operations Analyst) · Joao (Sales Closer) · Martim (SDR / Pre-Sales)
62
62
  - **strat**: Tomas (Chief Strategist) · Guilherme (Decision Quality & Strategic Foresight) · Lucas (Market & Competitive Intelligence Analyst) · Marta S. (Business Model Designer)
63
63
 
64
- ## Stack conventions
64
+ ## Stack Conventions
65
65
 
66
66
  Apply the section matching the files you touch.
67
67
 
@@ -1,6 +1,6 @@
1
1
  # ArkaOS — The Operating System for AI Agent Teams
2
2
 
3
- > v4.25.0 — 86 agents, 17 departments, 298 skills. Generated by `scripts/harness_gen.py`; do not edit.
3
+ > v4.26.0 — 86 agents, 17 departments, 302 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.
@@ -46,7 +46,7 @@ Adopt the matching persona when executing department work:
46
46
  - **brand**: Iris (Design Ops Lead) · Valentina (Creative Director) · Isabel (Visual Designer) · Júlia (UX Strategist) · Leo (Component Library Standardizer) · Mateus (Brand Strategist) · Nia (Design Extraction Engineer) · Oren (Accessibility Auditor) · Renata (UX Researcher) · Sofia D. (UX/UI Designer)
47
47
  - **community**: Beatriz (Community Strategist) · Maria (Community Manager) · Tania (Engagement & Gamification Designer)
48
48
  - **content**: Rafael (Content Strategist) · Simão (Video Producer & Production Lead) · Dinis (Information Compiler) · Filipe (Viral Content Engineer) · Joana (Scriptwriter) · Madalena (Content Researcher) · Margarida (Trends & Niche Analyst) · Nuno (Repurpose & Distribution Specialist)
49
- - **dev**: Marco (Chief Technology Officer) · Gabriel (Software Architect) · Paulo (Tech Lead) · Andre (Backend Core Lead) · Bruno (Security Engineer) · Carlos (DevOps Lead) · Diana (Senior Frontend Developer) · Diogo (Python Backend Specialist) · Duarte (Data / ETL Engineer) · Gonçalo (Laravel Specialist) · Rita (QA Engineer) · Salvador (AI Engineering Specialist) · Vasco (Data Platform Lead (Database & Data Engineer)) · Vera (Node.js / TypeScript Backend Specialist) · Maria (Research Assistant)
49
+ - **dev**: Marco (Chief Technology Officer) · Gabriel (Software Architect) · Paulo (Tech Lead) · Andre (Backend Core Lead) · Bruno (Security Engineer) · Carlos (DevOps Lead) · Diana (Senior Frontend Developer) · Diogo (Python Backend Specialist) · Duarte (Data / ETL Engineer) · Gonçalo (Laravel Specialist) · Rita (QA Engineer) · Salvador (AI Engineering Specialist) · Vasco (Data Platform Lead Database & Data Engineer) · Vera (Node.js / TypeScript Backend Specialist) · Maria (Research Assistant)
50
50
  - **ecom**: Ricardo (E-Commerce Director) · Alice (CRO Specialist) · Catarina (Lifecycle & Retention Manager) · David (Commerce Engineer)
51
51
  - **fin**: Helena (Chief Financial Officer) · Leonor (Financial Analyst) · Rui (Investment & Fundraising Strategist)
52
52
  - **kb**: Clara (Knowledge Director) · Francisco (Research Analyst) · Helena C. (Knowledge Curator) · Tomas Jr (Data Collector)
@@ -61,7 +61,7 @@ Adopt the matching persona when executing department work:
61
61
  - **sales**: Miguel (Sales Director) · Ines S. (Sales Operations Analyst) · Joao (Sales Closer) · Martim (SDR / Pre-Sales)
62
62
  - **strat**: Tomas (Chief Strategist) · Guilherme (Decision Quality & Strategic Foresight) · Lucas (Market & Competitive Intelligence Analyst) · Marta S. (Business Model Designer)
63
63
 
64
- ## Stack conventions
64
+ ## Stack Conventions
65
65
 
66
66
  Apply the section matching the files you touch.
67
67
 
@@ -1,6 +1,6 @@
1
1
  # ArkaOS — The Operating System for AI Agent Teams
2
2
 
3
- > v4.25.0 — 86 agents, 17 departments, 298 skills. Generated by `scripts/harness_gen.py`; do not edit.
3
+ > v4.26.0 — 86 agents, 17 departments, 302 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.
@@ -46,7 +46,7 @@ Adopt the matching persona when executing department work:
46
46
  - **brand**: Iris (Design Ops Lead) · Valentina (Creative Director) · Isabel (Visual Designer) · Júlia (UX Strategist) · Leo (Component Library Standardizer) · Mateus (Brand Strategist) · Nia (Design Extraction Engineer) · Oren (Accessibility Auditor) · Renata (UX Researcher) · Sofia D. (UX/UI Designer)
47
47
  - **community**: Beatriz (Community Strategist) · Maria (Community Manager) · Tania (Engagement & Gamification Designer)
48
48
  - **content**: Rafael (Content Strategist) · Simão (Video Producer & Production Lead) · Dinis (Information Compiler) · Filipe (Viral Content Engineer) · Joana (Scriptwriter) · Madalena (Content Researcher) · Margarida (Trends & Niche Analyst) · Nuno (Repurpose & Distribution Specialist)
49
- - **dev**: Marco (Chief Technology Officer) · Gabriel (Software Architect) · Paulo (Tech Lead) · Andre (Backend Core Lead) · Bruno (Security Engineer) · Carlos (DevOps Lead) · Diana (Senior Frontend Developer) · Diogo (Python Backend Specialist) · Duarte (Data / ETL Engineer) · Gonçalo (Laravel Specialist) · Rita (QA Engineer) · Salvador (AI Engineering Specialist) · Vasco (Data Platform Lead (Database & Data Engineer)) · Vera (Node.js / TypeScript Backend Specialist) · Maria (Research Assistant)
49
+ - **dev**: Marco (Chief Technology Officer) · Gabriel (Software Architect) · Paulo (Tech Lead) · Andre (Backend Core Lead) · Bruno (Security Engineer) · Carlos (DevOps Lead) · Diana (Senior Frontend Developer) · Diogo (Python Backend Specialist) · Duarte (Data / ETL Engineer) · Gonçalo (Laravel Specialist) · Rita (QA Engineer) · Salvador (AI Engineering Specialist) · Vasco (Data Platform Lead Database & Data Engineer) · Vera (Node.js / TypeScript Backend Specialist) · Maria (Research Assistant)
50
50
  - **ecom**: Ricardo (E-Commerce Director) · Alice (CRO Specialist) · Catarina (Lifecycle & Retention Manager) · David (Commerce Engineer)
51
51
  - **fin**: Helena (Chief Financial Officer) · Leonor (Financial Analyst) · Rui (Investment & Fundraising Strategist)
52
52
  - **kb**: Clara (Knowledge Director) · Francisco (Research Analyst) · Helena C. (Knowledge Curator) · Tomas Jr (Data Collector)
@@ -61,7 +61,7 @@ Adopt the matching persona when executing department work:
61
61
  - **sales**: Miguel (Sales Director) · Ines S. (Sales Operations Analyst) · Joao (Sales Closer) · Martim (SDR / Pre-Sales)
62
62
  - **strat**: Tomas (Chief Strategist) · Guilherme (Decision Quality & Strategic Foresight) · Lucas (Market & Competitive Intelligence Analyst) · Marta S. (Business Model Designer)
63
63
 
64
- ## Stack conventions
64
+ ## Stack Conventions
65
65
 
66
66
  Apply the section matching the files you touch.
67
67
 
@@ -87,9 +87,10 @@ export function statuslineConfigured(
87
87
  }
88
88
  }
89
89
 
90
- // gotchas.json is live v2 state: capture/collector.py appends to it and
91
- // `/arka evolve` (#348) ingests it. Missing means capture never ran;
92
- // corrupt means evolve will choke.
90
+ // gotchas.json is live v2 state: the PostToolUse hook writes it
91
+ // (core/hooks/post_tool_use.py::_store_gotcha) and `/arka evolve`
92
+ // (#348) ingests it. Missing means capture never ran; corrupt means
93
+ // evolve will choke.
93
94
  export function gotchasHealthy(
94
95
  gotchasPath = join(INSTALL_DIR, "gotchas.json")
95
96
  ) {
@@ -1,5 +1,5 @@
1
1
  import { existsSync, readFileSync, readdirSync } from "node:fs";
2
- import { join, dirname } from "node:path";
2
+ import { join, dirname, resolve, sep } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
 
5
5
  // Multi-runtime instruction bundles, generated by scripts/harness_gen.py
@@ -16,8 +16,13 @@ export function bundleDir(target) {
16
16
  // Content of one bundle file, or null when the bundle is absent (a
17
17
  // source tree without a generated harness/ — callers must fall back
18
18
  // loudly, never write a pointer to a file that does not exist).
19
+ // Containment guard: a rel that escapes the target's bundle directory
20
+ // resolves to null — defense-in-depth, unreachable from today's
21
+ // hardcoded callers.
19
22
  export function readBundleFile(target, rel) {
20
- const path = join(bundleDir(target), rel);
23
+ const base = resolve(bundleDir(target));
24
+ const path = resolve(base, rel);
25
+ if (path !== base && !path.startsWith(base + sep)) return null;
21
26
  return existsSync(path) ? readFileSync(path, "utf-8") : null;
22
27
  }
23
28
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_meta": {
3
3
  "version": "2.0.0",
4
- "generated": "2026-07-20T21:08:57.022558",
4
+ "generated": "2026-07-21T11:11:29.016401",
5
5
  "total_agents": 86,
6
6
  "generator": "core/agents/registry_gen.py",
7
7
  "tiers": {
@@ -1586,7 +1586,7 @@
1586
1586
  {
1587
1587
  "id": "dba-data-eng",
1588
1588
  "name": "Vasco",
1589
- "role": "Data Platform Lead (Database & Data Engineer)",
1589
+ "role": "Data Platform Lead Database & Data Engineer",
1590
1590
  "department": "dev",
1591
1591
  "tier": 2,
1592
1592
  "model": "sonnet",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_meta": {
3
3
  "generator": "scripts/marketplace_gen.py",
4
- "version": "4.25.0",
4
+ "version": "4.26.0",
5
5
  "marketplace": "arkaos"
6
6
  },
7
7
  "structural": {
@@ -1373,6 +1373,19 @@
1373
1373
  "origin": "arkaos"
1374
1374
  }
1375
1375
  },
1376
+ "harness-tune": {
1377
+ "depts": [
1378
+ "ops"
1379
+ ],
1380
+ "curated": false,
1381
+ "plugins": [
1382
+ "arkaos-ops@arkaos"
1383
+ ],
1384
+ "collision": false,
1385
+ "provenance": {
1386
+ "origin": "arkaos"
1387
+ }
1388
+ },
1376
1389
  "headline-write": {
1377
1390
  "depts": [
1378
1391
  "landing"
@@ -2054,6 +2067,19 @@
2054
2067
  "origin": "arkaos"
2055
2068
  }
2056
2069
  },
2070
+ "opensource-release": {
2071
+ "depts": [
2072
+ "dev"
2073
+ ],
2074
+ "curated": false,
2075
+ "plugins": [
2076
+ "arkaos-dev@arkaos"
2077
+ ],
2078
+ "collision": false,
2079
+ "provenance": {
2080
+ "origin": "arkaos"
2081
+ }
2082
+ },
2057
2083
  "operations": {
2058
2084
  "depts": [
2059
2085
  "ops"
@@ -2742,6 +2768,19 @@
2742
2768
  "origin": "arkaos"
2743
2769
  }
2744
2770
  },
2771
+ "session-retro": {
2772
+ "depts": [
2773
+ "ops"
2774
+ ],
2775
+ "curated": false,
2776
+ "plugins": [
2777
+ "arkaos-ops@arkaos"
2778
+ ],
2779
+ "collision": false,
2780
+ "provenance": {
2781
+ "origin": "arkaos"
2782
+ }
2783
+ },
2745
2784
  "shape-pitch": {
2746
2785
  "depts": [
2747
2786
  "pm"
@@ -3300,6 +3339,19 @@
3300
3339
  "origin": "arkaos"
3301
3340
  }
3302
3341
  },
3342
+ "workspace-audit": {
3343
+ "depts": [
3344
+ "ops"
3345
+ ],
3346
+ "curated": false,
3347
+ "plugins": [
3348
+ "arkaos-ops@arkaos"
3349
+ ],
3350
+ "collision": false,
3351
+ "provenance": {
3352
+ "origin": "arkaos"
3353
+ }
3354
+ },
3303
3355
  "write-as-persona": {
3304
3356
  "depts": [
3305
3357
  "kb"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkaos",
3
- "version": "4.25.0",
3
+ "version": "4.26.0",
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 = "4.25.0"
3
+ version = "4.26.0"
4
4
  description = "Core engine for ArkaOS — The Operating System for AI Agent Teams"
5
5
  readme = "README.md"
6
6
  license = {text = "MIT"}
@@ -71,6 +71,13 @@ DIR_TO_PREFIX = {
71
71
  # target's context stop being read — the budget is the feature.
72
72
  MAIN_FILE_BUDGET_BYTES = 16_000
73
73
 
74
+ # Stack slug -> display name for user-facing frontmatter (title() would
75
+ # render "Php").
76
+ STACK_DISPLAY = {
77
+ "laravel": "Laravel", "node": "Node", "nuxt": "Nuxt", "php": "PHP",
78
+ "python": "Python", "react": "React", "vue": "Vue",
79
+ }
80
+
74
81
 
75
82
  def _load_agents() -> list[dict]:
76
83
  data = json.loads(
@@ -182,7 +189,7 @@ Adopt the matching persona when executing department work:
182
189
 
183
190
  {_agent_index(agents)}
184
191
 
185
- ## Stack conventions
192
+ ## Stack Conventions
186
193
 
187
194
  Apply the section matching the files you touch.
188
195
 
@@ -204,9 +211,9 @@ def _cursor_files() -> dict[str, str]:
204
211
  body = _contract_body()
205
212
  # Strip the stack section from the always-on rule — stacks ship as
206
213
  # individually scoped .mdc files below, Cursor's native strength.
207
- main = body.split("## Stack conventions")[0].rstrip()
214
+ main = body.split("## Stack Conventions")[0].rstrip()
208
215
  main += (
209
- "\n\n## Stack conventions\n\nPath-scoped rules in this directory "
216
+ "\n\n## Stack Conventions\n\nPath-scoped rules in this directory "
210
217
  "(`arkaos-stack-*.mdc`) apply automatically to matching files.\n"
211
218
  )
212
219
  files["rules/arkaos.mdc"] = (
@@ -215,8 +222,9 @@ def _cursor_files() -> dict[str, str]:
215
222
  )
216
223
  for stack, globs, rule_body in _stack_rules():
217
224
  globs_line = ", ".join(globs)
225
+ display = STACK_DISPLAY.get(stack, stack.title())
218
226
  files[f"rules/arkaos-stack-{stack}.mdc"] = (
219
- f"---\ndescription: ArkaOS {stack} stack conventions\n"
227
+ f"---\ndescription: ArkaOS {display} stack conventions\n"
220
228
  f"globs: {globs_line}\nalwaysApply: false\n---\n\n"
221
229
  f"{rule_body}\n"
222
230
  )
@@ -247,22 +255,27 @@ def check_budget(files: dict[str, str]) -> list[str]:
247
255
  return over
248
256
 
249
257
 
250
- def main() -> int:
251
- files = generate()
252
- over = check_budget(files)
253
- if over:
254
- print("BUDGET EXCEEDED:\n " + "\n ".join(over))
255
- return 1
256
- if HARNESS_DIR.exists():
257
- for stale in HARNESS_DIR.rglob("*"):
258
+ def write_bundle(files: dict[str, str], harness_dir: Path) -> None:
259
+ """Write the bundle, removing files a previous run left behind."""
260
+ if harness_dir.exists():
261
+ for stale in harness_dir.rglob("*"):
258
262
  if stale.is_file():
259
- rel = str(stale.relative_to(HARNESS_DIR))
263
+ rel = str(stale.relative_to(harness_dir))
260
264
  if rel not in files:
261
265
  stale.unlink()
262
266
  for rel, content in files.items():
263
- target = HARNESS_DIR / rel
267
+ target = harness_dir / rel
264
268
  target.parent.mkdir(parents=True, exist_ok=True)
265
269
  target.write_text(content)
270
+
271
+
272
+ def main() -> int:
273
+ files = generate()
274
+ over = check_budget(files)
275
+ if over:
276
+ print("BUDGET EXCEEDED:\n " + "\n ".join(over))
277
+ return 1
278
+ write_bundle(files, HARNESS_DIR)
266
279
  total = sum(len(c.encode()) for c in files.values())
267
280
  print(
268
281
  f"harness generated: {len(files)} files, 6 targets, "