mandrel 1.93.0 → 2.0.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 -73
- package/.agents/agents/acceptance-critic.md +129 -0
- package/.agents/agents/story-worker.md +161 -0
- package/.agents/docs/SDLC.md +489 -1285
- package/.agents/docs/agentrc-reference.json +177 -67
- package/.agents/docs/configuration.md +108 -136
- package/.agents/docs/execution-reference.md +44 -22
- package/.agents/docs/quality-gates.md +13 -19
- package/.agents/docs/workflows.md +3 -3
- package/.agents/instructions.md +107 -108
- package/.agents/rules/ci-remediation.md +8 -12
- package/.agents/rules/git-conventions-reference.md +224 -0
- package/.agents/rules/git-conventions.md +42 -223
- package/.agents/rules/security-baseline.md +5 -0
- package/.agents/rules/testing-standards.md +106 -13
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +71 -201
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/risk-verdict.schema.json +0 -13
- package/.agents/scripts/acceptance-eval.js +62 -18
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/analyze-execution.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/check-context-budget.js +62 -5
- package/.agents/scripts/check-lifecycle-lint.js +6 -9
- package/.agents/scripts/check-prepush-recovery.js +1 -1
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- package/.agents/scripts/diagnose-friction.js +0 -6
- package/.agents/scripts/lib/Logger.js +6 -10
- package/.agents/scripts/lib/audit-suite/runner.js +2 -2
- package/.agents/scripts/lib/audit-suite/selector.js +5 -5
- package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
- package/.agents/scripts/lib/baselines/kernel.js +206 -18
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
- package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
- package/.agents/scripts/lib/checks/index.js +2 -1
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +16 -7
- package/.agents/scripts/lib/close-validation/gates.js +160 -22
- package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +103 -0
- package/.agents/scripts/lib/config/explain.js +57 -36
- package/.agents/scripts/lib/config/limits.js +17 -58
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +1 -1
- package/.agents/scripts/lib/config/runners.js +17 -50
- package/.agents/scripts/lib/config/temp-paths.js +19 -14
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +3 -8
- package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
- package/.agents/scripts/lib/config-settings-schema.js +52 -38
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +39 -4
- package/.agents/scripts/lib/duplicate-search.js +211 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +5 -5
- package/.agents/scripts/lib/framework-version.js +2 -3
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
- package/.agents/scripts/lib/git-utils.js +32 -6
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/label-constants.js +10 -23
- package/.agents/scripts/lib/label-taxonomy.js +9 -43
- package/.agents/scripts/lib/observability/active-story-env.js +112 -3
- package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
- package/.agents/scripts/lib/observability/source-classifier.js +3 -3
- package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
- package/.agents/scripts/lib/orchestration/code-review.js +20 -268
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
- package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
- package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +14 -14
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
- package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
- package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
- package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
- package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
- package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
- package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
- package/.agents/scripts/lib/planning-corpus.js +16 -11
- package/.agents/scripts/lib/preflight-runner.js +2 -2
- package/.agents/scripts/lib/provider-factory.js +1 -1
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/story-adjacency.js +11 -14
- package/.agents/scripts/lib/story-body/story-body.js +124 -70
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
- package/.agents/scripts/lib/validation-evidence.js +1 -1
- package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
- package/.agents/scripts/lint-issue-body.js +71 -40
- package/.agents/scripts/mandrel-update-preflight.js +1 -1
- package/.agents/scripts/notify.js +4 -3
- package/.agents/scripts/plan-context.js +64 -74
- package/.agents/scripts/plan-persist.js +121 -280
- package/.agents/scripts/plan-run-epilogue.js +97 -0
- package/.agents/scripts/post-structured-comment.js +38 -0
- package/.agents/scripts/providers/github/issues.js +17 -33
- package/.agents/scripts/providers/github/mappers.js +0 -12
- package/.agents/scripts/providers/github/tickets.js +2 -5
- package/.agents/scripts/resolve-plan-run.js +117 -0
- package/.agents/scripts/signals-view.js +24 -19
- package/.agents/scripts/single-story-close.js +11 -14
- package/.agents/scripts/single-story-confirm-merge.js +39 -23
- package/.agents/scripts/single-story-init.js +29 -20
- package/.agents/scripts/stories-wave-tick.js +6 -6
- package/.agents/scripts/story-plan.js +26 -47
- package/.agents/scripts/sync-claude-agents.js +165 -0
- package/.agents/scripts/update-ticket-state.js +37 -15
- package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
- package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
- package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
- package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
- package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
- package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
- package/.agents/skills/core/scope-triage/SKILL.md +28 -172
- package/.agents/skills/skills.index.json +8 -418
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +3 -3
- package/.agents/workflows/audit-clean-code.md +3 -3
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +5 -5
- package/.agents/workflows/audit-lighthouse.md +3 -3
- package/.agents/workflows/audit-navigability.md +3 -2
- package/.agents/workflows/audit-performance.md +3 -3
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +3 -3
- package/.agents/workflows/audit-security.md +3 -3
- package/.agents/workflows/audit-seo.md +3 -3
- package/.agents/workflows/audit-sre.md +3 -3
- package/.agents/workflows/audit-to-stories.md +20 -20
- package/.agents/workflows/audit-ux-ui.md +3 -3
- package/.agents/workflows/deliver.md +122 -131
- package/.agents/workflows/git-cleanup.md +3 -4
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
- package/.agents/workflows/helpers/code-review.md +70 -193
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
- package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
- package/.agents/workflows/helpers/parallel-tooling.md +1 -1
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
- package/.agents/workflows/mandrel-update.md +3 -2
- package/.agents/workflows/plan.md +112 -145
- package/.agents/workflows/qa-assist.md +24 -30
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -2
- package/README.md +9 -8
- package/docs/CHANGELOG.md +46 -0
- package/lib/cli/registry.js +95 -0
- package/lib/migrations/index.js +6 -5
- package/package.json +5 -3
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer-mobile.md +0 -120
- package/.agents/personas/engineer-web.md +0 -111
- package/.agents/personas/engineer.md +0 -119
- package/.agents/personas/product.md +0 -94
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/refactorer.md +0 -113
- package/.agents/personas/security-engineer.md +0 -112
- package/.agents/personas/sre.md +0 -86
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/personas/ux-designer.md +0 -95
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/dispatcher.js +0 -295
- package/.agents/scripts/epic-audit-prepare.js +0 -497
- package/.agents/scripts/epic-audit-recheck.js +0 -274
- package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
- package/.agents/scripts/epic-deliver-preflight.js +0 -462
- package/.agents/scripts/epic-deliver-prepare.js +0 -590
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-decompose.js +0 -54
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-plan-spec.js +0 -64
- package/.agents/scripts/epic-reconcile.js +0 -625
- package/.agents/scripts/lib/baseline-snapshot.js +0 -979
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
- package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
- package/.agents/scripts/lib/config/lifecycle.js +0 -40
- package/.agents/scripts/lib/config/preflight.js +0 -58
- package/.agents/scripts/lib/config/retro.js +0 -77
- package/.agents/scripts/lib/epic-merge-lock.js +0 -322
- package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
- package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -660
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -388
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -278
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
- package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
- package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
- package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
- package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
- package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
- package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -301
- package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
- package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
- package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
- package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
- package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
- package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
- package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
- package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
- package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
- package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
- package/.agents/scripts/lib/push-epic-retry.js +0 -209
- package/.agents/scripts/lib/spec/index.js +0 -36
- package/.agents/scripts/lib/spec/loader.js +0 -425
- package/.agents/scripts/lib/spec/state.js +0 -208
- package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
- package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
- package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
- package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
- package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
- package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
- package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
- package/.agents/scripts/lib/wave-runner/tick.js +0 -754
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
- package/.agents/scripts/lifecycle-emit.js +0 -510
- package/.agents/scripts/plan-critics.js +0 -199
- package/.agents/scripts/retro-run.js +0 -218
- package/.agents/scripts/standalone-feedback-rollup.js +0 -188
- package/.agents/scripts/story-close.js +0 -294
- package/.agents/scripts/story-init.js +0 -599
- package/.agents/scripts/story-phase.js +0 -369
- package/.agents/scripts/wave-tick.js +0 -335
- package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
- package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
- package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
- package/.agents/skills/core/code-simplification/SKILL.md +0 -389
- package/.agents/skills/core/context-engineering/SKILL.md +0 -309
- package/.agents/skills/core/context-engineering/examples.md +0 -58
- package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
- package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
- package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
- package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -413
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
- package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
- package/.agents/skills/core/idea-refinement/examples.md +0 -437
- package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
- package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
- package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
- package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
- package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
- package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
- package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
- package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
- package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
- package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
- package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
- package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
- package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
- package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
- package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
- package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
- package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
- package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
- package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
- package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
- package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
- package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
- package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
- package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
- package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
- package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
- package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
- package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
- package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
- package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
- package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
- package/.agents/workflows/helpers/deliver-epic.md +0 -955
- package/.agents/workflows/helpers/deliver-stories.md +0 -440
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
- package/.agents/workflows/helpers/epic-testing.md +0 -125
- package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
- package/.agents/workflows/helpers/plan-epic.md +0 -351
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# Git Conventions — Reference (on-demand)
|
|
2
|
+
|
|
3
|
+
**This rule applies when** you are reasoning about a git-history mechanic that
|
|
4
|
+
the always-on core [`git-conventions.md`](git-conventions.md) deliberately
|
|
5
|
+
summarizes: authoring a **contract change** (config/schema/lifecycle/label/API
|
|
6
|
+
shape), triaging a **push-hook false-negative**, resolving **shared-checkout
|
|
7
|
+
merge contention**, satisfying the **documentation-freshness gate**, or routing
|
|
8
|
+
a retrospective signal via a **`meta::*` label**. The core carries the
|
|
9
|
+
per-commit MUSTs; this file carries the detail behind them. Nothing here
|
|
10
|
+
relaxes a core MUST — read it when the matching work is in play.
|
|
11
|
+
|
|
12
|
+
## Contract Cutovers — No Shim Layer
|
|
13
|
+
|
|
14
|
+
Mandrel ships as the `mandrel` npm package, whose consumers pin an
|
|
15
|
+
exact lockfile version; they opt into breaks at upgrade time. Operator policy
|
|
16
|
+
for any contract change (config shape, baseline shape, schema, lifecycle
|
|
17
|
+
payload, ticket label, dispatch artifact, public API of a script) is
|
|
18
|
+
therefore:
|
|
19
|
+
|
|
20
|
+
1. **Hard cutovers only.** Contract changes ship as a single in-tree
|
|
21
|
+
migration of every producer and consumer. There is no parallel
|
|
22
|
+
old-shape support code, no read-side tolerance branch, and no
|
|
23
|
+
feature flag that toggles between the two shapes.
|
|
24
|
+
2. **The PR diff IS the migration.** A consumer upgrading to a release
|
|
25
|
+
with the change adopts the new shape by upgrading the
|
|
26
|
+
`mandrel` package (`mandrel update`). The PR that lands on
|
|
27
|
+
`main` already moved every internal call site; consumers move on the
|
|
28
|
+
same beat by upgrading.
|
|
29
|
+
3. **No deprecation ledger, no version-windowed sunsets.** The framework
|
|
30
|
+
does not track "to be removed in vX.Y" entries or run two shapes side
|
|
31
|
+
by side for a release window. If a shape changes, the old shape is
|
|
32
|
+
deleted in the same PR.
|
|
33
|
+
|
|
34
|
+
The codifying decision is **Epic #2646** (the "Hard-Cutover Cleanup Epic"),
|
|
35
|
+
which deleted the existing compatibility shim layer across
|
|
36
|
+
`config-resolver.js`, `lib/config/*.js`, `lib/baselines/`,
|
|
37
|
+
`wave-session.js`, `IExecutionAdapter` / `ManualDispatchAdapter`, lifecycle
|
|
38
|
+
emit shims, and duplicate progress/comment writers in one pass. The
|
|
39
|
+
per-finding closing references (audit Findings #10, #11, #13, #17) live in
|
|
40
|
+
the merged PRs and the Epic #2646 history; the standing forward-looking
|
|
41
|
+
audit lives at [`docs/roadmap.md`](../../docs/roadmap.md) (Part 1 — Model-Evolution Audit).
|
|
42
|
+
|
|
43
|
+
Practical guidance when authoring a contract change:
|
|
44
|
+
|
|
45
|
+
- If you are tempted to add a "legacy shape" branch in a parser or
|
|
46
|
+
resolver, **don't** — update every call site instead, and delete the
|
|
47
|
+
old shape in the same PR.
|
|
48
|
+
- If you cannot land every call site in a single PR (e.g. a
|
|
49
|
+
cross-repository change), the contract change is too large for one
|
|
50
|
+
hard cutover. Split the contract itself, not the rollout.
|
|
51
|
+
- Schema versions remain useful as **identifiers** (so a future consumer
|
|
52
|
+
can detect "I cannot read this artifact"); they are **not** an
|
|
53
|
+
invitation to keep multiple readers alive in the same release.
|
|
54
|
+
|
|
55
|
+
## Push Validation — the known false-negative signature
|
|
56
|
+
|
|
57
|
+
The core rule is: **never bypass hooks** (`--no-verify`, `--no-gpg-sign`, or
|
|
58
|
+
other hook-skipping flags) unless the operator explicitly authorizes it, and
|
|
59
|
+
if a hook fails, investigate the underlying cause. One recognized exception
|
|
60
|
+
signature is worth naming:
|
|
61
|
+
|
|
62
|
+
- **Known false-negative signature**: a `pre-push`/`pre-commit` failure
|
|
63
|
+
whose message is a _zero-match_ error (e.g. Biome's
|
|
64
|
+
`No files were processed in the specified paths`) rather than a
|
|
65
|
+
reported violation, combined with an agent CWD under a harness-managed
|
|
66
|
+
worktree path a consumer's lint config ignores (e.g.
|
|
67
|
+
`.claude/worktrees/<name>/` against a `files.includes` glob like
|
|
68
|
+
`"!**/.claude"`), is a **consumer-tooling gap**, not a real lint
|
|
69
|
+
failure. It does not authorize `--no-verify`. See
|
|
70
|
+
[`worktree-lifecycle.md` § Harness-worktree ⇄ consumer-lint-ignore interaction](../workflows/helpers/worktree-lifecycle.md#harness-worktree-consumer-lint-ignore-interaction-story-152)
|
|
71
|
+
for the recognition signature and the sanctioned consumer-side fix
|
|
72
|
+
(`--no-errors-on-unmatched` or equivalent) before escalating via
|
|
73
|
+
`agent::blocked`.
|
|
74
|
+
|
|
75
|
+
## Local checkout hygiene — full mechanics
|
|
76
|
+
|
|
77
|
+
**Invariant (stated in the core): the delivering flow owns tidying the local
|
|
78
|
+
checkout — reaping its own merged refs and fast-forwarding the base branch.
|
|
79
|
+
`/git-cleanup` is a recovery tool, not a routine chore.** The mechanics behind
|
|
80
|
+
that invariant:
|
|
81
|
+
|
|
82
|
+
Every flow that lands work — `/deliver` and `/git-deliver` — is responsible
|
|
83
|
+
for leaving the local checkout tidy without
|
|
84
|
+
operator intervention:
|
|
85
|
+
|
|
86
|
+
- **Fast-forwarding the base branch is owned by the flow.** `/deliver`
|
|
87
|
+
fast-forwards `main` itself in its cleanup phase (via
|
|
88
|
+
`git-cleanup.js --fast-forward-main --execute --yes`). No workflow ends by
|
|
89
|
+
telling the operator to "run `/git-cleanup` afterwards to catch up".
|
|
90
|
+
- **Reaping merged local refs is owned by the flow's next boot.** `/plan` and
|
|
91
|
+
`/git-deliver` open with a **protected boot sweep**
|
|
92
|
+
(`boot-sweep.js`) that fast-forwards `main`, prunes stale remote-tracking
|
|
93
|
+
refs, and reaps every local branch whose PR is already merged — skipping any
|
|
94
|
+
candidate with unpushed work, a dirty worktree, or a still-open parent
|
|
95
|
+
ticket. A branch a flow leaves behind (e.g. a `/git-deliver` feature branch
|
|
96
|
+
whose PR merges out of band) is therefore reaped automatically at the next
|
|
97
|
+
workflow boot, not left for the operator to sweep by hand. `boot-sweep.js`
|
|
98
|
+
defaults its `--include` glob to `story-*` — a bare invocation only sweeps
|
|
99
|
+
Story branches; `/plan` and `/git-deliver` widen the scope to their own
|
|
100
|
+
branch namespaces (`epic/*`, `feat/*`, `fix/*`, `chore/*`, `docs/*`,
|
|
101
|
+
`refactor/*`) by passing `--include` explicitly at their boot call site.
|
|
102
|
+
A branch the planner detects only via the weaker content-equivalence
|
|
103
|
+
signal (`detectedBy: 'content-merged'`, Story #4395's
|
|
104
|
+
`git merge-tree --write-tree` probe — content already landed in the base
|
|
105
|
+
branch by another route, such as a squash-merged Epic PR, with no merged
|
|
106
|
+
PR or git ancestry of its own) is **never** reaped by the boot sweep: it
|
|
107
|
+
is report-only, surfaced under `contentMerged` in the result envelope and
|
|
108
|
+
a routing hint in the summary line (Story #4396), so the operator can
|
|
109
|
+
send it to `/git-cleanup` for a confirmed, eyeballed reap.
|
|
110
|
+
- **`/git-cleanup` is recovery, not routine.** Run it by hand only to recover
|
|
111
|
+
an unusual state the automated hygiene does not cover — triaging stashes,
|
|
112
|
+
reaping across non-standard branch namespaces, or `--remote` pruning after a
|
|
113
|
+
force-push diverged a tip. It is **not** the expected way to keep `main`
|
|
114
|
+
current or to clear merged branches after a normal delivery; the delivering
|
|
115
|
+
flows already own that. If you find yourself reaching for `/git-cleanup`
|
|
116
|
+
after every routine `/deliver` or `/git-deliver` run, that is a signal the
|
|
117
|
+
owning flow's hygiene step regressed — fix the flow, do not codify the manual
|
|
118
|
+
sweep.
|
|
119
|
+
|
|
120
|
+
### Shared-checkout contention (Story #4460)
|
|
121
|
+
|
|
122
|
+
`story-close.js`'s merge phase runs `git checkout <epic-branch>` directly in
|
|
123
|
+
the **shared main repo checkout** (`close-inputs.js` resolves `mainCwd` to
|
|
124
|
+
`PROJECT_ROOT`), not an isolated worktree. `lib/epic-merge-lock.js` guards
|
|
125
|
+
that checkout with a **per-Epic** filesystem lock
|
|
126
|
+
(`epic-<epicId>.merge.lock`) so two `story-close.js` runs for the **same**
|
|
127
|
+
Epic serialize against each other — but nothing stops a **different**
|
|
128
|
+
Epic's concurrently-running `story-close.js` from treating the same shared
|
|
129
|
+
checkout as scratch space at the same time.
|
|
130
|
+
|
|
131
|
+
- **Recognition signature**: a `git checkout`/`git switch` failure during
|
|
132
|
+
the merge phase whose message is `error: Your local changes ... would be
|
|
133
|
+
overwritten by checkout`, where the shared checkout is parked on a
|
|
134
|
+
**different** epic's branch (e.g. `epic/4405`) than the one the current
|
|
135
|
+
`story-close.js` run is trying to merge (e.g. `epic/4425`), with
|
|
136
|
+
uncommitted edits that belong to that other Epic's delivery. This was
|
|
137
|
+
observed live during Epic #4425 delivery (Stories #4427/#4428) colliding
|
|
138
|
+
with a concurrently-running Epic #4405 session, and had to be worked
|
|
139
|
+
around by hand via `git stash push -u`.
|
|
140
|
+
- **The fix — `assertSharedCheckoutAvailable`**
|
|
141
|
+
(`lib/orchestration/story-close/shared-checkout-guard.js`), called from
|
|
142
|
+
`runFinalizeMerge` in `lib/orchestration/story-close/merge-runner.js`
|
|
143
|
+
immediately before the merge-phase `git checkout <epicBranch>`. It
|
|
144
|
+
**composes with, not replaces,** the per-Epic lock:
|
|
145
|
+
- It first checks the shared common `.git/` dir for a **foreign**
|
|
146
|
+
(different-epic) `epic-*.merge.lock` file whose recorded PID is still
|
|
147
|
+
alive (`findForeignActiveEpicLock` in `lib/epic-merge-lock.js`). If
|
|
148
|
+
found, the merge phase fails fast with a diagnostic naming the holding
|
|
149
|
+
epic id, its lock-file path, and its PID/acquired-at timestamp —
|
|
150
|
+
instead of surfacing the raw git checkout error.
|
|
151
|
+
- It then checks whether the shared checkout is simply dirty (via `git
|
|
152
|
+
status --porcelain`), regardless of whose branch is checked out, and
|
|
153
|
+
reports the dirty file list plus the currently-checked-out branch in
|
|
154
|
+
the failure diagnostic.
|
|
155
|
+
- It never inspects the **caller's own** epic-id lock namespace, so
|
|
156
|
+
same-epic concurrent `story-close.js` runs continue to serialize
|
|
157
|
+
solely through `withEpicMergeLock` (the existing per-Epic lock) before
|
|
158
|
+
this guard ever executes — this guard only ever refuses on a truly
|
|
159
|
+
_foreign_ epic's live lock or unrelated dirt.
|
|
160
|
+
- **Not fixed by this guard**: the guard reports the contention early and
|
|
161
|
+
actionably; it does not redesign the merge phase to use an isolated
|
|
162
|
+
worktree, and it does not change `restoreStartingBranch`'s existing
|
|
163
|
+
dirty-tree refusal behavior (`phases/branch-restore.js`) — both remain
|
|
164
|
+
out of scope. Resolution of an actual collision is still manual: wait for
|
|
165
|
+
the other Epic's story-close run to finish, or — only once you have
|
|
166
|
+
independently confirmed that process is no longer running — remove the
|
|
167
|
+
stale lock file and resolve the dirty tree by hand (stash/commit/reset;
|
|
168
|
+
never `git reset --hard` or `git checkout --force`).
|
|
169
|
+
|
|
170
|
+
## Documentation Freshness Gate
|
|
171
|
+
|
|
172
|
+
The `validate-docs-freshness.js` gate (run during `/deliver`) asks a
|
|
173
|
+
falsifiable question of every doc in `delivery.docsFreshness.paths` +
|
|
174
|
+
`project.docsContextFiles`: **was this doc actually updated for the Epic?**
|
|
175
|
+
A doc passes on either of two conditions, but they are not
|
|
176
|
+
interchangeable:
|
|
177
|
+
|
|
178
|
+
- **Living docs are satisfied by being rewritten, not annotated.** For
|
|
179
|
+
any non-changelog doc (architecture, decisions, README, guides, …) the
|
|
180
|
+
gate passes **only** when an Epic-referencing commit touched the file —
|
|
181
|
+
a commit whose message references `#<epicId>` and changes the doc.
|
|
182
|
+
Rewrite the doc as part of the Epic's work; do not sprinkle `#<epicId>`
|
|
183
|
+
into its prose to satisfy the check. An appended `#<epicId>` annotation
|
|
184
|
+
alone **fails** the gate for these files, and the failure message names
|
|
185
|
+
the file and the rewrite-not-append contract.
|
|
186
|
+
- **`#<epicId>` body annotations pass only for changelog files.** A
|
|
187
|
+
changelog-class file (basename matches `/changelog/i`, e.g.
|
|
188
|
+
`docs/CHANGELOG.md`) may pass on a body annotation, because an appended
|
|
189
|
+
release note keyed to the Epic is the legitimate, expected update there.
|
|
190
|
+
This is the single sanctioned annotation path; every other doc must use
|
|
191
|
+
the rewrite path above.
|
|
192
|
+
|
|
193
|
+
This restriction exists to remove the perverse incentive by which the
|
|
194
|
+
gate would otherwise reward manufacturing fake provenance — appending
|
|
195
|
+
Epic-ID history into living docs purely to clear the check.
|
|
196
|
+
|
|
197
|
+
## Meta Labels (Retrospective Signal Routing)
|
|
198
|
+
|
|
199
|
+
Two `meta::*` labels route retrospective signals into durable substrates so
|
|
200
|
+
the `/plan` Phase 0 fetcher (see
|
|
201
|
+
[`prior-feedback-fetcher.js`](../scripts/lib/feedback-loop/prior-feedback-fetcher.js))
|
|
202
|
+
can surface open feedback issues to the planner. Both labels live in
|
|
203
|
+
[`label-constants.js`](../scripts/lib/label-constants.js) under the
|
|
204
|
+
`META_LABELS` export — reference them by symbol from scripts rather than
|
|
205
|
+
hard-coding the string.
|
|
206
|
+
|
|
207
|
+
### `meta::framework-gap`
|
|
208
|
+
|
|
209
|
+
Apply this label to a GitHub issue that surfaces a defect, missing
|
|
210
|
+
capability, or weak ergonomic in the **framework itself** (anything under
|
|
211
|
+
`.agents/` or the dispatcher engine). Typical sources: a retrospective that
|
|
212
|
+
identifies a workflow that does not yet exist, a hook that should fire but
|
|
213
|
+
does not, or a script-level usability problem that should be solved
|
|
214
|
+
upstream rather than worked around in a consumer project.
|
|
215
|
+
|
|
216
|
+
### `meta::consumer-improvement`
|
|
217
|
+
|
|
218
|
+
Apply this label to a GitHub issue that surfaces an improvement that lives
|
|
219
|
+
in a **consumer project** (workflow tweaks, ergonomic asks, doc polish, or
|
|
220
|
+
project-local automation). The work is scoped to the consumer's
|
|
221
|
+
`.agents/`-driven layer or the consumer's own codebase, not to upstream
|
|
222
|
+
framework changes. Issues that span both axes should carry both labels —
|
|
223
|
+
`fetchPriorFeedback` dedupes by issue number so a dual-labeled issue
|
|
224
|
+
appears exactly once in the planner context.
|
|
@@ -1,30 +1,33 @@
|
|
|
1
1
|
# Git & Version Control Conventions
|
|
2
2
|
|
|
3
3
|
This rule applies globally to all repository changes to maintain a clean git
|
|
4
|
-
history.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
>
|
|
27
|
-
>
|
|
4
|
+
history. It is the **always-on core**: branch shapes, the Conventional-Commit
|
|
5
|
+
subject contract, issue references, and the non-negotiable push/hygiene MUSTs.
|
|
6
|
+
|
|
7
|
+
Deeper mechanics — the hard-cutover contract policy, the push-hook
|
|
8
|
+
false-negative signature, shared-checkout merge contention, the
|
|
9
|
+
documentation-freshness gate, and the `meta::*` retrospective-routing labels —
|
|
10
|
+
live in the on-demand
|
|
11
|
+
[`git-conventions-reference.md`](git-conventions-reference.md). Read that file
|
|
12
|
+
**before** doing the matching work; the core below is sufficient for every
|
|
13
|
+
routine commit, branch, and PR.
|
|
14
|
+
|
|
15
|
+
## Canonical Branching (v2)
|
|
16
|
+
|
|
17
|
+
### Story branch → PR → main
|
|
18
|
+
|
|
19
|
+
Every Story lands on a dedicated **Story branch** named `story-<storyId>`
|
|
20
|
+
(e.g., `story-104`), seeded from `project.baseBranch` (`main` by default).
|
|
21
|
+
The runtime owns branch creation via `single-story-init.js`; agents commit
|
|
22
|
+
on that branch only. Close opens a PR against `main` (squash + required
|
|
23
|
+
checks). There is **no** `epic/<id>` integration branch and no `--no-ff`
|
|
24
|
+
wave merge.
|
|
25
|
+
|
|
26
|
+
> **Commit subjects.** Stories have no child tickets. Commits land on
|
|
27
|
+
> `story-<storyId>` directly from the agent and the Conventional Commit
|
|
28
|
+
> subject references the Story via `(refs #<storyId>)`. See
|
|
29
|
+
> [`.agents/instructions.md` § 5.D](../instructions.md) for the hierarchy
|
|
30
|
+
> contract.
|
|
28
31
|
|
|
29
32
|
## Conventional Commits
|
|
30
33
|
|
|
@@ -44,49 +47,6 @@ creation via `story-init.js`; agents commit on the active Story branch only.
|
|
|
44
47
|
titles edited in the GitHub UI; author the PR title in conventional form
|
|
45
48
|
so the squash commit on `main` parses cleanly for release-please.
|
|
46
49
|
|
|
47
|
-
## Contract Cutovers — No Shim Layer
|
|
48
|
-
|
|
49
|
-
Mandrel ships as the `mandrel` npm package, whose consumers pin an
|
|
50
|
-
exact lockfile version; they opt into breaks at upgrade time. Operator policy
|
|
51
|
-
for any contract change (config shape, baseline shape, schema, lifecycle
|
|
52
|
-
payload, ticket label, dispatch artifact, public API of a script) is
|
|
53
|
-
therefore:
|
|
54
|
-
|
|
55
|
-
1. **Hard cutovers only.** Contract changes ship as a single in-tree
|
|
56
|
-
migration of every producer and consumer. There is no parallel
|
|
57
|
-
old-shape support code, no read-side tolerance branch, and no
|
|
58
|
-
feature flag that toggles between the two shapes.
|
|
59
|
-
2. **The PR diff IS the migration.** A consumer upgrading to a release
|
|
60
|
-
with the change adopts the new shape by upgrading the
|
|
61
|
-
`mandrel` package (`mandrel update`). The PR that lands on
|
|
62
|
-
`main` already moved every internal call site; consumers move on the
|
|
63
|
-
same beat by upgrading.
|
|
64
|
-
3. **No deprecation ledger, no version-windowed sunsets.** The framework
|
|
65
|
-
does not track "to be removed in vX.Y" entries or run two shapes side
|
|
66
|
-
by side for a release window. If a shape changes, the old shape is
|
|
67
|
-
deleted in the same PR.
|
|
68
|
-
|
|
69
|
-
The codifying decision is **Epic #2646** (the "Hard-Cutover Cleanup Epic"),
|
|
70
|
-
which deleted the existing compatibility shim layer across
|
|
71
|
-
`config-resolver.js`, `lib/config/*.js`, `lib/baselines/`,
|
|
72
|
-
`wave-session.js`, `IExecutionAdapter` / `ManualDispatchAdapter`, lifecycle
|
|
73
|
-
emit shims, and duplicate progress/comment writers in one pass. The
|
|
74
|
-
per-finding closing references (audit Findings #10, #11, #13, #17) live in
|
|
75
|
-
the merged PRs and the Epic #2646 history; the standing forward-looking
|
|
76
|
-
audit lives at [`docs/roadmap.md`](../../docs/roadmap.md) (Part 1 — Model-Evolution Audit).
|
|
77
|
-
|
|
78
|
-
Practical guidance when authoring a contract change:
|
|
79
|
-
|
|
80
|
-
- If you are tempted to add a "legacy shape" branch in a parser or
|
|
81
|
-
resolver, **don't** — update every call site instead, and delete the
|
|
82
|
-
old shape in the same PR.
|
|
83
|
-
- If you cannot land every call site in a single PR (e.g. a
|
|
84
|
-
cross-repository change), the contract change is too large for one
|
|
85
|
-
hard cutover. Split the contract itself, not the rollout.
|
|
86
|
-
- Schema versions remain useful as **identifiers** (so a future consumer
|
|
87
|
-
can detect "I cannot read this artifact"); they are **not** an
|
|
88
|
-
invitation to keep multiple readers alive in the same release.
|
|
89
|
-
|
|
90
50
|
## Push Validation & Reliability
|
|
91
51
|
|
|
92
52
|
To prevent "silent" push failures (e.g., hidden by multi-command chains or
|
|
@@ -106,19 +66,12 @@ rejected by `pre-push` hooks):
|
|
|
106
66
|
contained more than the linting fix.
|
|
107
67
|
4. **Never bypass hooks**: Do not use `--no-verify`, `--no-gpg-sign`, or
|
|
108
68
|
other hook-skipping flags unless the operator explicitly authorizes it.
|
|
109
|
-
If a hook fails, investigate the underlying cause.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
`.claude/worktrees/<name>/` against a `files.includes` glob like
|
|
116
|
-
`"!**/.claude"`), is a **consumer-tooling gap**, not a real lint
|
|
117
|
-
failure. It does not authorize `--no-verify`. See
|
|
118
|
-
[`worktree-lifecycle.md` § Harness-worktree ⇄ consumer-lint-ignore interaction](../workflows/helpers/worktree-lifecycle.md#harness-worktree-consumer-lint-ignore-interaction-story-152)
|
|
119
|
-
for the recognition signature and the sanctioned consumer-side fix
|
|
120
|
-
(`--no-errors-on-unmatched` or equivalent) before escalating via
|
|
121
|
-
`agent::blocked`.
|
|
69
|
+
If a hook fails, investigate the underlying cause. One recognized
|
|
70
|
+
exception — a Biome _zero-match_ failure under a harness-managed
|
|
71
|
+
worktree path the consumer's lint config ignores — is a consumer-tooling
|
|
72
|
+
gap, **not** authorization to skip the hook; its recognition signature
|
|
73
|
+
and sanctioned fix live in
|
|
74
|
+
[`git-conventions-reference.md` § Push Validation](git-conventions-reference.md).
|
|
122
75
|
|
|
123
76
|
## Local checkout hygiene
|
|
124
77
|
|
|
@@ -127,149 +80,15 @@ own merged refs and fast-forwarding the base branch. `/git-cleanup` is a
|
|
|
127
80
|
recovery tool, not a routine chore.**
|
|
128
81
|
|
|
129
82
|
Every flow that lands work — `/deliver` (Epic and standalone-Story paths),
|
|
130
|
-
`/git-deliver` —
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
-
|
|
139
|
-
`/git-deliver` open with a **protected boot sweep**
|
|
140
|
-
(`boot-sweep.js`) that fast-forwards `main`, prunes stale remote-tracking
|
|
141
|
-
refs, and reaps every local branch whose PR is already merged — skipping any
|
|
142
|
-
candidate with unpushed work, a dirty worktree, or a still-open parent
|
|
143
|
-
ticket. A branch a flow leaves behind (e.g. a `/git-deliver` feature branch
|
|
144
|
-
whose PR merges out of band) is therefore reaped automatically at the next
|
|
145
|
-
workflow boot, not left for the operator to sweep by hand. `boot-sweep.js`
|
|
146
|
-
defaults its `--include` glob to `story-*` — a bare invocation only sweeps
|
|
147
|
-
Story branches; `/plan` and `/git-deliver` widen the scope to their own
|
|
148
|
-
branch namespaces (`epic/*`, `feat/*`, `fix/*`, `chore/*`, `docs/*`,
|
|
149
|
-
`refactor/*`) by passing `--include` explicitly at their boot call site.
|
|
150
|
-
A branch the planner detects only via the weaker content-equivalence
|
|
151
|
-
signal (`detectedBy: 'content-merged'`, Story #4395's
|
|
152
|
-
`git merge-tree --write-tree` probe — content already landed in the base
|
|
153
|
-
branch by another route, such as a squash-merged Epic PR, with no merged
|
|
154
|
-
PR or git ancestry of its own) is **never** reaped by the boot sweep: it
|
|
155
|
-
is report-only, surfaced under `contentMerged` in the result envelope and
|
|
156
|
-
a routing hint in the summary line (Story #4396), so the operator can
|
|
157
|
-
send it to `/git-cleanup` for a confirmed, eyeballed reap.
|
|
158
|
-
- **`/git-cleanup` is recovery, not routine.** Run it by hand only to recover
|
|
159
|
-
an unusual state the automated hygiene does not cover — triaging stashes,
|
|
160
|
-
reaping across non-standard branch namespaces, or `--remote` pruning after a
|
|
161
|
-
force-push diverged a tip. It is **not** the expected way to keep `main`
|
|
162
|
-
current or to clear merged branches after a normal delivery; the delivering
|
|
163
|
-
flows already own that. If you find yourself reaching for `/git-cleanup`
|
|
164
|
-
after every routine `/deliver` or `/git-deliver` run, that is a signal the
|
|
165
|
-
owning flow's hygiene step regressed — fix the flow, do not codify the manual
|
|
166
|
-
sweep.
|
|
167
|
-
|
|
168
|
-
### Shared-checkout contention (Story #4460)
|
|
169
|
-
|
|
170
|
-
`story-close.js`'s merge phase runs `git checkout <epic-branch>` directly in
|
|
171
|
-
the **shared main repo checkout** (`close-inputs.js` resolves `mainCwd` to
|
|
172
|
-
`PROJECT_ROOT`), not an isolated worktree. `lib/epic-merge-lock.js` guards
|
|
173
|
-
that checkout with a **per-Epic** filesystem lock
|
|
174
|
-
(`epic-<epicId>.merge.lock`) so two `story-close.js` runs for the **same**
|
|
175
|
-
Epic serialize against each other — but nothing stops a **different**
|
|
176
|
-
Epic's concurrently-running `story-close.js` from treating the same shared
|
|
177
|
-
checkout as scratch space at the same time.
|
|
178
|
-
|
|
179
|
-
- **Recognition signature**: a `git checkout`/`git switch` failure during
|
|
180
|
-
the merge phase whose message is `error: Your local changes ... would be
|
|
181
|
-
overwritten by checkout`, where the shared checkout is parked on a
|
|
182
|
-
**different** epic's branch (e.g. `epic/4405`) than the one the current
|
|
183
|
-
`story-close.js` run is trying to merge (e.g. `epic/4425`), with
|
|
184
|
-
uncommitted edits that belong to that other Epic's delivery. This was
|
|
185
|
-
observed live during Epic #4425 delivery (Stories #4427/#4428) colliding
|
|
186
|
-
with a concurrently-running Epic #4405 session, and had to be worked
|
|
187
|
-
around by hand via `git stash push -u`.
|
|
188
|
-
- **The fix — `assertSharedCheckoutAvailable`**
|
|
189
|
-
(`lib/orchestration/story-close/shared-checkout-guard.js`), called from
|
|
190
|
-
`runFinalizeMerge` in `lib/orchestration/story-close/merge-runner.js`
|
|
191
|
-
immediately before the merge-phase `git checkout <epicBranch>`. It
|
|
192
|
-
**composes with, not replaces,** the per-Epic lock:
|
|
193
|
-
- It first checks the shared common `.git/` dir for a **foreign**
|
|
194
|
-
(different-epic) `epic-*.merge.lock` file whose recorded PID is still
|
|
195
|
-
alive (`findForeignActiveEpicLock` in `lib/epic-merge-lock.js`). If
|
|
196
|
-
found, the merge phase fails fast with a diagnostic naming the holding
|
|
197
|
-
epic id, its lock-file path, and its PID/acquired-at timestamp —
|
|
198
|
-
instead of surfacing the raw git checkout error.
|
|
199
|
-
- It then checks whether the shared checkout is simply dirty (via `git
|
|
200
|
-
status --porcelain`), regardless of whose branch is checked out, and
|
|
201
|
-
reports the dirty file list plus the currently-checked-out branch in
|
|
202
|
-
the failure diagnostic.
|
|
203
|
-
- It never inspects the **caller's own** epic-id lock namespace, so
|
|
204
|
-
same-epic concurrent `story-close.js` runs continue to serialize
|
|
205
|
-
solely through `withEpicMergeLock` (the existing per-Epic lock) before
|
|
206
|
-
this guard ever executes — this guard only ever refuses on a truly
|
|
207
|
-
_foreign_ epic's live lock or unrelated dirt.
|
|
208
|
-
- **Not fixed by this guard**: the guard reports the contention early and
|
|
209
|
-
actionably; it does not redesign the merge phase to use an isolated
|
|
210
|
-
worktree, and it does not change `restoreStartingBranch`'s existing
|
|
211
|
-
dirty-tree refusal behavior (`phases/branch-restore.js`) — both remain
|
|
212
|
-
out of scope. Resolution of an actual collision is still manual: wait for
|
|
213
|
-
the other Epic's story-close run to finish, or — only once you have
|
|
214
|
-
independently confirmed that process is no longer running — remove the
|
|
215
|
-
stale lock file and resolve the dirty tree by hand (stash/commit/reset;
|
|
216
|
-
never `git reset --hard` or `git checkout --force`).
|
|
217
|
-
|
|
218
|
-
## Documentation Freshness Gate
|
|
219
|
-
|
|
220
|
-
The `validate-docs-freshness.js` gate (run during `/deliver`) asks a
|
|
221
|
-
falsifiable question of every doc in `delivery.docsFreshness.paths` +
|
|
222
|
-
`project.docsContextFiles`: **was this doc actually updated for the Epic?**
|
|
223
|
-
A doc passes on either of two conditions, but they are not
|
|
224
|
-
interchangeable:
|
|
225
|
-
|
|
226
|
-
- **Living docs are satisfied by being rewritten, not annotated.** For
|
|
227
|
-
any non-changelog doc (architecture, decisions, README, guides, …) the
|
|
228
|
-
gate passes **only** when an Epic-referencing commit touched the file —
|
|
229
|
-
a commit whose message references `#<epicId>` and changes the doc.
|
|
230
|
-
Rewrite the doc as part of the Epic's work; do not sprinkle `#<epicId>`
|
|
231
|
-
into its prose to satisfy the check. An appended `#<epicId>` annotation
|
|
232
|
-
alone **fails** the gate for these files, and the failure message names
|
|
233
|
-
the file and the rewrite-not-append contract.
|
|
234
|
-
- **`#<epicId>` body annotations pass only for changelog files.** A
|
|
235
|
-
changelog-class file (basename matches `/changelog/i`, e.g.
|
|
236
|
-
`docs/CHANGELOG.md`) may pass on a body annotation, because an appended
|
|
237
|
-
release note keyed to the Epic is the legitimate, expected update there.
|
|
238
|
-
This is the single sanctioned annotation path; every other doc must use
|
|
239
|
-
the rewrite path above.
|
|
240
|
-
|
|
241
|
-
This restriction exists to remove the perverse incentive by which the
|
|
242
|
-
gate would otherwise reward manufacturing fake provenance — appending
|
|
243
|
-
Epic-ID history into living docs purely to clear the check.
|
|
244
|
-
|
|
245
|
-
## Meta Labels (Retrospective Signal Routing)
|
|
246
|
-
|
|
247
|
-
Two `meta::*` labels route retrospective signals into durable substrates so
|
|
248
|
-
the `/plan` Phase 0 fetcher (see
|
|
249
|
-
[`prior-feedback-fetcher.js`](../scripts/lib/feedback-loop/prior-feedback-fetcher.js))
|
|
250
|
-
can surface open feedback issues to the planner. Both labels live in
|
|
251
|
-
[`label-constants.js`](../scripts/lib/label-constants.js) under the
|
|
252
|
-
`META_LABELS` export — reference them by symbol from scripts rather than
|
|
253
|
-
hard-coding the string.
|
|
254
|
-
|
|
255
|
-
### `meta::framework-gap`
|
|
256
|
-
|
|
257
|
-
Apply this label to a GitHub issue that surfaces a defect, missing
|
|
258
|
-
capability, or weak ergonomic in the **framework itself** (anything under
|
|
259
|
-
`.agents/` or the dispatcher engine). Typical sources: a retrospective that
|
|
260
|
-
identifies a workflow that does not yet exist, a hook that should fire but
|
|
261
|
-
does not, or a script-level usability problem that should be solved
|
|
262
|
-
upstream rather than worked around in a consumer project.
|
|
263
|
-
|
|
264
|
-
### `meta::consumer-improvement`
|
|
265
|
-
|
|
266
|
-
Apply this label to a GitHub issue that surfaces an improvement that lives
|
|
267
|
-
in a **consumer project** (workflow tweaks, ergonomic asks, doc polish, or
|
|
268
|
-
project-local automation). The work is scoped to the consumer's
|
|
269
|
-
`.agents/`-driven layer or the consumer's own codebase, not to upstream
|
|
270
|
-
framework changes. Issues that span both axes should carry both labels —
|
|
271
|
-
`fetchPriorFeedback` dedupes by issue number so a dual-labeled issue
|
|
272
|
-
appears exactly once in the planner context.
|
|
83
|
+
`/git-deliver` — leaves the local checkout tidy without operator
|
|
84
|
+
intervention: it fast-forwards the base branch itself, and reaps its own
|
|
85
|
+
merged local refs on the next workflow boot (the `boot-sweep.js` protected
|
|
86
|
+
sweep). Do **not** end a workflow by telling the operator to run
|
|
87
|
+
`/git-cleanup` to catch up; `/git-cleanup` is for recovering an unusual state
|
|
88
|
+
the automated hygiene does not cover. The boot-sweep scope rules, the
|
|
89
|
+
content-merged report-only case, and the shared-checkout merge-contention
|
|
90
|
+
guard are detailed in
|
|
91
|
+
[`git-conventions-reference.md` § Local checkout hygiene](git-conventions-reference.md).
|
|
273
92
|
|
|
274
93
|
## Pull Requests
|
|
275
94
|
|
|
@@ -35,6 +35,8 @@ local override may relax them. The skill is updated to match.
|
|
|
35
35
|
"Logged in" is not "allowed".
|
|
36
36
|
- Users MUST only be able to access or modify resources they own; ownership
|
|
37
37
|
checks MUST run server-side before any state change.
|
|
38
|
+
- Inbound webhooks and server-to-server callbacks MUST verify the sender's
|
|
39
|
+
signature before parsing the payload; never act on an unverified webhook.
|
|
38
40
|
- Admin or elevated actions MUST verify the role server-side; never trust a
|
|
39
41
|
client-asserted role claim.
|
|
40
42
|
|
|
@@ -57,6 +59,9 @@ local override may relax them. The skill is updated to match.
|
|
|
57
59
|
- NEVER log Personal Identifiable Information (PII) such as emails, passwords,
|
|
58
60
|
full credit card numbers, session tokens, or phone numbers.
|
|
59
61
|
- Avoid logging complete objects directly; destructure out safe properties.
|
|
62
|
+
Prefer logging entities by opaque ID (e.g. `userId`), and sanitize user input
|
|
63
|
+
before it reaches an error log so a payload cannot smuggle PII through the
|
|
64
|
+
error path.
|
|
60
65
|
|
|
61
66
|
## Transport & Headers
|
|
62
67
|
|