mandrel 2.0.0 → 2.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.
- package/.agents/README.md +59 -28
- package/.agents/agents/acceptance-critic.md +20 -9
- package/.agents/agents/story-worker.md +45 -48
- package/.agents/audit-checklists/performance.md +1 -1
- package/.agents/docs/SDLC.md +60 -46
- package/.agents/docs/agentrc-reference.json +8 -13
- package/.agents/docs/configuration.md +33 -57
- package/.agents/docs/execution-reference.md +39 -10
- package/.agents/docs/quality-gates.md +17 -19
- package/.agents/docs/workflows.md +6 -6
- package/.agents/instructions.md +64 -79
- package/.agents/rules/ci-remediation.md +3 -3
- package/.agents/rules/gherkin-standards.md +10 -0
- package/.agents/rules/git-conventions-reference.md +42 -51
- package/.agents/schemas/acceptance-eval-verdict.schema.json +2 -2
- package/.agents/schemas/agentrc.schema.json +35 -46
- package/.agents/schemas/audit-rules.json +59 -1
- package/.agents/schemas/audit-rules.schema.json +33 -1
- package/.agents/schemas/lifecycle/README.md +1 -2
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
- package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
- package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
- package/.agents/schemas/signal-event.schema.json +3 -3
- package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
- package/.agents/schemas/validation-evidence.schema.json +1 -1
- package/.agents/scripts/acceptance-eval.js +24 -68
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/bootstrap.js +3 -3
- package/.agents/scripts/check-dead-exports.js +43 -104
- package/.agents/scripts/check-doc-links.js +2 -2
- package/.agents/scripts/check-lifecycle-lint.js +1 -1
- package/.agents/scripts/check-workflow-cli-lint.js +91 -0
- package/.agents/scripts/deliver-recover.js +122 -0
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +20 -50
- package/.agents/scripts/generate-skills-index.js +17 -1
- package/.agents/scripts/generate-workflows-doc.js +4 -4
- package/.agents/scripts/lib/ITicketingProvider.js +1 -19
- package/.agents/scripts/lib/audit-suite/selector.js +323 -23
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -11
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
- package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -1
- package/.agents/scripts/lib/checks/index.js +1 -1
- package/.agents/scripts/lib/checks/loop-health.js +12 -11
- package/.agents/scripts/lib/checks/state.js +17 -248
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +3 -3
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
- package/.agents/scripts/lib/cli-args.js +23 -2
- package/.agents/scripts/lib/close-validation/gates.js +13 -13
- package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
- package/.agents/scripts/lib/close-validation/runner.js +13 -21
- package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
- package/.agents/scripts/lib/config/acceptance-eval.js +2 -2
- package/.agents/scripts/lib/config/delivery-routing.js +7 -6
- package/.agents/scripts/lib/config/explain.js +10 -16
- package/.agents/scripts/lib/config/github.js +7 -5
- package/.agents/scripts/lib/config/limits.js +15 -25
- package/.agents/scripts/lib/config/quality.js +11 -14
- package/.agents/scripts/lib/config/runners.js +8 -21
- package/.agents/scripts/lib/config/temp-paths.js +18 -56
- package/.agents/scripts/lib/config-settings-schema-delivery.js +34 -16
- package/.agents/scripts/lib/config-settings-schema-quality.js +9 -2
- package/.agents/scripts/lib/config-settings-schema.js +48 -22
- package/.agents/scripts/lib/dead-exports-knip.js +105 -0
- package/.agents/scripts/lib/dead-exports-mode.js +51 -0
- package/.agents/scripts/lib/duplicate-search.js +38 -7
- package/.agents/scripts/lib/findings/promote-finding.js +23 -14
- package/.agents/scripts/lib/format-generated-json.js +97 -0
- package/.agents/scripts/lib/framework-version.js +19 -189
- package/.agents/scripts/lib/gh-exec.js +8 -0
- package/.agents/scripts/lib/git-branch-lifecycle.js +0 -158
- package/.agents/scripts/lib/git-utils.js +0 -14
- package/.agents/scripts/lib/json-utils.js +1 -2
- package/.agents/scripts/lib/label-constants.js +0 -15
- package/.agents/scripts/lib/label-taxonomy.js +1 -12
- package/.agents/scripts/lib/observability/active-story-env.js +42 -163
- package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
- package/.agents/scripts/lib/observability/signal-validator.js +4 -4
- package/.agents/scripts/lib/observability/signals-writer.js +6 -82
- package/.agents/scripts/lib/observability/source-classifier.js +2 -2
- package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +43 -45
- package/.agents/scripts/lib/orchestration/change-set.js +103 -0
- package/.agents/scripts/lib/orchestration/code-review.js +70 -191
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +3 -3
- package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +9 -11
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +7 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
- package/.agents/scripts/lib/orchestration/merge-block-class.js +76 -20
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
- package/.agents/scripts/lib/orchestration/plan-context.js +116 -33
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +26 -36
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +31 -22
- package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +16 -6
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +173 -25
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +280 -100
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +472 -55
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +21 -16
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +230 -0
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +41 -40
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +1 -2
- package/.agents/scripts/lib/orchestration/planning/spec-authoring-grounding.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
- package/.agents/scripts/lib/orchestration/retro-proposals.js +7 -7
- package/.agents/scripts/lib/orchestration/review-depth.js +105 -40
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
- package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
- package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
- package/.agents/scripts/lib/orchestration/run-epilogue.js +374 -16
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +24 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +4 -13
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +72 -30
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +12 -8
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +264 -43
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +104 -279
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +191 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +120 -0
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +75 -14
- package/.agents/scripts/lib/orchestration/story-init-remote.js +12 -8
- package/.agents/scripts/lib/orchestration/story-plan-state.js +14 -29
- package/.agents/scripts/lib/orchestration/task-body-validator.js +52 -7
- package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +119 -14
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +3 -4
- package/.agents/scripts/lib/orchestration/ticket-validator.js +121 -18
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -47
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +19 -32
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +61 -1
- package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
- package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
- package/.agents/scripts/lib/planning-corpus.js +12 -286
- package/.agents/scripts/lib/preflight-runner.js +2 -2
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
- package/.agents/scripts/lib/signals/index.js +4 -17
- package/.agents/scripts/lib/signals/read.js +35 -35
- package/.agents/scripts/lib/signals/schema.js +8 -11
- package/.agents/scripts/lib/signals/span-tree.js +7 -7
- package/.agents/scripts/lib/signals/write.js +0 -1
- package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
- package/.agents/scripts/lib/skills/parse-skill.js +16 -3
- package/.agents/scripts/lib/story-adjacency.js +8 -7
- package/.agents/scripts/lib/story-body/story-body.js +81 -13
- package/.agents/scripts/lib/templates/decomposer-prompts.js +15 -16
- package/.agents/scripts/lib/test-env.js +14 -1
- package/.agents/scripts/lib/test-tiers.js +0 -3
- package/.agents/scripts/lib/ticket-body-sections.js +0 -14
- package/.agents/scripts/lib/validation-evidence.js +31 -59
- package/.agents/scripts/lib/wave-runner/live-probe.js +315 -0
- package/.agents/scripts/lib/wave-runner/ready-set.js +32 -6
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +68 -19
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
- package/.agents/scripts/plan-context.js +38 -7
- package/.agents/scripts/plan-critics.js +203 -0
- package/.agents/scripts/plan-persist.js +145 -35
- package/.agents/scripts/plan-run-epilogue.js +83 -38
- package/.agents/scripts/post-structured-comment.js +0 -38
- package/.agents/scripts/pr-watch-with-update.js +43 -22
- package/.agents/scripts/providers/github/compose.js +0 -1
- package/.agents/scripts/providers/github/errors.js +0 -19
- package/.agents/scripts/providers/github/issues.js +1 -11
- package/.agents/scripts/providers/github/mappers.js +5 -0
- package/.agents/scripts/providers/github/sub-issues.js +0 -47
- package/.agents/scripts/providers/github/tickets.js +33 -153
- package/.agents/scripts/providers/github.js +17 -6
- package/.agents/scripts/quality-preview.js +13 -6
- package/.agents/scripts/resolve-stories.js +236 -0
- package/.agents/scripts/run-coverage.js +4 -1
- package/.agents/scripts/run-lint.js +2 -2
- package/.agents/scripts/run-verify.js +31 -2
- package/.agents/scripts/signals-view.js +9 -10
- package/.agents/scripts/single-story-close.js +173 -18
- package/.agents/scripts/single-story-confirm-merge.js +288 -15
- package/.agents/scripts/single-story-init.js +6 -10
- package/.agents/scripts/stories-wave-tick.js +380 -53
- package/.agents/scripts/story-plan.js +3 -3
- package/.agents/scripts/update-ticket-state.js +8 -50
- package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
- package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
- package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
- package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
- package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
- package/.agents/skills/core/idea-refinement/SKILL.md +3 -3
- package/.agents/skills/core/scope-triage/SKILL.md +3 -0
- package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
- package/.agents/skills/core/security-and-hardening/reference.md +375 -0
- package/.agents/skills/skills.index.json +2 -12
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
- package/.agents/workflows/audit-architecture.md +3 -4
- package/.agents/workflows/audit-clean-code.md +4 -4
- package/.agents/workflows/audit-documentation.md +4 -5
- package/.agents/workflows/audit-lighthouse.md +8 -0
- package/.agents/workflows/audit-navigability.md +10 -0
- package/.agents/workflows/audit-performance.md +2 -3
- package/.agents/workflows/audit-quality.md +8 -9
- package/.agents/workflows/audit-security.md +1 -2
- package/.agents/workflows/audit-seo.md +10 -0
- package/.agents/workflows/audit-ux-ui.md +7 -0
- package/.agents/workflows/deliver.md +133 -45
- package/.agents/workflows/git-cleanup.md +2 -2
- package/.agents/workflows/git-deliver.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +34 -17
- package/.agents/workflows/helpers/code-quality-guardrails.md +15 -12
- package/.agents/workflows/helpers/code-review.md +14 -12
- package/.agents/workflows/helpers/deliver-story-reference.md +73 -32
- package/.agents/workflows/helpers/deliver-story.md +209 -118
- package/.agents/workflows/helpers/parallel-tooling.md +2 -2
- package/.agents/workflows/helpers/worktree-lifecycle.md +28 -32
- package/.agents/workflows/plan.md +239 -19
- package/.agents/workflows/qa-assist.md +6 -6
- package/.agents/workflows/qa-explore.md +3 -3
- package/.agents/workflows/qa-run.md +1 -5
- package/bin/mandrel.js +12 -1
- package/docs/CHANGELOG.md +62 -0
- package/lib/cli/registry.js +262 -19
- package/lib/cli/sync-agents.js +157 -0
- package/lib/cli/sync-commands.js +115 -6
- package/lib/cli/sync.js +168 -6
- package/lib/cli/update.js +105 -8
- package/lib/cli/version-helpers.js +131 -0
- package/lib/migrations/README.md +7 -5
- package/lib/migrations/index.js +17 -9
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +154 -0
- package/package.json +2 -2
- package/.agents/schemas/epic-perf-report.schema.json +0 -89
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
- package/.agents/schemas/risk-verdict.schema.json +0 -53
- package/.agents/schemas/story-perf-summary.schema.json +0 -73
- package/.agents/scripts/analyze-execution.js +0 -444
- package/.agents/scripts/check-prepush-recovery.js +0 -90
- package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
- package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -187
- package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
- package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
- package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +0 -128
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -273
- package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
- package/.agents/scripts/lib/orchestration/planning/risk-verdict.js +0 -104
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
- package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -21
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -397
- package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
- package/.agents/scripts/lib/orchestration/resolve-plan-run.js +0 -155
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
- package/.agents/scripts/lib/orchestration/story-progress/story-run-progress-writer.js +0 -400
- package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +0 -36
- package/.agents/scripts/resolve-plan-run.js +0 -117
- package/.agents/skills/core/analyze-execution/SKILL.md +0 -101
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
# Security and Hardening — Reference (on-demand)
|
|
2
|
+
|
|
3
|
+
**Read this when** a task engages one of the sections below and the Policy
|
|
4
|
+
Capsule in [`SKILL.md`](SKILL.md) does not settle it on its own. The capsule
|
|
5
|
+
is the contract; this file is the reference material behind it. Nothing here
|
|
6
|
+
relaxes a capsule MUST, and nothing here is required reading merely because
|
|
7
|
+
the skill is active.
|
|
8
|
+
|
|
9
|
+
## When to Use
|
|
10
|
+
|
|
11
|
+
- Building anything that accepts user input
|
|
12
|
+
- Implementing authentication or authorization
|
|
13
|
+
- Storing or transmitting sensitive data
|
|
14
|
+
- Integrating with external APIs or services
|
|
15
|
+
- Adding file uploads, webhooks, or callbacks
|
|
16
|
+
- Handling payment or PII data
|
|
17
|
+
|
|
18
|
+
## Security Surfacing, Not Runtime Pause
|
|
19
|
+
|
|
20
|
+
Some changes are not unsafe by themselves but expand the security surface
|
|
21
|
+
enough that the change must be **explicitly documented** in the PR
|
|
22
|
+
description and on the originating ticket so a reviewer can sign off in
|
|
23
|
+
band. Documenting them is the gate — they do **not** pause execution:
|
|
24
|
+
|
|
25
|
+
- Adding new authentication flows or changing auth logic
|
|
26
|
+
- Storing new categories of sensitive data (PII, payment info)
|
|
27
|
+
- Adding new external service integrations
|
|
28
|
+
- Changing CORS configuration
|
|
29
|
+
- Adding file upload handlers
|
|
30
|
+
- Modifying rate limiting or throttling
|
|
31
|
+
- Granting elevated permissions or roles
|
|
32
|
+
|
|
33
|
+
For each item that applies, call it out under a "Security surface" section
|
|
34
|
+
in the PR body and on the parent ticket, label the change `risk::high`,
|
|
35
|
+
and link the relevant `security-baseline.md` MUST. Reviewers gate the
|
|
36
|
+
merge; the agent keeps moving.
|
|
37
|
+
|
|
38
|
+
`agent::blocked` remains the **only** runtime pause label. Use it for
|
|
39
|
+
unrecoverable blockers (missing prerequisite, ambiguous spec a sub-agent
|
|
40
|
+
cannot resolve), not for "this change is sensitive." Sensitive changes
|
|
41
|
+
ship through the documentation path above.
|
|
42
|
+
|
|
43
|
+
## OWASP Top 10 Prevention Patterns
|
|
44
|
+
|
|
45
|
+
The patterns below show **how** to satisfy the MUSTs in
|
|
46
|
+
[`security-baseline.md`](../../../rules/security-baseline.md). The MUSTs
|
|
47
|
+
themselves (parameterize queries, hash passwords, encode output, verify
|
|
48
|
+
ownership, set headers, restrict CORS, exclude sensitive fields) are listed
|
|
49
|
+
in the rule.
|
|
50
|
+
|
|
51
|
+
### 1. Injection (SQL, NoSQL, OS Command)
|
|
52
|
+
|
|
53
|
+
See [security-baseline § Output & Rendering](../../../rules/security-baseline.md#output--rendering).
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// BAD: SQL injection via string concatenation
|
|
57
|
+
const query = `SELECT * FROM users WHERE id = '${userId}'`;
|
|
58
|
+
|
|
59
|
+
// GOOD: Parameterized query
|
|
60
|
+
const user = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
|
|
61
|
+
|
|
62
|
+
// GOOD: ORM with parameterized input
|
|
63
|
+
const user = await prisma.user.findUnique({ where: { id: userId } });
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 2. Broken Authentication
|
|
67
|
+
|
|
68
|
+
See [security-baseline § Authentication](../../../rules/security-baseline.md#authentication).
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
import { hash, compare } from 'bcrypt';
|
|
72
|
+
|
|
73
|
+
const SALT_ROUNDS = 12;
|
|
74
|
+
const hashedPassword = await hash(plaintext, SALT_ROUNDS);
|
|
75
|
+
const isValid = await compare(plaintext, hashedPassword);
|
|
76
|
+
|
|
77
|
+
// Session management
|
|
78
|
+
app.use(
|
|
79
|
+
session({
|
|
80
|
+
secret: process.env.SESSION_SECRET, // From environment, not code
|
|
81
|
+
resave: false,
|
|
82
|
+
saveUninitialized: false,
|
|
83
|
+
cookie: {
|
|
84
|
+
httpOnly: true,
|
|
85
|
+
secure: true,
|
|
86
|
+
sameSite: 'lax',
|
|
87
|
+
maxAge: 24 * 60 * 60 * 1000,
|
|
88
|
+
},
|
|
89
|
+
}),
|
|
90
|
+
);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 3. Cross-Site Scripting (XSS)
|
|
94
|
+
|
|
95
|
+
See [security-baseline § Output & Rendering](../../../rules/security-baseline.md#output--rendering).
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// BAD: Rendering user input as HTML
|
|
99
|
+
element.innerHTML = userInput;
|
|
100
|
+
|
|
101
|
+
// GOOD: Use framework auto-escaping (React does this by default)
|
|
102
|
+
return <div>{userInput}</div>;
|
|
103
|
+
|
|
104
|
+
// If you MUST render HTML, sanitize first
|
|
105
|
+
import DOMPurify from 'dompurify';
|
|
106
|
+
const clean = DOMPurify.sanitize(userInput);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 4. Broken Access Control
|
|
110
|
+
|
|
111
|
+
See [security-baseline § Authorization](../../../rules/security-baseline.md#authorization).
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
app.patch('/api/tasks/:id', authenticate, async (req, res) => {
|
|
115
|
+
const task = await taskService.findById(req.params.id);
|
|
116
|
+
|
|
117
|
+
if (task.ownerId !== req.user.id) {
|
|
118
|
+
return res.status(403).json({
|
|
119
|
+
error: {
|
|
120
|
+
code: 'FORBIDDEN',
|
|
121
|
+
message: 'Not authorized to modify this task',
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const updated = await taskService.update(req.params.id, req.body);
|
|
127
|
+
return res.json(updated);
|
|
128
|
+
});
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 5. Security Misconfiguration
|
|
132
|
+
|
|
133
|
+
See [security-baseline § Transport & Headers](../../../rules/security-baseline.md#transport--headers).
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import helmet from 'helmet';
|
|
137
|
+
app.use(helmet());
|
|
138
|
+
|
|
139
|
+
app.use(
|
|
140
|
+
helmet.contentSecurityPolicy({
|
|
141
|
+
directives: {
|
|
142
|
+
defaultSrc: ["'self'"],
|
|
143
|
+
scriptSrc: ["'self'"],
|
|
144
|
+
styleSrc: ["'self'", "'unsafe-inline'"],
|
|
145
|
+
imgSrc: ["'self'", 'data:', 'https:'],
|
|
146
|
+
connectSrc: ["'self'"],
|
|
147
|
+
},
|
|
148
|
+
}),
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
app.use(
|
|
152
|
+
cors({
|
|
153
|
+
origin: process.env.ALLOWED_ORIGINS?.split(',') || 'http://localhost:3000',
|
|
154
|
+
credentials: true,
|
|
155
|
+
}),
|
|
156
|
+
);
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 6. Sensitive Data Exposure
|
|
160
|
+
|
|
161
|
+
See [security-baseline § Output & Rendering](../../../rules/security-baseline.md#output--rendering)
|
|
162
|
+
and [§ Secrets Management](../../../rules/security-baseline.md#secrets-management).
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
function sanitizeUser(user: UserRecord): PublicUser {
|
|
166
|
+
const { passwordHash, resetToken, ...publicFields } = user;
|
|
167
|
+
return publicFields;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const API_KEY = process.env.STRIPE_API_KEY;
|
|
171
|
+
if (!API_KEY) throw new Error('STRIPE_API_KEY not configured');
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Input Validation Patterns
|
|
175
|
+
|
|
176
|
+
See [security-baseline § Input Validation](../../../rules/security-baseline.md#input-validation).
|
|
177
|
+
|
|
178
|
+
### Schema Validation at Boundaries
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
import { z } from 'zod';
|
|
182
|
+
|
|
183
|
+
const CreateTaskSchema = z.object({
|
|
184
|
+
title: z.string().min(1).max(200).trim(),
|
|
185
|
+
description: z.string().max(2000).optional(),
|
|
186
|
+
priority: z.enum(['low', 'medium', 'high']).default('medium'),
|
|
187
|
+
dueDate: z.string().datetime().optional(),
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
app.post('/api/tasks', async (req, res) => {
|
|
191
|
+
const result = CreateTaskSchema.safeParse(req.body);
|
|
192
|
+
if (!result.success) {
|
|
193
|
+
return res.status(422).json({
|
|
194
|
+
error: {
|
|
195
|
+
code: 'VALIDATION_ERROR',
|
|
196
|
+
message: 'Invalid input',
|
|
197
|
+
details: result.error.flatten(),
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
const task = await taskService.create(result.data);
|
|
202
|
+
return res.status(201).json(task);
|
|
203
|
+
});
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### File Upload Safety
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
const ALLOWED_TYPES = ['image/jpeg', 'image/png', 'image/webp'];
|
|
210
|
+
const MAX_SIZE = 5 * 1024 * 1024; // 5MB
|
|
211
|
+
|
|
212
|
+
function validateUpload(file: UploadedFile) {
|
|
213
|
+
if (!ALLOWED_TYPES.includes(file.mimetype)) {
|
|
214
|
+
throw new ValidationError('File type not allowed');
|
|
215
|
+
}
|
|
216
|
+
if (file.size > MAX_SIZE) {
|
|
217
|
+
throw new ValidationError('File too large (max 5MB)');
|
|
218
|
+
}
|
|
219
|
+
// Don't trust the file extension — check magic bytes if critical
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Triaging npm audit Results
|
|
224
|
+
|
|
225
|
+
The MUST is in [security-baseline § Dependency Hygiene](../../../rules/security-baseline.md#dependency-hygiene).
|
|
226
|
+
This decision tree shows how to prioritize:
|
|
227
|
+
|
|
228
|
+
```text
|
|
229
|
+
npm audit reports a vulnerability
|
|
230
|
+
├── Severity: critical or high
|
|
231
|
+
│ ├── Is the vulnerable code reachable in your app?
|
|
232
|
+
│ │ ├── YES --> Fix immediately (update, patch, or replace the dependency)
|
|
233
|
+
│ │ └── NO (dev-only dep, unused code path) --> Fix soon, but not a blocker
|
|
234
|
+
│ └── Is a fix available?
|
|
235
|
+
│ ├── YES --> Update to the patched version
|
|
236
|
+
│ └── NO --> Check for workarounds, consider replacing the dependency, or add to allowlist with a review date
|
|
237
|
+
├── Severity: moderate
|
|
238
|
+
│ ├── Reachable in production? --> Fix in the next release cycle
|
|
239
|
+
│ └── Dev-only? --> Fix when convenient, track in backlog
|
|
240
|
+
└── Severity: low
|
|
241
|
+
└── Track and fix during regular dependency updates
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Key questions:**
|
|
245
|
+
|
|
246
|
+
- Is the vulnerable function actually called in your code path?
|
|
247
|
+
- Is the dependency a runtime dependency or dev-only?
|
|
248
|
+
- Is the vulnerability exploitable given your deployment context (e.g., a
|
|
249
|
+
server-side vulnerability in a client-only app)?
|
|
250
|
+
|
|
251
|
+
When you defer a fix, document the reason and set a review date.
|
|
252
|
+
|
|
253
|
+
## Rate Limiting
|
|
254
|
+
|
|
255
|
+
```typescript
|
|
256
|
+
import rateLimit from 'express-rate-limit';
|
|
257
|
+
|
|
258
|
+
// General API rate limit
|
|
259
|
+
app.use(
|
|
260
|
+
'/api/',
|
|
261
|
+
rateLimit({
|
|
262
|
+
windowMs: 15 * 60 * 1000,
|
|
263
|
+
max: 100,
|
|
264
|
+
standardHeaders: true,
|
|
265
|
+
legacyHeaders: false,
|
|
266
|
+
}),
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
// Stricter limit for auth endpoints (the rule MUSTs rate-limiting on auth)
|
|
270
|
+
app.use(
|
|
271
|
+
'/api/auth/',
|
|
272
|
+
rateLimit({
|
|
273
|
+
windowMs: 15 * 60 * 1000,
|
|
274
|
+
max: 10,
|
|
275
|
+
}),
|
|
276
|
+
);
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Secrets Management Layout
|
|
280
|
+
|
|
281
|
+
See [security-baseline § Secrets Management](../../../rules/security-baseline.md#secrets-management).
|
|
282
|
+
|
|
283
|
+
```text
|
|
284
|
+
.env files:
|
|
285
|
+
├── .env.example → Committed (template with placeholder values)
|
|
286
|
+
├── .env → NOT committed (contains real secrets)
|
|
287
|
+
└── .env.local → NOT committed (local overrides)
|
|
288
|
+
|
|
289
|
+
.gitignore must include:
|
|
290
|
+
.env
|
|
291
|
+
.env.local
|
|
292
|
+
.env.*.local
|
|
293
|
+
*.pem
|
|
294
|
+
*.key
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**Always check before committing:**
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
# Check for accidentally staged secrets
|
|
301
|
+
git diff --cached | grep -i "password\|secret\|api_key\|token"
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## Security Review Checklist
|
|
305
|
+
|
|
306
|
+
Use this when reviewing your own change before requesting human review. Each
|
|
307
|
+
item maps to a section in
|
|
308
|
+
[`security-baseline.md`](../../../rules/security-baseline.md).
|
|
309
|
+
|
|
310
|
+
```markdown
|
|
311
|
+
### Authentication
|
|
312
|
+
|
|
313
|
+
- [ ] Passwords hashed with bcrypt/scrypt/argon2 (salt rounds ≥ 12)
|
|
314
|
+
- [ ] Session tokens are httpOnly, secure, sameSite
|
|
315
|
+
- [ ] Login has rate limiting
|
|
316
|
+
- [ ] Password reset tokens expire
|
|
317
|
+
|
|
318
|
+
### Authorization
|
|
319
|
+
|
|
320
|
+
- [ ] Every endpoint checks user permissions
|
|
321
|
+
- [ ] Users can only access their own resources
|
|
322
|
+
- [ ] Admin actions require admin role verification
|
|
323
|
+
|
|
324
|
+
### Input
|
|
325
|
+
|
|
326
|
+
- [ ] All user input validated at the boundary
|
|
327
|
+
- [ ] SQL queries are parameterized
|
|
328
|
+
- [ ] HTML output is encoded/escaped
|
|
329
|
+
|
|
330
|
+
### Data
|
|
331
|
+
|
|
332
|
+
- [ ] No secrets in code or version control
|
|
333
|
+
- [ ] Sensitive fields excluded from API responses
|
|
334
|
+
- [ ] PII encrypted at rest (if applicable)
|
|
335
|
+
|
|
336
|
+
### Infrastructure
|
|
337
|
+
|
|
338
|
+
- [ ] Security headers configured (CSP, HSTS, etc.)
|
|
339
|
+
- [ ] CORS restricted to known origins
|
|
340
|
+
- [ ] Dependencies audited for vulnerabilities
|
|
341
|
+
- [ ] Error messages don't expose internals
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
## Common Rationalizations
|
|
345
|
+
|
|
346
|
+
| Rationalization | Reality |
|
|
347
|
+
| --------------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
348
|
+
| "This is an internal tool, security doesn't matter" | Internal tools get compromised. Attackers target the weakest link. |
|
|
349
|
+
| "We'll add security later" | Security retrofitting is 10x harder than building it in. Add it now. |
|
|
350
|
+
| "No one would try to exploit this" | Automated scanners will find it. Security by obscurity is not security. |
|
|
351
|
+
| "The framework handles security" | Frameworks provide tools, not guarantees. You still need to use them correctly. |
|
|
352
|
+
| "It's just a prototype" | Prototypes become production. Security habits from day one. |
|
|
353
|
+
|
|
354
|
+
## Red Flags
|
|
355
|
+
|
|
356
|
+
- User input passed directly to database queries, shell commands, or HTML
|
|
357
|
+
rendering
|
|
358
|
+
- Secrets in source code or commit history
|
|
359
|
+
- API endpoints without authentication or authorization checks
|
|
360
|
+
- Missing CORS configuration or wildcard (`*`) origins
|
|
361
|
+
- No rate limiting on authentication endpoints
|
|
362
|
+
- Stack traces or internal errors exposed to users
|
|
363
|
+
- Dependencies with known critical vulnerabilities
|
|
364
|
+
|
|
365
|
+
## Verification
|
|
366
|
+
|
|
367
|
+
After implementing security-relevant code, confirm against the rule:
|
|
368
|
+
|
|
369
|
+
- [ ] `npm audit` shows no critical or high vulnerabilities
|
|
370
|
+
- [ ] No secrets in source code or git history
|
|
371
|
+
- [ ] All user input validated at system boundaries
|
|
372
|
+
- [ ] Authentication and authorization checked on every protected endpoint
|
|
373
|
+
- [ ] Security headers present in response (check with browser DevTools)
|
|
374
|
+
- [ ] Error responses don't expose internal details
|
|
375
|
+
- [ ] Rate limiting active on auth endpoints
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-07-
|
|
2
|
+
"generatedAt": "2026-07-16T20:44:41.281Z",
|
|
3
3
|
"generator": "generate-skills-index.js@1",
|
|
4
4
|
"skills": [
|
|
5
|
-
{
|
|
6
|
-
"name": "analyze-execution",
|
|
7
|
-
"tier": "core",
|
|
8
|
-
"category": "core",
|
|
9
|
-
"path": ".agents/skills/core/analyze-execution/SKILL.md",
|
|
10
|
-
"description": "Aggregate per-Story or per-plan-run execution signals into a structured perf-summary or perf-report and upsert it onto the corresponding GitHub ticket. Use after a Story closes (Story mode) or during run closeout (plan-run mode). Reads NDJSON via `lib/signals/read` and writes a single structured comment.",
|
|
11
|
-
"policyCapsuleBullets": 8,
|
|
12
|
-
"allowedTools": ["Read", "Bash"],
|
|
13
|
-
"vendor": null
|
|
14
|
-
},
|
|
15
5
|
{
|
|
16
6
|
"name": "api-and-interface-design",
|
|
17
7
|
"tier": "core",
|
|
@@ -118,7 +108,7 @@
|
|
|
118
108
|
"category": "core",
|
|
119
109
|
"path": ".agents/skills/core/scope-triage/SKILL.md",
|
|
120
110
|
"description": "Optional split-advisory for `/plan`. Under v2 there is no epic|story routing verdict — `/plan` always authors Stories. Use this skill only when judging whether a draft should stay one Story or legitimately split (near-zero overlap or an architectural seam).",
|
|
121
|
-
"policyCapsuleBullets":
|
|
111
|
+
"policyCapsuleBullets": 5,
|
|
122
112
|
"allowedTools": null,
|
|
123
113
|
"vendor": null
|
|
124
114
|
},
|
|
@@ -122,9 +122,8 @@ authoring.
|
|
|
122
122
|
expression across jobs — tag-sharding makes flake triage non-deterministic.
|
|
123
123
|
- Run `bddgen` once per job before `playwright test`; cache the generated
|
|
124
124
|
directory only if the cache key includes every `.feature` and step file.
|
|
125
|
-
- Publish the Cucumber HTML/JSON report as the evidence artifact
|
|
126
|
-
|
|
127
|
-
zips.
|
|
125
|
+
- Publish the Cucumber HTML/JSON report as the evidence artifact, alongside
|
|
126
|
+
the Playwright HTML report and any trace zips.
|
|
128
127
|
- Quarantine `@flaky` scenarios with a dedicated job that does not gate the
|
|
129
128
|
merge queue; do not silently retry flakes in the main suite.
|
|
130
129
|
|
|
@@ -185,4 +184,3 @@ those outcomes.
|
|
|
185
184
|
- Scenario authoring rules: `.agents/rules/gherkin-standards.md`.
|
|
186
185
|
- Browser-level conventions: `.agents/skills/stack/qa/playwright/SKILL.md`.
|
|
187
186
|
- Operator entry point: `.agents/workflows/qa-run.md`.
|
|
188
|
-
- Evidence handoff: `.agents/workflows/helpers/epic-testing.md`.
|
|
@@ -91,7 +91,7 @@ source, route definitions, and rendered markup rather than a running browser.
|
|
|
91
91
|
|
|
92
92
|
The agent-driven Capture phase is **strictly read-only**. This invariant is
|
|
93
93
|
inviolable per [`security-baseline.md`](../../../../rules/security-baseline.md)
|
|
94
|
-
and the
|
|
94
|
+
and the Story's security considerations — it is not a soft preference.
|
|
95
95
|
|
|
96
96
|
- **No source edits.** The agent does not modify application code, config, or
|
|
97
97
|
tests while driving. Exploration observes; it never repairs.
|
|
@@ -192,9 +192,7 @@ Bundle findings **by likely root cause** into proposed follow-up tickets with
|
|
|
192
192
|
`Depends-on` / `Blocks` relationships, then present the draft for operator
|
|
193
193
|
approval. The harness **MUST NOT** create tickets autonomously — it stops at a
|
|
194
194
|
draft. The operator-approval gate is the safety boundary against spurious
|
|
195
|
-
filing.
|
|
196
|
-
**approved** findings to the Epic-testing helper for attachment to the Epic's
|
|
197
|
-
QA evidence ticket.
|
|
195
|
+
filing.
|
|
198
196
|
|
|
199
197
|
## 6. Sign-In & Contract Discipline
|
|
200
198
|
|
|
@@ -19,8 +19,7 @@ existing external APIs or business logic.
|
|
|
19
19
|
## Execution strategy (dual-path)
|
|
20
20
|
|
|
21
21
|
This lens runs along one of two execution paths. Both emit the **identical**
|
|
22
|
-
report contract (Step 3); downstream consumers (
|
|
23
|
-
epic-audit, `audit-to-stories`) are agnostic to which path produced it.
|
|
22
|
+
report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
|
|
24
23
|
|
|
25
24
|
- **Orchestrated (dynamic-workflow) path.** When Claude Code's
|
|
26
25
|
[dynamic workflows](https://code.claude.com/docs/en/workflows) are
|
|
@@ -218,7 +217,7 @@ Evaluate the gathered context against the following clean code dimensions:
|
|
|
218
217
|
gates, baseline kinds, close-validation steps, dependencies, or
|
|
219
218
|
harness subsystems under this dimension.
|
|
220
219
|
|
|
221
|
-
**Scope-mode behavior.** When this lens is invoked in
|
|
220
|
+
**Scope-mode behavior.** When this lens is invoked in Story scope (the
|
|
222
221
|
`{{changedFiles}}` block above is populated with a file list), the
|
|
223
222
|
maturity assessment for this dimension is a repo-wide property that
|
|
224
223
|
cannot be represented by a small changeset. In that case, render the
|
|
@@ -269,7 +268,7 @@ architectural pain points and areas for simplification.]
|
|
|
269
268
|
## Architecture Guardrail Coverage
|
|
270
269
|
|
|
271
270
|
[Codebase-wide mode: complete this section using the maturity rubric in
|
|
272
|
-
Step 2.
|
|
271
|
+
Step 2. Story-scoped run: set `Current Maturity` to
|
|
273
272
|
`Not Assessed — scoped run` and leave the remaining fields empty or
|
|
274
273
|
marked `n/a`.]
|
|
275
274
|
|
|
@@ -39,8 +39,7 @@ before this section existed.
|
|
|
39
39
|
## Execution strategy (dual-path)
|
|
40
40
|
|
|
41
41
|
This lens runs along one of two execution paths. Both emit the **identical**
|
|
42
|
-
report contract (Step 3); downstream consumers (
|
|
43
|
-
epic-audit, `audit-to-stories`) are agnostic to which path produced it.
|
|
42
|
+
report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
|
|
44
43
|
|
|
45
44
|
- **Orchestrated (dynamic-workflow) path.** When Claude Code's
|
|
46
45
|
[dynamic workflows](https://code.claude.com/docs/en/workflows) are
|
|
@@ -102,8 +101,9 @@ Analyze the repository with a focus on:
|
|
|
102
101
|
cyclomatic complexity > 8 (`delivery.quality.codingGuardrails.cyclomaticFlag`)
|
|
103
102
|
is **flag in review** (annotate or split); > 12
|
|
104
103
|
(`codingGuardrails.cyclomaticMustFix`) is **must-fix** before the work merges.
|
|
105
|
-
A per-file MI drop
|
|
106
|
-
|
|
104
|
+
A per-file MI drop beyond the configured
|
|
105
|
+
`delivery.quality.gates.maintainability.tolerance` (default 0.5pt) requires
|
|
106
|
+
a refactor in the same Story rather than a baseline bump.
|
|
107
107
|
- **Duplication:** Find "copy-paste" logic that should be abstracted into
|
|
108
108
|
reusable utilities or hooks.
|
|
109
109
|
- **Component Health:** In UI code, look for "component bloat" (files > 300
|
|
@@ -16,7 +16,7 @@ renamed, scripts move, described workflows change shape, and
|
|
|
16
16
|
version/topology claims go stale. The deterministic gates
|
|
17
17
|
(`check-doc-links.js`, `check-lifecycle-doc-drift.js`,
|
|
18
18
|
`validate-docs-freshness.js`) catch broken links, drift against generators,
|
|
19
|
-
and
|
|
19
|
+
and per-delivery freshness — they cannot tell whether the prose still
|
|
20
20
|
describes how the code actually behaves. That semantic verification is this
|
|
21
21
|
lens's job.
|
|
22
22
|
|
|
@@ -71,8 +71,7 @@ before this section existed.
|
|
|
71
71
|
## Execution strategy (dual-path)
|
|
72
72
|
|
|
73
73
|
This lens runs along one of two execution paths. Both emit the **identical**
|
|
74
|
-
report contract (Step 3); downstream consumers (
|
|
75
|
-
epic-audit, `audit-to-stories`) are agnostic to which path produced it.
|
|
74
|
+
report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
|
|
76
75
|
|
|
77
76
|
- **Orchestrated (dynamic-workflow) path.** When Claude Code's
|
|
78
77
|
[dynamic workflows](https://code.claude.com/docs/en/workflows) are
|
|
@@ -279,8 +278,8 @@ match the code), the deterministic-gate verdicts, and primary drift themes.]
|
|
|
279
278
|
## Periodic full-scope sweep
|
|
280
279
|
|
|
281
280
|
Context Economy findings accrete slowly — a doc that is lean today grows a
|
|
282
|
-
bloated tail over many
|
|
283
|
-
|
|
281
|
+
bloated tail over many deliveries, and no single change-set-scoped `/deliver`
|
|
282
|
+
run sees the whole picture. Run this lens **full-scope** on a
|
|
284
283
|
recurring cadence so the drift is caught before it compounds:
|
|
285
284
|
|
|
286
285
|
- **Scheduled invocation** — `/schedule` running `/audit-documentation`
|
|
@@ -5,6 +5,14 @@ command: false
|
|
|
5
5
|
|
|
6
6
|
# Lighthouse Audit & Analysis
|
|
7
7
|
|
|
8
|
+
## Applicability
|
|
9
|
+
|
|
10
|
+
**Web targets only.** Registered with `target: "web"` in
|
|
11
|
+
[`audit-rules.json`](../schemas/audit-rules.json): the selector skips this lens
|
|
12
|
+
on a project with no web surface, since there is no page to launch Lighthouse
|
|
13
|
+
against. See the `target` key's schema description for how applicability is
|
|
14
|
+
probed from the consumer's checkout.
|
|
15
|
+
|
|
8
16
|
## Role
|
|
9
17
|
|
|
10
18
|
Senior Web Performance & Quality Engineer. You operate Lighthouse end-to-end:
|
|
@@ -8,6 +8,16 @@ description: >-
|
|
|
8
8
|
|
|
9
9
|
# Navigability Audit
|
|
10
10
|
|
|
11
|
+
## Applicability
|
|
12
|
+
|
|
13
|
+
**Web targets only.** Registered with `target: "web"` in
|
|
14
|
+
[`audit-rules.json`](../schemas/audit-rules.json). This is consistent with the
|
|
15
|
+
lens's own no-op contract below rather than an additional constraint: the
|
|
16
|
+
web-surface probe's first signal _is_ configured `routeGlobs`, so a consumer
|
|
17
|
+
that has configured this lens's route-tree SSOT always clears the gate. The
|
|
18
|
+
gate only bites where the lens had no route data to read anyway — it converts a
|
|
19
|
+
silent no-op run into no run at all.
|
|
20
|
+
|
|
11
21
|
## Role
|
|
12
22
|
|
|
13
23
|
Information-Architecture Reviewer & Frontend Navigation Auditor
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Audit hot paths, algorithmic complexity, and I/O bottlenecks in the tooling surface (`
|
|
2
|
+
description: Audit hot paths, algorithmic complexity, and I/O bottlenecks in the tooling surface (`single-story-close`, dispatcher, gates); propose remediations.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# Performance & Bottleneck Audit
|
|
@@ -38,8 +38,7 @@ before this section existed.
|
|
|
38
38
|
## Execution strategy (dual-path)
|
|
39
39
|
|
|
40
40
|
This lens runs along one of two execution paths. Both emit the **identical**
|
|
41
|
-
report contract (Step 3); downstream consumers (
|
|
42
|
-
epic-audit, `audit-to-stories`) are agnostic to which path produced it.
|
|
41
|
+
report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
|
|
43
42
|
|
|
44
43
|
- **Orchestrated (dynamic-workflow) path.** When Claude Code's
|
|
45
44
|
[dynamic workflows](https://code.claude.com/docs/en/workflows) are
|
|
@@ -15,7 +15,7 @@ infrastructure, test coverage, and overall quality assurance practices. Your
|
|
|
15
15
|
goal is to identify testing gaps, flaky tests, inefficient mocking strategies,
|
|
16
16
|
and opportunities to improve test execution speed and reliability without making
|
|
17
17
|
any immediate changes. Additionally, you must evaluate the implemented tests
|
|
18
|
-
against the
|
|
18
|
+
against the Story under audit and the current codebase to ensure all quality
|
|
19
19
|
requirements are met and correctly documented.
|
|
20
20
|
|
|
21
21
|
**Note on Testing Responsibilities**: When evaluating test maturity, note the
|
|
@@ -48,8 +48,7 @@ before this section existed.
|
|
|
48
48
|
## Execution strategy (dual-path)
|
|
49
49
|
|
|
50
50
|
This lens runs along one of two execution paths. Both emit the **identical**
|
|
51
|
-
report contract (Step 3); downstream consumers (
|
|
52
|
-
epic-audit, `audit-to-stories`) are agnostic to which path produced it.
|
|
51
|
+
report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
|
|
53
52
|
|
|
54
53
|
- **Orchestrated (dynamic-workflow) path.** When Claude Code's
|
|
55
54
|
[dynamic workflows](https://code.claude.com/docs/en/workflows) are
|
|
@@ -101,8 +100,8 @@ degrade to the sequential path.
|
|
|
101
100
|
|
|
102
101
|
## Step 0 - Project Context
|
|
103
102
|
|
|
104
|
-
1. Read the
|
|
105
|
-
and target features.
|
|
103
|
+
1. Read the Story under audit — its `## Goal`, inline `acceptance[]` /
|
|
104
|
+
`verify[]`, and folded `## Spec` — to identify the target features.
|
|
106
105
|
2. Identify the target codebase paths for the audit.
|
|
107
106
|
|
|
108
107
|
## Step 1: Context Gathering (Read-Only Scan)
|
|
@@ -116,8 +115,8 @@ files. Pay special attention to:
|
|
|
116
115
|
`playwright.config.ts`, `cypress.json`).
|
|
117
116
|
- Test directories and files (e.g., `__tests__/`, `spec/`, `e2e/`, `*.test.ts`,
|
|
118
117
|
`*.spec.js`).
|
|
119
|
-
- The
|
|
120
|
-
implemented tests.
|
|
118
|
+
- The Story's `acceptance[]` / `verify[]` arrays, to map expected behaviour
|
|
119
|
+
versus implemented tests.
|
|
121
120
|
- Mocking and stubbing setups (e.g., `__mocks__/`, `setupTests.js`, MSW
|
|
122
121
|
handlers).
|
|
123
122
|
- CI/CD workflow files to understand how and when tests are executed.
|
|
@@ -140,8 +139,8 @@ Evaluate the gathered context against the following test quality dimensions:
|
|
|
140
139
|
5. **Performance & Execution:** Find bottlenecks in the test suite, such as
|
|
141
140
|
unnecessary serial execution, heavy setup running too frequently, or
|
|
142
141
|
opportunities for parallelization.
|
|
143
|
-
6. **Requirement Alignment:** Cross-reference the
|
|
144
|
-
|
|
142
|
+
6. **Requirement Alignment:** Cross-reference the Story's `acceptance[]`
|
|
143
|
+
criteria to ensure they have corresponding and complete test coverage.
|
|
145
144
|
Verify that the implementation found in the codebase correctly matches the
|
|
146
145
|
architectural requirements and highlight any inconsistencies or gaps.
|
|
147
146
|
|
|
@@ -39,8 +39,7 @@ before this section existed.
|
|
|
39
39
|
## Execution strategy (dual-path)
|
|
40
40
|
|
|
41
41
|
This lens runs along one of two execution paths. Both emit the **identical**
|
|
42
|
-
report contract (Step 3); downstream consumers (
|
|
43
|
-
epic-audit, `audit-to-stories`) are agnostic to which path produced it.
|
|
42
|
+
report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
|
|
44
43
|
|
|
45
44
|
- **Orchestrated (dynamic-workflow) path.** When Claude Code's
|
|
46
45
|
[dynamic workflows](https://code.claude.com/docs/en/workflows) are
|
|
@@ -4,6 +4,16 @@ description: Audit SEO fundamentals and Generative Engine Optimization signals (
|
|
|
4
4
|
|
|
5
5
|
# SEO & Generative Engine Optimization Audit
|
|
6
6
|
|
|
7
|
+
## Applicability
|
|
8
|
+
|
|
9
|
+
**Web targets only.** This lens is registered with `target: "web"` in
|
|
10
|
+
[`audit-rules.json`](../schemas/audit-rules.json), so the selector skips it
|
|
11
|
+
entirely on a project with no web surface — however well its keyword triggers
|
|
12
|
+
match the ticket prose. Applicability is derived from the consumer's own
|
|
13
|
+
checkout (configured navigability `routeGlobs`, a declared web-framework
|
|
14
|
+
dependency, or a tracked `.html` / `.css` / `.jsx` / `.tsx` source file), not
|
|
15
|
+
from an `.agentrc` key, and the probe fails open when indeterminate.
|
|
16
|
+
|
|
7
17
|
## Role
|
|
8
18
|
|
|
9
19
|
Senior Technical SEO and Generative Engine Optimization (GEO) Specialist. You
|
|
@@ -4,6 +4,13 @@ description: Audit UX/UI consistency and design system adherence
|
|
|
4
4
|
|
|
5
5
|
# UX/UI & Design System Audit
|
|
6
6
|
|
|
7
|
+
## Applicability
|
|
8
|
+
|
|
9
|
+
**Web targets only.** Registered with `target: "web"` in
|
|
10
|
+
[`audit-rules.json`](../schemas/audit-rules.json): the selector skips this lens
|
|
11
|
+
on a project with no rendered frontend. See the `target` key's schema
|
|
12
|
+
description for how applicability is probed from the consumer's checkout.
|
|
13
|
+
|
|
7
14
|
## Role
|
|
8
15
|
|
|
9
16
|
Lead Product Designer & Frontend Architect
|