@event4u/agent-config 14.6.0 → 14.8.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/CHANGELOG.md +255 -145
- package/README.md +1 -1
- package/dist/agent-src/commands/analyze/inbox.md +264 -10
- package/dist/agent-src/commands/analyze.md +1 -1
- package/dist/agent-src/commands/evals/git-pr-merge.json +13 -0
- package/dist/agent-src/commands/evals/roadmap.json +17 -1
- package/dist/agent-src/commands/pr/create.md +14 -2
- package/dist/agent-src/commands/pr/merge.md +379 -0
- package/dist/agent-src/commands/roadmap/process-full.md +272 -32
- package/dist/agent-src/commands/roadmap.md +1 -1
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +46 -36
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +37 -2
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +95 -2
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +289 -106
- package/dist/agent-src/rules/artifact-drafting-protocol.md +5 -1
- package/dist/agent-src/rules/context-hygiene.md +2 -0
- package/dist/agent-src/rules/decision-revisit-gate.md +67 -32
- package/dist/agent-src/rules/fix-what-you-see.md +108 -0
- package/dist/agent-src/rules/no-roadmap-references.md +0 -5
- package/dist/agent-src/rules/recurring-criticism.md +110 -0
- package/dist/agent-src/rules/roadmap-progress-sync.md +20 -1
- package/dist/agent-src/rules/rule-type-governance.md +0 -2
- package/dist/agent-src/rules/self-repair-loop.md +17 -0
- package/dist/agent-src/rules/skill-quality.md +0 -2
- package/dist/agent-src/rules/source-confidentiality.md +37 -7
- package/dist/agent-src/scripts/archival_sweep.ts +117 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +26 -7
- package/dist/agent-src/scripts/dashboard_mode.ts +212 -0
- package/dist/agent-src/scripts/gate_budget.ts +282 -0
- package/dist/agent-src/scripts/gate_execute.ts +72 -31
- package/dist/agent-src/scripts/roadmap_gates.ts +74 -3
- package/dist/agent-src/scripts/update_roadmap_progress.ts +296 -53
- package/dist/agent-src/skills/adr-create/SKILL.md +124 -5
- package/dist/agent-src/skills/ai-council/SKILL.md +48 -807
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +320 -0
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +99 -0
- package/dist/agent-src/skills/ai-council/references/execution-modes.md +162 -0
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +125 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +143 -0
- package/dist/agent-src/skills/decision-record/SKILL.md +61 -3
- package/dist/agent-src/skills/decision-review/SKILL.md +65 -0
- package/dist/agent-src/skills/merge-conflicts/SKILL.md +26 -0
- package/dist/agent-src/skills/quality-tools/SKILL.md +34 -326
- package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +113 -0
- package/dist/agent-src/skills/quality-tools/references/php-tools.md +222 -0
- package/dist/agent-src/skills/roadmap-management/SKILL.md +15 -409
- package/dist/agent-src/skills/roadmap-management/references/archival.md +226 -0
- package/dist/agent-src/skills/roadmap-management/references/authoring.md +107 -0
- package/dist/agent-src/skills/roadmap-management/references/dashboard.md +47 -0
- package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +58 -0
- package/dist/agent-src/skills/security/SKILL.md +8 -0
- package/dist/agent-src/skills/security-audit/SKILL.md +12 -1
- package/dist/agent-src/skills/skill-writing/SKILL.md +34 -570
- package/dist/agent-src/skills/skill-writing/references/procedure.md +275 -0
- package/dist/agent-src/skills/skill-writing/references/read-only-scripts.md +18 -0
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +298 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +65 -4
- package/dist/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
- package/dist/agent-src/templates/scripts/telemetry/remote.ts +160 -7
- package/dist/agent-src/templates/scripts/telemetry/transport.ts +169 -0
- package/dist/cli/registry.js +2 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli-delegate/chunk-2GNWGMAL.js +172 -0
- package/dist/cli-delegate/{chunk-P6LQDIWK.js → chunk-7PRE6ZV2.js} +338 -0
- package/dist/cli-delegate/{chunk-BKO2AZ7Z.js → chunk-B2ERU2VA.js} +1 -1
- package/dist/cli-delegate/chunk-E4XIZDIB.js +402 -0
- package/dist/cli-delegate/{chunk-3UCJWMMP.js → chunk-EEJUMCDZ.js} +16 -16
- package/dist/cli-delegate/{chunk-NXFWFAYV.js → chunk-G23AT6GD.js} +1 -0
- package/dist/cli-delegate/{chunk-XURJ4AQC.js → chunk-H4VIVD4C.js} +385 -284
- package/dist/cli-delegate/chunk-I3EIN2YG.js +36 -0
- package/dist/cli-delegate/{chunk-RLN73PR5.js → chunk-LPPWO5CE.js} +12 -8
- package/dist/cli-delegate/chunk-MWRD5YOH.js +100 -0
- package/dist/cli-delegate/{chunk-UEZ7D35A.js → chunk-N7CDDGI3.js} +4 -23
- package/dist/cli-delegate/{chunk-63WSP6YZ.js → chunk-PMEKGDED.js} +74 -167
- package/dist/cli-delegate/{chunk-GRRPEPRN.js → chunk-T7L2QK3K.js} +24 -5
- package/dist/cli-delegate/{chunk-EVTY7ISR.js → chunk-YM4GZDJG.js} +9 -1
- package/dist/cli-delegate/cmd_adr_effective.js +1162 -0
- package/dist/cli-delegate/cmd_conformance.js +466 -716
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +10 -10
- package/dist/cli-delegate/cmd_explain.js +1 -1
- package/dist/cli-delegate/cmd_export.js +10 -9
- package/dist/cli-delegate/cmd_handoff.js +10 -9
- package/dist/cli-delegate/cmd_memory_get.js +2 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +5 -5
- package/dist/cli-delegate/cmd_prune.js +11 -10
- package/dist/cli-delegate/cmd_route_audit.js +6 -5
- package/dist/cli-delegate/cmd_route_explain.js +3 -3
- package/dist/cli-delegate/cmd_session_recycle.js +840 -30
- package/dist/cli-delegate/cmd_settings_get.js +3 -3
- package/dist/cli-delegate/cmd_settings_migrate.js +10 -9
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +11 -10
- package/dist/cli-delegate/cmd_uninstall.js +13 -11
- 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 +11 -10
- package/dist/cli-delegate/cmd_versions.js +3 -3
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +111 -37
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +5 -5
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +15 -12
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +11 -8
- package/dist/hooks/dispatch.js +3165 -2192
- package/dist/install/claudePathsPlan.js +187 -0
- package/dist/install/claudePathsPlan.js.map +1 -0
- package/dist/install/globalRuleLayers.js +169 -0
- package/dist/install/globalRuleLayers.js.map +1 -0
- package/dist/install/hostLayerFingerprint.js +136 -0
- package/dist/install/hostLayerFingerprint.js.map +1 -0
- package/dist/install/install.mjs +553 -425
- package/dist/install/partitionEligibility.js +432 -0
- package/dist/install/partitionEligibility.js.map +1 -0
- package/dist/install/ruleLayerPartition.js +157 -0
- package/dist/install/ruleLayerPartition.js.map +1 -0
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1863 -1234
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_src.js +41 -0
- package/dist/scripts/_lib/agent_src.js.map +1 -1
- package/dist/scripts/_lib/install_layout.js +83 -0
- package/dist/scripts/_lib/install_layout.js.map +1 -0
- package/dist/scripts/_lib/installed_lock.js +444 -0
- package/dist/scripts/_lib/installed_lock.js.map +1 -0
- package/dist/scripts/_lib/prune_empty_dirs.js +85 -0
- package/dist/scripts/_lib/prune_empty_dirs.js.map +1 -0
- package/dist/scripts/condense.js +63 -251
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/schemas/settings.js +4 -0
- package/dist/server/schemas/settings.js.map +1 -1
- package/docs/contracts/settings-classes.md +12 -6
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +8 -3
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +45 -1
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +26 -0
- package/docs/guidelines/agent-infra/false-green.md +47 -1
- package/docs/guidelines/agent-infra/memory-access.md +17 -0
- package/docs/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
- package/package.json +1 -1
- package/src/agent-src/scripts/archival_sweep.ts +117 -0
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +26 -7
- package/src/agent-src/scripts/dashboard_mode.ts +212 -0
- package/src/agent-src/scripts/gate_budget.ts +282 -0
- package/src/agent-src/scripts/gate_execute.ts +72 -31
- package/src/agent-src/scripts/roadmap_gates.ts +74 -3
- package/src/agent-src/scripts/update_roadmap_progress.ts +296 -53
- package/src/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
- package/src/agent-src/templates/scripts/telemetry/remote.ts +160 -7
- package/src/agent-src/templates/scripts/telemetry/transport.ts +169 -0
- package/src/config/agent-settings.template.yml +27 -2
- package/src/config/ci-local-parity.yml +39 -0
- package/src/config/estate-count-budget.json +612 -3
- package/src/config/evaluator-budgets.json +3 -3
- package/src/config/gate-coverage.yml +220 -12
- package/src/config/gate-violation-baselines.json +73 -63
- package/src/config/gitignore-block.txt +15 -2
- package/src/config/hook-latency-budget.json +5 -0
- package/src/config/rule-activation-census.json +14 -6
- package/src/config/rule-stub-ceilings.json +34 -7
- package/src/install/claudePathsPlan.ts +196 -0
- package/src/install/globalRuleLayers.ts +197 -0
- package/src/install/hostLayerFingerprint.ts +145 -0
- package/src/install/partitionEligibility.ts +502 -0
- package/src/install/ruleLayerPartition.ts +212 -0
- package/src/scripts/_cli/cmd_adr_effective.ts +484 -0
- package/src/scripts/_cli/cmd_session_recycle.ts +9 -1
- package/src/scripts/_dispatch.bash +17 -1
- package/src/scripts/_lib/ac_heading.ts +30 -0
- package/src/scripts/_lib/adr_frontmatter.test.ts +365 -0
- package/src/scripts/_lib/adr_frontmatter.ts +459 -0
- package/src/scripts/_lib/agent_src.ts +42 -0
- package/src/scripts/_lib/bench_ab_pinned_repo.ts +162 -0
- package/src/scripts/_lib/bench_ab_workspace.ts +10 -1
- package/src/scripts/_lib/envelope_grounding.ts +49 -9
- package/src/scripts/_lib/installed_lock.ts +50 -5
- package/src/scripts/_lib/layer_overlap_notice.ts +11 -2
- package/src/scripts/_lib/md_section.ts +129 -0
- package/src/scripts/_lib/prune_empty_dirs.ts +80 -0
- package/src/scripts/_lib/scope_guard.sh +26 -3
- package/src/scripts/_lib/self_repair.ts +19 -0
- package/src/scripts/_lib/self_repair_class_b.ts +171 -0
- package/src/scripts/adr/evidence_census.ts +899 -0
- package/src/scripts/adr/regenerate_index.ts +12 -32
- package/src/scripts/adr_cite_check.ts +540 -39
- package/src/scripts/ai_council/cli_help.ts +55 -0
- package/src/scripts/audit_adr_coverage.ts +103 -17
- package/src/scripts/before_complete_hook.ts +153 -28
- package/src/scripts/bench_ab_v2_complexity.ts +27 -7
- package/src/scripts/bench_hook_latency.ts +204 -0
- package/src/scripts/build_archive_index.ts +34 -0
- package/src/scripts/check_adr_frontmatter.ts +574 -39
- package/src/scripts/check_hook_bundle_content.ts +219 -0
- package/src/scripts/check_new_adr_evidence.ts +529 -0
- package/src/scripts/check_references.ts +78 -0
- package/src/scripts/check_release_published.ts +32 -11
- package/src/scripts/check_rule_layer_partition.ts +531 -0
- package/src/scripts/check_single_delivery.ts +194 -17
- package/src/scripts/check_standing_rule_delivery.ts +8 -2
- package/src/scripts/ci_settle.ts +170 -0
- package/src/scripts/condense.ts +79 -259
- package/src/scripts/council_cli.ts +3 -3
- package/src/scripts/dispatch_r2_reviewer.ts +6 -14
- package/src/scripts/external_sources_denylist.json +4 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +77 -14
- package/src/scripts/hooks/block_no_verify.ts +61 -10
- package/src/scripts/hooks/block_unauthorized_git.ts +21 -1
- package/src/scripts/hooks/concern_registry.ts +4 -0
- package/src/scripts/hooks/dispatch_hook.ts +154 -187
- package/src/scripts/hooks/dispatch_issues.ts +38 -19
- package/src/scripts/hooks/fallback_yaml.ts +66 -0
- package/src/scripts/hooks/host_semantics.ts +21 -0
- package/src/scripts/hooks/injection_budget.ts +13 -3
- package/src/scripts/hooks/py_json_dumps.ts +103 -0
- package/src/scripts/hooks/rtk_wrap_hook.ts +8 -3
- package/src/scripts/hooks/run_continuation_hook.ts +8 -5
- package/src/scripts/hooks/ship_diff_volume_hook.ts +81 -15
- package/src/scripts/hooks/source_first_gate_hook.ts +464 -0
- package/src/scripts/hooks/state_io.ts +870 -21
- package/src/scripts/hooks/stdin_failure_policy.ts +96 -0
- package/src/scripts/hooks/subagent_ledger_hook.ts +44 -15
- package/src/scripts/hooks/telemetry_flush_hook.ts +139 -0
- package/src/scripts/hooks/telemetry_self_repair.ts +128 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +22 -4
- package/src/scripts/hooks/turn_end_gate_hook.ts +81 -15
- package/src/scripts/injection_scan_hook.ts +137 -5
- package/src/scripts/install.ts +16 -11
- package/src/scripts/language_mirror_hook.ts +561 -25
- package/src/scripts/lint_framework_leakage_allowlist.json +2 -2
- package/src/scripts/lint_hook_manifest.ts +49 -0
- package/src/scripts/lint_plan_risk_register.ts +4 -3
- package/src/scripts/lint_provenance_vocabulary.ts +472 -4
- package/src/scripts/lint_skill_router_head.ts +4 -4
- package/src/scripts/mcp_server/tools.ts +2 -2
- package/src/scripts/new_roadmap.ts +136 -0
- package/src/scripts/pack_mcp_content.ts +20 -5
- package/src/scripts/release.ts +37 -38
- package/src/scripts/report_layer_overlap.ts +6 -0
- package/src/scripts/routing_doctor.ts +5 -1
- package/src/scripts/self_repair_hook.ts +37 -5
- package/src/scripts/session_register_hook.ts +11 -0
- package/src/scripts/skill_usage_collect.ts +11 -1
- package/src/scripts/skill_usage_report.ts +278 -8
- package/src/scripts/sync_pr_branch.ts +170 -20
- package/src/server/schemas/settings.ts +8 -0
- package/dist/cli-delegate/chunk-EJITJBJX.js +0 -172
- package/dist/cli-delegate/chunk-PZWRPRWP.js +0 -38
- package/dist/cli-delegate/{chunk-PPQO4NGR.js → chunk-6RJA2F5A.js} +3 -3
- package/dist/cli-delegate/{chunk-RYNADUFG.js → chunk-LWTYTX6F.js} +0 -0
- package/dist/cli-delegate/{chunk-FBKL6JWT.js → chunk-MMSGVZKV.js} +3 -3
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# ai-council — output path and synthesis
|
|
2
|
+
|
|
3
|
+
> Mode body of the [`ai-council`](../SKILL.md) skill (router-head retrofit,
|
|
4
|
+
> 2026-08-20). Content moved VERBATIM from SKILL.md — load this file when the
|
|
5
|
+
> mode table in SKILL.md routes here.
|
|
6
|
+
|
|
7
|
+
## Output path convention
|
|
8
|
+
|
|
9
|
+
Council artefacts (questions, responses, sessions) are **dev-time
|
|
10
|
+
scratch** — gitignored in both the package repo and consumer repos
|
|
11
|
+
and auto-pruned after `ai_council.session_retention_days` (default
|
|
12
|
+
7). They inform a decision; they are not the durable contract. The
|
|
13
|
+
durable contract lives in the roadmap / ADR / skill body that cites
|
|
14
|
+
the council's convergence inline.
|
|
15
|
+
|
|
16
|
+
**Linking to a specific council file is forbidden by
|
|
17
|
+
[`no-roadmap-references`](../../../rules/no-roadmap-references.md)
|
|
18
|
+
(council clause)** — gitignored, not in the cloned repo, gone after
|
|
19
|
+
the retention window. Inline the convergence with date + members
|
|
20
|
+
instead.
|
|
21
|
+
|
|
22
|
+
Three directories, three modes:
|
|
23
|
+
|
|
24
|
+
| Mode | Path | Format |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| **Topic-anchored question** (paired with a roadmap or ADR) | `agents/runtime/council/questions/<topic-slug>.md` | Markdown |
|
|
27
|
+
| **Topic-anchored response** (paired with the question above) | `agents/runtime/council/responses/<topic-slug>.json` | JSON from `council:run --output` |
|
|
28
|
+
| **Ad-hoc session** (no durable artefact yet) | `agents/runtime/council/sessions/<UTC-timestamp>.json` | JSON from `council:run --output` |
|
|
29
|
+
|
|
30
|
+
`<topic-slug>` is kebab-case and **must match** the corresponding
|
|
31
|
+
roadmap / ADR slug if one exists (e.g. `path-fixes` mirrors the
|
|
32
|
+
matching `road-to-<topic-slug>` roadmap under `agents/roadmaps/`).
|
|
33
|
+
|
|
34
|
+
### Forbidden
|
|
35
|
+
|
|
36
|
+
- Files at `agents/` root (e.g. `agents/runtime/council/question-foo.md`).
|
|
37
|
+
- Dot-prefix scratch (e.g. `agents/.council-question-foo.md`).
|
|
38
|
+
- Any other directory below `agents/` (e.g. `agents/scratch/`,
|
|
39
|
+
`agents/evidence/notes/`). Operator scratch belongs under
|
|
40
|
+
`agents/runtime/tmp/` (gitignored).
|
|
41
|
+
- Cross-references from any artefact to specific council files —
|
|
42
|
+
see [`no-roadmap-references`](../../../rules/no-roadmap-references.md)
|
|
43
|
+
(council clause). Inline the convergence summary instead, with
|
|
44
|
+
date and member list for traceability (`Council (claude-sonnet-4-5
|
|
45
|
+
+ gpt-4o, YYYY-MM-DD) reviewed N candidate strategies; converged
|
|
46
|
+
on …`).
|
|
47
|
+
|
|
48
|
+
### Exempt
|
|
49
|
+
|
|
50
|
+
- `agents/evidence/audits/` — historical audit bundles. The canonical
|
|
51
|
+
council dirs are gitignored; audit bundles are tracked,
|
|
52
|
+
cohesive narratives that may include council artefacts as
|
|
53
|
+
part of their evidence trail (e.g. `audits/2026-05-14-north-star/`
|
|
54
|
+
bundling its triggering question, raw responses, and synthesis
|
|
55
|
+
alongside the audit's findings). The layout linter
|
|
56
|
+
(`scripts/check_council_layout.ts`) skips this directory.
|
|
57
|
+
|
|
58
|
+
`scripts/check_council_layout.ts` is the mechanical check for the
|
|
59
|
+
output path convention — wire it into the package's CI pipeline so
|
|
60
|
+
violations break the build.
|
|
61
|
+
|
|
62
|
+
## Synthesis templates (lens-aware)
|
|
63
|
+
|
|
64
|
+
The **Convergence / Divergence** slot in `council:render` output is
|
|
65
|
+
populated with a lens-specific synthesis prompt. The host agent reads
|
|
66
|
+
this prompt and writes the summary in the shape it dictates. The five
|
|
67
|
+
templates live in `scripts/ai_council/prompts.ts::_SYNTHESIS_TABLE`
|
|
68
|
+
and are exposed via `synthesis_template(mode)`.
|
|
69
|
+
|
|
70
|
+
**R4 Q4 split** — decision lenses get a structured Karpathy-style
|
|
71
|
+
template; creative lenses keep an open-ended prose body. **Every lens
|
|
72
|
+
now closes with two required verdict-discipline sections** — **Kill
|
|
73
|
+
criteria** (observable falsifiers with a threshold or event, checkable
|
|
74
|
+
without re-convening the council) and **Concrete next step** (exactly
|
|
75
|
+
one artefact-producing action) — added so no synthesis ships an
|
|
76
|
+
unfalsifiable verdict (road-to-opt-council-deliberation Phase 0):
|
|
77
|
+
|
|
78
|
+
| Lens | Class | Synthesis sections |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `default` | decision | Agreement · Clashes · Blind spots · Recommendation · **Kill criteria · Concrete next step** |
|
|
81
|
+
| `pr` | decision | Consensus · Conflicts · Must-fix before merge · Recommendation · **Kill criteria · Concrete next step** |
|
|
82
|
+
| `analysis` | decision | Top-10 by consensus · Supporting · Outliers · **Kill criteria · Concrete next step** |
|
|
83
|
+
| `design` | creative | open prose body + **Kill criteria · Concrete next step** |
|
|
84
|
+
| `optimize` | creative | open prose body + **Kill criteria · Concrete next step** |
|
|
85
|
+
|
|
86
|
+
Input modes (`prompt` / `roadmap` / `diff` / `files`) inherit the
|
|
87
|
+
`default` decision template — they are bundling shapes, not lenses.
|
|
88
|
+
|
|
89
|
+
**Source citations:**
|
|
90
|
+
* Template shape — Round 2 council verdict
|
|
91
|
+
(`agents/runtime/council/sessions/2026-05-14-ai-council-redesign/round-1.md`,
|
|
92
|
+
Opus's lens-adaptive synthesis proposal).
|
|
93
|
+
* Decision/creative split — Round 4 Q4 verdict
|
|
94
|
+
(`agents/runtime/council/sessions/2026-05-14-ai-council-redesign/round-3-responses.json`).
|
|
95
|
+
R4 reframed `optimize` as creative because perf trade-offs resist
|
|
96
|
+
pre-templated shape — Performance-wins / Trade-offs /
|
|
97
|
+
Implementation-order is too rigid for the variety of optimize-lens
|
|
98
|
+
artefacts. R4 reframed `design` for the same reason — design
|
|
99
|
+
critiques are inherently narrative.
|
|
100
|
+
|
|
101
|
+
### `--prose-synthesis` escape hatch (R4 Q4)
|
|
102
|
+
|
|
103
|
+
Both `council:run` and `council:render` accept symmetric escape-hatch
|
|
104
|
+
flags on top of the lens table:
|
|
105
|
+
|
|
106
|
+
* `--prose-synthesis` — force creative-lens passthrough (bare slot)
|
|
107
|
+
regardless of lens. Use when the user on `default`/`pr`/`analysis`
|
|
108
|
+
prefers a narrative recommendation over the structured template.
|
|
109
|
+
* `--no-prose-synthesis` — force the `default` structured template
|
|
110
|
+
even on a creative lens. Use when a `design` or `optimize` artefact
|
|
111
|
+
has a one-shot need for Karpathy-style structure.
|
|
112
|
+
|
|
113
|
+
The flag is mutually exclusive — picking one disables the other on
|
|
114
|
+
the same invocation. When `council:run` records either flag in the
|
|
115
|
+
output JSON, `council:render` honours it unless the renderer is
|
|
116
|
+
called with an explicit flag of its own.
|
|
117
|
+
|
|
118
|
+
### Renderer lens resolution
|
|
119
|
+
|
|
120
|
+
`council:render <responses.json>` resolves the active lens in this
|
|
121
|
+
order: explicit `--prompt-mode` flag > `prompt_mode` field in the
|
|
122
|
+
payload > `mode` field in the payload > `None` (default decision
|
|
123
|
+
template). The `--prose-synthesis` / `--no-prose-synthesis` flag
|
|
124
|
+
overrides the table regardless of how the lens resolved.
|
|
125
|
+
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# ai-council — procedure and critical evaluation
|
|
2
|
+
|
|
3
|
+
> Mode body of the [`ai-council`](../SKILL.md) skill (router-head retrofit,
|
|
4
|
+
> 2026-08-20). Content moved VERBATIM from SKILL.md — load this file when the
|
|
5
|
+
> mode table in SKILL.md routes here.
|
|
6
|
+
|
|
7
|
+
### Neutrality — context-handoff
|
|
8
|
+
|
|
9
|
+
External reviewers do better critique when they know **what the
|
|
10
|
+
project is**, not just what the artefact looks like. The council
|
|
11
|
+
ships a neutral **handoff preamble** (modelled on `/agent-handoff`)
|
|
12
|
+
in front of every member's system prompt, assembled by
|
|
13
|
+
`prompts.handoff_preamble(project, original_ask)`:
|
|
14
|
+
|
|
15
|
+
| Carried | Forbidden |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Project name (from `composer.json` / `package.json` / repo dir) | Host-agent identity (Augment, Claude Code, Cursor, Cline, Windsurf, Copilot agent) — stripped line-by-line before send |
|
|
18
|
+
| Stack one-liner inferred from manifest files | Host-agent reasoning, prior turns, internal analysis |
|
|
19
|
+
| One paragraph of repo purpose from `README.md` (max 400 chars) | Host-agent framing language ("I think this looks weak", "the user probably wants…") |
|
|
20
|
+
| The user's **original ask** verbatim (the free-form sentence that triggered `/council`) | Anything the host agent generated about the artefact |
|
|
21
|
+
|
|
22
|
+
`detect_project_context()` in `scripts/ai_council/project_context.ts`
|
|
23
|
+
reads only the manifest files + root README; missing fields collapse
|
|
24
|
+
to `None` and the preamble silently omits the line. With both
|
|
25
|
+
`project=None` and `original_ask=""`, the preamble degrades to the
|
|
26
|
+
bare `NEUTRALITY_PREAMBLE` (v1 shape — back-compat for callers that
|
|
27
|
+
have not migrated yet).
|
|
28
|
+
|
|
29
|
+
## Procedure
|
|
30
|
+
|
|
31
|
+
1. **Resolve target.** Identify the artefact mode (`prompt`, `roadmap`,
|
|
32
|
+
`diff`, `files`) and locate the source. Refuse to proceed if the
|
|
33
|
+
target is ambiguous.
|
|
34
|
+
2. **Bundle + redact.** Call `scripts/ai_council/bundler.ts` to produce
|
|
35
|
+
a redacted artefact bundle. If `BundleTooLarge` fires, surface the
|
|
36
|
+
size and ask the user to narrow scope — do NOT truncate silently.
|
|
37
|
+
3. **Clear the spend bound.** The council is standing-authorized — there is
|
|
38
|
+
no per-invocation approval. What still binds is a *bound*, resolved in
|
|
39
|
+
this order:
|
|
40
|
+
- **No billable member** (every member is `mode: cli` under
|
|
41
|
+
subscription auth — `billable=False`) → nothing is spent. Render the
|
|
42
|
+
estimate table as information and fan out. No gate.
|
|
43
|
+
- **Billable members with a configured ceiling** (`cost_budget.max_total_usd`
|
|
44
|
+
non-zero, or `daily_limit_usd` non-zero) → the ceiling **is** the
|
|
45
|
+
authorization the user already gave. Render the estimate and fan out.
|
|
46
|
+
`on_overrun` still fires per member on breach (below) — that is where
|
|
47
|
+
the user regains the decision.
|
|
48
|
+
- **Billable members with no ceiling at all** (`max_total_usd: 0` AND
|
|
49
|
+
`daily_limit_usd: 0`) → unbounded paid spend, so surface the estimate
|
|
50
|
+
and require an explicit `1`. Nothing bounds the call, so the user must.
|
|
51
|
+
|
|
52
|
+
Autonomy settings do not *create* a bound and do not lift the last case.
|
|
53
|
+
Consumers who want the old per-run gate back set a small
|
|
54
|
+
`cost_budget.max_total_usd`: every call then breaches and `on_overrun`
|
|
55
|
+
asks, per member.
|
|
56
|
+
4. **Fan out.** Dispatch the bundle to each enabled council member via
|
|
57
|
+
`scripts/ai_council/orchestrator.ts`. Each member receives the
|
|
58
|
+
neutrality preamble from `prompts.ts` plus the artefact — nothing
|
|
59
|
+
from the host agent's prior reasoning.
|
|
60
|
+
5. **Render results.** Stack each member's response under its own
|
|
61
|
+
provider-attributed heading. Never merge or paraphrase responses
|
|
62
|
+
into the host agent's voice.
|
|
63
|
+
6. **Summarise.** Write a `Convergence / Divergence` block listing
|
|
64
|
+
agreements, disagreements, and unique insights — provider-attributed.
|
|
65
|
+
7. **Critically evaluate** every finding before it leaves the host
|
|
66
|
+
(see *Critical evaluation* below). The host is the convener **and**
|
|
67
|
+
the skeptic — never a reviewer of the artefact itself, but always a
|
|
68
|
+
reviewer of the **council's output**.
|
|
69
|
+
8. **Translate validated findings to options.** Convert each finding
|
|
70
|
+
the host accepts (or accepts with modification) into a concrete
|
|
71
|
+
numbered option for the user. Tag every option with the host's
|
|
72
|
+
verdict so the user sees the agent's reasoned position, not the
|
|
73
|
+
council's raw output. The user decides; the council advises; the
|
|
74
|
+
host filters.
|
|
75
|
+
|
|
76
|
+
## Critical evaluation — convener-skeptic stance
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
COUNCIL CONVERGENCE IS NOT CORRECTNESS.
|
|
80
|
+
DO NOT BLINDLY ACCEPT FINDINGS. DO NOT BLINDLY REJECT THEM.
|
|
81
|
+
EVERY FINDING GETS A REASONED VERDICT BEFORE IT REACHES THE USER.
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Mechanism claims need a probe, not a second opinion
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
A MECHANISM CLAIM IN A COUNCIL ARTEFACT IS MARKED `unverified:` UNTIL A PROBE COVERS IT.
|
|
88
|
+
A VERDICT RESTING ON AN UNVERIFIED MECHANISM CLAIM DOES NOT BIND.
|
|
89
|
+
SEVERAL MODELS AGREEING MULTIPLIES PLAUSIBILITY. IT DOES NOT PRODUCE EVIDENCE.
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
A **mechanism claim** asserts how the machine behaves: "this toggle removes the
|
|
93
|
+
cost", "that gate scans X", "the host reads the router". The council deliberates
|
|
94
|
+
over **arguments**, never against the running system — it cannot execute a command,
|
|
95
|
+
so it has no way to falsify one. Marking such a claim `unverified:` in the artefact
|
|
96
|
+
keeps the reader from mistaking a well-argued mechanism for a measured one, and the
|
|
97
|
+
non-binding clause means the fix for a wrong claim is a probe, not a re-vote.
|
|
98
|
+
|
|
99
|
+
**Case zero (2026-07-29).** An accepted ADR claimed a compile-time toggle gave
|
|
100
|
+
"zero-cost dormancy" because the rule was dropped from `dist/router.json`. Two
|
|
101
|
+
council members praised the reasoning; neither could check it. A one-line `grep`
|
|
102
|
+
later showed the toggle was read by the router compiler and by **nothing in the
|
|
103
|
+
projector**, so the rule's body kept shipping as a file — and the host reads the
|
|
104
|
+
file. The claim was half wrong, the verdict that rested on it was void, and what
|
|
105
|
+
caught it was a probe, not a third opinion.
|
|
106
|
+
|
|
107
|
+
The council is **uninformed about the codebase, ADRs, locked
|
|
108
|
+
contracts, prior decisions, and project history** — it sees only the
|
|
109
|
+
artefact + neutrality preamble. That is the source of its diversity
|
|
110
|
+
**and** its blind spots. Convergence between members can mean shared
|
|
111
|
+
generic best-practice priors, not project-specific correctness.
|
|
112
|
+
|
|
113
|
+
The host applies a critical lens to **every finding** (convergence
|
|
114
|
+
**and** divergence) before surfacing it as a numbered option:
|
|
115
|
+
|
|
116
|
+
| Check | Question | Tool |
|
|
117
|
+
|---|---|---|
|
|
118
|
+
| **Codebase fit** | Does the finding match the actual code, files, signatures, conventions? | `view` / `codebase-retrieval` / `grep` |
|
|
119
|
+
| **Locked-decision conflict** | Does it contradict an ADR, kernel rule, contract under `docs/contracts/`, or `docs/decisions/`? | `view` |
|
|
120
|
+
| **Already addressed** | Is it a generic best-practice already covered by an existing rule, skill, or test? | `view` / `grep` |
|
|
121
|
+
| **Cost / benefit** | Is the change worth the diff size, churn, and review cost vs. the marginal benefit? | reasoning |
|
|
122
|
+
| **Hallucination** | Does the finding cite a file, function, or behavior that does not exist? | `view` |
|
|
123
|
+
|
|
124
|
+
Each finding receives one of three verdicts:
|
|
125
|
+
|
|
126
|
+
- **`accept`** — codebase fits, no locked-decision conflict, benefit clears cost. Surface as a normal numbered option.
|
|
127
|
+
- **`accept-with-modification`** — core insight valid, but the proposed shape needs adjusting (wrong file, contradicts ADR detail, scope creep). Surface with the **modified** patch and a one-line note.
|
|
128
|
+
- **`reject`** — finding is wrong (hallucinated reference, contradicts a locked decision, already addressed, generic noise). Surface as a **Rejected by host** entry with a one-line reason. Still visible — the user can override.
|
|
129
|
+
|
|
130
|
+
The verdict is the host's **own** reasoning, not the council's.
|
|
131
|
+
Pretending convergence equals correctness, or paraphrasing council
|
|
132
|
+
output as host analysis, both breach the [`direct-answers`](../../../rules/direct-answers.md)
|
|
133
|
+
no-invented-facts rule. When the host cannot reach a confident
|
|
134
|
+
verdict on a finding (mixed evidence, ambiguous scope), it surfaces
|
|
135
|
+
the finding as `needs-input` with the open question — the user
|
|
136
|
+
decides, the host does not guess.
|
|
137
|
+
|
|
138
|
+
### What this is NOT
|
|
139
|
+
|
|
140
|
+
- **Not a re-review by the host.** The host did not write the artefact independently and cannot critique it independently — that boundary still holds.
|
|
141
|
+
- **Not a vote against the council.** Rejecting a finding requires evidence (file, line, contract reference), not preference.
|
|
142
|
+
- **Not silent filtering.** Every finding reaches the user with its verdict and reason. The user can pick a `reject` option and override the host.
|
|
143
|
+
|
|
@@ -119,6 +119,21 @@ Write:
|
|
|
119
119
|
law instead of a decision under current conditions; see
|
|
120
120
|
[`decision-revisit-gate`](../../rules/decision-revisit-gate.md) for
|
|
121
121
|
what happens when a later change is blocked by it without one.
|
|
122
|
+
It is an externally observable **condition**, never a cadence and never
|
|
123
|
+
permanence under a field name: `terminal`, `none`, "never" and "forever"
|
|
124
|
+
are invalid, and `unclassified` is legal only on an *existing* record
|
|
125
|
+
during the migration — never on the one you are locking now.
|
|
126
|
+
- **Evidence + assumptions, split explicitly.** Every load-bearing factual
|
|
127
|
+
claim in the rationale either points at a basis ref — `file:line`, a URL, a
|
|
128
|
+
`docs/CLAIMS.md` claim id, a benchmark id — or is **labelled an
|
|
129
|
+
assumption**. There is no third state. Cite nothing and the record grades
|
|
130
|
+
`E0`, which is honest and publishable; a confident grade over no citations
|
|
131
|
+
is not. **Agreement is not evidence:** the council converging, or two
|
|
132
|
+
models liking the same option, is `provenance: agentic` with
|
|
133
|
+
`agentic_mode: council` — sources and measurements raise the grade,
|
|
134
|
+
consensus does not. A human product call records `E0` plus
|
|
135
|
+
`authority_basis: owner_intent` rather than a faked grade. Vocabulary:
|
|
136
|
+
[`adr-layout § Provenance and evidence`](../../../docs/contracts/adr-layout.md).
|
|
122
137
|
|
|
123
138
|
### 5. Wire the supersession chain (if any)
|
|
124
139
|
|
|
@@ -129,9 +144,34 @@ If this decision overrides a prior ADR:
|
|
|
129
144
|
not "we now think differently".
|
|
130
145
|
- Hand off the `supersedes:` linkage to `adr-create`.
|
|
131
146
|
|
|
132
|
-
### 6.
|
|
147
|
+
### 6. Admission gate — is this an ADR at all?
|
|
133
148
|
|
|
134
|
-
|
|
149
|
+
Classify **before** handing off. A locked choice earns an ADR only when it is
|
|
150
|
+
architecturally significant on at least one axis:
|
|
151
|
+
|
|
152
|
+
- **Hard or costly to reverse** — a one-way door: public API shape, DB schema,
|
|
153
|
+
wire format, published identifier, migration.
|
|
154
|
+
- **Broadly constraining** — it binds work outside the module that made it.
|
|
155
|
+
- **Crosses a governed surface** — consumer contract, API, security or privacy
|
|
156
|
+
floor, package structure.
|
|
157
|
+
|
|
158
|
+
None of the three → **no ADR**. The record still exists; it lands as a
|
|
159
|
+
decision note in `agents/decisions/`, a config value, a measurement record in
|
|
160
|
+
`docs/CLAIMS.md`, an experiment, or a roadmap item. Explicitly not ADRs: a
|
|
161
|
+
temporary numeric threshold · a benchmark value · a model mapping · one-off
|
|
162
|
+
release sequencing · a reversible local implementation detail.
|
|
163
|
+
|
|
164
|
+
**The reference case is in this tree.** ADR-002 encodes `25 000 → 26 000` and
|
|
165
|
+
a `4.0k` override ceiling as architecture law (`ADR-002:55`, `:62`), and
|
|
166
|
+
ADR-114 then had to add another override while recording that 7 of 9 kernel
|
|
167
|
+
rules already carry them (`ADR-114:74`). The *principle* — a kernel budget
|
|
168
|
+
exists, is measured, and is capped — is the ADR. The numbers belong in a
|
|
169
|
+
versioned budget contract with a regression gate, so a recalibration stops
|
|
170
|
+
needing an architecture supersession.
|
|
171
|
+
|
|
172
|
+
### 7. Hand off to file mechanics
|
|
173
|
+
|
|
174
|
+
Gate passed → output the structured payload (below). The user — or
|
|
135
175
|
`adr-create` — turns it into the file.
|
|
136
176
|
|
|
137
177
|
## Weighted-matrix mode (quantitative)
|
|
@@ -226,10 +266,22 @@ Consequences:
|
|
|
226
266
|
- <becomes harder>
|
|
227
267
|
✗ <becomes impossible>
|
|
228
268
|
|
|
269
|
+
Assumptions:
|
|
270
|
+
~ <load-bearing claim with no basis ref>
|
|
271
|
+
|
|
272
|
+
Evidence:
|
|
273
|
+
<basis ref> — file:line | URL | CLAIMS id | benchmark id (or: none — E0)
|
|
274
|
+
|
|
275
|
+
Provenance: human | agentic | mixed | unknown (agentic_mode: single | council | delegated)
|
|
276
|
+
Grade: E0 | E1 | E2 | E3 | E4 (authority_basis: evidence | owner_intent)
|
|
277
|
+
|
|
229
278
|
Supersedes: <ADR-XYZ "title"> (if any)
|
|
230
279
|
Trigger: <what changed> (if superseding)
|
|
280
|
+
Revisit-if: <observable condition>
|
|
281
|
+
|
|
282
|
+
Admission gate: ADR | decision note | config value | measurement | experiment | roadmap item
|
|
231
283
|
|
|
232
|
-
Next: /adr-create with the payload above
|
|
284
|
+
Next: /adr-create with the payload above (only when the gate says ADR)
|
|
233
285
|
```
|
|
234
286
|
|
|
235
287
|
## Gotcha
|
|
@@ -240,6 +292,12 @@ Next: /adr-create with the payload above
|
|
|
240
292
|
cons for the chosen option, you have not understood it yet.
|
|
241
293
|
- A supersession with no "what changed in the world" is a vibe
|
|
242
294
|
pivot. Reject and ask.
|
|
295
|
+
- An unlabelled guess is worse than a labelled one. A claim with no basis ref
|
|
296
|
+
and no assumption label reads as established fact to the next reader.
|
|
297
|
+
- "The council agreed" is a provenance fact, not an evidence grade. If the
|
|
298
|
+
only support is agreement, the grade is `E0` — write it.
|
|
299
|
+
- Writing an ADR for a threshold is how a recalibration becomes an
|
|
300
|
+
architecture supersession. Run the admission gate first.
|
|
243
301
|
|
|
244
302
|
## Do NOT
|
|
245
303
|
|
|
@@ -93,6 +93,31 @@ available at the time it was made**, not against the outcome alone.
|
|
|
93
93
|
A decision can be correct given the information then and still need
|
|
94
94
|
revision now.
|
|
95
95
|
|
|
96
|
+
**Read the record's axes in this order** — each step can end the review, so
|
|
97
|
+
running them out of order pays for the expensive ones first:
|
|
98
|
+
|
|
99
|
+
1. **Effective state** — status, `superseded_by`, amendments, whether the
|
|
100
|
+
`review_trigger` fired. `superseded`/`deprecated` is not a live lock at all.
|
|
101
|
+
2. **`provenance`** (+ `agentic_mode`) — who decided; descriptive only.
|
|
102
|
+
3. **`evidence.strength`** — E0–E4, claim-relative, not a count of sources.
|
|
103
|
+
4. **`evidence.discovery`** — on E0, `incomplete` means *nobody looked*: a
|
|
104
|
+
discovery failure, not an evidence failure. Search before treating the
|
|
105
|
+
absence as established, or the grade measures the review, not the decision.
|
|
106
|
+
5. **Current evidence** — what tree, measurements and sources say *today*.
|
|
107
|
+
6. **Reversibility** — of the transition you propose, not of the original
|
|
108
|
+
decision. The routing unit is the transition, never the document.
|
|
109
|
+
7. **Reserved dimensions** — `protected_dimensions`, `reopen_policy` (absent →
|
|
110
|
+
`unclassified`, which is not `owner`).
|
|
111
|
+
|
|
112
|
+
Then price the reopen record from the grade × provenance burden table in
|
|
113
|
+
[`adr-layout § The reopen record`](../../../docs/contracts/adr-layout.md) —
|
|
114
|
+
cheap for an `E0`/`E1` agentic snapshot, *surfaced* rather than obeyed or
|
|
115
|
+
overturned for `E0`/`E1` human, the standard five fields at `E2`, and those
|
|
116
|
+
fields plus engaging the original evidence **in kind** at `E3`/`E4`. Read the
|
|
117
|
+
table; do not reconstruct it from memory. The axes are defined by
|
|
118
|
+
[`adr-layout § Provenance and evidence`](../../../docs/contracts/adr-layout.md),
|
|
119
|
+
not here.
|
|
120
|
+
|
|
96
121
|
### 4. Verdict
|
|
97
122
|
|
|
98
123
|
One of three:
|
|
@@ -298,6 +323,40 @@ in the rule; the lock catalog, fire steps, and failure modes live here.
|
|
|
298
323
|
Identical ceremony for a typo-level amendment would cost more than asking
|
|
299
324
|
the owner and the mechanism would die of its own weight.
|
|
300
325
|
|
|
326
|
+
### The grade prices the record, never the authority
|
|
327
|
+
|
|
328
|
+
```
|
|
329
|
+
AN EVIDENCE GRADE IS A MEASUREMENT, NOT A PERMISSION.
|
|
330
|
+
IT PRICES THE REOPEN RECORD AND THE REVIEW PRIORITY. IT CONFERS NO AUTHORITY.
|
|
331
|
+
A LOW GRADE NEVER LETS AN AGENT SUPERSEDE A RECORD ON ITS OWN.
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Nothing in the burden table changes **who** may act: venue comes from the
|
|
335
|
+
discriminator, the trust boundaries the transition touches, and the
|
|
336
|
+
owner-reserved rows — never from the grade.
|
|
337
|
+
|
|
338
|
+
The coupling was proposed and refused: two council seats independently named it
|
|
339
|
+
the design's central defect, because the party assigning the grade would also
|
|
340
|
+
be the party gaining authority from it, and would additionally be
|
|
341
|
+
self-classifying its own transition as `reversible-internal` — itself an
|
|
342
|
+
authority-bearing classification. Calling the result "provisional" changes
|
|
343
|
+
neither the trust boundary nor the blast radius. Whether an *independently
|
|
344
|
+
validated* grade may ever reduce the authorization burden is owner-reserved and
|
|
345
|
+
open: do not answer it here — it is the `authority-coupling-decision` blocker in
|
|
346
|
+
`road-to-evidence-based-adr-governance`, and
|
|
347
|
+
[`adr-layout § The reopen record`](../../../docs/contracts/adr-layout.md) closes
|
|
348
|
+
on the same point.
|
|
349
|
+
|
|
350
|
+
Two consequences that are easy to get backwards:
|
|
351
|
+
|
|
352
|
+
- **An ADR's historical decision-maker does not determine its reopen venue.** A
|
|
353
|
+
record decided by a council does not need a council to reopen it; a record
|
|
354
|
+
decided by one agent is not thereby an agent's to overturn.
|
|
355
|
+
- **A low-evidence record may state a decision; it does not establish that the
|
|
356
|
+
alternatives remain invalid.** *"We chose B because we had to choose"* is
|
|
357
|
+
legitimate and publishable — but never grounds for *"A is forbidden, the ADR
|
|
358
|
+
says B"*, which needs evidence the record never carried.
|
|
359
|
+
|
|
301
360
|
### When NOT to fire
|
|
302
361
|
|
|
303
362
|
- The blocked change has no real benefit — the gate is not a lever to
|
|
@@ -324,6 +383,12 @@ in the rule; the lock catalog, fire steps, and failure modes live here.
|
|
|
324
383
|
value-over-budget clause.
|
|
325
384
|
- Silently dropping a good idea because "we already decided this" —
|
|
326
385
|
the canonical failure the gate exists to stop.
|
|
386
|
+
- Reading a low `evidence.strength` as permission to supersede — the grade
|
|
387
|
+
prices the record, it never moves the venue.
|
|
388
|
+
- Treating `discovery: incomplete` as established absence: that grades the
|
|
389
|
+
review, not the decision.
|
|
390
|
+
- Citing a low-evidence ADR as proof its rejected alternatives are still
|
|
391
|
+
invalid. It records a choice, not a refutation.
|
|
327
392
|
|
|
328
393
|
## See also
|
|
329
394
|
|
|
@@ -25,6 +25,32 @@ Use this skill when:
|
|
|
25
25
|
|
|
26
26
|
## Procedure: Resolve merge conflicts
|
|
27
27
|
|
|
28
|
+
### 0. Classify before resolving — and never start in the GitHub web editor
|
|
29
|
+
|
|
30
|
+
A `CONFLICTING` PR is not a signal to open the web editor. **The web editor
|
|
31
|
+
cannot tell generated from authored**, so it presents a mechanical regeneration
|
|
32
|
+
and a real human decision as the same three-way merge — which is how a generated
|
|
33
|
+
file gets hand-merged into a state matching neither branch.
|
|
34
|
+
|
|
35
|
+
So classify locally first, before resolving anything. Sort every conflicted path
|
|
36
|
+
into three classes, because the correct resolution differs per class and only one
|
|
37
|
+
of them is a judgement call:
|
|
38
|
+
|
|
39
|
+
| Class | What it is | Resolution |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| **generated** | a build output, an index, a compiled manifest — anything a generator writes from a source in the tree | re-run the generator. **Never mix hunks**, and note that a *clean* auto-merge of a generated file is still wrong: it can produce a file matching neither branch |
|
|
42
|
+
| **remeasured** | a baseline, budget, or ratchet number a CI gate compares against | re-run the measurement on the merged tree and record what it says. Two branches legitimately measured two different trees, so there is no side to take — and picking one is how a ratchet silently loosens |
|
|
43
|
+
| **authored** | prose, source, config a human wrote | a human decision — read both sides. This is what the rest of this skill is about |
|
|
44
|
+
|
|
45
|
+
Getting the class wrong is the expensive direction: hand-merging a generated
|
|
46
|
+
file, or picking a side on a measured one, both produce a plausible-looking file
|
|
47
|
+
that no branch ever had. If the project ships a tool that does this
|
|
48
|
+
classification, run it before touching the conflict; where it does not, the
|
|
49
|
+
three-way sort above is still the first step.
|
|
50
|
+
|
|
51
|
+
This is a checklist item, not a gate — nothing enforces it
|
|
52
|
+
(road-to-merge-hotspot-drawdown 4.3).
|
|
53
|
+
|
|
28
54
|
### 1. Understand the situation
|
|
29
55
|
|
|
30
56
|
Before touching any conflict:
|