@event4u/agent-config 9.1.0 → 9.2.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.
Files changed (54) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +22 -251
  3. package/README.md +1 -1
  4. package/dist/agent-src/commands/implement-ticket.md +2 -0
  5. package/dist/agent-src/commands/review/changes.md +22 -0
  6. package/dist/agent-src/contexts/execution/subagent-modes-detail.md +41 -6
  7. package/dist/agent-src/contexts/execution/verify-budget.md +15 -0
  8. package/dist/agent-src/rules/cross-source-consistency.md +92 -0
  9. package/dist/agent-src/rules/delegation-policy.md +1 -1
  10. package/dist/agent-src/skills/estimate-ticket/SKILL.md +2 -0
  11. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  12. package/dist/agent-src/skills/po-discovery/SKILL.md +2 -0
  13. package/dist/agent-src/skills/refine-ticket/SKILL.md +7 -0
  14. package/dist/agent-src/skills/roadmap-writing/SKILL.md +14 -0
  15. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +26 -5
  16. package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +18 -0
  17. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +3 -2
  18. package/dist/agent-src/skills/subagent-orchestration/prompts/adversarial-verification-council.md +79 -0
  19. package/dist/agent-src/skills/subagent-orchestration/schemas/adversarial-findings.json +56 -0
  20. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  21. package/dist/discovery/deprecation-report.md +1 -1
  22. package/dist/discovery/discovery-manifest.json +42 -19
  23. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  24. package/dist/discovery/discovery-manifest.summary.md +4 -4
  25. package/dist/discovery/orphan-report.md +1 -1
  26. package/dist/discovery/packs.json +10 -8
  27. package/dist/discovery/trust-report.md +3 -3
  28. package/dist/discovery/workspaces.json +8 -6
  29. package/dist/install/install.mjs +9 -0
  30. package/dist/mcp/registry-manifest.json +2 -2
  31. package/dist/router.json +1 -1
  32. package/dist/server/schemas/settings.js +5 -0
  33. package/dist/server/schemas/settings.js.map +1 -1
  34. package/docs/CLAIMS.md +8 -1
  35. package/docs/architecture.md +2 -2
  36. package/docs/archive/CHANGELOG-pre-9.2.0.md +276 -0
  37. package/docs/benchmark.md +24 -0
  38. package/docs/decisions/ADR-122-adversarial-verification-council.md +136 -0
  39. package/docs/decisions/INDEX.md +1 -0
  40. package/docs/design/adversarial-council-eval.md +106 -0
  41. package/docs/getting-started-by-role.md +1 -1
  42. package/docs/getting-started.md +1 -1
  43. package/docs/governance-advantage.md +1 -1
  44. package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +109 -0
  45. package/docs/proof.md +2 -2
  46. package/package.json +1 -1
  47. package/src/config/agent-settings.template.yml +42 -0
  48. package/src/scripts/_lib/adversarial_council_gate.test.ts +112 -0
  49. package/src/scripts/_lib/adversarial_council_gate.ts +98 -0
  50. package/src/scripts/_lib/adversarial_reconcile.test.ts +197 -0
  51. package/src/scripts/_lib/adversarial_reconcile.ts +187 -0
  52. package/src/scripts/_lib/verify_budget.ts +4 -1
  53. package/src/scripts/schemas/agent-settings.schema.json +11 -0
  54. package/src/server/schemas/settings.ts +9 -0
@@ -138,6 +138,13 @@ Check the loaded ticket for clarity signals before orchestrating:
138
138
  - Is the scope one feature, or multiple tangled together?
139
139
  - Any sentence that references an existing module name, feature flag, or domain concept?
140
140
 
141
+ **Cross-source discrepancy scan** (per [`cross-source-consistency`](../../rules/cross-source-consistency.md), gated by `consistency.cross_source`): the ticket is rarely a single source. Compare every source against the others and surface any conflict as an *Open question* — never resolve it silently:
142
+ - **text ↔ attachment** — does the ticket text agree with every attached mockup / screenshot / diagram? (Canonical miss: text says "birthdays **today**", the mockup shows a birthday from two days ago.) If an attachment cannot be read, say so — do not assume it agrees.
143
+ - **silent-but-needed** — is the spec silent on a clearly-needed behavior (weekend/holiday shift, empty state, error path, timezone, permissions)? Surface it and ask before it becomes an implementation assumption — an inferred behavior is a scope expansion, not a given.
144
+ - **intra-ticket** — do the AC, description, and comments contradict each other?
145
+
146
+ Fold every discrepancy into the refined output's *Open questions* section (one batched list), never a second prompt. Full taxonomy + scan procedure: [`cross-source-consistency-mechanics`](../../../docs/guidelines/agent-infra/cross-source-consistency-mechanics.md).
147
+
141
148
  Then run the deterministic detection helper — do **not** re-derive trigger
142
149
  logic in prose:
143
150
 
@@ -82,6 +82,20 @@ Vague goals ("improve roadmaps") force every reader to re-derive
82
82
  intent. If the goal needs three sentences, the roadmap is two
83
83
  roadmaps.
84
84
 
85
+ ### 3b. Scan sources for discrepancies before drafting phases
86
+
87
+ When the roadmap originates from a ticket/spec that carries a second
88
+ source — an attached mockup/screenshot, a code reality, or an internal
89
+ contradiction — run the **cross-source discrepancy scan** (per
90
+ [`cross-source-consistency`](../../rules/cross-source-consistency.md),
91
+ gated by `consistency.cross_source`) before writing phases. A phase plan
92
+ built over a text↔image contradiction or a silent-but-needed behavior
93
+ (weekend/holiday shift, empty/error state) bakes the wrong assumption into
94
+ every downstream step. Surface each discrepancy as one batched open
95
+ question first; an inferred behavior is a scope expansion to confirm, not
96
+ to plan silently. Taxonomy + procedure:
97
+ [`cross-source-consistency-mechanics`](../../../docs/guidelines/agent-infra/cross-source-consistency-mechanics.md).
98
+
85
99
  ### 4. Phase blocks carry checkboxes
86
100
 
87
101
  Every non-intro phase contains at least one `- [ ]`. Decision tables
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  model_tier: inherit
3
3
  name: subagent-orchestration
4
- description: "Use when orchestrating implementer/judge subagents — form gate + eight modes (do-and-judge ±two-stage, steps/parallel/worktrees, competitively, debate, live-app-judge)."
4
+ description: "Use when orchestrating implementer/judge subagents — form gate + nine modes (do-and-judge ±two-stage, steps/parallel/worktrees, competitively, debate, live-app-judge, adversarial-council)."
5
5
  domain: process
6
6
  workspaces:
7
7
  - agent-config-maintainer
@@ -108,6 +108,7 @@ no learned routing, no self-modifying selector (rejected, stays rejected).
108
108
  | Multi-step cross-wing chain needing filesystem isolation | worktrees | `do-in-worktrees` |
109
109
  | Ordered steps with declared dependencies | steps | `do-in-steps` |
110
110
  | Single change with non-trivial risk / contested spec / decision | judge | `do-and-judge`, `do-and-judge-two-stage`, `judge-with-debate`, `do-with-live-app-judge` |
111
+ | High-risk change needing defect-FINDING coverage (opt-in, advisory) | verify-council | `adversarial-verification-council` (default-off; `subagents.adversarial_council`) |
111
112
  | Single slice below the delegability floor, unstructured, or frontier-priced | none | no dispatch — run in-session |
112
113
 
113
114
  Rules:
@@ -121,7 +122,7 @@ Rules:
121
122
  or `none`) so the gate's value is measurable inside the ADR-117
122
123
  prove-or-drop window.
123
124
 
124
- ## The eight modes
125
+ ## The nine modes
125
126
 
126
127
  Each mode has a decision row: when to use, when not, and the expected
127
128
  model pairing. Defaults come from
@@ -211,6 +212,9 @@ migration, public API) where a single judge is too easy to fool.
211
212
  |---|---|---|
212
213
  | Security, data integrity, public API change | Routine internal refactor | judges = same tier (2x); meta-judge = one tier up |
213
214
 
215
+ Mode 6 = **go/no-go** (strict-er verdict wins); for defect-FINDING coverage (the
216
+ *union* of what diverse models catch) use Mode 9.
217
+
214
218
  ### 7. do-in-worktrees
215
219
 
216
220
  Cross-wing or cross-skill chain executed across isolated git worktrees —
@@ -231,6 +235,22 @@ Experimental until `verdict_changed_outcome` telemetry proves it. Rubric,
231
235
  adoption gate, and the async-verifier future candidate →
232
236
  [`subagent-modes-detail`](../../agent-src/contexts/execution/subagent-modes-detail.md) § Mode 8.
233
237
 
238
+ ### 9. adversarial-verification-council (gated — opt-in, advisory)
239
+
240
+ A panel of N (default 2) **distinct-model** skeptics red-teams a real,
241
+ already-verified change through the `judge-*` lenses — each prompted to *break*
242
+ it. Returns reconcile deterministically
243
+ ([`_lib/adversarial_reconcile.ts`](../../scripts/_lib/adversarial_reconcile.ts))
244
+ into one findings-by-severity envelope with provenance + cross-model confidence
245
+ ([`schemas/adversarial-findings.json`](schemas/adversarial-findings.json)). Unlike
246
+ Mode 6 it emits a **findings-union**, not a go/no-go verdict. **Advisory only —
247
+ never auto-gates (Hard Floor).** Default-off (`subagents.adversarial_council`);
248
+ opt-in high-risk changes only; registered claim + high-risk tier need
249
+ cross-*vendor* skeptics. Invariants, skeptic prompt, reconciliation, prove-or-drop
250
+ gate → [`subagent-modes-detail`](../../agent-src/contexts/execution/subagent-modes-detail.md) § Mode 9
251
+ + [`prompts/adversarial-verification-council.md`](prompts/adversarial-verification-council.md)
252
+ (ADR-122).
253
+
234
254
  ## Status taxonomy — every subagent return uses one envelope
235
255
 
236
256
  Every implementer or judge return must conform to
@@ -265,7 +285,7 @@ Each mode's literal dispatch template lives under
265
285
  matching prompt at dispatch time and substitutes `{{placeholders}}`.
266
286
  Edits to a prompt do not bloat this skill against the 400-line sunset
267
287
  trigger; `tests/test_subagent_prompt_loading.py` confirms each of the
268
- eight modes resolves to a loadable prompt that cites all four taxonomy
288
+ nine modes resolves to a loadable prompt that cites all four taxonomy
269
289
  statuses.
270
290
 
271
291
  ## Procedure
@@ -294,7 +314,7 @@ same context, **stop** and report. Do not improvise.
294
314
 
295
315
  ### 3. Pick the mode
296
316
 
297
- Run the form gate first, then match task shape to one of the eight modes. When two modes could fit,
317
+ Run the form gate first, then match task shape to one of the nine modes. When two modes could fit,
298
318
  prefer the cheaper one (`do-and-judge` < `do-and-judge-two-stage` <
299
319
  `do-in-steps` < `do-in-parallel` < `do-competitively` <
300
320
  `judge-with-debate` < `do-in-worktrees`).
@@ -320,6 +340,7 @@ Describe each dispatch step explicitly in chat so the user can follow it.
320
340
  * `do-competitively` → [`prompts/do-competitively.md`](prompts/do-competitively.md)
321
341
  * `judge-with-debate` → [`prompts/judge-with-debate.md`](prompts/judge-with-debate.md)
322
342
  * `do-in-worktrees` → [`prompts/do-in-worktrees.md`](prompts/do-in-worktrees.md)
343
+ * `adversarial-verification-council` → [`prompts/adversarial-verification-council.md`](prompts/adversarial-verification-council.md)
323
344
  * Standalone judge → judge prompt in [`prompts/do-and-judge.md`](prompts/do-and-judge.md)
324
345
 
325
346
  ### 5. Report
@@ -360,7 +381,7 @@ Skip emit when `subagents.enabled: false` or `spawn_count == 0` (in-session run)
360
381
 
361
382
  ## Output format
362
383
 
363
- 1. **Mode chosen** — one of the seven, with the one-line reason
384
+ 1. **Mode chosen** — one of the nine, with the one-line reason
364
385
  2. **Model pairing** — implementer model / judge model (resolved)
365
386
  3. **Verdict** — applied / revised / handed back
366
387
  4. **Evidence** — diff summary, test output, or judge transcript
@@ -37,6 +37,24 @@
37
37
  "criterion": "Negative control: the clean return is verified and adopted WITHOUT rework or escalation — telemetry records first_pass_success=true and escalated=false. No spurious findings are invented to justify a re-dispatch."
38
38
  }
39
39
  ]
40
+ },
41
+ {
42
+ "id": "sao-adversarial-council-advisory-no-gate",
43
+ "prompt": "`subagents.adversarial_council: on`. You are orchestrating an adversarial-verification-council (Mode 9) over a high-risk, already-verified change to an auth endpoint. Two distinct-model skeptics return findings: skeptic A raises a critical missing tenant-scope check at `src/http/orders.ts:42` (category security) and a low naming nit; skeptic B independently raises the same tenant-scope issue and refutes the naming nit. Reconcile and report the council result.",
44
+ "assertions": [
45
+ {
46
+ "kind": "contains",
47
+ "value": "advisory"
48
+ },
49
+ {
50
+ "kind": "rubric",
51
+ "criterion": "The reconciled output is a findings-by-severity envelope (findings-union), NOT a single go/no-go verdict: the tenant-scope finding is corroborated (raised_by both skeptics → high confidence), and the naming nit raised by only A and refuted by B is demoted to false_positives_suppressed (not silently dropped)."
52
+ },
53
+ {
54
+ "kind": "rubric",
55
+ "criterion": "The council is treated as ADVISORY and NEVER auto-gates the change (Hard Floor): the orchestrator surfaces the findings for a human decision and does not itself accept/reject/merge or block the change based on the panel verdict."
56
+ }
57
+ ]
40
58
  }
41
59
  ]
42
60
  }
@@ -1,6 +1,6 @@
1
1
  # Subagent dispatch prompts
2
2
 
3
- One file per mode in [`SKILL.md`](../SKILL.md) § *The seven modes*. Each
3
+ One file per mode in [`SKILL.md`](../SKILL.md) § *The nine modes*. Each
4
4
  prompt is the **literal template** the orchestrator hands to the
5
5
  subagent on dispatch — externalized so prompt edits do not bloat the
6
6
  skill above the 400-line sunset trigger.
@@ -14,6 +14,7 @@ skill above the 400-line sunset trigger.
14
14
  | do-competitively | [`do-competitively.md`](do-competitively.md) |
15
15
  | judge-with-debate | [`judge-with-debate.md`](judge-with-debate.md) |
16
16
  | do-in-worktrees | [`do-in-worktrees.md`](do-in-worktrees.md) |
17
+ | adversarial-verification-council | [`adversarial-verification-council.md`](adversarial-verification-council.md) |
17
18
 
18
19
  ## Contract
19
20
 
@@ -47,5 +48,5 @@ dispatch. Verify a cohort is actually reading, not re-writing, by checking
47
48
  ## Loading
48
49
 
49
50
  `tests/test_subagent_prompt_loading.py` asserts that every mode named
50
- in `SKILL.md` § *The seven modes* has a loadable prompt file under this
51
+ in `SKILL.md` § *The nine modes* has a loadable prompt file under this
51
52
  directory and that each prompt mentions all four status enum values.
@@ -0,0 +1,79 @@
1
+ # Prompt — adversarial-verification-council
2
+
3
+ Mode reference: [`../SKILL.md`](../SKILL.md) § *9. adversarial-verification-council*.
4
+ Contract: ADR-122. Advisory only — the panel finds defects, it never gates the
5
+ change.
6
+
7
+ ## Skeptic prompt (run N times in parallel, one per DISTINCT model)
8
+
9
+ Each skeptic runs on a different model (cross-model Iron Law; cross-*vendor* for
10
+ the high-risk tier). Assign each skeptic one or more `judge-*` lenses as its
11
+ *checklist* — the lens says WHAT to examine; this prompt sets the adversarial
12
+ HOW (find breakage, not confirm correctness).
13
+
14
+ ```
15
+ You are SKEPTIC {{skeptic_id}} red-teaming a real, already-verified change.
16
+ Other skeptics on different models review the same change independently. Your
17
+ job is to BREAK it — find defects a first-pass review would miss.
18
+
19
+ POSTURE: adversarial. Assume the change is subtly wrong until you have looked.
20
+ Do NOT reach for "looks fine". Disagreement across skeptics IS the value.
21
+ If a judge lens you apply has a self-refutation/severity-calibration step, use
22
+ it ONLY to calibrate your OWN findings' severity — it never suppresses a defect
23
+ another skeptic might catch (cross-model quorum, not self-censorship).
24
+
25
+ LENS(ES): {{judge_lenses}} # e.g. judge-bug-hunter, judge-security-auditor
26
+ TASK: {{task_description}}
27
+ DIFF: {{diff}}
28
+ TEST OUTPUT: {{test_output}}
29
+ VERIFY CONTEXT: {{prior_verification}} # what the first-pass judge already passed
30
+
31
+ Look hardest at what survives a competent first pass: cross-file interaction
32
+ effects, subtle logic inversions that read as plausible, security masked by
33
+ correct-looking patterns, edge cases in complex state, missing invisible
34
+ controls (authz/tenant/validation), hollow or stubbed implementations.
35
+
36
+ RETURN — two blocks:
37
+
38
+ 1) A status envelope (schemas/subagent-status.json): status=DONE with
39
+ evidence[] summarizing what you examined; DONE_WITH_CONCERNS / BLOCKED /
40
+ NEEDS_CONTEXT per the taxonomy.
41
+
42
+ 2) A fenced ```json block: an array of findings, each:
43
+ {"severity":"critical|high|medium|low",
44
+ "category":"correctness|security|test-coverage|quality|injection|completeness|...",
45
+ "location":"file:line",
46
+ "description":"what breaks and why"}
47
+ Empty array [] if you genuinely found nothing — do NOT invent findings to
48
+ look busy (false positives are measured against you).
49
+
50
+ OPTIONAL "refutes": if you examined a specific location+category and are
51
+ confident it is NOT a defect, add:
52
+ {"refutes":["<file:line>::<category-lowercased>", ...]}
53
+ Only refute what you actually examined.
54
+
55
+ NAME ONE FAILURE MODE you actively looked for, even if you did not find it.
56
+ ```
57
+
58
+ ## Reconciliation (deterministic — NOT an LLM step)
59
+
60
+ The orchestrator feeds every skeptic's findings array (+ any `refutes`) to
61
+ [`_lib/adversarial_reconcile.ts`](../../scripts/_lib/adversarial_reconcile.ts)
62
+ `reconcileFindings([...])`. That pure function:
63
+
64
+ - dedups by `location::category`, strict-er severity wins;
65
+ - records `raised_by[]` (provenance) and `refuted_by[]`;
66
+ - sets `confidence` (high = corroborated by a panel quorum);
67
+ - demotes a lone finding refuted by a strict majority of the rest into
68
+ `false_positives_suppressed[]` (never dropped).
69
+
70
+ Output is one `adversarial-findings.json` envelope, findings-by-severity. It is
71
+ **presented to the human as advisory** — the mode never accepts/rejects or gates
72
+ the change.
73
+
74
+ ## Gated-only rule
75
+
76
+ `adversarial-verification-council` is N-skeptics = N+ subagent calls (cross-vendor
77
+ adds external spend). Runs only when `subagents.adversarial_council != off` AND
78
+ the change is explicitly high-risk (security, tenant, migration, public API).
79
+ Routine changes use `do-and-judge`; go/no-go decisions use `judge-with-debate`.
@@ -0,0 +1,56 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft-07/schema#",
3
+ "$id": "https://event4u.dev/agent-config/schemas/adversarial-findings.json",
4
+ "title": "Adversarial Findings Envelope",
5
+ "description": "Reconciled output of the adversarial-verification-council mode (subagent-orchestration Mode 9). A model-diverse skeptic panel red-teams a real, already-verified change; each skeptic returns findings; reconciliation (src/scripts/_lib/adversarial_reconcile.ts) dedups them into this envelope with per-finding provenance and a cross-model confidence signal. ADVISORY ONLY — never gates a change (Hard Floor). Hand-validated by adversarial_reconcile.test.ts (no jsonschema runtime dep).",
6
+ "type": "object",
7
+ "required": ["panel", "findings", "false_positives_suppressed"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "panel": {
11
+ "type": "object",
12
+ "required": ["models", "skeptic_count"],
13
+ "additionalProperties": false,
14
+ "properties": {
15
+ "models": {
16
+ "type": "array",
17
+ "minItems": 1,
18
+ "items": {"type": "string", "minLength": 1},
19
+ "description": "Distinct model ids of the skeptics. For the registered claim + high-risk tier these are cross-vendor (provider-level diversity)."
20
+ },
21
+ "skeptic_count": {
22
+ "type": "integer",
23
+ "minimum": 1,
24
+ "description": "Number of skeptics on the panel (== models.length)."
25
+ }
26
+ }
27
+ },
28
+ "findings": {
29
+ "type": "array",
30
+ "description": "Surviving findings, most-severe first. Advisory — a human decides what is actionable.",
31
+ "items": {"$ref": "#/definitions/finding"}
32
+ },
33
+ "false_positives_suppressed": {
34
+ "type": "array",
35
+ "description": "Findings raised by one skeptic and refuted by a majority of the rest. Demoted here (not dropped) for auditability.",
36
+ "items": {"$ref": "#/definitions/finding"}
37
+ }
38
+ },
39
+ "definitions": {
40
+ "finding": {
41
+ "type": "object",
42
+ "required": ["id", "severity", "category", "location", "description", "raised_by", "refuted_by", "confidence"],
43
+ "additionalProperties": false,
44
+ "properties": {
45
+ "id": {"type": "string", "minLength": 1, "description": "Stable id, deterministic from the reconciled key order (avc-NNN)."},
46
+ "severity": {"type": "string", "enum": ["critical", "high", "medium", "low"], "description": "Most-severe severity among the skeptics that raised it (strict-er wins)."},
47
+ "category": {"type": "string", "minLength": 1, "description": "Defect class: correctness | security | test-coverage | quality | injection | completeness | ..."},
48
+ "location": {"type": "string", "minLength": 1, "description": "file:line (or the closest anchor the skeptic could give)."},
49
+ "description": {"type": "string", "minLength": 1, "description": "What the defect is and why it breaks."},
50
+ "raised_by": {"type": "array", "minItems": 1, "items": {"type": "string", "minLength": 1}, "description": "Model ids that independently raised this finding — the provenance + corroboration signal."},
51
+ "refuted_by": {"type": "array", "items": {"type": "string", "minLength": 1}, "description": "Model ids that examined this finding and judged it NOT a defect."},
52
+ "confidence": {"type": "string", "enum": ["high", "medium", "low"], "description": "high = corroborated by a panel quorum; medium = corroborated below quorum (or lone raiser on a solo panel); low = single raiser on a multi-skeptic panel."}
53
+ }
54
+ }
55
+ }
56
+ }
@@ -39,7 +39,7 @@ schema_version: 1
39
39
  # CI guard: a release bump of `package.json` must update this value
40
40
  # in lockstep — see scripts/check_template_pin_drift.ts (road-to-
41
41
  # portable-runtime-and-update-check P3.3).
42
- agent_config_version: "9.1.0"
42
+ agent_config_version: "9.2.0"
43
43
 
44
44
  # --- Project identity ---
45
45
  project:
@@ -1,6 +1,6 @@
1
1
  # Discovery — Deprecation Report
2
2
 
3
- - Generated: `2026-07-14T09:00:03Z`
3
+ - Generated: `2026-07-14T13:40:54Z`
4
4
  - Deprecated artefacts: **0**
5
5
 
6
6
  _None. Tree is clean._
@@ -1102,7 +1102,7 @@
1102
1102
  },
1103
1103
  {
1104
1104
  "category": "command",
1105
- "checksum": "sha256:a202d7aa04b637885b9bae8e6cb9b5720adf72979bbd1e4c742a1ed28aff4dd9",
1105
+ "checksum": "sha256:acefd13ee30decae123744bf123fc1ea850a46c3c4950d4e4d0d153cfa2e5193",
1106
1106
  "install": {
1107
1107
  "default": true,
1108
1108
  "removable": false
@@ -1464,7 +1464,7 @@
1464
1464
  },
1465
1465
  {
1466
1466
  "category": "command",
1467
- "checksum": "sha256:8518fc42b63d6384ce3bbdd377e105b29edde98cbe4c512816a5e2dd1c5f79cf",
1467
+ "checksum": "sha256:c327db498d5de278aa46badcfc14995820f8f2a49e462d4e3e827265541611d2",
1468
1468
  "install": {
1469
1469
  "default": true,
1470
1470
  "removable": false
@@ -5544,6 +5544,29 @@
5544
5544
  "engineering"
5545
5545
  ]
5546
5546
  },
5547
+ {
5548
+ "category": "rule",
5549
+ "checksum": "sha256:c41abaaf955699738ccee56b1370b5149bc84ab1fa5f1b6baa24e2b873b9393d",
5550
+ "install": {
5551
+ "default": true,
5552
+ "removable": false
5553
+ },
5554
+ "lifecycle": "active",
5555
+ "packs": [
5556
+ "engineering-base",
5557
+ "product-basic"
5558
+ ],
5559
+ "path": "src/rules/cross-source-consistency.md",
5560
+ "trust": {
5561
+ "confidence": "high",
5562
+ "human_review_required": false,
5563
+ "level": "core"
5564
+ },
5565
+ "workspaces": [
5566
+ "engineering",
5567
+ "product"
5568
+ ]
5569
+ },
5547
5570
  {
5548
5571
  "category": "rule",
5549
5572
  "checksum": "sha256:f09f13f41eab26421f29cc731f8b1b737f9f37079c913416ba686bc9d45a8bc2",
@@ -5568,7 +5591,7 @@
5568
5591
  },
5569
5592
  {
5570
5593
  "category": "rule",
5571
- "checksum": "sha256:7eaac36c60b5c2cff3ca564f9c212aa4c02cf35c93afa442da461db08b96dcb9",
5594
+ "checksum": "sha256:a7fb7c005699c157c6c263011700ad3173c206c94f2aa6af1022ce8f73bd5b40",
5572
5595
  "install": {
5573
5596
  "default": true,
5574
5597
  "removable": false
@@ -9266,7 +9289,7 @@
9266
9289
  },
9267
9290
  {
9268
9291
  "category": "skill",
9269
- "checksum": "sha256:043dbe881bb6230e51a2116624a1df2fe3ef41b6387f3fd2466f6fafac687ee7",
9292
+ "checksum": "sha256:44b899d5e20f9df7ff6c314ddbdbde2acc3f113c70972711973406851880ca5f",
9270
9293
  "install": {
9271
9294
  "default": true,
9272
9295
  "removable": true
@@ -9354,7 +9377,7 @@
9354
9377
  },
9355
9378
  {
9356
9379
  "category": "skill",
9357
- "checksum": "sha256:dc4135f2700c2a5619216ee15a60fd2995d431c5b7f760e6bac001a2dbf99782",
9380
+ "checksum": "sha256:6852419c1125a3c85507533245a096064e35a41d57ed49b2c6394e370df99d47",
9358
9381
  "install": {
9359
9382
  "default": true,
9360
9383
  "removable": true
@@ -11428,7 +11451,7 @@
11428
11451
  },
11429
11452
  {
11430
11453
  "category": "skill",
11431
- "checksum": "sha256:c5e07dbdb98efa2391f8fd36aa5ae69d3fff762ddc3b359f23b78fb35601ffa5",
11454
+ "checksum": "sha256:873175a941baa7f10386d89f78ef87c10a00d2ca811bbcbd273bd8b2dc73bb07",
11432
11455
  "install": {
11433
11456
  "default": true,
11434
11457
  "removable": true
@@ -12066,7 +12089,7 @@
12066
12089
  },
12067
12090
  {
12068
12091
  "category": "skill",
12069
- "checksum": "sha256:78ba80e645243815c450fb087375dd06edd943c9d965411dda6d05ed3b2be0a2",
12092
+ "checksum": "sha256:00bedf510fe4b6adabbe4e4a7c16cd9a2259801b300d95879f0f22093741037c",
12070
12093
  "install": {
12071
12094
  "default": true,
12072
12095
  "removable": true
@@ -12264,7 +12287,7 @@
12264
12287
  },
12265
12288
  {
12266
12289
  "category": "skill",
12267
- "checksum": "sha256:7a9e002a68263c1654173fe007d4f6a6b9c6db1d00026428ca26dedc82e427c3",
12290
+ "checksum": "sha256:3803e4889057d8d1f0619ca4f9652b88729124a2aa2bdb83b31f2064c02ed104",
12268
12291
  "install": {
12269
12292
  "default": true,
12270
12293
  "removable": false
@@ -12814,7 +12837,7 @@
12814
12837
  },
12815
12838
  {
12816
12839
  "category": "skill",
12817
- "checksum": "sha256:97d4f70ad08349a307b8d4af9b9fa288dd5f33365cd1217bd4c66e7013717123",
12840
+ "checksum": "sha256:355f51b3ef319bb84a826f417b33c465e8991cd0dbf6c2cc645c7db9af9ebc6c",
12818
12841
  "install": {
12819
12842
  "default": true,
12820
12843
  "removable": false
@@ -13535,7 +13558,7 @@
13535
13558
  "workspaces": []
13536
13559
  }
13537
13560
  ],
13538
- "checksum": "sha256:69fcb002e72524fe832ff2fc8dc5cfc7335f71d1b6c049c8e108c83665d97eb2",
13561
+ "checksum": "sha256:c2e1ad4673f3bf59c601bfdf51040b155bbcc511f0af3622004ca1917bad10e9",
13539
13562
  "deprecations": [
13540
13563
  {
13541
13564
  "key": "tier",
@@ -13678,10 +13701,10 @@
13678
13701
  "reason": "scaffold template for ticket-bundle tickets (ADR-101); carries no runtime frontmatter — emit-tickets fills it in per ticket"
13679
13702
  }
13680
13703
  ],
13681
- "generated_at": "2026-07-14T09:00:03Z",
13704
+ "generated_at": "2026-07-14T13:40:54Z",
13682
13705
  "packs": [
13683
13706
  {
13684
- "artefact_count": 106,
13707
+ "artefact_count": 107,
13685
13708
  "description": "Framework-neutral engineering hygiene — git, tests, reviews.",
13686
13709
  "domain": "engineering",
13687
13710
  "human_review_required": 0,
@@ -13691,7 +13714,7 @@
13691
13714
  "trust_level_default": "core",
13692
13715
  "trust_summary": {
13693
13716
  "advisory": 0,
13694
- "core": 104,
13717
+ "core": 105,
13695
13718
  "experimental": 1,
13696
13719
  "professional": 1,
13697
13720
  "restricted": 0
@@ -14034,7 +14057,7 @@
14034
14057
  ]
14035
14058
  },
14036
14059
  {
14037
- "artefact_count": 11,
14060
+ "artefact_count": 12,
14038
14061
  "description": "Core PO/PM artefacts (ticket refinement, AC, estimation).",
14039
14062
  "domain": "product",
14040
14063
  "human_review_required": 0,
@@ -14053,7 +14076,7 @@
14053
14076
  "trust_level_default": "professional",
14054
14077
  "trust_summary": {
14055
14078
  "advisory": 0,
14056
- "core": 0,
14079
+ "core": 1,
14057
14080
  "experimental": 0,
14058
14081
  "professional": 11,
14059
14082
  "restricted": 0
@@ -14451,26 +14474,26 @@
14451
14474
  "stats": {
14452
14475
  "by_category": {
14453
14476
  "command": 184,
14454
- "rule": 104,
14477
+ "rule": 105,
14455
14478
  "skill": 275,
14456
14479
  "subagent": 1,
14457
14480
  "template": 1
14458
14481
  },
14459
14482
  "by_lifecycle": {
14460
- "active": 549,
14483
+ "active": 550,
14461
14484
  "archived": 0,
14462
14485
  "deprecated": 0,
14463
14486
  "experimental": 16
14464
14487
  },
14465
14488
  "by_trust_level": {
14466
14489
  "advisory": 8,
14467
- "core": 438,
14490
+ "core": 439,
14468
14491
  "experimental": 21,
14469
14492
  "professional": 98,
14470
14493
  "restricted": 0
14471
14494
  },
14472
14495
  "documented_unassigned_count": 26,
14473
- "total_artefacts": 565,
14496
+ "total_artefacts": 566,
14474
14497
  "unassigned_count": 0
14475
14498
  },
14476
14499
  "unassigned": [],
@@ -1 +1 @@
1
- 4edf44025858feda295b87664a0aa847b8b44794c21fa92fc6fd6ce0c976608a discovery-manifest.json
1
+ 662d30c8e6a940ea63e9a9d3fdd667a0acded956349c9f89dd21d0b8daf9727c discovery-manifest.json
@@ -1,8 +1,8 @@
1
1
  # Discovery Manifest — Summary
2
2
 
3
- - Generated: `2026-07-14T09:00:03Z`
3
+ - Generated: `2026-07-14T13:40:54Z`
4
4
  - Scanner: `c24312e116f8`
5
- - Artefacts: **565**
5
+ - Artefacts: **566**
6
6
  - Unassigned: **0**
7
7
 
8
8
  ## `engineering` — Engineering
@@ -11,7 +11,7 @@
11
11
 
12
12
  | Pack | Artefacts |
13
13
  |---|---|
14
- | `engineering-base` — Engineering Base | 106 |
14
+ | `engineering-base` — Engineering Base | 107 |
15
15
  | `git` — Git | 4 |
16
16
  | `php` — PHP | 6 |
17
17
  | `laravel` — Laravel | 25 |
@@ -31,7 +31,7 @@
31
31
 
32
32
  | Pack | Artefacts |
33
33
  |---|---|
34
- | `product-basic` — Product Basic | 11 |
34
+ | `product-basic` — Product Basic | 12 |
35
35
  | `product-discovery` — Product Discovery | 4 |
36
36
 
37
37
  ## `finance` — Finance
@@ -1,6 +1,6 @@
1
1
  # Discovery — Orphan Report
2
2
 
3
- - Generated: `2026-07-14T09:00:03Z`
3
+ - Generated: `2026-07-14T13:40:54Z`
4
4
  - Orphan artefacts: **0**
5
5
 
6
6
  > An orphan is an artefact whose declared pack has no other members.
@@ -1,10 +1,10 @@
1
1
  {
2
- "checksum": "sha256:69fcb002e72524fe832ff2fc8dc5cfc7335f71d1b6c049c8e108c83665d97eb2",
3
- "generated_at": "2026-07-14T09:00:03Z",
2
+ "checksum": "sha256:c2e1ad4673f3bf59c601bfdf51040b155bbcc511f0af3622004ca1917bad10e9",
3
+ "generated_at": "2026-07-14T13:40:54Z",
4
4
  "packs": [
5
5
  {
6
6
  "always_on": false,
7
- "artefact_count": 106,
7
+ "artefact_count": 107,
8
8
  "artefacts": [
9
9
  "src/domains/engineering-base/mission/upgrade/command.md",
10
10
  "src/rules/active-remediation.md",
@@ -12,6 +12,7 @@
12
12
  "src/rules/code-comment-discipline.md",
13
13
  "src/rules/commit-conventions.md",
14
14
  "src/rules/commit-policy.md",
15
+ "src/rules/cross-source-consistency.md",
15
16
  "src/rules/delegation-policy.md",
16
17
  "src/rules/docker-commands.md",
17
18
  "src/rules/downstream-changes.md",
@@ -114,14 +115,14 @@
114
115
  "src/skills/worktree-lifecycle/SKILL.md"
115
116
  ],
116
117
  "by_lifecycle": {
117
- "active": 105,
118
+ "active": 106,
118
119
  "archived": 0,
119
120
  "deprecated": 0,
120
121
  "experimental": 1
121
122
  },
122
123
  "by_trust_level": {
123
124
  "advisory": 0,
124
- "core": 104,
125
+ "core": 105,
125
126
  "experimental": 1,
126
127
  "professional": 1,
127
128
  "restricted": 0
@@ -669,8 +670,9 @@
669
670
  },
670
671
  {
671
672
  "always_on": false,
672
- "artefact_count": 11,
673
+ "artefact_count": 12,
673
674
  "artefacts": [
675
+ "src/rules/cross-source-consistency.md",
674
676
  "src/skills/churn-prevention/SKILL.md",
675
677
  "src/skills/estimate-ticket/SKILL.md",
676
678
  "src/skills/feature-planning/SKILL.md",
@@ -684,14 +686,14 @@
684
686
  "src/skills/technical-specification/SKILL.md"
685
687
  ],
686
688
  "by_lifecycle": {
687
- "active": 11,
689
+ "active": 12,
688
690
  "archived": 0,
689
691
  "deprecated": 0,
690
692
  "experimental": 0
691
693
  },
692
694
  "by_trust_level": {
693
695
  "advisory": 0,
694
- "core": 0,
696
+ "core": 1,
695
697
  "experimental": 0,
696
698
  "professional": 11,
697
699
  "restricted": 0
@@ -1,6 +1,6 @@
1
1
  # Discovery — Trust Report
2
2
 
3
- - Generated: `2026-07-14T09:00:03Z`
3
+ - Generated: `2026-07-14T13:40:54Z`
4
4
  - Workspaces tracked: **10**
5
5
  - Human-review-required artefacts: **3**
6
6
 
@@ -10,13 +10,13 @@
10
10
  |---|---|---|---|---|---|
11
11
  | `agent-config-maintainer` | 304 | 0 | 3 | 0 | 0 |
12
12
  | `construction` | 23 | 0 | 0 | 0 | 0 |
13
- | `engineering` | 167 | 58 | 2 | 0 | 0 |
13
+ | `engineering` | 168 | 58 | 2 | 0 | 0 |
14
14
  | `finance` | 26 | 4 | 0 | 1 | 0 |
15
15
  | `founder` | 30 | 0 | 1 | 1 | 0 |
16
16
  | `gtm` | 28 | 13 | 1 | 0 | 0 |
17
17
  | `legal-review-prep` | 23 | 0 | 0 | 6 | 0 |
18
18
  | `ops` | 23 | 8 | 1 | 0 | 0 |
19
- | `product` | 23 | 15 | 1 | 0 | 0 |
19
+ | `product` | 24 | 15 | 1 | 0 | 0 |
20
20
  | `small-business` | 29 | 0 | 19 | 0 | 0 |
21
21
 
22
22
  ## Human-review-required artefacts