@event4u/agent-config 9.28.0 → 9.29.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/.claude-plugin/marketplace.json +1 -1
- package/AGENTS.md +6 -6
- package/CHANGELOG.md +66 -0
- package/README.md +1 -1
- package/agents/templates/.ai-council.yml.example +55 -24
- package/dist/agent-src/commands/cost/report.md +2 -2
- package/dist/agent-src/commands/team/adversarial.md +8 -7
- package/dist/agent-src/commands/team/delegate.md +13 -12
- package/dist/agent-src/commands/team/review.md +9 -8
- package/dist/agent-src/commands/team/status.md +9 -8
- package/dist/agent-src/commands/team.md +29 -19
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +88 -2
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +29 -21
- package/dist/agent-src/contexts/execution/host-capability-manifest.md +26 -15
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +18 -0
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +54 -0
- package/dist/agent-src/contexts/execution/subagent-routing.md +13 -11
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +25 -0
- package/dist/agent-src/contexts/execution/subagent-steering.md +6 -3
- package/dist/agent-src/rules/delegation-policy.md +11 -7
- package/dist/agent-src/rules/settings-ask-protocol.md +8 -7
- package/dist/agent-src/rules/token-budget-discipline.md +1 -1
- package/dist/agent-src/skills/forensics-report/SKILL.md +114 -0
- package/dist/agent-src/skills/forensics-report/evals/triggers.json +17 -0
- package/dist/agent-src/skills/premortem/SKILL.md +30 -1
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -1
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +7 -5
- package/dist/agent-src/skills/subagent-orchestration/schemas/subagent-status.json +61 -3
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +1 -1
- package/dist/agent-src/templates/AGENTS.md +4 -4
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +23 -0
- package/dist/cli-delegate/{chunk-22GCIJ2O.js → chunk-66OVWGB5.js} +1 -1
- package/dist/cli-delegate/{chunk-GB2FSUEE.js → chunk-LCFJIQ4J.js} +32 -0
- package/dist/cli-delegate/{chunk-VSYT7OHO.js → chunk-LVRYBKTI.js} +31 -2
- package/dist/cli-delegate/{chunk-DVRS2KVR.js → chunk-MMXA5GY7.js} +10 -17
- package/dist/cli-delegate/{chunk-JXARCGVN.js → chunk-MP3JT3IU.js} +1 -1
- package/dist/cli-delegate/{chunk-PQSAQKHW.js → chunk-NZ5N2XQL.js} +3 -3
- package/dist/cli-delegate/{chunk-7OMQCH4V.js → chunk-OJM3MBJM.js} +1 -1
- package/dist/cli-delegate/{chunk-2BE5I2MN.js → chunk-RCIA67XN.js} +111 -90
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +6 -43
- package/dist/cli-delegate/cmd_doctor.js +9 -5
- package/dist/cli-delegate/cmd_explain.js +2 -2
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +3 -3
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +4 -4
- package/dist/cli-delegate/cmd_route_audit.js +2 -2
- package/dist/cli-delegate/cmd_route_explain.js +1 -1
- package/dist/cli-delegate/cmd_settings_get.js +1 -7
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +69 -20
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -2
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +39 -2
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +12 -4
- package/dist/hooks/dispatch.js +373 -35
- package/dist/install/install.mjs +42 -17
- package/dist/mcp/registry-manifest.json +2 -2
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +651 -262
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +54 -0
- package/dist/scripts/_lib/agent_settings.js.map +1 -1
- package/dist/scripts/condense.js +147 -2
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/schemas/settings.js +6 -7
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/shared/settingsCarveOut.js +0 -9
- package/dist/shared/settingsCarveOut.js.map +1 -1
- package/dist/shared/settingsClasses.js +11 -9
- package/dist/shared/settingsClasses.js.map +1 -1
- package/dist/ui/assets/{index-DmR0mbk4.js → index-JDAF00bC.js} +2 -2
- package/dist/ui/assets/{index-DmR0mbk4.js.map → index-JDAF00bC.js.map} +1 -1
- package/dist/ui/index.html +1 -1
- package/docs/contracts/settings-classes.md +39 -9
- package/package.json +1 -1
- package/src/agent-src/templates/AGENTS.md +4 -4
- package/src/config/agent-settings.template.yml +52 -66
- package/src/config/discovery/packs.yml +11 -0
- package/src/config/discovery/workspaces.yml +1 -1
- package/src/config/gate-violation-baselines.json +3 -3
- package/src/scripts/_cli/cmd_conformance.ts +14 -42
- package/src/scripts/_cli/cmd_doctor.ts +65 -48
- package/src/scripts/_lib/agent_settings.ts +58 -0
- package/src/scripts/_lib/auto_dispatch.corpus.test.ts +1 -1
- package/src/scripts/_lib/auto_dispatch.ts +23 -18
- package/src/scripts/_lib/capsule_trigger.ts +124 -0
- package/src/scripts/_lib/host_capability.ts +63 -6
- package/src/scripts/_lib/judgment_ladder.ts +382 -0
- package/src/scripts/_lib/orchestration_gate.ts +8 -0
- package/src/scripts/_lib/orchestration_record.ts +37 -0
- package/src/scripts/_lib/orchestration_savings.ts +1 -1
- package/src/scripts/_lib/self_repair.ts +160 -13
- package/src/scripts/_lib/self_repair_store.ts +28 -0
- package/src/scripts/_lib/subagent_capsule.ts +182 -0
- package/src/scripts/_lib/subagent_response.ts +19 -0
- package/src/scripts/_lib/subagent_spawn.ts +13 -0
- package/src/scripts/_lib/subagent_steering.ts +9 -4
- package/src/scripts/_lib/tier_budget_routing.ts +6 -1
- package/src/scripts/_lib/worker_budget.ts +37 -2
- package/src/scripts/ai_council/clients.ts +76 -54
- package/src/scripts/ai_council/config.ts +94 -6
- package/src/scripts/ai_council/handoff.ts +113 -0
- package/src/scripts/ai_council/modes.ts +19 -4
- package/src/scripts/ai_council/orchestrator.ts +105 -0
- package/src/scripts/ai_council/quorum.ts +84 -0
- package/src/scripts/ai_council/session.ts +44 -0
- package/src/scripts/ai_council/transport_resolver.ts +127 -1
- package/src/scripts/ai_team/availability.ts +110 -0
- package/src/scripts/ai_team/config.ts +34 -14
- package/src/scripts/ai_team/team_dispatch.ts +71 -29
- package/src/scripts/bench_critic_protocol.ts +396 -0
- package/src/scripts/check_detector_corpus.ts +202 -0
- package/src/scripts/check_hook_bundle_freshness.ts +4 -1
- package/src/scripts/condense.ts +162 -2
- package/src/scripts/council_cli.ts +401 -25
- package/src/scripts/forensics_report.ts +333 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +69 -35
- package/src/scripts/lint_discovery_vocabulary.ts +2 -0
- package/src/scripts/lint_never_silent.ts +276 -0
- package/src/scripts/lint_no_activation_gates.ts +271 -0
- package/src/scripts/orchestration_record.ts +8 -0
- package/src/scripts/rebuild_hook_bundle.ts +177 -0
- package/src/scripts/release.ts +74 -2
- package/src/scripts/routing_doctor.ts +21 -36
- package/src/scripts/score_skill_selection.ts +19 -5
- package/src/scripts/self_repair_cli.ts +287 -57
- package/src/scripts/team_events_spike.ts +271 -0
- package/src/scripts/team_review_gate_hook.ts +31 -9
- package/src/server/schemas/settings.ts +10 -17
- package/src/shared/settingsCarveOut.ts +0 -10
- package/src/shared/settingsClasses.ts +11 -9
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: forensics-report
|
|
3
|
+
description: "Use when a release review needs machine-derived evidence from git history — hotspot risk and change-coupling analyzers. Triggers on 'hotspot', 'what changes together', 'release forensics'."
|
|
4
|
+
domain: engineering
|
|
5
|
+
model_tier: medium
|
|
6
|
+
workspaces:
|
|
7
|
+
- engineering
|
|
8
|
+
packs:
|
|
9
|
+
- forensics
|
|
10
|
+
lifecycle: experimental
|
|
11
|
+
trust:
|
|
12
|
+
level: experimental
|
|
13
|
+
install:
|
|
14
|
+
default: false
|
|
15
|
+
removable: true
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# forensics-report
|
|
19
|
+
|
|
20
|
+
## When to use
|
|
21
|
+
|
|
22
|
+
- Before or during a **release review**, when machine-derived evidence is
|
|
23
|
+
wanted alongside the human review: "which files are the risk hotspots in
|
|
24
|
+
this release", "what changes together", "release forensics".
|
|
25
|
+
- When intended module boundaries should be checked against what the git
|
|
26
|
+
history actually shows (change-coupling across module lines).
|
|
27
|
+
- The output is **advisory, never a gate** — it points reviewers at places
|
|
28
|
+
worth attention; it never passes or fails anything.
|
|
29
|
+
- NOT for IT-security incident forensics (route to `incident-commander`) and
|
|
30
|
+
NOT for runtime performance hotspots (route to `performance-analysis`).
|
|
31
|
+
|
|
32
|
+
## Procedure
|
|
33
|
+
|
|
34
|
+
1. **Pick the range** — the previous release tag to HEAD (`vPREV..HEAD`) or a
|
|
35
|
+
released pair (`vPREV..vNEW`). Pin the range explicitly; a floating range
|
|
36
|
+
breaks determinism.
|
|
37
|
+
2. **Run the report:**
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npx tsx node_modules/@event4u/agent-config/src/scripts/forensics_report.ts --range vPREV..vNEW --out report.json
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Two deterministic, git-log-based analyzers run, read-only and offline:
|
|
44
|
+
- **Hotspot risk** = normalized change frequency x normalized complexity
|
|
45
|
+
per file over the range.
|
|
46
|
+
- **Change-coupling** = `co_changes(A,B) / min(changes(A), changes(B))`
|
|
47
|
+
per file pair.
|
|
48
|
+
3. **Optionally feed the release findings ledger:** add
|
|
49
|
+
`--findings-out findings.json`, then ingest via
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npx tsx node_modules/@event4u/agent-config/src/scripts/check_finding_dispositions.ts --ingest findings.json --release X.Y.Z
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
which appends to the existing ledger at
|
|
56
|
+
`agents/evidence/release-findings/<version>.json`. Emitted findings are
|
|
57
|
+
`kind: correctness` with `severity: low|medium` — non-blocking for the
|
|
58
|
+
release gate by construction.
|
|
59
|
+
4. **Read the results:**
|
|
60
|
+
- `hotspots[]` — a hotspot is a place for reviewer attention, NEVER a
|
|
61
|
+
quality verdict. A frequently changed complex file can be exactly right
|
|
62
|
+
as it is; the score says "look here", not "this is bad".
|
|
63
|
+
- `coupling[]` — file pairs that habitually change together.
|
|
64
|
+
- `boundary_contradictions[]` — cross-module coupling above the threshold,
|
|
65
|
+
i.e. a contradiction between intended and actual boundaries. This is a
|
|
66
|
+
finding CLASS to discuss, not a failure.
|
|
67
|
+
|
|
68
|
+
## Output format
|
|
69
|
+
|
|
70
|
+
1. Lead with the scanned denominator (`scanned.commits` / `scanned.files`, including skipped bulk commits) — a reader must be able to judge the sample before the findings.
|
|
71
|
+
2. Present hotspots and coupling as ranked tables with the score interpretation line ("a place to look, not a quality verdict") attached.
|
|
72
|
+
3. When `--findings-out` was used, state the ingest command and the ledger path the findings landed in.
|
|
73
|
+
|
|
74
|
+
Deterministic JSON with these fields:
|
|
75
|
+
|
|
76
|
+
| Field | Meaning |
|
|
77
|
+
|---|---|
|
|
78
|
+
| `mode` | analyzer mode the run used |
|
|
79
|
+
| `range` | the pinned rev-range analyzed |
|
|
80
|
+
| `scanned` | commit/file counts, including skipped bulk commits |
|
|
81
|
+
| `params` | thresholds and normalization parameters in effect |
|
|
82
|
+
| `hotspots[]` | per-file hotspot entries (path, frequency, complexity, score) |
|
|
83
|
+
| `coupling[]` | file-pair coupling entries (paths, co-change ratio) |
|
|
84
|
+
| `boundary_contradictions[]` | cross-module coupling hits above threshold |
|
|
85
|
+
|
|
86
|
+
Findings emitted via `--findings-out` conform to
|
|
87
|
+
`review-findings.schema.json` (shipped with the package; `kind: correctness`,
|
|
88
|
+
`severity: low|medium`).
|
|
89
|
+
|
|
90
|
+
## Gotchas
|
|
91
|
+
|
|
92
|
+
- **Bulk commits are coupling noise** — commits touching more than
|
|
93
|
+
`max_commit_files` files (default 50) are skipped by the coupling analyzer
|
|
94
|
+
and counted in the report's `scanned` section.
|
|
95
|
+
- **Only git log + working-tree file metrics are read** — renamed files
|
|
96
|
+
appear as two separate paths, splitting their history across both.
|
|
97
|
+
- **Deterministic only with a pinned range** — `vPREV..vNEW` reproduces;
|
|
98
|
+
"since today" or a date-relative range does not.
|
|
99
|
+
|
|
100
|
+
## Do NOT
|
|
101
|
+
|
|
102
|
+
- Do NOT build a gate out of this report — the pre-registered value question
|
|
103
|
+
in `docs/CLAIMS.md` (`forensics-pack-value`) decides promotion or closure;
|
|
104
|
+
until then the output stays advisory.
|
|
105
|
+
- Do NOT sell hotspot scores as a code-quality proxy — they measure change
|
|
106
|
+
frequency and complexity, not correctness or craftsmanship.
|
|
107
|
+
- Do NOT emit findings with `severity: high|critical` or
|
|
108
|
+
`kind: security|claim` — that would block the release gate, which this
|
|
109
|
+
analyzer must never do.
|
|
110
|
+
|
|
111
|
+
## See also
|
|
112
|
+
|
|
113
|
+
- `forensics_report.ts` (this package's scripts tree; consumer path `node_modules/@event4u/agent-config/src/scripts/forensics_report.ts`) — the analyzer implementation.
|
|
114
|
+
- `docs/CLAIMS.md` — the pre-registered `forensics-pack-value` question.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "forensics-report",
|
|
3
|
+
"last_eval": "2026-08-09",
|
|
4
|
+
"description": "5 should-trigger + 5 should-not-trigger. Should-trigger covers DE+EN phrasings for git-history release forensics (hotspot risk, change-coupling, release-review evidence). Should-not-trigger covers near-miss neighbours: security incident forensics (incident-commander), plain git log, runtime performance hotspots (performance-analysis), line blame, security audit.",
|
|
5
|
+
"queries": [
|
|
6
|
+
{ "q": "which files are the riskiest hotspots in this release", "trigger": true },
|
|
7
|
+
{ "q": "what files always change together", "trigger": true },
|
|
8
|
+
{ "q": "run the forensics report for the release review", "trigger": true },
|
|
9
|
+
{ "q": "zeig mir hotspot und coupling evidenz für das release", "trigger": true },
|
|
10
|
+
{ "q": "machine-derived evidence for the release review", "trigger": true },
|
|
11
|
+
{ "q": "do a forensic analysis of the security incident from last night", "trigger": false },
|
|
12
|
+
{ "q": "show me the git log for the last week", "trigger": false },
|
|
13
|
+
{ "q": "find the performance hotspots in production at runtime", "trigger": false },
|
|
14
|
+
{ "q": "who wrote this line — run git blame on it", "trigger": false },
|
|
15
|
+
{ "q": "run a security audit on the auth module", "trigger": false }
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -80,6 +80,31 @@ For each top failure mode (sorted by L × I from `risk-officer`):
|
|
|
80
80
|
rollout strategy that reduces the likelihood of this failure mode. Keep it
|
|
81
81
|
executable; flag as `accept` if no practical guardrail exists.
|
|
82
82
|
|
|
83
|
+
### 3b. Compress into the four-part failure register
|
|
84
|
+
|
|
85
|
+
When the pre-mortem accompanies a plan artefact (a roadmap, an ADR, a design
|
|
86
|
+
doc), compress the analysis into the **four-part failure register** — the
|
|
87
|
+
fixed, comparable shape the roadmap template's optional `## Pre-mortem`
|
|
88
|
+
section consumes:
|
|
89
|
+
|
|
90
|
+
1. **Three most probable causes of death, ranked** — one paragraph each,
|
|
91
|
+
naming the concrete mechanism by which the plan most plausibly dies.
|
|
92
|
+
Mechanisms, not topics: "the gate's two inputs are unmeasurable from this
|
|
93
|
+
corpus" is a cause; "measurement risk" is not.
|
|
94
|
+
2. **One untested hidden dependency** — the assumption the plan relies on but
|
|
95
|
+
never tests.
|
|
96
|
+
3. **One modification that makes failure survivable** — a concrete plan change
|
|
97
|
+
that converts a fatal outcome into a recoverable one.
|
|
98
|
+
4. **One tripwire metric with a horizon** — a measurable signal plus a
|
|
99
|
+
threshold and deadline that says early that cause #1 is materializing.
|
|
100
|
+
|
|
101
|
+
The register was validated blind against this repo's own closed nulls
|
|
102
|
+
(3 of 4 registers named the actual failure cause at rank 1 —
|
|
103
|
+
`agents/evidence/analysis/premortem-blind-retro-validation.md`). The hits were
|
|
104
|
+
all failures of *measurability*; the miss was a mechanism that worked but
|
|
105
|
+
added nothing — weight the register toward "can this experiment answer its
|
|
106
|
+
question" and state redundancy risks explicitly.
|
|
107
|
+
|
|
83
108
|
### 4. Optional memory write-back
|
|
84
109
|
|
|
85
110
|
If the analysis surfaces a pattern worth preserving for future decisions:
|
|
@@ -96,7 +121,11 @@ If the analysis surfaces a pattern worth preserving for future decisions:
|
|
|
96
121
|
1. **Ranked prospective failure modes** — L × I ordered list (from `risk-officer`)
|
|
97
122
|
2. **Early-warning signal per failure mode** — concrete, observable indicator
|
|
98
123
|
3. **Preventive guardrails** — one per failure mode (or `accept` with rationale)
|
|
99
|
-
4. **
|
|
124
|
+
4. **Four-part failure register** (when accompanying a plan artefact) — three
|
|
125
|
+
ranked causes of death · one untested hidden dependency · one
|
|
126
|
+
survivable-failure modification · one tripwire metric with a horizon
|
|
127
|
+
(step 3b; feeds the roadmap template's optional `## Pre-mortem` section)
|
|
128
|
+
5. **Optional memory candidate** — drafted to `/memory propose` if the pattern
|
|
100
129
|
clears the admission gate (≥ 2 distinct file paths OR ≥ 3 future decisions)
|
|
101
130
|
|
|
102
131
|
## Do NOT
|
|
@@ -82,7 +82,8 @@ Each link **delegates** to the artifact that owns it (no duplication):
|
|
|
82
82
|
([`complexity-first-planning`](../complexity-first-planning/SKILL.md)); dispatch
|
|
83
83
|
independent subtasks async ([`subagent-orchestration` § RDP](../subagent-orchestration/SKILL.md)),
|
|
84
84
|
auto-triggered by the [`delegation-policy`](../../rules/delegation-policy.md) rule
|
|
85
|
-
(gates on
|
|
85
|
+
(gates on the emergency incident switch + host manifest — always-on
|
|
86
|
+
orchestration carries no per-layer on/off setting).
|
|
86
87
|
5. **audit** — check progress against real tool results
|
|
87
88
|
([`verify-before-complete`](../../rules/verify-before-complete.md)).
|
|
88
89
|
6. **verify** — fresh-context verifier on the structural-complexity gate
|
|
@@ -56,15 +56,17 @@ parallel subagents **by default** and keep working while they run (async), rathe
|
|
|
56
56
|
than blocking on each return — intervene only if one goes off track. Engage per
|
|
57
57
|
[`rdp-gate`](../../contexts/execution/rdp-gate.md).
|
|
58
58
|
|
|
59
|
-
###
|
|
59
|
+
### Always-on auto-dispatch
|
|
60
60
|
|
|
61
61
|
"By default" is governed by the [`delegation-policy`](../../rules/delegation-policy.md)
|
|
62
62
|
rule — the single source of the auto-trigger. It gates on the activation context
|
|
63
63
|
([`auto-orchestration-activation`](../../contexts/execution/auto-orchestration-activation.md)):
|
|
64
|
-
dispatch only when `
|
|
64
|
+
dispatch only when `emergency.orchestration_halt` is not set, the host
|
|
65
65
|
manifest reports `subagent_spawn: true`, and the task is classified delegable.
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
A matched signal → dispatch, surfacing mode + per-subtask tiers in one line;
|
|
67
|
+
an ambiguous verdict → ask, always; any gate failing → in-session no-op.
|
|
68
|
+
There is no more per-layer on/off setting (always-on orchestration). Never
|
|
69
|
+
lifts a safety floor.
|
|
68
70
|
|
|
69
71
|
## Worker-prompt contract
|
|
70
72
|
|
|
@@ -326,7 +328,7 @@ After every auto-dispatched run, write one audit-log-v1 line
|
|
|
326
328
|
never hand-author the JSON. Line shape, field semantics, recorder
|
|
327
329
|
invocation, and `token_delta` sourcing priority →
|
|
328
330
|
[`orchestration-telemetry` § Emit procedure](../../agent-src/contexts/execution/orchestration-telemetry.md).
|
|
329
|
-
Skip emit when `
|
|
331
|
+
Skip emit when `emergency.orchestration_halt` is set or `spawn_count == 0`
|
|
330
332
|
(in-session run).
|
|
331
333
|
|
|
332
334
|
## Gotcha
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://event4u.dev/agent-config/schemas/subagent-status.json",
|
|
4
4
|
"title": "Subagent Status Envelope",
|
|
5
|
-
"description": "Required wire format for every implementer or judge subagent return. Loaded by /do-and-judge, /do-in-steps, and the subagent-orchestration skill.
|
|
5
|
+
"description": "Required wire format for every implementer or judge subagent return. Loaded by /do-and-judge, /do-in-steps, and the subagent-orchestration skill. No jsonschema runtime dep — the authoritative validators are src/scripts/_lib/subagent_response.ts (body) and src/scripts/_lib/subagent_capsule.ts (CHECKPOINT capsule), covered by tests/scripts/_lib_subagent_response.test.ts and tests/scripts/_lib_subagent_capsule.test.ts.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": ["status", "summary"],
|
|
8
8
|
"additionalProperties": false,
|
|
9
9
|
"properties": {
|
|
10
10
|
"status": {
|
|
11
11
|
"type": "string",
|
|
12
|
-
"enum": ["DONE", "DONE_WITH_CONCERNS", "NEEDS_CONTEXT", "BLOCKED"],
|
|
13
|
-
"description": "DONE = work shipped, gate green. DONE_WITH_CONCERNS = work shipped but caller must read concerns[]. NEEDS_CONTEXT = paused, blocking_question[] must be answered. BLOCKED = halted, blocking_reason describes why no path forward."
|
|
12
|
+
"enum": ["DONE", "DONE_WITH_CONCERNS", "NEEDS_CONTEXT", "BLOCKED", "CHECKPOINT"],
|
|
13
|
+
"description": "DONE = work shipped, gate green. DONE_WITH_CONCERNS = work shipped but caller must read concerns[]. NEEDS_CONTEXT = paused, blocking_question[] must be answered. BLOCKED = halted, blocking_reason describes why no path forward. CHECKPOINT = the worker reached its budget watermark and hands off a state capsule; done/remaining/generation are required."
|
|
14
14
|
},
|
|
15
15
|
"summary": {
|
|
16
16
|
"type": "string",
|
|
@@ -40,6 +40,60 @@
|
|
|
40
40
|
"next_action": {
|
|
41
41
|
"type": "string",
|
|
42
42
|
"description": "What the caller does now. Optional; orchestrator infers from status when omitted."
|
|
43
|
+
},
|
|
44
|
+
"generation": {
|
|
45
|
+
"type": "integer",
|
|
46
|
+
"minimum": 1,
|
|
47
|
+
"description": "CHECKPOINT only. Generation index in the recycling chain; the first dispatch is 1."
|
|
48
|
+
},
|
|
49
|
+
"done": {
|
|
50
|
+
"type": "array",
|
|
51
|
+
"maxItems": 40,
|
|
52
|
+
"items": {"type": "string", "minLength": 1, "maxLength": 200, "pattern": "^[^\\n\\r]*$"},
|
|
53
|
+
"description": "CHECKPOINT only. What is finished — ref tokens (file:line, id, path), never bodies."
|
|
54
|
+
},
|
|
55
|
+
"remaining": {
|
|
56
|
+
"type": "array",
|
|
57
|
+
"maxItems": 40,
|
|
58
|
+
"items": {"type": "string", "minLength": 1, "maxLength": 240, "pattern": "^[^\\n\\r]*$"},
|
|
59
|
+
"description": "CHECKPOINT only. What is left, one short line each."
|
|
60
|
+
},
|
|
61
|
+
"decisions": {
|
|
62
|
+
"type": "array",
|
|
63
|
+
"maxItems": 40,
|
|
64
|
+
"items": {"type": "string", "minLength": 1, "maxLength": 240, "pattern": "^[^\\n\\r]*$"},
|
|
65
|
+
"description": "CHECKPOINT only. Choices already made that the successor must not silently re-open."
|
|
66
|
+
},
|
|
67
|
+
"open_risks": {
|
|
68
|
+
"type": "array",
|
|
69
|
+
"maxItems": 40,
|
|
70
|
+
"items": {"type": "string", "minLength": 1, "maxLength": 240, "pattern": "^[^\\n\\r]*$"},
|
|
71
|
+
"description": "CHECKPOINT only. Risks still open at handoff."
|
|
72
|
+
},
|
|
73
|
+
"touched_files": {
|
|
74
|
+
"type": "array",
|
|
75
|
+
"maxItems": 40,
|
|
76
|
+
"items": {"type": "string", "minLength": 1, "maxLength": 200, "pattern": "^[^\\n\\r]*$"},
|
|
77
|
+
"description": "CHECKPOINT only. Paths / file:line this generation touched — never diffs."
|
|
78
|
+
},
|
|
79
|
+
"assumptions": {
|
|
80
|
+
"type": "array",
|
|
81
|
+
"maxItems": 40,
|
|
82
|
+
"description": "Stated premises the successor inherits instead of re-deriving. Valid on a CHECKPOINT capsule AND on a completed worker result — unstated assumptions are the first thing compression drops.",
|
|
83
|
+
"items": {
|
|
84
|
+
"type": "object",
|
|
85
|
+
"required": ["statement", "basis", "epistemic_state"],
|
|
86
|
+
"additionalProperties": false,
|
|
87
|
+
"properties": {
|
|
88
|
+
"statement": {"type": "string", "minLength": 1, "maxLength": 240, "pattern": "^[^\\n\\r]*$"},
|
|
89
|
+
"basis": {"type": "string", "minLength": 1, "maxLength": 200, "pattern": "^[^\\n\\r]*$", "description": "Ref token the premise rests on."},
|
|
90
|
+
"epistemic_state": {
|
|
91
|
+
"type": "string",
|
|
92
|
+
"enum": ["verified", "assumed", "gap"],
|
|
93
|
+
"description": "The Evidence-Report buckets from evidence-discipline.md — the capsule does not get a private grading scale."
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
43
97
|
}
|
|
44
98
|
},
|
|
45
99
|
"allOf": [
|
|
@@ -58,6 +112,10 @@
|
|
|
58
112
|
{
|
|
59
113
|
"if": {"properties": {"status": {"const": "BLOCKED"}}, "required": ["status"]},
|
|
60
114
|
"then": {"required": ["blocking_reason"]}
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"if": {"properties": {"status": {"const": "CHECKPOINT"}}, "required": ["status"]},
|
|
118
|
+
"then": {"required": ["done", "remaining", "generation"]}
|
|
61
119
|
}
|
|
62
120
|
]
|
|
63
121
|
}
|
|
@@ -61,7 +61,7 @@ Generate ≥ 1 concrete case per HIGH dimension, plus the happy path. Enforce th
|
|
|
61
61
|
|
|
62
62
|
Widen the list with a second pair of eyes:
|
|
63
63
|
|
|
64
|
-
- **Subagent path** — when the host supports subagent spawn and
|
|
64
|
+
- **Subagent path** — when the host supports subagent spawn and no emergency halt is set (always-on orchestration: there is no more per-layer on/off setting): spawn **one** subagent with an adversarial lens — *"Behavior: {sentence}. Case list so far: {list}. As a security researcher / SRE / chaos engineer: which non-obvious failure mode or abuse vector is missing?"* On security-critical surfaces a **second** subagent with a different lens is allowed; more is waste. Merge only novel cases.
|
|
65
65
|
- **Degraded path (mandatory when no subagent runs)** — a self-review pass with an explicit lens shift: re-walk step 2 asking *"what breaks in production? what would an attacker try?"* and emit the same output shape (1–2 additional cases, or explicitly "none found").
|
|
66
66
|
|
|
67
67
|
Unavailability of subagents never skips this step — it only switches the path.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# {{project_name}}
|
|
2
2
|
|
|
3
|
-
<!-- Fill placeholders or run `/agents init`; delete after.
|
|
3
|
+
<!-- Fill placeholders or run `/agents init`; delete after. Recipes: `.augment/contexts/contracts/agents-md-anatomy.md`. -->
|
|
4
4
|
|
|
5
5
|
> {{project_description}}
|
|
6
6
|
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
| Layer | Location | Edits |
|
|
10
10
|
|---|---|---|
|
|
11
|
-
| Installed package | `.augment/`, `dist/agent-src/` |
|
|
12
|
-
| Project layer | `agents/`, `agents/overrides/`, `.agent-settings.yml` | your customizations
|
|
11
|
+
| Installed package | `.augment/`, `dist/agent-src/` | managed by `event4u/agent-config` |
|
|
12
|
+
| Project layer | `agents/`, `agents/overrides/`, `.agent-settings.yml` | your customizations |
|
|
13
13
|
|
|
14
14
|
## Pointers
|
|
15
15
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
- **Skills (on-demand expertise)** — domain skills surfaced by description, invoked on trigger match: [`.augment/skills/`](.augment/skills/).
|
|
19
19
|
- **Commands (workflows)** — slash-commands the agent runs end-to-end (`/work`, `/create-pr`, …): [`.augment/commands/`](.augment/commands/).
|
|
20
20
|
- **Project-specific docs** — your own architecture notes, roadmaps, sessions, contexts: [`agents/`](agents/).
|
|
21
|
-
- **Delegation & review** — dispatch independent-slice tasks to subagents instead of serial work; a mutating session ends after a neutral cross-model review: [`delegation-policy`](.augment/rules/delegation-policy.md).
|
|
21
|
+
- **Delegation & review** — dispatch independent-slice tasks to subagents instead of serial work; in a team (host-flag gated) the lead coordinates, teammates implement; a mutating session ends after a neutral cross-model review: [`delegation-policy`](.augment/rules/delegation-policy.md).
|
|
22
22
|
|
|
23
23
|
## Emergency triage — read this when nothing else is reachable
|
|
24
24
|
|
|
@@ -39,7 +39,7 @@ schema_version: 1
|
|
|
39
39
|
# CI guard: a release bump of `package.json` must update this value
|
|
40
40
|
# in lockstep — see scripts/check_template_pin_drift.ts (road-to-
|
|
41
41
|
# portable-runtime-and-update-check P3.3).
|
|
42
|
-
agent_config_version: "9.
|
|
42
|
+
agent_config_version: "9.29.0"
|
|
43
43
|
|
|
44
44
|
# --- Project identity ---
|
|
45
45
|
project:
|
|
@@ -251,6 +251,20 @@ Templates for roadmap files stored in `agents/roadmaps/` or `{module_root}/{Modu
|
|
|
251
251
|
`status: draft` roadmaps are exempt until flipped to ready. Enforced
|
|
252
252
|
by `lint_plan_risk_register` at pre-push + CI.
|
|
253
253
|
|
|
254
|
+
25. **`## Pre-mortem` is optional — and only worth having when it is a
|
|
255
|
+
forecast.** A roadmap MAY carry a `## Pre-mortem` section holding the
|
|
256
|
+
four-part failure register from the
|
|
257
|
+
[`premortem`](../skills/premortem/SKILL.md) skill (three ranked causes
|
|
258
|
+
of death · one untested hidden dependency · one survivable-failure
|
|
259
|
+
modification · one tripwire metric with a horizon). It is deliberately
|
|
260
|
+
NOT required: a failure register written to satisfy a template stops
|
|
261
|
+
being a forecast, and boilerplate in a failure register is worse than
|
|
262
|
+
its absence. Include it when the plan is heavy or irreversible enough
|
|
263
|
+
that a named tripwire changes behaviour; omit it entirely otherwise —
|
|
264
|
+
never ship an empty or perfunctory one. Distinct from rule 24's Risk
|
|
265
|
+
Register: the register ranks *known* risks with mitigations; the
|
|
266
|
+
pre-mortem imagines the *whole plan dead* and reconstructs why.
|
|
267
|
+
|
|
254
268
|
---
|
|
255
269
|
|
|
256
270
|
## Quality Gates (remote CI by default)
|
|
@@ -357,6 +371,15 @@ complexity: lightweight
|
|
|
357
371
|
|
|
358
372
|
{Optional: edge cases, decisions, links to related docs.}
|
|
359
373
|
|
|
374
|
+
<!-- ## Pre-mortem — INCLUDE ONLY when the plan is heavy or irreversible
|
|
375
|
+
enough that a failure forecast changes behaviour (rule 25). OMIT
|
|
376
|
+
entirely otherwise — a perfunctory register is worse than none.
|
|
377
|
+
Shape: the four-part failure register from the premortem skill.
|
|
378
|
+
1. Causes of death, ranked: {three, one paragraph each — mechanisms, not topics}
|
|
379
|
+
2. Untested hidden dependency: {the assumption the plan never tests}
|
|
380
|
+
3. Survivable-failure modification: {one concrete plan change}
|
|
381
|
+
4. Tripwire: {metric + threshold + horizon that says cause #1 is materializing} -->
|
|
382
|
+
|
|
360
383
|
<!-- ## Provenance — INCLUDE ONLY for source-derived / harvest / capability-adoption
|
|
361
384
|
roadmaps (rule 19). OMIT entirely for internally-originated roadmaps —
|
|
362
385
|
do NOT ship an empty Provenance section.
|
|
@@ -406,8 +406,40 @@ function load_agent_settings(options = {}) {
|
|
|
406
406
|
_deep_merge(merged, layer);
|
|
407
407
|
}
|
|
408
408
|
}
|
|
409
|
+
_warn_removed_always_on_keys(merged);
|
|
409
410
|
return merged;
|
|
410
411
|
}
|
|
412
|
+
var REMOVED_ALWAYS_ON_KEYS = [
|
|
413
|
+
"subagents.enabled",
|
|
414
|
+
"subagents.auto",
|
|
415
|
+
"subagents.host_capabilities",
|
|
416
|
+
"subagents.budget_routing",
|
|
417
|
+
"ai_team.enabled"
|
|
418
|
+
];
|
|
419
|
+
var _warnedRemovedAlwaysOnKeys = /* @__PURE__ */ new Set();
|
|
420
|
+
function _readDottedSettingsPath(root, dotted) {
|
|
421
|
+
let node = root;
|
|
422
|
+
for (const part of dotted.split(".")) {
|
|
423
|
+
if (typeof node !== "object" || node === null || Array.isArray(node)) {
|
|
424
|
+
return void 0;
|
|
425
|
+
}
|
|
426
|
+
node = node[part];
|
|
427
|
+
}
|
|
428
|
+
return node;
|
|
429
|
+
}
|
|
430
|
+
function _warn_removed_always_on_keys(merged) {
|
|
431
|
+
for (const key of REMOVED_ALWAYS_ON_KEYS) {
|
|
432
|
+
if (_warnedRemovedAlwaysOnKeys.has(key)) {
|
|
433
|
+
continue;
|
|
434
|
+
}
|
|
435
|
+
if (_readDottedSettingsPath(merged, key) === void 0) {
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
438
|
+
_warnedRemovedAlwaysOnKeys.add(key);
|
|
439
|
+
process.stderr.write(`${key} was removed (always-on orchestration); ignored.
|
|
440
|
+
`);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
411
443
|
function* iter_setting_overrides(options = {}) {
|
|
412
444
|
const project_path = options.project_path ?? null;
|
|
413
445
|
const user_global_path = options.user_global_path ?? null;
|
|
@@ -343,6 +343,7 @@ function _build_config(raw, source_path) {
|
|
|
343
343
|
const cli_call_budget = _build_cli_call_budget(
|
|
344
344
|
_asDict(_getOr(raw, "cli_call_budget", {}))
|
|
345
345
|
);
|
|
346
|
+
const quorum = _build_quorum(_get(raw, "quorum", "majority"));
|
|
346
347
|
const necessity_classifier = _build_necessity_classifier(
|
|
347
348
|
_asDict(_getOr(raw, "necessity_classifier", {}))
|
|
348
349
|
);
|
|
@@ -368,6 +369,7 @@ function _build_config(raw, source_path) {
|
|
|
368
369
|
"debate_gates"
|
|
369
370
|
);
|
|
370
371
|
const restate = _build_restate(_asDict(_getOr(raw, "restate", {})), "restate");
|
|
372
|
+
const critic_protocol = _build_critic_protocol(_getOr(raw, "critic_protocol", "legacy"));
|
|
371
373
|
const decision_resolution = _build_decision_resolution(
|
|
372
374
|
_asDict(_getOr(raw, "decision_resolution", {}))
|
|
373
375
|
);
|
|
@@ -389,6 +391,7 @@ function _build_config(raw, source_path) {
|
|
|
389
391
|
advisors,
|
|
390
392
|
consensus_scoring: consensus,
|
|
391
393
|
cli_call_budget,
|
|
394
|
+
quorum,
|
|
392
395
|
necessity_classifier,
|
|
393
396
|
model_downgrade,
|
|
394
397
|
debate,
|
|
@@ -397,6 +400,7 @@ function _build_config(raw, source_path) {
|
|
|
397
400
|
chairman,
|
|
398
401
|
debate_gates,
|
|
399
402
|
restate,
|
|
403
|
+
critic_protocol,
|
|
400
404
|
decision_resolution,
|
|
401
405
|
routing,
|
|
402
406
|
low_impact,
|
|
@@ -598,6 +602,16 @@ function _build_restate(d, scope) {
|
|
|
598
602
|
}
|
|
599
603
|
return { enabled: Boolean(enabled) };
|
|
600
604
|
}
|
|
605
|
+
var _VALID_CRITIC_PROTOCOLS = /* @__PURE__ */ new Set(["legacy", "load_bearing"]);
|
|
606
|
+
function _build_critic_protocol(v) {
|
|
607
|
+
if (v === void 0 || v === null) return "legacy";
|
|
608
|
+
if (!(_isStr(v) && _VALID_CRITIC_PROTOCOLS.has(v))) {
|
|
609
|
+
throw new CouncilConfigError(
|
|
610
|
+
`\`critic_protocol\`=${_pyRepr(v)} not in ${_sortedListRepr(_VALID_CRITIC_PROTOCOLS)}.`
|
|
611
|
+
);
|
|
612
|
+
}
|
|
613
|
+
return v;
|
|
614
|
+
}
|
|
601
615
|
var _VALID_RESOLUTION_MODES = /* @__PURE__ */ new Set([
|
|
602
616
|
"agent",
|
|
603
617
|
"council",
|
|
@@ -873,7 +887,7 @@ function _build_defaults(d) {
|
|
|
873
887
|
if (!_isDict(d)) {
|
|
874
888
|
throw new CouncilConfigError("`defaults` must be a mapping.");
|
|
875
889
|
}
|
|
876
|
-
const mode = _get(d, "mode", "
|
|
890
|
+
const mode = _get(d, "mode", "auto");
|
|
877
891
|
if (!(_isStr(mode) && _VALID_MODES.has(mode))) {
|
|
878
892
|
throw new CouncilConfigError(
|
|
879
893
|
`defaults.mode=${_pyRepr(mode)} not in ${_sortedListRepr(_VALID_MODES)}.`
|
|
@@ -1035,7 +1049,7 @@ function _build_cost_budget(d) {
|
|
|
1035
1049
|
}
|
|
1036
1050
|
return cb;
|
|
1037
1051
|
}
|
|
1038
|
-
function _build_member(name, cfg, default_mode = "
|
|
1052
|
+
function _build_member(name, cfg, default_mode = "auto") {
|
|
1039
1053
|
if (!_VALID_PROVIDERS.has(name)) {
|
|
1040
1054
|
throw new CouncilConfigError(
|
|
1041
1055
|
`members.${name}: unknown provider; valid: ${_sortedListRepr(_VALID_PROVIDERS)}.`
|
|
@@ -1152,6 +1166,7 @@ function _build_member(name, cfg, default_mode = "api") {
|
|
|
1152
1166
|
prompt_cache_ttl
|
|
1153
1167
|
};
|
|
1154
1168
|
}
|
|
1169
|
+
var _DEFAULT_CLI_CALLS_PER_DAY = 50;
|
|
1155
1170
|
function _build_cli_call_budget(d) {
|
|
1156
1171
|
if (!_isDict(d)) {
|
|
1157
1172
|
throw new CouncilConfigError("`cli_call_budget` must be a mapping.");
|
|
@@ -1163,6 +1178,9 @@ function _build_cli_call_budget(d) {
|
|
|
1163
1178
|
);
|
|
1164
1179
|
}
|
|
1165
1180
|
const caps = /* @__PURE__ */ new Map();
|
|
1181
|
+
for (const provider of _VALID_PROVIDERS) {
|
|
1182
|
+
caps.set(provider, _DEFAULT_CLI_CALLS_PER_DAY);
|
|
1183
|
+
}
|
|
1166
1184
|
for (const [provider, value] of Object.entries(raw_caps)) {
|
|
1167
1185
|
if (!_VALID_PROVIDERS.has(provider)) {
|
|
1168
1186
|
throw new CouncilConfigError(
|
|
@@ -1190,6 +1208,17 @@ function _build_cli_call_budget(d) {
|
|
|
1190
1208
|
}
|
|
1191
1209
|
return { max_calls_per_day: caps, warn_at };
|
|
1192
1210
|
}
|
|
1211
|
+
function _build_quorum(raw) {
|
|
1212
|
+
if (raw === "majority") {
|
|
1213
|
+
return "majority";
|
|
1214
|
+
}
|
|
1215
|
+
if (_isInt(raw) && !_isBool(raw) && raw >= 1) {
|
|
1216
|
+
return raw;
|
|
1217
|
+
}
|
|
1218
|
+
throw new CouncilConfigError(
|
|
1219
|
+
`\`quorum\`=${_pyRepr(raw)} must be 'majority' or an integer >= 1 (got ${_pyTypeName(raw)}).`
|
|
1220
|
+
);
|
|
1221
|
+
}
|
|
1193
1222
|
function _build_advisor(name, cfg) {
|
|
1194
1223
|
if (!_isDict(cfg)) {
|
|
1195
1224
|
throw new CouncilConfigError(`advisors.${name}: must be a mapping.`);
|
|
@@ -4355,18 +4355,9 @@ var settingsSchema = external_exports.object({
|
|
|
4355
4355
|
}).default({})
|
|
4356
4356
|
}).default({}),
|
|
4357
4357
|
subagents: external_exports.object({
|
|
4358
|
-
enabled: external_exports.boolean().default(true).describe(
|
|
4359
|
-
"Global master switch for the subagent layer. true (default) = available; false = fully disabled (the canonical kill-switch \u2014 no auto-dispatch, no routing, everything runs in-session)."
|
|
4360
|
-
),
|
|
4361
|
-
auto: external_exports.enum(["off", "ask", "on"]).default("on").describe(
|
|
4362
|
-
"Automatic-dispatch mode. off = subagents only via explicit command. ask = classify the task and ask once before dispatching. on = auto-dispatch delegable tasks (surface the choice in one line). Shipped default is on on subagent-capable hosts (flipped from ask 2026-07-09, ADR-117), off elsewhere; no-op where the host has no subagent primitive."
|
|
4363
|
-
),
|
|
4364
4358
|
downshift: external_exports.boolean().default(true).describe(
|
|
4365
4359
|
"Route delegable sub-tasks to the lowest-capable model tier (cost + speed via model downshift). false = every subagent runs on the session tier."
|
|
4366
4360
|
),
|
|
4367
|
-
budget_routing: external_exports.enum(["ask", "auto", "off"]).default("ask").describe(
|
|
4368
|
-
"Budget-aware cheap-request delegation (docs/contracts/budget-routing.md): pick the cheapest classifier-adequate tier WITH available budget (cost.budgets.per_tier); cheap exhausted but strong funded \u2192 strong tier; all exhausted \u2192 session model + notice. Work is never blocked to save money; the session model is never switched (delegation with a model override). ask = confirm the first budget-motivated downshift per session (default). auto = apply silently with telemetry. off = today's behavior (single-flip rollback). Distinct from downshift: that is the quality/cost knob, this is the resource-availability gate."
|
|
4369
|
-
),
|
|
4370
4361
|
quota_arbitrage: external_exports.boolean().default(true).describe(
|
|
4371
4362
|
"Prefer a separate quota-pool model for delegable sub-tasks where the host manifest reports one. Optional bonus only \u2014 identical behaviour (minus the quota win) where unsupported. Never load-bearing."
|
|
4372
4363
|
),
|
|
@@ -4377,9 +4368,6 @@ var settingsSchema = external_exports.object({
|
|
|
4377
4368
|
}).default({}).describe(
|
|
4378
4369
|
"Per-tier model map for downshift routing. Each empty value uses the tier runtime default (no vendor model baked in)."
|
|
4379
4370
|
),
|
|
4380
|
-
host_capabilities: external_exports.object({}).passthrough().default({}).describe(
|
|
4381
|
-
"Optional override of the host-capability manifest (subagent_spawn / parallel_spawn / status_polling / separate_quota_pool). Any field set wins; omitted fields fall back to the all-false safe default. Empty = the agent resolves the manifest from host knowledge."
|
|
4382
|
-
),
|
|
4383
4371
|
implementer_model: external_exports.string().default("").describe(
|
|
4384
4372
|
"Override the model the orchestrator dispatches to subagents that write code (e.g. claude-sonnet-4, gpt-5). Empty (default) = inherit the session's primary model \u2014 cheapest and usually right."
|
|
4385
4373
|
),
|
|
@@ -4399,14 +4387,11 @@ var settingsSchema = external_exports.object({
|
|
|
4399
4387
|
)
|
|
4400
4388
|
}),
|
|
4401
4389
|
ai_team: external_exports.object({
|
|
4402
|
-
enabled: external_exports.boolean().default(false).describe(
|
|
4403
|
-
"Master switch for the /team cross-model review family (docs/contracts/ai-team-config.md). false (default) = commands are never suggested and every invocation refuses with an enable pointer. true = the family is live; individual gates (allow_delegate) still apply."
|
|
4404
|
-
),
|
|
4405
4390
|
model: external_exports.string().default("auto").describe(
|
|
4406
4391
|
"Model handed to the codex CLI. 'auto' (default) = pass no --model flag so the CLI's own default applies \u2014 tracks the subscription's current strongest model instead of pinning a stale ID. Any other value passes through verbatim as `--model <value>`."
|
|
4407
4392
|
),
|
|
4408
4393
|
allow_delegate: external_exports.boolean().default(false).describe(
|
|
4409
|
-
"Second opt-in for the only wrapper that delegates write access (/team:delegate). false (default) = delegate refuses even when
|
|
4394
|
+
"Second opt-in for the only wrapper that delegates write access (/team:delegate). false (default) = delegate refuses even when /team itself is available. Availability (codex CLI installed + authenticated) is necessary but not sufficient \u2014 this key must ALSO be true before delegation is reachable."
|
|
4410
4395
|
),
|
|
4411
4396
|
max_calls_per_day: external_exports.number().int().min(0).default(50).describe(
|
|
4412
4397
|
"Per-day cap on team calls, read against the EXISTING cli_call_budget openai bucket (~/.event4u/agent-config/cli-calls.json, daily UTC reset) \u2014 one subscription, one counter, never a parallel count. 0 = block all team calls."
|
|
@@ -4422,7 +4407,15 @@ var settingsSchema = external_exports.object({
|
|
|
4422
4407
|
"Circuit-breaker bound: after this many CONSECUTIVE BLOCK verdicts in one session, a visible notice is injected exactly once and the managed layer stops re-blocking \u2014 the user decides, never an infinite Claude\u2194Codex loop. An ALLOW verdict resets the counter. Positive integer."
|
|
4423
4408
|
)
|
|
4424
4409
|
}).default({ managed: false, max_consecutive_blocks: 3 })
|
|
4425
|
-
}).default({
|
|
4410
|
+
}).default({ model: "auto", allow_delegate: false, max_calls_per_day: 50, suppress_setup_hint: false, review_gate: { managed: false, max_consecutive_blocks: 3 } }),
|
|
4411
|
+
emergency: external_exports.object({
|
|
4412
|
+
orchestration_halt: external_exports.boolean().default(false).describe(
|
|
4413
|
+
"The one audited incident switch over the always-on orchestration stack (subagents, council, team). NOT an activation gate: false (default) = the stack runs normally. true = halted; arming requires no ceremony. Disarming (returning to false) requires orchestration_halt_justification to be a non-empty string. Both transitions emit one telemetry line."
|
|
4414
|
+
),
|
|
4415
|
+
orchestration_halt_justification: external_exports.string().default("").describe(
|
|
4416
|
+
"Required non-empty before orchestration_halt may return to false. Ignored while arming the halt."
|
|
4417
|
+
)
|
|
4418
|
+
}).default({ orchestration_halt: false, orchestration_halt_justification: "" }),
|
|
4426
4419
|
onboarding: external_exports.object({
|
|
4427
4420
|
onboarded: external_exports.boolean().default(false).describe(
|
|
4428
4421
|
"Set to true once the developer has completed `agent-config setup`. The onboarding-gate rule blocks the first turn of every chat until this is true. Toggle back to false to re-trigger the wizard."
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
resolve_project_root
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LCFJIQ4J.js";
|
|
5
5
|
import {
|
|
6
6
|
resolvePackageRoot
|
|
7
7
|
} from "./chunk-MCJYCQPF.js";
|
|
@@ -2,10 +2,10 @@ import { createRequire as __acCreateRequire } from 'node:module'; const require
|
|
|
2
2
|
import {
|
|
3
3
|
ZodFirstPartyTypeKind,
|
|
4
4
|
settingsSchema
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-MMXA5GY7.js";
|
|
6
6
|
import {
|
|
7
7
|
main
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-MP3JT3IU.js";
|
|
9
9
|
import {
|
|
10
10
|
RULE_SOURCE_REL
|
|
11
11
|
} from "./chunk-BKO2AZ7Z.js";
|
|
@@ -48,7 +48,7 @@ import {
|
|
|
48
48
|
import {
|
|
49
49
|
find_project_root_with_anchor,
|
|
50
50
|
load_agent_settings
|
|
51
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-LCFJIQ4J.js";
|
|
52
52
|
import {
|
|
53
53
|
event4u_root,
|
|
54
54
|
legacy_xdg_root,
|