@event4u/agent-config 1.33.0 → 1.35.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/.agent-src/commands/review-changes.md +13 -8
- package/.agent-src/commands/roadmap/process-full.md +17 -15
- package/.agent-src/contexts/execution/roadmap-process-loop.md +11 -10
- package/.agent-src/personas/README.md +12 -21
- package/.agent-src/personas/_template-specialist/persona.md +89 -0
- package/.agent-src/personas/backend-architect.md +96 -0
- package/.agent-src/personas/discovery-lead.md +99 -0
- package/.agent-src/personas/eloquent-tamer.md +96 -0
- package/.agent-src/personas/frontend-engineer.md +100 -0
- package/.agent-src/personas/product-owner.md +71 -52
- package/.agent-src/personas/qa.md +27 -2
- package/.agent-src/personas/revops-maintainer.md +100 -0
- package/.agent-src/personas/security-engineer.md +100 -0
- package/.agent-src/personas/tech-writer.md +99 -0
- package/.agent-src/skills/accessibility-auditor/SKILL.md +132 -0
- package/.agent-src/skills/adr-create/SKILL.md +1 -0
- package/.agent-src/skills/adversarial-review/SKILL.md +1 -0
- package/.agent-src/skills/agent-docs-writing/SKILL.md +1 -0
- package/.agent-src/skills/agents-md-thin-root/SKILL.md +1 -0
- package/.agent-src/skills/ai-council/SKILL.md +1 -0
- package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -0
- package/.agent-src/skills/analysis-skill-router/SKILL.md +1 -0
- package/.agent-src/skills/api-design/SKILL.md +3 -0
- package/.agent-src/skills/api-endpoint/SKILL.md +1 -0
- package/.agent-src/skills/api-testing/SKILL.md +1 -0
- package/.agent-src/skills/architecture-review-lens/SKILL.md +137 -0
- package/.agent-src/skills/artisan-commands/SKILL.md +1 -0
- package/.agent-src/skills/async-python-patterns/SKILL.md +1 -0
- package/.agent-src/skills/authz-review/SKILL.md +4 -0
- package/.agent-src/skills/aws-infrastructure/SKILL.md +1 -0
- package/.agent-src/skills/blade-ui/SKILL.md +1 -0
- package/.agent-src/skills/blast-radius-analyzer/SKILL.md +3 -0
- package/.agent-src/skills/bug-analyzer/SKILL.md +1 -0
- package/.agent-src/skills/check-refs/SKILL.md +1 -0
- package/.agent-src/skills/code-refactoring/SKILL.md +1 -0
- package/.agent-src/skills/code-review/SKILL.md +1 -0
- package/.agent-src/skills/command-routing/SKILL.md +1 -0
- package/.agent-src/skills/command-writing/SKILL.md +1 -0
- package/.agent-src/skills/competitive-positioning/SKILL.md +152 -0
- package/.agent-src/skills/composer-packages/SKILL.md +1 -0
- package/.agent-src/skills/context-authoring/SKILL.md +1 -0
- package/.agent-src/skills/context-document/SKILL.md +1 -0
- package/.agent-src/skills/conventional-commits-writing/SKILL.md +1 -0
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +1 -0
- package/.agent-src/skills/copilot-config/SKILL.md +1 -0
- package/.agent-src/skills/customer-research/SKILL.md +116 -0
- package/.agent-src/skills/dashboard-design/SKILL.md +1 -0
- package/.agent-src/skills/data-flow-mapper/SKILL.md +1 -0
- package/.agent-src/skills/database/SKILL.md +3 -0
- package/.agent-src/skills/dcf-modeling/SKILL.md +1 -0
- package/.agent-src/skills/decision-record/SKILL.md +218 -0
- package/.agent-src/skills/deep-reading-analyst/SKILL.md +1 -0
- package/.agent-src/skills/defense-in-depth/SKILL.md +1 -0
- package/.agent-src/skills/dependency-upgrade/SKILL.md +1 -0
- package/.agent-src/skills/description-assist/SKILL.md +1 -0
- package/.agent-src/skills/design-review/SKILL.md +1 -0
- package/.agent-src/skills/devcontainer/SKILL.md +1 -0
- package/.agent-src/skills/developer-like-execution/SKILL.md +1 -0
- package/.agent-src/skills/discovery-interview/SKILL.md +152 -0
- package/.agent-src/skills/docker/SKILL.md +1 -0
- package/.agent-src/skills/dto-creator/SKILL.md +1 -0
- package/.agent-src/skills/eloquent/SKILL.md +3 -0
- package/.agent-src/skills/error-handling-patterns/SKILL.md +1 -0
- package/.agent-src/skills/estimate-ticket/SKILL.md +1 -0
- package/.agent-src/skills/existing-ui-audit/SKILL.md +3 -0
- package/.agent-src/skills/fe-design/SKILL.md +4 -1
- package/.agent-src/skills/feature-planning/SKILL.md +1 -0
- package/.agent-src/skills/file-editor/SKILL.md +1 -0
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +1 -0
- package/.agent-src/skills/flux/SKILL.md +1 -0
- package/.agent-src/skills/form-handler/SKILL.md +145 -0
- package/.agent-src/skills/funnel-analysis/SKILL.md +1 -0
- package/.agent-src/skills/git-workflow/SKILL.md +1 -0
- package/.agent-src/skills/github-ci/SKILL.md +1 -0
- package/.agent-src/skills/grafana/SKILL.md +1 -0
- package/.agent-src/skills/guideline-writing/SKILL.md +1 -0
- package/.agent-src/skills/incident-commander/SKILL.md +140 -0
- package/.agent-src/skills/jira-integration/SKILL.md +1 -0
- package/.agent-src/skills/jobs-events/SKILL.md +1 -0
- package/.agent-src/skills/judge-bug-hunter/SKILL.md +1 -0
- package/.agent-src/skills/judge-code-quality/SKILL.md +1 -0
- package/.agent-src/skills/judge-security-auditor/SKILL.md +3 -0
- package/.agent-src/skills/judge-test-coverage/SKILL.md +1 -0
- package/.agent-src/skills/laravel/SKILL.md +1 -0
- package/.agent-src/skills/laravel-horizon/SKILL.md +1 -0
- package/.agent-src/skills/laravel-mail/SKILL.md +1 -0
- package/.agent-src/skills/laravel-middleware/SKILL.md +1 -0
- package/.agent-src/skills/laravel-notifications/SKILL.md +1 -0
- package/.agent-src/skills/laravel-pennant/SKILL.md +1 -0
- package/.agent-src/skills/laravel-pulse/SKILL.md +1 -0
- package/.agent-src/skills/laravel-reverb/SKILL.md +1 -0
- package/.agent-src/skills/laravel-scheduling/SKILL.md +1 -0
- package/.agent-src/skills/laravel-validation/SKILL.md +1 -0
- package/.agent-src/skills/launch-readiness/SKILL.md +156 -0
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +1 -0
- package/.agent-src/skills/lint-skills/SKILL.md +1 -0
- package/.agent-src/skills/livewire/SKILL.md +1 -0
- package/.agent-src/skills/livewire-architect/SKILL.md +158 -0
- package/.agent-src/skills/logging-monitoring/SKILL.md +1 -0
- package/.agent-src/skills/markitdown/SKILL.md +1 -0
- package/.agent-src/skills/mcp/SKILL.md +1 -0
- package/.agent-src/skills/mcp-builder/SKILL.md +1 -0
- package/.agent-src/skills/md-language-check/SKILL.md +1 -0
- package/.agent-src/skills/merge-conflicts/SKILL.md +1 -0
- package/.agent-src/skills/migration-architect/SKILL.md +119 -0
- package/.agent-src/skills/migration-creator/SKILL.md +1 -0
- package/.agent-src/skills/mobile-e2e-strategy/SKILL.md +2 -1
- package/.agent-src/skills/module-management/SKILL.md +1 -0
- package/.agent-src/skills/multi-tenancy/SKILL.md +1 -0
- package/.agent-src/skills/okr-tree-modeling/SKILL.md +1 -0
- package/.agent-src/skills/openapi/SKILL.md +1 -0
- package/.agent-src/skills/override-management/SKILL.md +1 -0
- package/.agent-src/skills/performance/SKILL.md +1 -0
- package/.agent-src/skills/performance-analysis/SKILL.md +1 -0
- package/.agent-src/skills/persona-writing/SKILL.md +1 -0
- package/.agent-src/skills/pest-testing/SKILL.md +1 -0
- package/.agent-src/skills/php-coder/SKILL.md +1 -0
- package/.agent-src/skills/php-debugging/SKILL.md +1 -0
- package/.agent-src/skills/php-service/SKILL.md +1 -0
- package/.agent-src/skills/playwright-architect/SKILL.md +141 -0
- package/.agent-src/skills/playwright-testing/SKILL.md +1 -0
- package/.agent-src/skills/po-discovery/SKILL.md +127 -0
- package/.agent-src/skills/project-analysis-core/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-laravel/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-nextjs/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-node-express/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-react/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-symfony/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +1 -0
- package/.agent-src/skills/project-analyzer/SKILL.md +1 -0
- package/.agent-src/skills/project-docs/SKILL.md +1 -0
- package/.agent-src/skills/prompt-engineering-patterns/SKILL.md +1 -0
- package/.agent-src/skills/prompt-optimizer/SKILL.md +1 -0
- package/.agent-src/skills/quality-tools/SKILL.md +1 -0
- package/.agent-src/skills/react-native-setup/SKILL.md +1 -0
- package/.agent-src/skills/react-shadcn-ui/SKILL.md +1 -0
- package/.agent-src/skills/readme-reviewer/SKILL.md +1 -0
- package/.agent-src/skills/readme-writing/SKILL.md +1 -0
- package/.agent-src/skills/readme-writing-package/SKILL.md +1 -0
- package/.agent-src/skills/receiving-code-review/SKILL.md +1 -0
- package/.agent-src/skills/refine-prompt/SKILL.md +1 -0
- package/.agent-src/skills/refine-ticket/SKILL.md +1 -0
- package/.agent-src/skills/release-comms/SKILL.md +123 -0
- package/.agent-src/skills/repomix-packer/SKILL.md +1 -0
- package/.agent-src/skills/requesting-code-review/SKILL.md +1 -0
- package/.agent-src/skills/review-routing/SKILL.md +1 -0
- package/.agent-src/skills/rice-prioritization/SKILL.md +1 -0
- package/.agent-src/skills/risk-officer/SKILL.md +141 -0
- package/.agent-src/skills/roadmap-management/SKILL.md +1 -0
- package/.agent-src/skills/roadmap-writing/SKILL.md +2 -1
- package/.agent-src/skills/rtk-output-filtering/SKILL.md +1 -0
- package/.agent-src/skills/rule-writing/SKILL.md +1 -0
- package/.agent-src/skills/script-writing/SKILL.md +1 -0
- package/.agent-src/skills/secrets-management/SKILL.md +1 -0
- package/.agent-src/skills/security/SKILL.md +1 -0
- package/.agent-src/skills/security-audit/SKILL.md +1 -0
- package/.agent-src/skills/sentry-integration/SKILL.md +1 -0
- package/.agent-src/skills/sequential-thinking/SKILL.md +1 -0
- package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -0
- package/.agent-src/skills/skill-management/SKILL.md +1 -0
- package/.agent-src/skills/skill-reviewer/SKILL.md +1 -0
- package/.agent-src/skills/skill-writing/SKILL.md +1 -0
- package/.agent-src/skills/sql-writing/SKILL.md +1 -0
- package/.agent-src/skills/stakeholder-tradeoff/SKILL.md +237 -0
- package/.agent-src/skills/subagent-orchestration/SKILL.md +13 -0
- package/.agent-src/skills/systematic-debugging/SKILL.md +1 -0
- package/.agent-src/skills/tailwind-engineer/SKILL.md +130 -0
- package/.agent-src/skills/tech-debt-tracker/SKILL.md +152 -0
- package/.agent-src/skills/technical-specification/SKILL.md +1 -0
- package/.agent-src/skills/terraform/SKILL.md +1 -0
- package/.agent-src/skills/terragrunt/SKILL.md +1 -0
- package/.agent-src/skills/test-driven-development/SKILL.md +1 -0
- package/.agent-src/skills/test-performance/SKILL.md +1 -0
- package/.agent-src/skills/testing-anti-patterns/SKILL.md +1 -0
- package/.agent-src/skills/threat-modeling/SKILL.md +3 -0
- package/.agent-src/skills/token-optimizer/SKILL.md +1 -0
- package/.agent-src/skills/traefik/SKILL.md +1 -0
- package/.agent-src/skills/ui-component-architect/SKILL.md +153 -0
- package/.agent-src/skills/unit-economics-modeling/SKILL.md +1 -0
- package/.agent-src/skills/universal-project-analysis/SKILL.md +1 -0
- package/.agent-src/skills/upstream-contribute/SKILL.md +1 -0
- package/.agent-src/skills/using-git-worktrees/SKILL.md +1 -0
- package/.agent-src/skills/validate-feature-fit/SKILL.md +1 -0
- package/.agent-src/skills/verify-completion-evidence/SKILL.md +1 -0
- package/.agent-src/skills/voc-extract/SKILL.md +164 -0
- package/.agent-src/skills/websocket/SKILL.md +1 -0
- package/.agent-src/templates/roadmaps.md +9 -0
- package/.claude-plugin/marketplace.json +21 -1
- package/AGENTS.md +1 -0
- package/CHANGELOG.md +75 -0
- package/README.md +2 -2
- package/docs/architecture.md +2 -2
- package/docs/catalog.md +21 -4
- package/docs/contracts/context-spine.md +133 -0
- package/docs/contracts/file-ownership-matrix.json +616 -0
- package/docs/contracts/mental-models.md +336 -0
- package/docs/contracts/persona-schema.md +136 -0
- package/docs/contracts/skill-domains.md +143 -0
- package/docs/decisions/ADR-005-subagent-worktrees.md +120 -0
- package/docs/decisions/ADR-006-skill-tools-python-pilot.md +114 -0
- package/docs/decisions/INDEX.md +3 -0
- package/docs/guidelines/cross-role-handoff.md +127 -0
- package/docs/personas.md +115 -0
- package/package.json +1 -1
- package/scripts/_backfill_skill_domains.py +140 -0
- package/scripts/_emit_domain_table.py +35 -0
- package/scripts/install-hooks.sh +21 -4
- package/scripts/lint_context_spine_usage.py +133 -0
- package/scripts/lint_roadmap_complexity.py +37 -0
- package/scripts/lint_skill_tools.py +168 -0
- package/scripts/schemas/skill.schema.json +15 -1
- package/scripts/skill_linter.py +19 -4
- package/scripts/skill_tools/__init__.py +22 -0
- package/scripts/skill_tools/audit_persona_coverage.py +147 -0
- package/scripts/skill_tools/run_block_d_eval.py +129 -0
- package/scripts/skill_tools/score_skill_relevance.py +169 -0
- package/scripts/skill_tools/suggest_skill_for_task.py +113 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: review-changes
|
|
3
|
-
skills: [code-review, subagent-orchestration, judge-bug-hunter, judge-security-auditor, judge-test-coverage, judge-code-quality, git-workflow]
|
|
4
|
-
description: Self-review local changes before creating a PR — dispatches to
|
|
3
|
+
skills: [code-review, subagent-orchestration, judge-bug-hunter, judge-security-auditor, judge-test-coverage, judge-code-quality, architecture-review-lens, git-workflow]
|
|
4
|
+
description: Self-review local changes before creating a PR — dispatches to five specialized judges (bug, security, tests, quality, architecture) and consolidates verdicts
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
suggestion:
|
|
7
7
|
eligible: true
|
|
@@ -55,7 +55,7 @@ Read `.agent-settings.yml`:
|
|
|
55
55
|
|
|
56
56
|
Unknown alias → stop. Never silently fall back.
|
|
57
57
|
|
|
58
|
-
### 4. Dispatch to the
|
|
58
|
+
### 4. Dispatch to the five judges
|
|
59
59
|
|
|
60
60
|
Each judge receives **the same diff plus the task context** (ticket,
|
|
61
61
|
PR body, commit messages) and runs independently. The judges are:
|
|
@@ -66,16 +66,21 @@ PR body, commit messages) and runs independently. The judges are:
|
|
|
66
66
|
| [`judge-security-auditor`](../skills/judge-security-auditor/SKILL.md) | AuthZ/AuthN, injection, secrets, unsafe deserialization, SSRF, XSS |
|
|
67
67
|
| [`judge-test-coverage`](../skills/judge-test-coverage/SKILL.md) | Missing assertions, uncovered branches, over-mocking, regression-test gaps |
|
|
68
68
|
| [`judge-code-quality`](../skills/judge-code-quality/SKILL.md) | Naming, SRP, DRY, dead code, consistency with codebase conventions |
|
|
69
|
+
| [`architecture-review-lens`](../skills/architecture-review-lens/SKILL.md) | Layer violations, dependency direction, leaky abstractions, cross-service contract drift |
|
|
70
|
+
|
|
71
|
+
The five judges weight equally in the consolidated verdict — none
|
|
72
|
+
overrides another.
|
|
69
73
|
|
|
70
74
|
Pick dispatch mode based on diff size and environment:
|
|
71
75
|
|
|
72
76
|
- **Sequential** (default, simplest) — run bug-hunter → security-auditor
|
|
73
|
-
→ test-coverage → code-quality, collect
|
|
77
|
+
→ test-coverage → code-quality → architecture-review-lens, collect
|
|
78
|
+
each verdict
|
|
74
79
|
- **Parallel** — if `subagents.max_parallel` in `.agent-settings.yml` is
|
|
75
|
-
≥
|
|
80
|
+
≥ 5 and subagent dispatch is available, run all five concurrently
|
|
76
81
|
following the `do-in-parallel` pattern in
|
|
77
82
|
[`subagent-orchestration`](../skills/subagent-orchestration/SKILL.md);
|
|
78
|
-
the
|
|
83
|
+
the five judges operate on the same diff but produce independent
|
|
79
84
|
reports, so no shared-state risk
|
|
80
85
|
|
|
81
86
|
Each judge returns its own `Judge / Model / Target / Verdict /
|
|
@@ -129,7 +134,7 @@ Produce one combined report:
|
|
|
129
134
|
before proceeding
|
|
130
135
|
- If **any** judge returned `revise` → fix 🔴 findings automatically,
|
|
131
136
|
ask before fixing 🟡 findings, report 🟢 as suggestions
|
|
132
|
-
- If all
|
|
137
|
+
- If all five returned `apply` → the diff is ready; report and stop
|
|
133
138
|
|
|
134
139
|
### 7. Quality tools (verbosity-gated)
|
|
135
140
|
|
|
@@ -163,7 +168,7 @@ Per `verbosity.routine_confirmations` (default `false`):
|
|
|
163
168
|
## Use this command when
|
|
164
169
|
|
|
165
170
|
- Preparing a self-review before opening a PR
|
|
166
|
-
- Stress-testing a local branch with the same
|
|
171
|
+
- Stress-testing a local branch with the same five lenses a reviewer
|
|
167
172
|
would apply
|
|
168
173
|
- Sanity-checking a diff before handing it to `/create-pr`
|
|
169
174
|
|
|
@@ -28,8 +28,8 @@ with the **scope delta below**.
|
|
|
28
28
|
## Scope delta
|
|
29
29
|
|
|
30
30
|
- **Working set:** every open step across every phase, in document
|
|
31
|
-
order.
|
|
32
|
-
|
|
31
|
+
order. Phase-internal annotations like `(deferred)` / `(optional)` /
|
|
32
|
+
"gated on Phase N" do not narrow the working set.
|
|
33
33
|
- **Stop after:** the entire roadmap reaches `count_open == 0`, or a
|
|
34
34
|
halt condition fires (Hard-Floor, council-off + ambiguity,
|
|
35
35
|
security-sensitive, scope-out-of-roadmap, test/quality red).
|
|
@@ -45,18 +45,20 @@ with the **scope delta below**.
|
|
|
45
45
|
|
|
46
46
|
```
|
|
47
47
|
/roadmap:process-full PROCESSES EVERY OPEN STEP IN THE FILE.
|
|
48
|
-
|
|
49
|
-
NOTES
|
|
50
|
-
|
|
48
|
+
PHASE-INTERNAL "(DEFERRED)" / "(OPTIONAL)" / "GATED ON PHASE X"
|
|
49
|
+
NOTES DO NOT NARROW THE WORKING SET. ONLY THE FIVE HALT CONDITIONS
|
|
50
|
+
STOP THE RUN.
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
`/roadmap:process-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
53
|
+
Phase-internal `(deferred)` / `(optional)` / `gated on Phase N` tags are
|
|
54
|
+
authoring annotations, not execution gates. `/roadmap:process-full`
|
|
55
|
+
ignores them by construction. If the user wants narrower execution they
|
|
56
|
+
invoke `/roadmap:process-phase` (scope = single phase) or
|
|
57
|
+
`/roadmap:process-step` (scope = single step) instead.
|
|
58
|
+
|
|
59
|
+
Time-boxed plate / horizon framing is forbidden in roadmaps by template
|
|
60
|
+
rule 16 (`templates/roadmaps.md`). If a legacy roadmap still carries
|
|
61
|
+
such phrasing, treat it as ordinary prose — never as a gate.
|
|
60
62
|
|
|
61
63
|
## Iron Law — Real-time dashboard
|
|
62
64
|
|
|
@@ -79,9 +81,9 @@ step 5.
|
|
|
79
81
|
|
|
80
82
|
- **No silent acceleration past a halt.** Every halt condition stops
|
|
81
83
|
the run; the user resumes on the next turn.
|
|
82
|
-
- **No silent stop at
|
|
83
|
-
"gated on Phase N", "deferred", or any equivalent
|
|
84
|
-
**not** a halt condition. Continue.
|
|
84
|
+
- **No silent stop at an authoring annotation.** Encountering
|
|
85
|
+
"gated on Phase N", "deferred", "optional", or any equivalent
|
|
86
|
+
phase-internal annotation is **not** a halt condition. Continue.
|
|
85
87
|
- **No silent batch flip.** Each step's checkbox flips in the same
|
|
86
88
|
reply that lands its work — never deferred to the archive commit.
|
|
87
89
|
- **Phase quality pipeline runs at every phase boundary** when cadence
|
|
@@ -108,19 +108,20 @@ For each open step in the working set (scope-bound — see wrapper):
|
|
|
108
108
|
|
|
109
109
|
On halt: stop, surface state, do **not** auto-fix outside the failing step.
|
|
110
110
|
|
|
111
|
-
### Non-halt —
|
|
111
|
+
### Non-halt — gating notes, "optional" tags
|
|
112
112
|
|
|
113
113
|
The following are **authoring annotations**, never halt conditions. Do
|
|
114
114
|
**not** stop execution when the roadmap text contains them:
|
|
115
115
|
|
|
116
|
-
- `Horizon (N-week visible plate)` section headers
|
|
117
|
-
- `(out-of-horizon, gated on Phase N)` phase-header suffixes
|
|
118
116
|
- `(deferred)` / `(later)` / `(optional)` tags on a step
|
|
119
|
-
- "Gate: Phase 1 ships and …" prose inside
|
|
117
|
+
- "Gate: Phase 1 ships and …" prose inside a later phase
|
|
120
118
|
|
|
121
119
|
`process-step` and `process-phase` honor scope by stopping at their
|
|
122
|
-
configured boundary anyway. `process-full`
|
|
123
|
-
these
|
|
120
|
+
configured boundary anyway. `process-full` processes every open step
|
|
121
|
+
regardless of these annotations — see
|
|
122
|
+
[`/roadmap:process-full § Iron Law`](../../commands/roadmap/process-full.md#iron-law--full-is-full).
|
|
123
|
+
Time-boxed plate / horizon framing is forbidden in roadmaps by template
|
|
124
|
+
rule 16; if encountered in legacy text, treat as ordinary prose.
|
|
124
125
|
|
|
125
126
|
## 6. Final report and archival
|
|
126
127
|
|
|
@@ -139,10 +140,10 @@ these markers — see [`/roadmap:process-full § Iron Law`](../../commands/roadm
|
|
|
139
140
|
|---|---|---|
|
|
140
141
|
| `process-step` | Single first open step | One iteration of § 5 |
|
|
141
142
|
| `process-phase` | All open steps in first phase with `count_open > 0` | Phase boundary; per-phase quality if cadence ≠ `end_of_roadmap` |
|
|
142
|
-
| `process-full` | Every open step across every phase, in order
|
|
143
|
+
| `process-full` | Every open step across every phase, in order | Roadmap fully closed (or halt) |
|
|
143
144
|
|
|
144
145
|
`process-full` runs the per-phase quality pipeline at every phase
|
|
145
146
|
boundary when cadence is `per_phase` or `per_step`; on red it halts
|
|
146
|
-
before the next phase.
|
|
147
|
-
"
|
|
148
|
-
|
|
147
|
+
before the next phase. Phase-internal `(deferred)` / `(optional)` /
|
|
148
|
+
"gated on Phase N" annotations do not stop the run — those are
|
|
149
|
+
authoring notes, not halt conditions.
|
|
@@ -26,27 +26,17 @@ Personas fix that: one definition, many skills.
|
|
|
26
26
|
|
|
27
27
|
## Schema
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
Locked in [`../../docs/contracts/persona-schema.md`](../../docs/contracts/persona-schema.md).
|
|
30
|
+
Two-tier hybrid (council iter-1 A-OQ1 verdict (c)):
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
| `description` | string | one sentence, ≤ 160 chars |
|
|
36
|
-
| `tier` | `core` \| `specialist` | Core = always-loaded cast; Specialist = opt-in |
|
|
37
|
-
| `mode` | string (optional) | advisory link to a role-contract workflow mode |
|
|
38
|
-
| `version` | string | semantic version; bump on breaking changes |
|
|
39
|
-
| `source` | string | `package` for personas shipped here |
|
|
40
|
-
|
|
41
|
-
Required sections (checked by the linter):
|
|
42
|
-
|
|
43
|
-
1. **Focus** — one paragraph, the lens.
|
|
44
|
-
2. **Mindset** — bullets, default assumptions and skepticism.
|
|
45
|
-
3. **Unique Questions** — ≥ 3 questions no other persona asks.
|
|
46
|
-
4. **Output Expectations** — how findings are phrased.
|
|
47
|
-
5. **Anti-Patterns** — what this persona must refuse to do.
|
|
32
|
+
- **Core** — 5 sections (Focus · Mindset · Unique Questions · Output
|
|
33
|
+
Expectations · Anti-Patterns), ≤ 120 lines. Always-loaded cast.
|
|
34
|
+
- **Specialist** — 7 sections (Core-5 + Critical Rules + Workflows),
|
|
35
|
+
≤ 100 lines. Opt-in lens.
|
|
48
36
|
|
|
49
|
-
|
|
37
|
+
Frontmatter is uniform across tiers: `id · role · description · tier
|
|
38
|
+
· mode · version · source`. See the contract for full details and
|
|
39
|
+
the linter check list.
|
|
50
40
|
|
|
51
41
|
## The Core-6 (always-loaded cast, v1)
|
|
52
42
|
|
|
@@ -94,10 +84,11 @@ cast (usually Core-6 for review skills, empty for others).
|
|
|
94
84
|
- Every persona must pass the Unique-Questions heuristic.
|
|
95
85
|
- Project-specific personas live in the consumer repo
|
|
96
86
|
(`.agent-src/personas/` overrides), never in this package.
|
|
97
|
-
-
|
|
98
|
-
|
|
87
|
+
- **Core** template: [`../templates/persona.md`](../templates/persona.md) (5 sections, ≤ 120 lines).
|
|
88
|
+
- **Specialist** template: [`./_template-specialist/persona.md`](./_template-specialist/persona.md) (7 sections, ≤ 100 lines).
|
|
99
89
|
|
|
100
90
|
## Related
|
|
101
91
|
|
|
92
|
+
- [`../../docs/contracts/persona-schema.md`](../../docs/contracts/persona-schema.md) — locked schema (Core / Specialist)
|
|
102
93
|
- [`../../docs/guidelines/agent-infra/role-contracts.md`](../../docs/guidelines/agent-infra/role-contracts.md) — workflow modes personas compose with
|
|
103
94
|
- [`../rules/artifact-drafting-protocol.md`](../rules/artifact-drafting-protocol.md) — mandatory per new persona
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: {persona-id}
|
|
3
|
+
role: {Human-readable role name}
|
|
4
|
+
description: "One sentence — the voice this specialist brings; ≤ 160 chars."
|
|
5
|
+
tier: specialist
|
|
6
|
+
mode: developer
|
|
7
|
+
version: "1.0"
|
|
8
|
+
source: package
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# {Human-readable role name}
|
|
12
|
+
|
|
13
|
+
## Focus
|
|
14
|
+
|
|
15
|
+
One paragraph. The lens this specialist applies — narrow domain,
|
|
16
|
+
explicit axis. State what this voice notices that no other persona
|
|
17
|
+
catches. Avoid restating the role title; describe the *reading
|
|
18
|
+
posture* the voice adopts when handed a diff or plan.
|
|
19
|
+
|
|
20
|
+
End with one sentence pinning the boundary: what this lens is **not**
|
|
21
|
+
responsible for.
|
|
22
|
+
|
|
23
|
+
## Mindset
|
|
24
|
+
|
|
25
|
+
- Default assumption #1 the persona starts every review from.
|
|
26
|
+
- Skepticism #1 — what this voice refuses to take on faith.
|
|
27
|
+
- Skepticism #2.
|
|
28
|
+
- Operational habit (e.g. "always reads X before Y").
|
|
29
|
+
- One unfair-but-useful prior (the bias the voice owns honestly).
|
|
30
|
+
|
|
31
|
+
## Unique Questions
|
|
32
|
+
|
|
33
|
+
Three or more questions no other persona asks verbatim. Each must
|
|
34
|
+
be falsifiable against the artefact under review.
|
|
35
|
+
|
|
36
|
+
- {Question 1 — direct, scoped, answerable from the diff/plan.}
|
|
37
|
+
- {Question 2.}
|
|
38
|
+
- {Question 3.}
|
|
39
|
+
- {Optional Question 4.}
|
|
40
|
+
|
|
41
|
+
## Output Expectations
|
|
42
|
+
|
|
43
|
+
How findings are phrased when this lens is invoked.
|
|
44
|
+
|
|
45
|
+
- Format: bullets · table · numbered list — pick one.
|
|
46
|
+
- Severity vocabulary: e.g. `must-fix · should-fix · nit`.
|
|
47
|
+
- Citation rule: every finding cites a file:line or contract path.
|
|
48
|
+
- Length: short — one screen unless the diff is genuinely large.
|
|
49
|
+
|
|
50
|
+
## Anti-Patterns
|
|
51
|
+
|
|
52
|
+
- {What this persona must refuse to do — e.g. "no rubber-stamp on
|
|
53
|
+
unsigned diffs"}.
|
|
54
|
+
- {Anti-pattern 2.}
|
|
55
|
+
- {Anti-pattern 3.}
|
|
56
|
+
- {Anti-pattern 4 — optional.}
|
|
57
|
+
|
|
58
|
+
## Critical Rules
|
|
59
|
+
|
|
60
|
+
Non-negotiable invariants this lens enforces. Bulleted, declarative,
|
|
61
|
+
≤ 8 items. Each rule must be verifiable against the artefact (diff,
|
|
62
|
+
plan, ticket) without external context.
|
|
63
|
+
|
|
64
|
+
- {Rule 1 — e.g. "Every public method touching tenant data must
|
|
65
|
+
resolve the tenant ID before the first DB call."}
|
|
66
|
+
- {Rule 2.}
|
|
67
|
+
- {Rule 3.}
|
|
68
|
+
- {Rule 4 — optional.}
|
|
69
|
+
|
|
70
|
+
## Workflows
|
|
71
|
+
|
|
72
|
+
Concrete inspection steps this persona runs against the skill's
|
|
73
|
+
input. Numbered, deterministic, ≤ 6 steps. Each step is a single
|
|
74
|
+
action with a clear pass/fail outcome.
|
|
75
|
+
|
|
76
|
+
1. {Step — e.g. "Locate every authorization gate touched by the
|
|
77
|
+
diff. Confirm each gate explicitly checks tenant + role."}
|
|
78
|
+
2. {Step.}
|
|
79
|
+
3. {Step.}
|
|
80
|
+
4. {Optional step.}
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
*Author note (delete before publishing): this template targets the
|
|
85
|
+
7-section specialist spine locked in
|
|
86
|
+
[`docs/contracts/persona-schema.md`](../../../docs/contracts/persona-schema.md).
|
|
87
|
+
Stay within the **≤ 100 line** budget (file total, including
|
|
88
|
+
frontmatter). Replace every `{placeholder}` with concrete content.
|
|
89
|
+
Run the project's CI / lint pipeline before commit.*
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: backend-architect
|
|
3
|
+
role: Backend Architect
|
|
4
|
+
description: "The voice that watches service-layer boundaries — module seams, transaction scope, and the contracts a change widens or breaks."
|
|
5
|
+
tier: specialist
|
|
6
|
+
mode: reviewer
|
|
7
|
+
version: "1.0"
|
|
8
|
+
source: package
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Backend Architect
|
|
12
|
+
|
|
13
|
+
## Focus
|
|
14
|
+
|
|
15
|
+
System shape behind the diff. Reads every change against the layered
|
|
16
|
+
boundaries it crosses — controller → service → domain → persistence —
|
|
17
|
+
and asks whether the boundary remains coherent after. Notices when a
|
|
18
|
+
module quietly absorbs a responsibility belonging elsewhere, when a
|
|
19
|
+
transaction grows new side-effects, when an interface gains implicit
|
|
20
|
+
clients.
|
|
21
|
+
|
|
22
|
+
Not the code-quality lens; does not chase naming or DRY. Chases
|
|
23
|
+
coupling, leakage, and decisions hard to undo.
|
|
24
|
+
|
|
25
|
+
## Mindset
|
|
26
|
+
|
|
27
|
+
- Every public method is a contract; every parameter change is a
|
|
28
|
+
versioning event in disguise.
|
|
29
|
+
- Transaction boundaries are part of the API — extending one across
|
|
30
|
+
a network call is the change, not the symptom.
|
|
31
|
+
- A service calling another service's repository signals the seam is
|
|
32
|
+
wrong, not that the call is convenient.
|
|
33
|
+
- Backwards-compatible-on-the-wire ≠ backwards-compatible — query
|
|
34
|
+
shapes, lock orderings, event payloads count too.
|
|
35
|
+
|
|
36
|
+
## Unique Questions
|
|
37
|
+
|
|
38
|
+
- Which seam does this change cross, and is the new dependency
|
|
39
|
+
direction the one we want long-term?
|
|
40
|
+
- What is the transaction boundary now, and does the diff stretch it
|
|
41
|
+
across an external call, queue, or tenant?
|
|
42
|
+
- Which downstream consumer of this API will silently break — caller
|
|
43
|
+
signature, event payload, or query result shape?
|
|
44
|
+
- Is this the right module to own this responsibility, or has it
|
|
45
|
+
drifted in because the right module felt expensive to touch?
|
|
46
|
+
|
|
47
|
+
## Output Expectations
|
|
48
|
+
|
|
49
|
+
Numbered findings, each citing `path:line` and naming the boundary
|
|
50
|
+
at risk. Severity: `must-fix` for new cyclic deps, widened
|
|
51
|
+
transaction scope, breaking contract changes; `should-fix` for
|
|
52
|
+
module misownership; `nit` for naming inside the seam. End with a
|
|
53
|
+
one-sentence verdict on whether the change is locally clean but
|
|
54
|
+
architecturally regressive.
|
|
55
|
+
|
|
56
|
+
## Anti-Patterns
|
|
57
|
+
|
|
58
|
+
- Do NOT review test coverage — `qa`'s lens.
|
|
59
|
+
- Do NOT comment on naming or formatting unless it signals a
|
|
60
|
+
boundary leak.
|
|
61
|
+
- Do NOT suggest rewrites — surface the boundary risk, propose the
|
|
62
|
+
smallest correction.
|
|
63
|
+
- Do NOT rubber-stamp a diff that compiles but reshapes a contract.
|
|
64
|
+
|
|
65
|
+
## Critical Rules
|
|
66
|
+
|
|
67
|
+
- A new dependency edge between layers (controller → repository
|
|
68
|
+
bypassing service) is `must-fix`.
|
|
69
|
+
- A method's return type widening from a domain object to a raw
|
|
70
|
+
array or `mixed` is `must-fix` — removes a contract.
|
|
71
|
+
- A transaction boundary newly spanning HTTP, queue dispatch, or
|
|
72
|
+
cross-tenant work is `must-fix`.
|
|
73
|
+
- An event payload field rename without a deprecation cycle is
|
|
74
|
+
`must-fix` — consumers exist outside this repo.
|
|
75
|
+
- A service method calling another service's models or repository
|
|
76
|
+
directly is `must-fix` — seam is wrong.
|
|
77
|
+
|
|
78
|
+
## Workflows
|
|
79
|
+
|
|
80
|
+
1. Inventory the layers touched by the diff (controller, service,
|
|
81
|
+
domain, persistence, infra). Note any new edges between them.
|
|
82
|
+
2. For every changed public signature, locate every caller. Flag
|
|
83
|
+
any caller whose contract assumptions break.
|
|
84
|
+
3. For every transaction or unit-of-work block touched, list the
|
|
85
|
+
side-effects inside it after the change. Flag external calls
|
|
86
|
+
added inside the boundary.
|
|
87
|
+
4. For every event or queue payload changed, locate consumers. Flag
|
|
88
|
+
missing version/deprecation handling.
|
|
89
|
+
5. Output: numbered findings with `path:line`, severity tag, and a
|
|
90
|
+
one-line "boundary at risk" label per finding.
|
|
91
|
+
|
|
92
|
+
## Composes well with
|
|
93
|
+
|
|
94
|
+
- `senior-engineer` — long-horizon impact framing.
|
|
95
|
+
- `security-engineer` — when boundary changes also cross trust
|
|
96
|
+
zones (tenant, public surface, secrets).
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: discovery-lead
|
|
3
|
+
role: Discovery Lead
|
|
4
|
+
description: "The senior voice that owns the who and the problem — switch events named, hypotheses falsifiable, themes ranked by distinct people."
|
|
5
|
+
tier: specialist
|
|
6
|
+
mode: planner
|
|
7
|
+
version: "1.0"
|
|
8
|
+
source: package
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Discovery Lead
|
|
12
|
+
|
|
13
|
+
## Focus
|
|
14
|
+
|
|
15
|
+
Owns the **who** and the **problem** — upstream of the PO. Reads
|
|
16
|
+
every plan against three questions: *whose problem is this, what
|
|
17
|
+
switch event proves it, what would falsify the framing*. Catches
|
|
18
|
+
bias-by-question, anecdote-as-signal, and "we asked the user" that
|
|
19
|
+
turns out to be one articulate user. Not the design lens — does
|
|
20
|
+
not propose UI; holds the line on framing, evidence, and
|
|
21
|
+
disconfirmation.
|
|
22
|
+
|
|
23
|
+
## Mindset
|
|
24
|
+
|
|
25
|
+
- A frame without a switch event is a hypothesis dressed up as a
|
|
26
|
+
fact; the day-they-decided is the only solid floor.
|
|
27
|
+
- Three signals from distinct people beat one vivid quote from a
|
|
28
|
+
loud reporter.
|
|
29
|
+
- A question bank that survives audit unchanged is suspicious, not
|
|
30
|
+
perfect.
|
|
31
|
+
- Disconfirmations are the cheapest insight to ignore and the most
|
|
32
|
+
valuable to act on.
|
|
33
|
+
- Discovery hands off to PO; mixing roles loses the upstream
|
|
34
|
+
guardrail.
|
|
35
|
+
|
|
36
|
+
## Unique Questions
|
|
37
|
+
|
|
38
|
+
- Whose problem is this — named segment, not "users"?
|
|
39
|
+
- What is the switch event the recruit was filtered on?
|
|
40
|
+
- Which question in the bank is leading, and which can disconfirm?
|
|
41
|
+
- Are the themes ranked by distinct interviewees or by quote count?
|
|
42
|
+
- What would falsify this framing — and have we seen it yet?
|
|
43
|
+
|
|
44
|
+
## Output Expectations
|
|
45
|
+
|
|
46
|
+
- Format: framed slice (focal job · segment · switch event ·
|
|
47
|
+
disconfirmer) → audited bank → insight log → disconfirmation log.
|
|
48
|
+
- Vocabulary: past behaviour over hypothetical; verbatim over
|
|
49
|
+
paraphrase; *"the day they decided"* over *"users want"*.
|
|
50
|
+
- Citation: every theme cites distinct interviewees; every
|
|
51
|
+
disconfirmation cites the original hypothesis it answers.
|
|
52
|
+
- Length: short — one slice per artefact unless explicitly
|
|
53
|
+
multi-segment.
|
|
54
|
+
|
|
55
|
+
## Anti-Patterns
|
|
56
|
+
|
|
57
|
+
- Do NOT translate insights into AC — that is PO space.
|
|
58
|
+
- Do NOT ship a frame without a switch event.
|
|
59
|
+
- Do NOT rank themes by quote count.
|
|
60
|
+
- Do NOT collapse disconfirmations into "we also heard …" prose.
|
|
61
|
+
- Do NOT scope-drift into pricing / GTM / design — hand off.
|
|
62
|
+
|
|
63
|
+
## Critical Rules
|
|
64
|
+
|
|
65
|
+
- Every discovery slice carries a switch event and a named segment;
|
|
66
|
+
unnamed segments route back to `customer-research`.
|
|
67
|
+
- Every interview round runs through bias-audit before recruiting;
|
|
68
|
+
unaudited banks are blocked.
|
|
69
|
+
- Every theme report cites distinct interviewees as the rank key,
|
|
70
|
+
not quote count.
|
|
71
|
+
- Every disconfirmation has a named owner who must respond before
|
|
72
|
+
the team acts on the round.
|
|
73
|
+
- Hand-off to PO is explicit: discovery produces themes +
|
|
74
|
+
disconfirmations; PO produces tickets + AC. No silent boundary
|
|
75
|
+
crossings.
|
|
76
|
+
|
|
77
|
+
## Workflows
|
|
78
|
+
|
|
79
|
+
1. **Frame-then-interview loop.** Fuzzy problem → `customer-research`
|
|
80
|
+
to frame focal job + switch event + segment → recruit on switch
|
|
81
|
+
event → `discovery-interview` to build + audit bank → run
|
|
82
|
+
interviews → extract insights → frequency-rank themes → publish
|
|
83
|
+
disconfirmation log → hand themes to PO via `refine-ticket`.
|
|
84
|
+
2. **VoC-extract loop.** Backlog noise → `voc-extract` over issues +
|
|
85
|
+
PR threads + Sentry → theme report ranked by distinct authors →
|
|
86
|
+
surface scope-violations → route refine-candidates to PO,
|
|
87
|
+
probe-candidates back into the interview loop.
|
|
88
|
+
3. **Re-interview gate.** New round proposed → check whether the
|
|
89
|
+
prior round's disconfirmations were answered; if not, re-run
|
|
90
|
+
instead of expanding scope.
|
|
91
|
+
|
|
92
|
+
## Composes well with
|
|
93
|
+
|
|
94
|
+
- `product-owner` — discovery hands themes; PO writes the AC.
|
|
95
|
+
- `critical-challenger` — catches frames that survived politeness
|
|
96
|
+
but not falsification.
|
|
97
|
+
- `stakeholder` — names the silent stakeholders the interview
|
|
98
|
+
forgot.
|
|
99
|
+
- `qa` — turns disconfirmation criteria into acceptance gates.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: eloquent-tamer
|
|
3
|
+
role: Eloquent Tamer
|
|
4
|
+
description: "The voice that audits Eloquent for N+1, query-shape regressions, and ORM idioms that compile cleanly but melt the database."
|
|
5
|
+
tier: specialist
|
|
6
|
+
mode: reviewer
|
|
7
|
+
version: "1.0"
|
|
8
|
+
source: package
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Eloquent Tamer
|
|
12
|
+
|
|
13
|
+
## Focus
|
|
14
|
+
|
|
15
|
+
The query the ORM actually emits. Reads every Eloquent change
|
|
16
|
+
against the SQL it produces — joins, eager loads, lazy loads inside
|
|
17
|
+
loops, chunk vs cursor, lock semantics. Names the query shape, not
|
|
18
|
+
just the PHP shape. Notices when a relationship access in a Blade
|
|
19
|
+
partial becomes one query per row, when a global scope hides an
|
|
20
|
+
unindexed column predicate, when a `with()` produces a payload no
|
|
21
|
+
caller uses.
|
|
22
|
+
|
|
23
|
+
Not a generic perf lens; scope is the database boundary as seen
|
|
24
|
+
through Eloquent.
|
|
25
|
+
|
|
26
|
+
## Mindset
|
|
27
|
+
|
|
28
|
+
- The query is the contract; the model is a convenience over it.
|
|
29
|
+
- An N+1 is a design smell, not a perf bug — fix the call site,
|
|
30
|
+
not the query count alarm.
|
|
31
|
+
- `whereHas` without an index on the joined column is a bug
|
|
32
|
+
surfacing in production before staging.
|
|
33
|
+
- Eager loading the wrong shape mirrors N+1 — fetching rows nobody
|
|
34
|
+
reads costs the same as fetching them one-by-one.
|
|
35
|
+
|
|
36
|
+
## Unique Questions
|
|
37
|
+
|
|
38
|
+
- What query does this code emit on worst-case row count, and is
|
|
39
|
+
the column it filters on indexed?
|
|
40
|
+
- Which loop accesses a relationship not eager-loaded —
|
|
41
|
+
intentionally or by oversight?
|
|
42
|
+
- Where does a `with()` over-fetch a relation no caller uses?
|
|
43
|
+
- Which global scope, observer, or accessor adds a hidden query
|
|
44
|
+
the caller did not opt into?
|
|
45
|
+
|
|
46
|
+
## Output Expectations
|
|
47
|
+
|
|
48
|
+
Bullets, each naming the query shape (`SELECT … WHERE … JOIN …`)
|
|
49
|
+
and the trigger (file:line). Severity: `must-fix` for N+1 on
|
|
50
|
+
user-facing paths or unindexed predicates; `should-fix` for
|
|
51
|
+
over-fetched eager loads or unbounded lazy loads; `nit` for idiom
|
|
52
|
+
clean-ups (`first()` over `get()->first()`). End with the SQL the
|
|
53
|
+
diff likely emits at p99 row count.
|
|
54
|
+
|
|
55
|
+
## Anti-Patterns
|
|
56
|
+
|
|
57
|
+
- Do NOT comment on PHP style or naming unless it produces a worse
|
|
58
|
+
query.
|
|
59
|
+
- Do NOT recommend caching as a fix for a query problem; the query
|
|
60
|
+
is the bug.
|
|
61
|
+
- Do NOT suggest raw SQL where `with()` + an index covers it.
|
|
62
|
+
- Do NOT chase micro-optimizations; lens is shape, not constants.
|
|
63
|
+
|
|
64
|
+
## Critical Rules
|
|
65
|
+
|
|
66
|
+
- A relationship access inside a `foreach` without prior `load()` /
|
|
67
|
+
`with()` is `must-fix`.
|
|
68
|
+
- A `whereHas` / `whereDoesntHave` on an unindexed foreign-key
|
|
69
|
+
column is `must-fix`.
|
|
70
|
+
- An `update()` or `delete()` without an explicit `where()` is
|
|
71
|
+
`must-fix`, regardless of perceived safety.
|
|
72
|
+
- A `chunk()` over a query missing a stable `orderBy` on a unique
|
|
73
|
+
column is `must-fix` — silently skips rows.
|
|
74
|
+
- An eager-load of a relation no downstream caller reads is
|
|
75
|
+
`should-fix`.
|
|
76
|
+
|
|
77
|
+
## Workflows
|
|
78
|
+
|
|
79
|
+
1. List every loop, every `each()`, and every Blade partial called
|
|
80
|
+
in a loop in the diff. For each, name the relations it touches.
|
|
81
|
+
2. For every relation access, confirm it was eager-loaded at the
|
|
82
|
+
query producing the loop's collection.
|
|
83
|
+
3. For every new `where`, `whereHas`, `orderBy`, or `groupBy`,
|
|
84
|
+
name the column and confirm the index covering it (or flag
|
|
85
|
+
missing).
|
|
86
|
+
4. For every `update()` / `delete()` / `truncate()`, confirm the
|
|
87
|
+
predicate is bounded and idempotency is intentional.
|
|
88
|
+
5. Output: bullets with the emitted SQL shape, the trigger
|
|
89
|
+
(`file:line`), and severity. Suggest the eager-load or index
|
|
90
|
+
resolving each `must-fix` finding.
|
|
91
|
+
|
|
92
|
+
## Composes well with
|
|
93
|
+
|
|
94
|
+
- `backend-architect` — when an ORM change crosses a service seam.
|
|
95
|
+
- `qa` — when a query shape needs a regression test against a seed
|
|
96
|
+
dataset.
|