@event4u/agent-config 9.27.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 +13 -12
- package/CHANGELOG.md +165 -0
- package/README.md +1 -1
- package/agents/templates/.ai-council.yml.example +55 -24
- package/dist/agent-src/commands/analyze/conformance.md +24 -0
- 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 +28 -3
- 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/artifact-engagement-recording.md +4 -1
- package/dist/agent-src/rules/autonomous-execution.md +1 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +33 -6
- package/dist/agent-src/rules/context-hygiene.md +3 -1
- package/dist/agent-src/rules/council-availability.md +93 -0
- package/dist/agent-src/rules/cross-source-consistency.md +3 -0
- package/dist/agent-src/rules/delegation-policy.md +38 -10
- package/dist/agent-src/rules/design-fidelity.md +3 -0
- package/dist/agent-src/rules/evaluator-independence.md +2 -1
- package/dist/agent-src/rules/external-code-graph-interop.md +2 -1
- package/dist/agent-src/rules/finance-safety-floor.md +1 -1
- package/dist/agent-src/rules/git-history-discipline.md +1 -1
- package/dist/agent-src/rules/history-discipline.md +3 -1
- package/dist/agent-src/rules/legal-safety-floor.md +1 -1
- package/dist/agent-src/rules/no-pr-progress-comments.md +3 -1
- package/dist/agent-src/rules/onboarding-gate.md +3 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +4 -1
- package/dist/agent-src/rules/role-mode-adherence.md +1 -1
- package/dist/agent-src/rules/scale-discipline.md +3 -1
- package/dist/agent-src/rules/self-repair-loop.md +103 -0
- package/dist/agent-src/rules/session-canary.md +2 -1
- package/dist/agent-src/rules/settings-ask-protocol.md +8 -7
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
- package/dist/agent-src/rules/token-budget-discipline.md +4 -2
- package/dist/agent-src/rules/tool-safety.md +5 -1
- package/dist/agent-src/skills/adversarial-review/SKILL.md +1 -1
- package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.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/performance-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/persona-improvement/SKILL.md +1 -1
- package/dist/agent-src/skills/premortem/SKILL.md +30 -1
- package/dist/agent-src/skills/project-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -1
- package/dist/agent-src/skills/security-audit/SKILL.md +1 -1
- package/dist/agent-src/skills/sequential-thinking/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -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/skills/universal-project-analysis/SKILL.md +1 -1
- package/dist/agent-src/templates/AGENTS.md +8 -12
- 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/registry.js +7 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli-delegate/chunk-66OVWGB5.js +270 -0
- package/dist/cli-delegate/{chunk-HJ6DAJHR.js → chunk-LCFJIQ4J.js} +89 -7
- 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-WR6GTRHJ.js → chunk-MP3JT3IU.js} +3 -3
- package/dist/cli-delegate/{chunk-3KJIMFTB.js → chunk-NZ5N2XQL.js} +467 -305
- package/dist/cli-delegate/{chunk-AIIUU73N.js → chunk-OJM3MBJM.js} +1 -1
- package/dist/cli-delegate/{chunk-BCPIOAGV.js → chunk-RCIA67XN.js} +117 -96
- package/dist/cli-delegate/chunk-REKCMYOU.js +2991 -0
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +134 -0
- package/dist/cli-delegate/cmd_conformance.js +10 -47
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +10 -6
- package/dist/cli-delegate/cmd_explain.js +80 -330
- package/dist/cli-delegate/cmd_export.js +6 -6
- package/dist/cli-delegate/cmd_fleet.js +3 -3
- package/dist/cli-delegate/cmd_handoff.js +3 -3
- package/dist/cli-delegate/cmd_mcp_available.js +433 -0
- package/dist/cli-delegate/cmd_migrate.js +3 -3
- package/dist/cli-delegate/cmd_packs_active.js +153 -0
- package/dist/cli-delegate/cmd_preflight.js +1 -1
- package/dist/cli-delegate/cmd_prune.js +6 -6
- package/dist/cli-delegate/cmd_route_audit.js +8 -8
- package/dist/cli-delegate/cmd_route_explain.js +4 -4
- package/dist/cli-delegate/cmd_settings_get.js +266 -0
- package/dist/cli-delegate/cmd_settings_migrate.js +6 -6
- package/dist/cli-delegate/cmd_settings_set.js +8 -2968
- package/dist/cli-delegate/cmd_sync.js +6 -6
- package/dist/cli-delegate/cmd_uninstall.js +6 -6
- package/dist/cli-delegate/cmd_update.js +4 -4
- package/dist/cli-delegate/cmd_upgrade.js +4 -4
- package/dist/cli-delegate/cmd_validate.js +6 -6
- package/dist/cli-delegate/cmd_versions.js +4 -4
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +164 -55
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -3
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +44 -5
- package/dist/discovery/trust-report.md +11 -11
- package/dist/discovery/workspaces.json +16 -6
- package/dist/hooks/dispatch.js +9341 -6131
- package/dist/install/install.mjs +739 -524
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +777 -281
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +134 -15
- 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 +68 -17
- package/docs/guidelines/agent-infra/memory-access.md +14 -3
- package/package.json +1 -1
- package/src/agent-src/templates/AGENTS.md +8 -12
- package/src/config/agent-settings.template.yml +52 -66
- package/src/config/budgets.yml +29 -0
- package/src/config/discovery/packs.yml +11 -0
- package/src/config/discovery/workspaces.yml +1 -1
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +26 -0
- package/src/config/gate-violation-baselines.json +3 -3
- package/src/scripts/_cli/cmd_brand_status.ts +174 -0
- package/src/scripts/_cli/cmd_conformance.ts +14 -42
- package/src/scripts/_cli/cmd_doctor.ts +65 -48
- package/src/scripts/_cli/cmd_mcp_available.ts +266 -0
- package/src/scripts/_cli/cmd_packs_active.ts +225 -0
- package/src/scripts/_cli/cmd_settings_get.ts +324 -0
- package/src/scripts/_dispatch.bash +57 -0
- package/src/scripts/_lib/agent_settings.ts +140 -16
- 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/carrier_divergence.ts +135 -0
- package/src/scripts/_lib/host_capability.ts +144 -4
- 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/prompt_shape.ts +88 -0
- package/src/scripts/_lib/review_skipped_record.ts +102 -0
- package/src/scripts/_lib/rule_layer_overlap.ts +254 -0
- package/src/scripts/_lib/self_repair.ts +489 -0
- package/src/scripts/_lib/self_repair_store.ts +128 -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/transcript_entry.ts +80 -0
- 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_branch_freshness.ts +255 -0
- package/src/scripts/check_council_config_location.ts +125 -1
- package/src/scripts/check_detector_corpus.ts +202 -0
- package/src/scripts/check_hook_bundle_freshness.ts +4 -1
- package/src/scripts/check_standing_rule_delivery.ts +314 -0
- package/src/scripts/condense.ts +162 -2
- package/src/scripts/config/profiles.ts +13 -3
- package/src/scripts/conformance_scan.ts +272 -24
- package/src/scripts/council_availability_hook.ts +188 -0
- package/src/scripts/council_cli.ts +527 -32
- package/src/scripts/forensics_report.ts +333 -0
- package/src/scripts/hook_manifest.yaml +107 -26
- package/src/scripts/hooks/block_no_verify.ts +39 -2
- package/src/scripts/hooks/block_unauthorized_git.ts +156 -7
- package/src/scripts/hooks/concern_registry.ts +10 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +484 -0
- package/src/scripts/hooks/end_review_nudge_hook.ts +726 -0
- package/src/scripts/hooks/orchestration_record_hook.ts +342 -0
- package/src/scripts/install.ts +151 -0
- package/src/scripts/language_mirror_hook.ts +30 -37
- 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/measure_scope_dedup.ts +19 -13
- package/src/scripts/onboarding_gate_hook.ts +40 -1
- package/src/scripts/orchestration_record.ts +12 -1
- package/src/scripts/preamble_byte_census.ts +9 -20
- package/src/scripts/rebuild_hook_bundle.ts +177 -0
- package/src/scripts/release.ts +74 -2
- package/src/scripts/report_carrier_divergence.ts +364 -0
- package/src/scripts/report_skill_activation.ts +257 -0
- package/src/scripts/report_skill_obligation_violations.ts +579 -0
- package/src/scripts/routing_doctor.ts +95 -39
- package/src/scripts/score_skill_selection.ts +19 -5
- package/src/scripts/self_repair_cli.ts +470 -0
- package/src/scripts/self_repair_hook.ts +241 -0
- 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
|
@@ -29,7 +29,7 @@ obligation_frequency: "per-edit"
|
|
|
29
29
|
A precedence rule plus its validation gate (merged from the former
|
|
30
30
|
`brand-consistency` rule, 2026-08-04 — the pair shared triggers and one
|
|
31
31
|
subject). When a consumer already has a brand — registered tokens
|
|
32
|
-
(
|
|
32
|
+
(`tokens.json`), a voice profile, a brand guide — that brand is authoritative
|
|
33
33
|
for the run. The curated `brand` corpus (archetypes, colour psychology, type
|
|
34
34
|
principles) is a **gap-filler**, never an override.
|
|
35
35
|
|
|
@@ -55,10 +55,32 @@ OR A VOICE RULE. A VALUE THAT TRACES TO NEITHER IS OFF-BRAND.
|
|
|
55
55
|
NEVER SHIP AN ASSET THE ACTIVE BRAND CANNOT ACCOUNT FOR.
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
+
## Where the brand actually lives — and how to check
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
NEVER INFER BRAND PRESENCE FROM A FILENAME. RUN `agent-config brand:status`.
|
|
62
|
+
THE FILE IS `tokens.json`, NEVER `.tokens.json` — A DOT-PREFIXED FILE IS READ BY NOTHING.
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The resolver searches exactly four paths under the project root, in this order,
|
|
66
|
+
first hit wins (`BRAND_TOKEN_PATHS`, the UI scaffold directive):
|
|
67
|
+
|
|
68
|
+
1. `tokens.json`
|
|
69
|
+
2. `assets/tokens.json`
|
|
70
|
+
3. `resources/tokens.json`
|
|
71
|
+
4. `agents/settings/brand/tokens.json` <!-- ref-ignore -->
|
|
72
|
+
|
|
73
|
+
`agent-config brand:status` reports which one holds a file, or that none does —
|
|
74
|
+
and separately flags a dot-prefixed `.tokens.json`, which is the file a reader
|
|
75
|
+
of this rule's earlier wording would plausibly have created and which nothing
|
|
76
|
+
reads. Absent is a real answer: it means the greenfield branch below, not a
|
|
77
|
+
misconfiguration.
|
|
78
|
+
|
|
58
79
|
## Precedence order
|
|
59
80
|
|
|
60
|
-
1. **Consumer brand profile** — registered
|
|
61
|
-
guide, or a confirmed `brand-strategy`
|
|
81
|
+
1. **Consumer brand profile** — a registered `tokens.json` at one of the four
|
|
82
|
+
paths above, a voice profile, a brand guide, or a confirmed `brand-strategy`
|
|
83
|
+
/ `brand-identity` constraint set.
|
|
62
84
|
2. **This run's confirmed decisions** — selections the human signed off this session.
|
|
63
85
|
3. **The brand corpus** — archetype / colour / type / messaging defaults, used
|
|
64
86
|
only where 1 and 2 are silent, and always surfaced as corpus-sourced.
|
|
@@ -66,7 +88,7 @@ NEVER SHIP AN ASSET THE ACTIVE BRAND CANNOT ACCOUNT FOR.
|
|
|
66
88
|
## What the gate covers
|
|
67
89
|
|
|
68
90
|
- **Colour / type / spacing** in generated UI or assets that is not one of the
|
|
69
|
-
active brand tokens (from `state.ui_design` or the consumer's
|
|
91
|
+
active brand tokens (from `state.ui_design` or the consumer's `tokens.json`).
|
|
70
92
|
A raw hex / font / px value with no token behind it is off-brand.
|
|
71
93
|
- **Copy and microcopy** whose register contradicts the active voice profile
|
|
72
94
|
(e.g. playful copy under an authoritative `Ruler` voice).
|
|
@@ -79,7 +101,7 @@ NEVER SHIP AN ASSET THE ACTIVE BRAND CANNOT ACCOUNT FOR.
|
|
|
79
101
|
- **Precedence half:** any brand decision while a consumer brand profile is
|
|
80
102
|
present — to keep the corpus from quietly replacing a value the brand already
|
|
81
103
|
defines.
|
|
82
|
-
- **Gate half:** a brand layer is active for the run (a
|
|
104
|
+
- **Gate half:** a brand layer is active for the run (a `tokens.json` /
|
|
83
105
|
`state.ui_design` brand profile or a confirmed `brand-strategy` /
|
|
84
106
|
`brand-identity` constraint set) AND a UI / copy / asset is being emitted or
|
|
85
107
|
reviewed.
|
|
@@ -114,6 +136,11 @@ for the full Brand-mode vs Product-mode discriminator.
|
|
|
114
136
|
- [`brand-consistency`](brand-consistency.md) — pointer stub; its body lives here since the 2026-08-04 merge.
|
|
115
137
|
- [`brand`](../skills/brand/SKILL.md) — the gap-fill corpus this rule subordinates to consumer brand.
|
|
116
138
|
- [`brand-identity`](../skills/brand-identity/SKILL.md) — defines the tokens the gate validates against.
|
|
117
|
-
- [`brand-to-tokens`](../skills/brand-to-tokens/SKILL.md) — emits the DTCG
|
|
139
|
+
- [`brand-to-tokens`](../skills/brand-to-tokens/SKILL.md) — emits the DTCG token
|
|
140
|
+
source of truth. **Known contradiction, recorded not resolved:** that skill's
|
|
141
|
+
prose says to author `.tokens.json` while the only resolver in the tree reads
|
|
142
|
+
`tokens.json`, so a consumer following it literally produces a file nothing
|
|
143
|
+
loads. The authoring name is a consumer-visible decision and is not changed
|
|
144
|
+
here; `brand:status` surfaces the mismatch at the moment it matters.
|
|
118
145
|
- [`design-intelligence`](../skills/design-intelligence/SKILL.md) — the "audit findings outrank corpus" precedent the gate mirrors.
|
|
119
146
|
- [`docs/guidelines/design-modes.md`](../docs/guidelines/design-modes.md) — brand vs product register discriminator and routing.
|
|
@@ -19,7 +19,9 @@ obligation_frequency: "per-turn"
|
|
|
19
19
|
# Context Hygiene
|
|
20
20
|
|
|
21
21
|
> **Enforced by:** [`scripts/context_hygiene_hook.ts`](../../scripts/context_hygiene_hook.ts)
|
|
22
|
-
> on Augment + Claude Code (`PostToolUse`).
|
|
22
|
+
> on Augment + Claude Code (`PostToolUse`). Run `agent-config hooks:status` to
|
|
23
|
+
> see whether that slot is actually bound on the host you are on — this line is
|
|
24
|
+
> a statement about the manifest, not about your install. The hook maintains
|
|
23
25
|
> `agents/state/context-hygiene.json` (tool-call count, loop signal,
|
|
24
26
|
> freshness milestones at 20/40/60); the prose below is the spec the
|
|
25
27
|
> hook implements and the agent-side fallback.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "auto"
|
|
3
|
+
tier: "2a"
|
|
4
|
+
description: "Council availability is decided by the CLI resolver, never by the project tree — .agent-settings.yml is not the council config"
|
|
5
|
+
triggers:
|
|
6
|
+
- keyword: "council"
|
|
7
|
+
- keyword: "ai council"
|
|
8
|
+
- keyword: "ai-council"
|
|
9
|
+
- keyword: "council:status"
|
|
10
|
+
- keyword: "second opinion"
|
|
11
|
+
- phrase: "cross-check with another model"
|
|
12
|
+
self_contained: true
|
|
13
|
+
workspaces: [agent-config-maintainer, construction, engineering, finance, founder, gtm, legal-review-prep, ops, product, small-business]
|
|
14
|
+
packs: [meta]
|
|
15
|
+
enforced_by:
|
|
16
|
+
- "none"
|
|
17
|
+
# obligation: line 27
|
|
18
|
+
obligation_frequency: "per-task"
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Council Availability Is CLI-Decided
|
|
22
|
+
|
|
23
|
+
The council config is user-global (ADR-104): configured once per developer, live
|
|
24
|
+
in every project, worktree and CWD — including consumer repos carrying none of
|
|
25
|
+
this package's internals. Nothing in the project tree switches it on or off.
|
|
26
|
+
|
|
27
|
+
## The Iron Law
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
COUNCIL AVAILABILITY IS DECIDED BY THE CLI RESOLVER — NEVER BY THE PROJECT TREE.
|
|
31
|
+
RUN THE FREE `council:status` PROBE BEFORE CLAIMING THE COUNCIL IS UNAVAILABLE.
|
|
32
|
+
NEVER INFER "NOT CONFIGURED" FROM A MISSING `.agent-settings.yml`, A MISSING
|
|
33
|
+
`scripts/ai_council`, OR A MISSING PROJECT-LOCAL COUNCIL FILE — NONE OF THEM
|
|
34
|
+
CARRY COUNCIL ENABLEMENT.
|
|
35
|
+
NEVER COPY THE USER-GLOBAL CONFIG INTO THE PROJECT TREE TO "MAKE IT WORK".
|
|
36
|
+
NEVER PRESENT A SUBAGENT FAN-OUT AS A COUNCIL.
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## The probe
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
agent-config council:status # no API call, no spend, any directory
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Prints `CONFIGURED` / `NOT CONFIGURED`, the resolved path, the layer that
|
|
46
|
+
resolved it, and the member count. In this package's own checkout:
|
|
47
|
+
`./scripts-run src/scripts/council_cli status`.
|
|
48
|
+
|
|
49
|
+
## What says nothing about availability
|
|
50
|
+
|
|
51
|
+
A missing `.agent-settings.yml` (it never carried enablement — the block was
|
|
52
|
+
removed in ADR-093), a missing `scripts/ai_council/` (package-internal, absent
|
|
53
|
+
from every consumer), a missing project-local council file (the resolver ignores
|
|
54
|
+
`project_root` entirely), and invisible API keys (they live under
|
|
55
|
+
`~/.event4u/agent-config/`). The one real location is
|
|
56
|
+
`~/.event4u/agent-config/settings/.ai-council.yml`; the only escape is
|
|
57
|
+
`$AI_COUNCIL_CONFIG`, an explicit absolute path — still not a project search.
|
|
58
|
+
|
|
59
|
+
## Why this rule exists
|
|
60
|
+
|
|
61
|
+
The council switch is **not** in `.agent-settings.yml`, though roughly twenty
|
|
62
|
+
rules train the reflex of reading that file to learn whether a feature is on.
|
|
63
|
+
The exception lived only in [`ai-council`](../skills/ai-council/SKILL.md),
|
|
64
|
+
a skill body that reaches context only on activation, so five consumer sessions
|
|
65
|
+
inspected the tree, announced "council not configured", and substituted a
|
|
66
|
+
subagent fan-out while two members were configured the whole time. One copied
|
|
67
|
+
the user-global config into the repo to "make it work".
|
|
68
|
+
|
|
69
|
+
## If the probe really says unavailable
|
|
70
|
+
|
|
71
|
+
State the resolver's own message and stop. A subagent fan-out is a legitimate
|
|
72
|
+
substitute **only when named as such** — never as "the council". Same honesty
|
|
73
|
+
boundary as [`evaluator-independence`](evaluator-independence.md).
|
|
74
|
+
|
|
75
|
+
## When NOT to fire
|
|
76
|
+
|
|
77
|
+
Availability is already settled this session, or the question is about council
|
|
78
|
+
*content* (findings, synthesis) rather than availability.
|
|
79
|
+
|
|
80
|
+
## Enforcement
|
|
81
|
+
|
|
82
|
+
`enforced_by: none` — no gate reads a chat claim. Deterministic instead:
|
|
83
|
+
`check_council_config_location` fails the build when a council surface ties the
|
|
84
|
+
config to `.agent-settings.yml`, which never carried it, or to a project-tree
|
|
85
|
+
path, and its §4 fails when no always-loaded rule carries this fact at all.
|
|
86
|
+
|
|
87
|
+
## See also
|
|
88
|
+
|
|
89
|
+
- [`ai-council`](../skills/ai-council/SKILL.md) — the full invocation procedure.
|
|
90
|
+
- [`direct-answers`](direct-answers.md) Iron Law 2 — a live-state fact is never
|
|
91
|
+
asserted from inspection when an authoritative resolver exists.
|
|
92
|
+
- [`self-repair-loop`](self-repair-loop.md) — catches the claim when it is made
|
|
93
|
+
anyway.
|
|
@@ -61,6 +61,9 @@ OBVIOUS-TO-THE-AGENT ≠ IN-SCOPE.
|
|
|
61
61
|
a ticket/spec that carries a second source (an attachment, a code reality, or an
|
|
62
62
|
internal contradiction), gated by `consistency.cross_source` in
|
|
63
63
|
`.agent-settings.yml` (`on` default · `auto` = high-confidence only · `off` = inert).
|
|
64
|
+
That file is the project layer of a cascade that starts user-global — never read
|
|
65
|
+
the setting or its absence from it alone; `agent-config settings:get
|
|
66
|
+
consistency.cross_source` reports the value and the file it came from.
|
|
64
67
|
|
|
65
68
|
**Does NOT fire** on a single clear source with no second source to compare
|
|
66
69
|
against (that is plain vagueness — it belongs to `ask-when-uncertain`), on
|
|
@@ -46,16 +46,18 @@ Only when the activation gate from
|
|
|
46
46
|
[`auto-orchestration-activation`](../contexts/execution/auto-orchestration-activation.md)
|
|
47
47
|
clears — all of:
|
|
48
48
|
|
|
49
|
-
- `
|
|
49
|
+
- `emergency.orchestration_halt` is not set,
|
|
50
50
|
- the host-capability manifest reports `subagent_spawn: true`,
|
|
51
51
|
- the task is classified **delegable** per
|
|
52
52
|
[`auto-dispatch-classification`](../contexts/execution/auto-dispatch-classification.md)
|
|
53
53
|
(≥1 independent, well-specified slice above the size floor).
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
+ per-subtask tiers in one line
|
|
55
|
+
Always-on orchestration (road-to-always-on-orchestration Phase 1) removed the
|
|
56
|
+
`subagents.enabled`/`subagents.auto` settings this used to gate on — there is
|
|
57
|
+
no more per-layer on/off setting. A matched delegable signal → dispatch,
|
|
58
|
+
surfacing the chosen mode + per-subtask tiers in one line, never silent. An
|
|
59
|
+
AMBIGUOUS verdict (no enumerated signal matched) → **ask**, always — a verdict
|
|
60
|
+
to the user, never a speculative spawn. The emergency halt, or no host
|
|
59
61
|
primitive → run in-session (clean no-op).
|
|
60
62
|
|
|
61
63
|
## What it makes binding
|
|
@@ -77,11 +79,37 @@ primitive → run in-session (clean no-op).
|
|
|
77
79
|
ordered slice never dispatches before its declared parent's return is
|
|
78
80
|
verified. Both per
|
|
79
81
|
[`subagent-steering`](../contexts/execution/subagent-steering.md).
|
|
80
|
-
6. **Record** telemetry after each dispatch —
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
6. **Record** telemetry after each dispatch — on hook-capable hosts the
|
|
83
|
+
`orchestration-record` concern (`post_tool_use`) emits the line
|
|
84
|
+
deterministically for every Agent/Task completion; on hosts without the
|
|
85
|
+
slot, run `orchestration_record` yourself (one validated line: spawn_count,
|
|
86
|
+
token_delta + provenance, tier, task_class) per
|
|
87
|
+
[`orchestration-telemetry`](../contexts/execution/orchestration-telemetry.md)
|
|
88
|
+
§ Emit. Measured before the hook existed: 1 of 370 dispatches captured —
|
|
89
|
+
the model-carried path alone leaves the value question unmeasured.
|
|
90
|
+
|
|
91
|
+
## Carriers — how this rule reaches a session (and what stays model-carried)
|
|
92
|
+
|
|
93
|
+
No host runs the tier-2 rule router, so this file's triggers alone never load
|
|
94
|
+
it. The obligation travels on three carriers instead: the always-loaded
|
|
95
|
+
AGENTS.md line (delegate-by-default + end-review), the `delegation-nudge`
|
|
96
|
+
concern on `user_prompt_submit` (runs `classifyTask` on cheap prompt signals
|
|
97
|
+
and injects a one-line verdict ONLY when the classifier says
|
|
98
|
+
`do-in-parallel`/`do-in-steps` — silence otherwise; delivery on
|
|
99
|
+
`user_prompt_submit` is end-to-end verified), and the `end-review-nudge`
|
|
100
|
+
concern on `stop` (ONE `review_skipped` telemetry line per mutating
|
|
101
|
+
no-review session — verified; its advisory line reaches the dispatcher
|
|
102
|
+
output, but host-side forwarding of stop-slot context to the model is
|
|
103
|
+
unverified, so the model-facing end-review carrier is the AGENTS.md line
|
|
104
|
+
plus this telemetry). The
|
|
105
|
+
capability gate itself resolves from the committed host registry merged with a
|
|
106
|
+
live environment probe in `src/scripts/_lib/host_capability.ts`
|
|
107
|
+
(`probeHostCapabilities` — capability is a fact about the host, never a
|
|
108
|
+
settings override). What stays
|
|
109
|
+
model-carried, honestly: the decomposition itself, the per-return
|
|
110
|
+
verification, and every dispatch on hosts without hook slots. The nudges are
|
|
111
|
+
advisory by design — whether they change behaviour is measured by the
|
|
112
|
+
telemetry, not assumed.
|
|
85
113
|
|
|
86
114
|
## Scope — does NOT
|
|
87
115
|
|
|
@@ -72,6 +72,9 @@ decisions already made — treat it like brand tokens, not like inspiration.
|
|
|
72
72
|
## Strictness — set by `design.fidelity_mode`
|
|
73
73
|
|
|
74
74
|
Read `design.fidelity_mode` from `.agent-settings.yml`. Missing → `strict`.
|
|
75
|
+
That file is the project layer of a cascade that starts user-global, so "missing"
|
|
76
|
+
means missing from **every** layer — `agent-config settings:get
|
|
77
|
+
design.fidelity_mode` reports the value and the file it came from.
|
|
75
78
|
|
|
76
79
|
| Mode | Behaviour |
|
|
77
80
|
|---|---|
|
|
@@ -99,7 +99,8 @@ id; with no ledger yet, the counter falls back to session scope. And the slot
|
|
|
99
99
|
itself is not universal: `pre_tool_use` exists on **three** hosts — augment,
|
|
100
100
|
claude, cowork. On cursor, cline, windsurf, gemini and copilot this guard has
|
|
101
101
|
nowhere to bind, so items 1 and 4 join 2 and 3 as model-carried there. The
|
|
102
|
-
frequency join in `check_enforcement_coverage.ts` reports exactly that set
|
|
102
|
+
frequency join in `check_enforcement_coverage.ts` reports exactly that set, and
|
|
103
|
+
`agent-config hooks:status` answers it for the host you are on right now.
|
|
103
104
|
|
|
104
105
|
Items 2 and 3 — an honestly chosen scope, and recording the prompt with the
|
|
105
106
|
verdict — are **not** enforced by anything. A narrowed scope is not decidable
|
|
@@ -70,7 +70,8 @@ AND the repo contains a detectable index:
|
|
|
70
70
|
routing skill: `agent-config code-graph detect|query|affected|path` over the
|
|
71
71
|
native engine or a consumer-shipped index, grep as the stated fallback. On
|
|
72
72
|
hook-capable hosts the PreToolUse `code-graph` nudge surfaces this once per
|
|
73
|
-
session; on instruction-file hosts this rule is the surface.
|
|
73
|
+
session; on instruction-file hosts this rule is the surface. Which of the two
|
|
74
|
+
you are on is `agent-config hooks:status`, not a guess from the host name.
|
|
74
75
|
- [`discovery_graph`](../scripts/discovery_graph.ts) — this suite's OWN artefact
|
|
75
76
|
relation-graph (`affected`/`explain`); the external code-graph is the
|
|
76
77
|
*source-code* analogue this rule defers to for code questions.
|
|
@@ -41,7 +41,7 @@ obligation_frequency: "per-task"
|
|
|
41
41
|
|
|
42
42
|
# Finance Safety Floor
|
|
43
43
|
|
|
44
|
-
Domain safety floor for finance-pack artefacts (cash, runway, valuation, scenario, unit economics, forecasting). Auto-activates when `pack-finance-basic` or `pack-finance-advanced` is installed.
|
|
44
|
+
Domain safety floor for finance-pack artefacts (cash, runway, valuation, scenario, unit economics, forecasting). Auto-activates when `pack-finance-basic` or `pack-finance-advanced` is installed — `agent-config packs:active` says whether it is, and names the degraded case where zero packs load and this floor cannot activate at all.
|
|
45
45
|
|
|
46
46
|
## Iron Law — no final investment recommendation
|
|
47
47
|
|
|
@@ -84,4 +84,4 @@ Trigger-set above activates this routing on demand, independent of the disciplin
|
|
|
84
84
|
- [`commit-policy`](commit-policy.md) — commits are the user's call; rewriting them is a stronger version of the same restriction.
|
|
85
85
|
- [`token-efficiency`](token-efficiency.md) — Iron Law on burning the user's tokens for cosmetic gain.
|
|
86
86
|
- [`skill:git-workflow`](../skills/git-workflow/SKILL.md) — Safe Squash-After-Push protocol and Divergent-State Recovery decision tree.
|
|
87
|
-
- `git … --no-verify` / `core.hooksPath` overrides — deterministically blocked by the `block-no-verify` PreToolUse guard (`src/scripts/hooks/block_no_verify.ts`, registered in `hook_manifest.yaml`) **on the three hosts that have a `pre_tool_use` slot at all** — augment, claude, cowork. On cursor, cline, windsurf, gemini and copilot the guard has nowhere to bind, so on those hosts the Iron Laws above are model-carried and "deterministically blocked" is not a claim this rule can make. Surfaced by the frequency join in `check_enforcement_coverage.ts`, which reports the per-commit obligation as uncovered on exactly those platforms.
|
|
87
|
+
- `git … --no-verify` / `core.hooksPath` overrides — deterministically blocked by the `block-no-verify` PreToolUse guard (`src/scripts/hooks/block_no_verify.ts`, registered in `hook_manifest.yaml`) **on the three hosts that have a `pre_tool_use` slot at all** — augment, claude, cowork. On cursor, cline, windsurf, gemini and copilot the guard has nowhere to bind, so on those hosts the Iron Laws above are model-carried and "deterministically blocked" is not a claim this rule can make. Surfaced by the frequency join in `check_enforcement_coverage.ts`, which reports the per-commit obligation as uncovered on exactly those platforms. To check the host you are on rather than trusting this sentence, run `agent-config hooks:status`.
|
|
@@ -26,7 +26,9 @@ obligation_frequency: "per-edit"
|
|
|
26
26
|
# History Discipline
|
|
27
27
|
|
|
28
28
|
Pack floor for the `history-discipline` pack (default-off; auto-activates
|
|
29
|
-
when the pack is installed
|
|
29
|
+
when the pack is installed — `agent-config packs:active` says whether it is,
|
|
30
|
+
and names the degraded case where zero packs load and this floor cannot
|
|
31
|
+
activate at all). Agents get history wrong in both directions:
|
|
30
32
|
missing entirely on data that needs it, or over-built as event sourcing
|
|
31
33
|
where a row-level log suffices — and audit tables that themselves grow
|
|
32
34
|
without bound.
|
|
@@ -39,7 +39,7 @@ obligation_frequency: "per-task"
|
|
|
39
39
|
|
|
40
40
|
# Legal Safety Floor
|
|
41
41
|
|
|
42
|
-
Domain safety floor for the `legal-review-prep` pack (contract/NDA/DPA review, legal triage). Auto-activates when `pack-legal-review-prep` is installed. Sibling to `finance-safety-floor` / `strategy-safety-floor`. Every output is a **draft to PREPARE for attorney review**, never legal advice. Operating mechanics migrated to [`legal-practice-profile § Legal safety floor`](../skills/legal-practice-profile/SKILL.md) (per P4 of `road-to-kernel-and-router`) — the Iron Laws below stay here.
|
|
42
|
+
Domain safety floor for the `legal-review-prep` pack (contract/NDA/DPA review, legal triage). Auto-activates when `pack-legal-review-prep` is installed — `agent-config packs:active` says whether it is, and names the degraded case where zero packs load and this floor cannot activate at all. Sibling to `finance-safety-floor` / `strategy-safety-floor`. Every output is a **draft to PREPARE for attorney review**, never legal advice. Operating mechanics migrated to [`legal-practice-profile § Legal safety floor`](../skills/legal-practice-profile/SKILL.md) (per P4 of `road-to-kernel-and-router`) — the Iron Laws below stay here.
|
|
43
43
|
|
|
44
44
|
## Iron Law — no final legal call
|
|
45
45
|
|
|
@@ -25,7 +25,9 @@ EXCEPTION: USER-INVOKED FLOWS ALWAYS RUN.
|
|
|
25
25
|
EXCEPTION: USER EXPLICITLY ASKED FOR IT THIS TURN.
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
Reading `.agent-settings.yml
|
|
28
|
+
Reading `.agent-settings.yml` — the project layer of a cascade that starts
|
|
29
|
+
user-global, so "not set" means not set on any layer; `agent-config settings:get
|
|
30
|
+
personal.pr_progress_comments` reports the value and the file it came from:
|
|
29
31
|
|
|
30
32
|
- Missing key / not set → treat as `false`.
|
|
31
33
|
- `personal.pr_progress_comments: false` (default) → gate fires.
|
|
@@ -18,7 +18,9 @@ obligation_frequency: "per-session"
|
|
|
18
18
|
# Onboarding Gate
|
|
19
19
|
|
|
20
20
|
**Iron Law.** First turn of a project: if `onboarding.onboarded` is
|
|
21
|
-
false in `.agent-settings.yml
|
|
21
|
+
false in `.agent-settings.yml` — the project layer of a cascade that starts
|
|
22
|
+
user-global, so check it with `agent-config settings:get onboarding.onboarded`
|
|
23
|
+
rather than by opening one file — instruct the developer to run
|
|
22
24
|
`agent-config setup` in their terminal before executing any other
|
|
23
25
|
request. The wizard writes `onboarding.onboarded: true` on `Finish`,
|
|
24
26
|
which silences this rule for subsequent turns.
|
|
@@ -45,7 +45,10 @@ AND EXECUTION MUST SKIP THEM INLINE WITH [-] AND A REASON.
|
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
When autonomous local-CI runs are disabled in `.agent-settings.yml`
|
|
48
|
-
(`quality.local_auto_run: false` — the shipped template default
|
|
48
|
+
(`quality.local_auto_run: false` — the shipped template default; that file is the
|
|
49
|
+
project layer of a cascade that starts user-global, and this key is one where an
|
|
50
|
+
ABSENT value resolves to `true` at its reader and therefore DISABLES this gate —
|
|
51
|
+
`agent-config settings:get quality.local_auto_run` reports both facts), every
|
|
49
52
|
full-pipeline gate run during roadmap work is wasted wall-clock and
|
|
50
53
|
tokens — the remote CI on the PR is the authoritative gate. Roadmaps must
|
|
51
54
|
neither schedule nor execute those gates locally. New CI gates and
|
|
@@ -20,7 +20,7 @@ one of the six modes defined in
|
|
|
20
20
|
[`role-contracts`](../docs/guidelines/agent-infra/role-contracts.md):
|
|
21
21
|
`developer`, `reviewer`, `tester`, `po`, `incident`, `planner`.
|
|
22
22
|
|
|
23
|
-
Read `roles.active_role` from `.agent-settings.yml` at session start. Empty / missing → rule is inert; do NOT guess a mode.
|
|
23
|
+
Read `roles.active_role` from `.agent-settings.yml` at session start — the project layer of a cascade that starts user-global, so use `agent-config settings:get roles.active_role`, which reports the value and the file it came from, rather than opening one file. Empty / missing → rule is inert; do NOT guess a mode.
|
|
24
24
|
|
|
25
25
|
When active, every closing output MUST:
|
|
26
26
|
|
|
@@ -33,7 +33,9 @@ obligation_frequency: "per-edit"
|
|
|
33
33
|
# Scale Discipline
|
|
34
34
|
|
|
35
35
|
Pack floor for the `scale-discipline` pack (default-off; auto-activates
|
|
36
|
-
when the pack is installed
|
|
36
|
+
when the pack is installed — `agent-config packs:active` says whether it is,
|
|
37
|
+
and names the degraded case where zero packs load and this floor cannot
|
|
38
|
+
activate at all). AI agents produce functionally correct but
|
|
37
39
|
scale-hostile persistence code — this rule binds the failure classes to
|
|
38
40
|
deterministic pattern lints where possible and to review advice where not.
|
|
39
41
|
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "auto"
|
|
3
|
+
tier: "2a"
|
|
4
|
+
description: "An observed defect in the agent's own behaviour becomes a queued record and a fix against agent-config — never a silent shrug"
|
|
5
|
+
triggers:
|
|
6
|
+
- keyword: "self-repair"
|
|
7
|
+
- keyword: "self-repair-queue"
|
|
8
|
+
- phrase: "nicht richtig gearbeitet"
|
|
9
|
+
- phrase: "du hast das falsch"
|
|
10
|
+
- phrase: "you ignored the rule"
|
|
11
|
+
- phrase: "that was wrong"
|
|
12
|
+
self_contained: true
|
|
13
|
+
workspaces: [agent-config-maintainer, construction, engineering, finance, founder, gtm, legal-review-prep, ops, product, small-business]
|
|
14
|
+
packs: [meta]
|
|
15
|
+
enforced_by:
|
|
16
|
+
- "hook:self-repair"
|
|
17
|
+
# obligation: line 28
|
|
18
|
+
obligation_frequency: "per-turn"
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Self-Repair Loop
|
|
22
|
+
|
|
23
|
+
A defect in how the agent behaved is a defect in **agent-config**, not in the
|
|
24
|
+
user's project. The user should not have to file it, and the next user should
|
|
25
|
+
not meet it again. Two intake paths fill one queue: the user says so
|
|
26
|
+
(`user_prompt_submit`), or a deterministic detector fires at turn end (`stop`).
|
|
27
|
+
|
|
28
|
+
## The Iron Law
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
AN OBSERVED DEFECT IN THE AGENT'S OWN BEHAVIOUR IS QUEUED AND FIXED — NEVER SHRUGGED OFF.
|
|
32
|
+
THE DEFECT BELONGS TO AGENT-CONFIG. NEVER "FIX" IT BY EDITING THE USER'S PROJECT.
|
|
33
|
+
CORRECT THE TURN OPENLY IN FRONT OF THE USER. NEVER RE-RUN IT SILENTLY TO HIDE THE MISS.
|
|
34
|
+
THE OUTWARD STEP — PUSH, PR, ISSUE — NEEDS THE USER'S WORD THIS TURN. NO EXCEPTION.
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## When the queue line appears
|
|
38
|
+
|
|
39
|
+
`<self-repair-queue>` is injected at prompt time while records are open. It is
|
|
40
|
+
work, not a notification:
|
|
41
|
+
|
|
42
|
+
1. **Read it** — `agent-config self-repair:status`, then the newest record
|
|
43
|
+
under `agents/runtime/self-repair/`.
|
|
44
|
+
2. **Name the surface that failed** — the rule, skill, gate, or missing carrier
|
|
45
|
+
that allowed the behaviour. A defect with no named surface is an apology,
|
|
46
|
+
not a fix.
|
|
47
|
+
3. **Author the fix against agent-config** — in a checkout if one exists, so
|
|
48
|
+
the release can be a pull request; otherwise the report alone becomes an
|
|
49
|
+
issue.
|
|
50
|
+
4. **Offer the release** — `agent-config self-repair:release <fingerprint>`;
|
|
51
|
+
`--dry-run` shows route and body without touching the network. Running it is
|
|
52
|
+
the user's call, per
|
|
53
|
+
[`non-destructive-by-default`](non-destructive-by-default.md).
|
|
54
|
+
|
|
55
|
+
## Correct openly, never silently
|
|
56
|
+
|
|
57
|
+
Reported by the user → redo the task properly in the same turn, visibly, saying
|
|
58
|
+
what changed. Found by a detector → say so at the next opportunity and correct
|
|
59
|
+
it. Forbidden is the hidden version: re-running the turn so the miss never
|
|
60
|
+
surfaces. That mechanism (`attempt → critic → re-attempt`) was benchmarked and
|
|
61
|
+
falsified under ADR-106 — capability Δ = 0, council verdict TERMINAL — and the
|
|
62
|
+
same verdict names the replacement lever: refine the rules on the failure tail,
|
|
63
|
+
which is what a queued record feeds. Hiding the miss also destroys the only
|
|
64
|
+
signal the loop runs on.
|
|
65
|
+
|
|
66
|
+
## What the detectors do NOT do
|
|
67
|
+
|
|
68
|
+
They do not check that every rule was followed. Most obligations here are
|
|
69
|
+
model-carried and unobservable from a transcript; guessing at them would
|
|
70
|
+
manufacture defects and flood the queue. A new detector must fire on a real
|
|
71
|
+
recorded failure **and** stay silent on its near-miss.
|
|
72
|
+
|
|
73
|
+
## Privacy — fail-closed by construction
|
|
74
|
+
|
|
75
|
+
A record carries a class, a sanitized evidence span and a counter, and has **no
|
|
76
|
+
field** that can hold a prompt, a file body, or a project path. It passes the
|
|
77
|
+
audited privacy floor before leaving the machine; a refusal downgrades it to
|
|
78
|
+
local-only rather than scrubbing it into publishable shape — the same principle
|
|
79
|
+
as [`domain-safety-pii`](domain-safety-pii.md) § Surface 2.
|
|
80
|
+
|
|
81
|
+
## When NOT to fire
|
|
82
|
+
|
|
83
|
+
The user is criticising the **code**, not the agent's conduct; the fingerprint
|
|
84
|
+
is already an open record (the hook increments it); or a one-off caused by
|
|
85
|
+
information the agent could not have had — note it, do not queue it.
|
|
86
|
+
|
|
87
|
+
## Enforcement
|
|
88
|
+
|
|
89
|
+
The hook is `fail_closed: false` and always exits 0: it records, it never
|
|
90
|
+
gates — blocking a turn-end on a heuristic is the failure mode the
|
|
91
|
+
enforcement-projection null warns about. Detection is hook-carried, analysis and
|
|
92
|
+
fix model-carried; only the privacy gate and route choice are deterministic.
|
|
93
|
+
Nothing claims a defect *will* be caught — only that a caught one is not dropped.
|
|
94
|
+
Whether the hook is bound at all on this host is `agent-config hooks:status`; on
|
|
95
|
+
a host with no matching slot the detection half does not run and only the
|
|
96
|
+
model-carried half remains.
|
|
97
|
+
|
|
98
|
+
## See also
|
|
99
|
+
|
|
100
|
+
- [`non-destructive-by-default`](non-destructive-by-default.md) — the Hard Floor the release step obeys.
|
|
101
|
+
- [`skill-improvement-pipeline`](../skills/skill-improvement-pipeline/SKILL.md) — the sibling loop for capability gaps.
|
|
102
|
+
- [`upstream-contribute`](../skills/upstream-contribute/SKILL.md) — the manual path this automates.
|
|
103
|
+
- [`council-availability`](council-availability.md) — the defect class that motivated the first detector.
|
|
@@ -80,7 +80,8 @@ name it and suggest a fresh session or `/agent-handoff`, per
|
|
|
80
80
|
> bound in **two** slots. `session_start` injects the full `<session-canary>`
|
|
81
81
|
> contract once, so a fresh conversation cannot start without it.
|
|
82
82
|
> `user_prompt_submit` injects a one-line beat every turn, which is what
|
|
83
|
-
> actually reaches a task boundary.
|
|
83
|
+
> actually reaches a task boundary. Both bindings are manifest facts; whether
|
|
84
|
+
> they are live on this install is `agent-config hooks:status`.
|
|
84
85
|
|
|
85
86
|
**Why two slots, and why not one.** The obligation is per *task*. No host has a
|
|
86
87
|
per-task slot — Cline maps `TaskStart`/`TaskResume` onto `session_start`, and
|
|
@@ -7,7 +7,6 @@ triggers:
|
|
|
7
7
|
- keyword: "settings:set"
|
|
8
8
|
- keyword: "canary_name"
|
|
9
9
|
- keyword: "rich_skills"
|
|
10
|
-
- keyword: "budget_routing"
|
|
11
10
|
- keyword: "adversarial_council"
|
|
12
11
|
- keyword: "learn_on_session_end"
|
|
13
12
|
- keyword: "open_edited_files"
|
|
@@ -34,7 +33,7 @@ obligation_frequency: "per-task"
|
|
|
34
33
|
# Settings-Ask Protocol
|
|
35
34
|
|
|
36
35
|
A settings question is the one ask where the agent poses the question *and* owns
|
|
37
|
-
where the answer goes.
|
|
36
|
+
where the answer goes. Seven keys can produce one, in two mechanisms that look
|
|
38
37
|
identical from outside and differ completely underneath.
|
|
39
38
|
|
|
40
39
|
## The Iron Law
|
|
@@ -70,7 +69,7 @@ How long it stays cached in working state is the key's own business, and several
|
|
|
70
69
|
keys state their own scope. Reading the C path as "re-ask every execution" would
|
|
71
70
|
turn a fence against illegal writes into a source of extra questions.
|
|
72
71
|
|
|
73
|
-
## The
|
|
72
|
+
## The seven keys
|
|
74
73
|
|
|
75
74
|
**Class B — persist once**: `personal.canary_name` ·
|
|
76
75
|
`personal.open_edited_files` · `memory.learn_on_session_end`. Each ships a
|
|
@@ -78,10 +77,12 @@ conservative default (`""`, `false`, `false`), so absent is indistinguishable
|
|
|
78
77
|
from *no* and never from *yes*.
|
|
79
78
|
|
|
80
79
|
**Class C carrying an `ask` value in its own enum** — a runtime question whose
|
|
81
|
-
answer dies with the run: `
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
80
|
+
answer dies with the run: `worktrees.mode` (**ships** as `ask`), plus
|
|
81
|
+
`tokens.rich_skills`, `subagents.adversarial_council`, `decision_engine.on_block`
|
|
82
|
+
(which can be set to `ask` by a human but do not ship that way). Always-on
|
|
83
|
+
orchestration (road-to-always-on-orchestration Phase 1) deleted
|
|
84
|
+
`subagents.auto` and `subagents.budget_routing` — the layer no longer carries a
|
|
85
|
+
setting for this protocol to route.
|
|
85
86
|
|
|
86
87
|
## The budget
|
|
87
88
|
|
|
@@ -43,7 +43,7 @@ obligation_frequency: "per-task"
|
|
|
43
43
|
|
|
44
44
|
# Strategy Safety Floor
|
|
45
45
|
|
|
46
|
-
Domain safety floor for founder-strategy artefacts (vision, positioning, competitive moats, market entry, OKR trees, build-vs-buy). Auto-activates when `pack-founder-strategy` is installed.
|
|
46
|
+
Domain safety floor for founder-strategy artefacts (vision, positioning, competitive moats, market entry, OKR trees, build-vs-buy). Auto-activates when `pack-founder-strategy` is installed — `agent-config packs:active` says whether it is, and names the degraded case where zero packs load and this floor cannot activate at all.
|
|
47
47
|
|
|
48
48
|
## Iron Law — strategy is a frame, not a verdict
|
|
49
49
|
|
|
@@ -32,7 +32,9 @@ TO THE FULL FRUGALITY CANON (telegraph-speak, thin-projector).
|
|
|
32
32
|
| `standard` | — | Balanced condensation | Not trimmed if priority ≥ 60 | 500–2000 tokens |
|
|
33
33
|
| `rich` | Must be declared + justified | **Exempt** | **Never trimmed** | 2000–3500 tokens |
|
|
34
34
|
|
|
35
|
-
Read `tokens.rich_skills` from `.agent-settings.yml` (default `on`)
|
|
35
|
+
Read `tokens.rich_skills` from `.agent-settings.yml` (default `on`) — the project
|
|
36
|
+
layer of a cascade that starts user-global, so `agent-config settings:get
|
|
37
|
+
tokens.rich_skills` is the read that answers it, file included — to determine
|
|
36
38
|
whether rich skills may load in full. If `off`, treat them as `standard`. If
|
|
37
39
|
`ask`, the question's shape is
|
|
38
40
|
[`settings-ask-protocol`](settings-ask-protocol.md)'s, not this rule's; what only
|
|
@@ -137,7 +139,7 @@ its obligation on line 300.
|
|
|
137
139
|
|
|
138
140
|
## The size band is measured, and only its ceiling is gated
|
|
139
141
|
|
|
140
|
-
The `rich` band is **2,000–3,500 tokens** (
|
|
142
|
+
The `rich` band is **2,000–3,500 tokens** (ADR-217, `docs/decisions/ADR-217-rich-class-band-measured-and-enforced.md`).
|
|
141
143
|
It was 2,000–5,000 and enforced by nothing until that record: measured with the
|
|
142
144
|
exact BPE tokenizer, the largest rich artifact in the tree is 3,331 tokens, so
|
|
143
145
|
the old ceiling described no artifact that existed. An unused permission costs
|
|
@@ -25,7 +25,11 @@ Tools are permissions, not abilities. Every tool access must be declared and rev
|
|
|
25
25
|
## Constraints
|
|
26
26
|
|
|
27
27
|
- **Deny by default** — no tool access unless explicitly listed in `allowed_tools`
|
|
28
|
-
- **Allowlist only** — tool names must match the tool registry
|
|
28
|
+
- **Allowlist only** — tool names must match the tool registry. That registry is
|
|
29
|
+
a small static constant and is **not** the same thing as the MCP servers a
|
|
30
|
+
session can reach; `agent-config mcp:available` prints both, kept apart, and
|
|
31
|
+
says plainly that it performs no handshake. Conflating the two is how a skill
|
|
32
|
+
ends up declaring a tool nothing provides.
|
|
29
33
|
- **Read-first** — prefer read-only actions; write requires explicit approval
|
|
30
34
|
- **No hidden credentials** — tools must not embed API keys or tokens in skill files
|
|
31
35
|
- **No arbitrary execution** — tool adapters have fixed interfaces, not free-form calls
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
model_tier: high
|
|
3
3
|
name: adversarial-review
|
|
4
|
-
description: "
|
|
4
|
+
description: "Adversarial critique — devil's advocate, stress-test, honest teardown ('poke holes', 'be brutal', 'was hältst du davon'); explicit request only. Routine code or design review → code-review."
|
|
5
5
|
personas:
|
|
6
6
|
- critical-challenger
|
|
7
7
|
domain: quality
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
model_tier: high
|
|
3
3
|
name: analysis-autonomous-mode
|
|
4
|
-
description: "
|
|
4
|
+
description: "Autonomous multi-step investigation — deep research carried end-to-end without per-step approval; explicit request only, never for normal feature work."
|
|
5
5
|
domain: discovery
|
|
6
6
|
workspaces:
|
|
7
7
|
- agent-config-maintainer
|