@event4u/agent-config 14.23.0 → 16.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/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +144 -152
- package/README.md +1 -1
- package/dist/agent-src/commands/agent-handoff.md +8 -7
- package/dist/agent-src/commands/agents/init.md +1 -1
- package/dist/agent-src/commands/agents/user/accept.md +4 -4
- package/dist/agent-src/commands/agents/user/delete.md +2 -2
- package/dist/agent-src/commands/agents/user/init.md +3 -3
- package/dist/agent-src/commands/agents/user/review.md +3 -3
- package/dist/agent-src/commands/agents/user/show.md +3 -3
- package/dist/agent-src/commands/agents/user/update.md +2 -2
- package/dist/agent-src/commands/agents/user.md +6 -6
- package/dist/agent-src/commands/analytics/prune.md +1 -1
- package/dist/agent-src/commands/analytics/show.md +2 -2
- package/dist/agent-src/commands/analyze/decision.md +2 -2
- package/dist/agent-src/commands/analyze/inbox.md +5 -5
- package/dist/agent-src/commands/analyze/incident.md +3 -3
- package/dist/agent-src/commands/analyze/near-miss.md +3 -3
- package/dist/agent-src/commands/analyze/postmortem.md +4 -4
- package/dist/agent-src/commands/analyze/premortem.md +2 -2
- package/dist/agent-src/commands/analyze.md +2 -2
- package/dist/agent-src/commands/bug/fix.md +1 -1
- package/dist/agent-src/commands/bug/investigate.md +2 -2
- package/dist/agent-src/commands/cost/profile.md +3 -3
- package/dist/agent-src/commands/design.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +1 -1
- package/dist/agent-src/commands/feature/plan.md +2 -2
- package/dist/agent-src/commands/feature/roadmap.md +2 -2
- package/dist/agent-src/commands/ghostwriter/fetch.md +4 -4
- package/dist/agent-src/commands/ghostwriter/list.md +1 -1
- package/dist/agent-src/commands/ghostwriter/show.md +1 -1
- package/dist/agent-src/commands/ghostwriter/write.md +9 -9
- package/dist/agent-src/commands/humanize.md +6 -6
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/judge/solo.md +1 -1
- package/dist/agent-src/commands/judge.md +1 -1
- package/dist/agent-src/commands/knowledge/cross-repo.md +1 -1
- package/dist/agent-src/commands/knowledge/forget.md +1 -1
- package/dist/agent-src/commands/knowledge/ingest.md +2 -2
- package/dist/agent-src/commands/knowledge/list.md +1 -1
- package/dist/agent-src/commands/memory/add.md +3 -3
- package/dist/agent-src/commands/memory/load.md +4 -4
- package/dist/agent-src/commands/memory/mine-session.md +1 -1
- package/dist/agent-src/commands/memory/promote.md +4 -4
- package/dist/agent-src/commands/memory/propose.md +2 -2
- package/dist/agent-src/commands/mode.md +5 -5
- package/dist/agent-src/commands/post-as/ghostwriter.md +3 -3
- package/dist/agent-src/commands/post-as/me.md +7 -7
- package/dist/agent-src/commands/pr/create.md +1 -1
- package/dist/agent-src/commands/pr/merge.md +1 -1
- package/dist/agent-src/commands/profile/activate.md +1 -1
- package/dist/agent-src/commands/profile/show.md +1 -1
- package/dist/agent-src/commands/research/deep.md +2 -2
- package/dist/agent-src/commands/research/report.md +2 -2
- package/dist/agent-src/commands/review/changes.md +1 -1
- package/dist/agent-src/commands/review/routing.md +1 -1
- package/dist/agent-src/commands/roadmap/create.md +4 -3
- package/dist/agent-src/commands/roadmap/materialize.md +2 -2
- package/dist/agent-src/commands/roadmap/next.md +1 -1
- package/dist/agent-src/commands/roadmap/process-full.md +2 -2
- package/dist/agent-src/commands/security-audit-config.md +3 -3
- package/dist/agent-src/commands/skill/preview.md +1 -1
- package/dist/agent-src/commands/skills/discover.md +1 -1
- package/dist/agent-src/commands/sync/agent-settings.md +2 -2
- package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
- package/dist/agent-src/commands/tests/create.md +1 -1
- package/dist/agent-src/commands/tests/e2e-heal.md +1 -1
- package/dist/agent-src/commands/tests/e2e-plan.md +1 -1
- package/dist/agent-src/contexts/authority/kernel-rule-edits.md +6 -6
- package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -2
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +88 -1
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +51 -1
- package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +1 -1
- package/dist/agent-src/contexts/execution/cheap-question-mechanics.md +1 -1
- package/dist/agent-src/contexts/execution/contract-decision-sheet.md +3 -3
- package/dist/agent-src/contexts/execution/mandated-lines.md +1 -1
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +1 -1
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -1
- package/dist/agent-src/contexts/execution/plan-confidence-gate.md +5 -5
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -1
- package/dist/agent-src/contexts/execution/subagent-modes-detail.md +1 -1
- package/dist/agent-src/contexts/execution/subagent-routing.md +2 -2
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +1 -1
- package/dist/agent-src/contexts/execution/user-memory-channels.md +3 -3
- package/dist/agent-src/contexts/execution/verification-mechanics.md +1 -1
- package/dist/agent-src/contexts/judges/persona-voice-rubric.md +2 -2
- package/dist/agent-src/guidelines/abstraction-thresholds.md +88 -0
- package/dist/agent-src/guidelines/agent-infra/5w2h-analysis.md +260 -0
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +99 -0
- package/dist/agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +325 -0
- package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +177 -0
- package/dist/agent-src/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +222 -0
- package/dist/agent-src/guidelines/agent-infra/ask-when-uncertain-demos.md +134 -0
- package/dist/agent-src/guidelines/agent-infra/asking-and-brevity-examples.md +198 -0
- package/dist/agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
- package/dist/agent-src/guidelines/agent-infra/carve-out-predicates.md +17 -0
- package/dist/agent-src/guidelines/agent-infra/comparison-matrix.md +179 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +165 -0
- package/dist/agent-src/guidelines/agent-infra/corpus-grounding-authoring.md +91 -0
- package/dist/agent-src/guidelines/agent-infra/critical-thinking.md +156 -0
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +109 -0
- package/dist/agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
- package/dist/agent-src/guidelines/agent-infra/direct-answers-demos.md +142 -0
- package/dist/agent-src/guidelines/agent-infra/domain-adoption-gates.md +112 -0
- package/dist/agent-src/guidelines/agent-infra/domain-eval-anti-pattern.md +53 -0
- package/dist/agent-src/guidelines/agent-infra/domain-pack-architecture.md +56 -0
- package/dist/agent-src/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/dist/agent-src/guidelines/agent-infra/emphasis-budget.md +45 -0
- package/dist/agent-src/guidelines/agent-infra/engineering-memory-data-format.md +210 -0
- package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
- package/dist/agent-src/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/dist/agent-src/guidelines/agent-infra/failure-signatures.md +70 -0
- package/dist/agent-src/guidelines/agent-infra/false-green.md +233 -0
- package/dist/agent-src/guidelines/agent-infra/first-principles.md +192 -0
- package/dist/agent-src/guidelines/agent-infra/framework-neutrality-patterns.md +66 -0
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +169 -0
- package/dist/agent-src/guidelines/agent-infra/gate-authoring.md +177 -0
- package/dist/agent-src/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/installed-tools-manifest.md +142 -0
- package/dist/agent-src/guidelines/agent-infra/inversion-thinking.md +388 -0
- package/dist/agent-src/guidelines/agent-infra/ios-simulator-guide.md +378 -0
- package/dist/agent-src/guidelines/agent-infra/language-and-tone-examples.md +141 -0
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +317 -0
- package/dist/agent-src/guidelines/agent-infra/linked-projects-onboarding-gate.md +80 -0
- package/dist/agent-src/guidelines/agent-infra/mcp-request-signing.md +197 -0
- package/dist/agent-src/guidelines/agent-infra/memory-access.md +149 -0
- package/dist/agent-src/guidelines/agent-infra/mental-models.md +314 -0
- package/dist/agent-src/guidelines/agent-infra/minimal-safe-diff-mechanics.md +241 -0
- package/dist/agent-src/guidelines/agent-infra/missing-tool-handling.md +66 -0
- package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +101 -0
- package/dist/agent-src/guidelines/agent-infra/naming.md +69 -0
- package/dist/agent-src/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
- package/dist/agent-src/guidelines/agent-infra/output-patterns.md +117 -0
- package/dist/agent-src/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
- package/dist/agent-src/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/dist/agent-src/guidelines/agent-infra/review-routing-data-format.md +143 -0
- package/dist/agent-src/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +274 -0
- package/dist/agent-src/guidelines/agent-infra/role-contracts.md +209 -0
- package/dist/agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
- package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +241 -0
- package/dist/agent-src/guidelines/agent-infra/rule-type-governance.md +73 -0
- package/dist/agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
- package/dist/agent-src/guidelines/agent-infra/scqa-framework.md +526 -0
- package/dist/agent-src/guidelines/agent-infra/security-lint-containment.md +121 -0
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +134 -0
- package/dist/agent-src/guidelines/agent-infra/simplicity-and-goal-demos.md +211 -0
- package/dist/agent-src/guidelines/agent-infra/six-hats.md +353 -0
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +229 -0
- package/dist/agent-src/guidelines/agent-infra/skill-quality-checklist.md +157 -0
- package/dist/agent-src/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/dist/agent-src/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
- package/dist/agent-src/guidelines/agent-infra/systems-thinking.md +220 -0
- package/dist/agent-src/guidelines/agent-infra/tool-description-as-policy.md +35 -0
- package/dist/agent-src/guidelines/agent-infra/tool-integration.md +73 -0
- package/dist/agent-src/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
- package/dist/agent-src/guidelines/agent-infra/untrusted-input-spotlighting.md +166 -0
- package/dist/agent-src/guidelines/agent-infra/verify-before-complete-demos.md +128 -0
- package/dist/agent-src/guidelines/augment-portability-patterns.md +70 -0
- package/dist/agent-src/guidelines/code-clarity.md +350 -0
- package/dist/agent-src/guidelines/component-oriented-and-oop-development.md +189 -0
- package/dist/agent-src/guidelines/cross-role-handoff.md +127 -0
- package/dist/agent-src/guidelines/design-antipatterns-triggers.json +18 -0
- package/dist/agent-src/guidelines/design-antipatterns.md +327 -0
- package/dist/agent-src/guidelines/design-asset-discipline.md +38 -0
- package/dist/agent-src/guidelines/design-canon.md +63 -0
- package/dist/agent-src/guidelines/design-fidelity-mechanics.md +293 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +78 -0
- package/dist/agent-src/guidelines/design-handover-extraction.md +117 -0
- package/dist/agent-src/guidelines/design-modes.md +143 -0
- package/dist/agent-src/guidelines/design-reconciliation.md +172 -0
- package/dist/agent-src/guidelines/docs/readme-size-and-splitting.md +209 -0
- package/dist/agent-src/guidelines/e2e/playwright.md +363 -0
- package/dist/agent-src/guidelines/gtm-handoff.md +114 -0
- package/dist/agent-src/guidelines/monorepo-antipatterns.md +141 -0
- package/dist/agent-src/guidelines/php/api-design.md +115 -0
- package/dist/agent-src/guidelines/php/artisan-commands.md +81 -0
- package/dist/agent-src/guidelines/php/blade-ui.md +78 -0
- package/dist/agent-src/guidelines/php/controllers.md +90 -0
- package/dist/agent-src/guidelines/php/database.md +194 -0
- package/dist/agent-src/guidelines/php/eloquent.md +208 -0
- package/dist/agent-src/guidelines/php/flux.md +80 -0
- package/dist/agent-src/guidelines/php/general.md +207 -0
- package/dist/agent-src/guidelines/php/git.md +164 -0
- package/dist/agent-src/guidelines/php/jobs.md +111 -0
- package/dist/agent-src/guidelines/php/livewire.md +71 -0
- package/dist/agent-src/guidelines/php/logging.md +79 -0
- package/dist/agent-src/guidelines/php/naming.md +89 -0
- package/dist/agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
- package/dist/agent-src/guidelines/php/patterns/dtos.md +199 -0
- package/dist/agent-src/guidelines/php/patterns/events.md +67 -0
- package/dist/agent-src/guidelines/php/patterns/factory.md +53 -0
- package/dist/agent-src/guidelines/php/patterns/pipelines.md +66 -0
- package/dist/agent-src/guidelines/php/patterns/policies.md +66 -0
- package/dist/agent-src/guidelines/php/patterns/repositories.md +122 -0
- package/dist/agent-src/guidelines/php/patterns/service-layer.md +64 -0
- package/dist/agent-src/guidelines/php/patterns/strategy.md +247 -0
- package/dist/agent-src/guidelines/php/patterns.md +28 -0
- package/dist/agent-src/guidelines/php/performance.md +92 -0
- package/dist/agent-src/guidelines/php/php-coding-patterns.md +80 -0
- package/dist/agent-src/guidelines/php/resources.md +100 -0
- package/dist/agent-src/guidelines/php/security.md +110 -0
- package/dist/agent-src/guidelines/php/sql.md +97 -0
- package/dist/agent-src/guidelines/php/validations.md +119 -0
- package/dist/agent-src/guidelines/php/websocket.md +100 -0
- package/dist/agent-src/guidelines/prompt-templates.md +189 -0
- package/dist/agent-src/guidelines/redundancy-taxonomy.md +208 -0
- package/dist/agent-src/guidelines/wing4-handoff.md +127 -0
- package/dist/agent-src/personas/README.md +1 -1
- package/dist/agent-src/personas/_template-specialist/persona.md +1 -1
- package/dist/agent-src/personas/product-owner.md +1 -1
- package/dist/agent-src/rules/active-remediation.md +1 -1
- package/dist/agent-src/rules/architecture.md +2 -2
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/ask-when-uncertain.md +2 -2
- package/dist/agent-src/rules/brand-source-of-truth.md +9 -7
- package/dist/agent-src/rules/code-comment-discipline.md +2 -2
- package/dist/agent-src/rules/code-provenance.md +1 -1
- package/dist/agent-src/rules/content-quoting-floor.md +1 -1
- package/dist/agent-src/rules/context-hygiene.md +5 -5
- package/dist/agent-src/rules/cross-source-consistency.md +1 -1
- package/dist/agent-src/rules/design-fidelity.md +36 -46
- package/dist/agent-src/rules/direct-answers.md +2 -2
- package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
- package/dist/agent-src/rules/evaluator-independence.md +1 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
- package/dist/agent-src/rules/icon-consistency.md +5 -1
- package/dist/agent-src/rules/improve-before-implement.md +1 -1
- package/dist/agent-src/rules/language-and-tone.md +3 -3
- package/dist/agent-src/rules/minimal-safe-diff.md +1 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +2 -2
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
- package/dist/agent-src/rules/role-mode-adherence.md +2 -2
- package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
- package/dist/agent-src/rules/size-enforcement.md +1 -1
- package/dist/agent-src/rules/source-confidentiality.md +2 -2
- package/dist/agent-src/rules/think-before-action.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +7 -5
- package/dist/agent-src/rules/ui-audit-gate.md +3 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +3 -3
- package/dist/agent-src/rules/user-interaction.md +31 -30
- package/dist/agent-src/skills/activation-design/SKILL.md +2 -2
- package/dist/agent-src/skills/adr-create/SKILL.md +5 -5
- package/dist/agent-src/skills/ai-council/SKILL.md +1 -1
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +1 -1
- package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +24 -3
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/build-buy-partner/SKILL.md +1 -1
- package/dist/agent-src/skills/churn-prevention/SKILL.md +2 -2
- package/dist/agent-src/skills/code-refactoring/SKILL.md +3 -3
- package/dist/agent-src/skills/code-review/SKILL.md +3 -3
- package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
- package/dist/agent-src/skills/comp-banding/SKILL.md +1 -1
- package/dist/agent-src/skills/competitive-moat-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
- package/dist/agent-src/skills/complexity-first-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -2
- package/dist/agent-src/skills/contracts-cognition/SKILL.md +1 -1
- package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +2 -2
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +2 -2
- package/dist/agent-src/skills/customer-research/SKILL.md +2 -2
- package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
- package/dist/agent-src/skills/data-handling-judgment/SKILL.md +1 -1
- package/dist/agent-src/skills/deal-qualification-meddic/SKILL.md +2 -2
- package/dist/agent-src/skills/decision-record/SKILL.md +3 -3
- package/dist/agent-src/skills/decision-review/SKILL.md +8 -8
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +22 -22
- package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +2 -2
- package/dist/agent-src/skills/design-review/SKILL.md +4 -4
- package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -1
- package/dist/agent-src/skills/design-tokens/SKILL.md +17 -2
- package/dist/agent-src/skills/design-variations/SKILL.md +2 -2
- package/dist/agent-src/skills/developer-like-execution/SKILL.md +2 -2
- package/dist/agent-src/skills/discovery-interview/SKILL.md +2 -2
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +3 -3
- package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -2
- package/dist/agent-src/skills/error-handling-patterns/SKILL.md +9 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +44 -1
- package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +2 -2
- package/dist/agent-src/skills/expansion-playbook/SKILL.md +2 -2
- package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/experiment-loop/references/protocol.md +1 -1
- package/dist/agent-src/skills/fe-design/SKILL.md +3 -3
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +3 -3
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/forecast-accuracy/SKILL.md +2 -2
- package/dist/agent-src/skills/forecasting/SKILL.md +2 -2
- package/dist/agent-src/skills/fundraising-narrative/SKILL.md +2 -2
- package/dist/agent-src/skills/funnel-analysis/SKILL.md +2 -2
- package/dist/agent-src/skills/gtm-launch/SKILL.md +2 -2
- package/dist/agent-src/skills/hiring-loop-design/SKILL.md +1 -1
- package/dist/agent-src/skills/html-deck/SKILL.md +5 -5
- package/dist/agent-src/skills/humanizer/SKILL.md +1 -1
- package/dist/agent-src/skills/humanizer/data/patterns.md +1 -1
- package/dist/agent-src/skills/iconography/SKILL.md +3 -3
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
- package/dist/agent-src/skills/laravel-api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +3 -3
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +6 -6
- package/dist/agent-src/skills/livewire/SKILL.md +1 -1
- package/dist/agent-src/skills/market-entry-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/mcp-builder/SKILL.md +1 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +3 -3
- package/dist/agent-src/skills/messaging-architecture/SKILL.md +2 -2
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/onboarding-design/SKILL.md +2 -2
- package/dist/agent-src/skills/onboarding-program/SKILL.md +1 -1
- package/dist/agent-src/skills/one-on-one-cadence/SKILL.md +1 -1
- package/dist/agent-src/skills/org-design/SKILL.md +1 -1
- package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +3 -3
- package/dist/agent-src/skills/override-management/SKILL.md +1 -1
- package/dist/agent-src/skills/perf-feedback-craft/SKILL.md +1 -1
- package/dist/agent-src/skills/persona-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/php-coder/SKILL.md +1 -1
- package/dist/agent-src/skills/pipeline-strategy/SKILL.md +2 -2
- package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -3
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/positioning-strategy/SKILL.md +2 -2
- package/dist/agent-src/skills/privacy-review/SKILL.md +1 -1
- package/dist/agent-src/skills/prompt-optimizer/SKILL.md +3 -3
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -2
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/release-comms/SKILL.md +2 -2
- package/dist/agent-src/skills/retention-loops/SKILL.md +2 -2
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-management/SKILL.md +1 -1
- package/dist/agent-src/skills/roadmap-management/references/archival.md +1 -1
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +5 -5
- package/dist/agent-src/skills/rule-writing/SKILL.md +6 -6
- package/dist/agent-src/skills/runway-cognition/SKILL.md +2 -2
- package/dist/agent-src/skills/scenario-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-writing/references/procedure.md +1 -1
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +3 -3
- package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -3
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +1 -1
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +11 -5
- package/dist/agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -1
- package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
- package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +28 -8
- package/dist/agent-src/skills/unit-economics-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +1 -1
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +2 -2
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/skills/vision-articulation/SKILL.md +1 -1
- package/dist/agent-src/skills/voc-extract/SKILL.md +2 -2
- package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +1 -1
- package/dist/agent-src/skills/workspace-link/SKILL.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +6 -6
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/contexts/knowledge-pages.md +2 -3
- package/dist/agent-src/templates/copilot-instructions.md +1 -1
- package/dist/agent-src/templates/roadmaps.md +1 -1
- package/dist/agent-src/templates/scripts/README.md +2 -2
- package/dist/agent-src/user-types/_template/user-type.md +1 -1
- package/dist/cli-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
- package/dist/cli-delegate/{chunk-IAI3XL43.js → chunk-3FKR64R5.js} +22 -6
- package/dist/cli-delegate/{chunk-J3RFNKG4.js → chunk-55ACLDUE.js} +2 -2
- package/dist/cli-delegate/{chunk-PKOBQADP.js → chunk-57PN4GYJ.js} +1 -1
- package/dist/cli-delegate/{chunk-KCNTUSPI.js → chunk-AK6HODNQ.js} +4 -4
- package/dist/cli-delegate/{chunk-2FTMENJL.js → chunk-GYC3VRYN.js} +1 -1
- package/dist/cli-delegate/{chunk-LWTYTX6F.js → chunk-H32DGUJH.js} +15 -84
- package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
- package/dist/cli-delegate/chunk-NUHLI2RX.js +80 -0
- package/dist/cli-delegate/{chunk-TYSY33MD.js → chunk-QJWAUMJW.js} +12 -2
- package/dist/cli-delegate/{chunk-2KKXJW25.js → chunk-S3VFXMTM.js} +1 -1
- package/dist/cli-delegate/{chunk-I6RHFQEG.js → chunk-YUM5KURG.js} +17 -1
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +834 -275
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_explain.js +5 -3
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +6 -6
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +1 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +3 -2
- package/dist/cli-delegate/cmd_prune.js +4 -4
- package/dist/cli-delegate/cmd_route_audit.js +3 -3
- package/dist/cli-delegate/cmd_route_explain.js +1 -1
- package/dist/cli-delegate/cmd_session_recycle.js +3 -3
- package/dist/cli-delegate/cmd_settings_get.js +15 -9
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +54 -11
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +25 -78
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +5 -7
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +4 -6
- package/dist/hooks/dispatch.js +9684 -9304
- package/dist/install/install.mjs +36 -8
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +2147 -1470
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +73 -0
- package/dist/scripts/_lib/agent_src.js +20 -0
- package/dist/scripts/_lib/guidelines_lane.js +158 -0
- package/dist/scripts/_lib/installed_lock.js +1 -1
- package/dist/scripts/condense.js +2 -5
- package/dist/server/io/yamlIO.js +175 -17
- package/dist/server/schemas/settings.js +18 -4
- package/dist/shared/settingsSurface.js +6 -1
- package/docs/contracts/settings-classes.md +18 -9
- package/docs/guidelines/abstraction-thresholds.md +35 -0
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +3 -3
- package/docs/guidelines/agent-infra/false-green.md +2 -2
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +1 -1
- package/docs/guidelines/design-fidelity-mechanics.md +4 -0
- package/docs/guidelines/design-fidelity-routing.md +78 -0
- package/docs/guidelines/design-reconciliation.md +172 -0
- package/docs/guidelines/gtm-handoff.md +2 -2
- package/docs/guidelines/wing4-handoff.md +2 -2
- package/package.json +7 -3
- package/src/config/agent-settings.template.yml +55 -8
- package/src/config/ci-local-parity.yml +34 -0
- package/src/config/continuity-surface.json +11 -32
- package/src/config/gate-coverage.yml +31 -8
- package/src/config/gate-reachability-exemptions.json +1 -0
- package/src/config/gate-violation-baselines.json +3 -3
- package/src/config/hook-token-budget.json +1 -1
- package/src/config/host-injection-effect.json +2 -2
- package/src/config/pack-size-budget.json +55 -4
- package/src/config/platform-anchor.json +47 -0
- package/src/config/preamble-payload-budget.json +12 -8
- package/src/config/preamble-payload-exceptions.json +28 -0
- package/src/config/publish-surface.json +4 -2
- package/src/config/ratification-policy.json +7 -0
- package/src/config/rule-stub-ceilings.json +16 -9
- package/src/scripts/_cli/cmd_settings_get.ts +22 -7
- package/src/scripts/_dispatch.bash +3 -1
- package/src/scripts/_lib/agent_settings.ts +85 -0
- package/src/scripts/_lib/agent_src.ts +21 -0
- package/src/scripts/_lib/artifact_maturity.ts +242 -0
- package/src/scripts/_lib/base_ref_payload.ts +315 -0
- package/src/scripts/_lib/conformance_report.ts +403 -0
- package/src/scripts/_lib/continuity_writer.ts +72 -13
- package/src/scripts/_lib/design_system_import.ts +20 -0
- package/src/scripts/_lib/design_tolerance.ts +281 -0
- package/src/scripts/_lib/dropped_decision.ts +142 -0
- package/src/scripts/_lib/guidelines_lane.ts +164 -0
- package/src/scripts/_lib/installed_lock.ts +1 -1
- package/src/scripts/_lib/measured_payload_ceiling.ts +424 -0
- package/src/scripts/_lib/obligation_frequency.ts +2 -3
- package/src/scripts/_lib/payload_catalogue_completeness.ts +211 -0
- package/src/scripts/_lib/platform_anchor.ts +1053 -0
- package/src/scripts/_lib/ratification_artifact.ts +278 -0
- package/src/scripts/_lib/release_findings_ingest.ts +324 -0
- package/src/scripts/_lib/release_tag_dispatch.ts +63 -0
- package/src/scripts/_lib/review_baseline.ts +254 -0
- package/src/scripts/_lib/review_skipped_record.ts +61 -1
- package/src/scripts/_lib/security_lint.ts +23 -2
- package/src/scripts/_lib/self_repair.ts +21 -0
- package/src/scripts/_lib/session_index_trust.ts +42 -1
- package/src/scripts/_lib/standing_bound_ratchet.ts +267 -88
- package/src/scripts/_lib/tolerance_shadow.ts +177 -0
- package/src/scripts/_lib/turn_end_refusals.ts +51 -4
- package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
- package/src/scripts/autonomy_friction_traffic.ts +379 -0
- package/src/scripts/check_beta_review_markers.ts +35 -4
- package/src/scripts/check_finding_dispositions.ts +167 -16
- package/src/scripts/check_held_object_arrivals.ts +381 -0
- package/src/scripts/check_kernel_edit_ratified.ts +462 -0
- package/src/scripts/check_loss_class_declared.ts +793 -46
- package/src/scripts/check_platform_anchor.ts +390 -0
- package/src/scripts/check_preamble_payload_budget.ts +672 -107
- package/src/scripts/check_projected_rule_routes.ts +395 -0
- package/src/scripts/check_release_published.ts +1 -1
- package/src/scripts/check_reply_consistency.ts +86 -17
- package/src/scripts/code_graph/cli.ts +6 -0
- package/src/scripts/condense.ts +2 -6
- package/src/scripts/generate_host_cost_table.ts +354 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +74 -30
- package/src/scripts/hooks/block_kernel_rule_writes.ts +12 -2
- package/src/scripts/hooks/category_a.ts +1 -1
- package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/end_review_nudge_hook.ts +101 -21
- package/src/scripts/hooks/review_baseline_hook.ts +130 -0
- package/src/scripts/hooks/session_eol_hook.ts +68 -154
- package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
- package/src/scripts/hooks/turn_end_gate_hook.ts +232 -14
- package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
- package/src/scripts/hooks_doctor.ts +4 -1
- package/src/scripts/hot_context_hook.ts +41 -401
- package/src/scripts/install.ts +1 -1
- package/src/scripts/interruption_report.ts +8 -2
- package/src/scripts/janitor.ts +8 -1
- package/src/scripts/lint_evidence_artifacts.ts +1 -0
- package/src/scripts/lint_knowledge_scale.ts +0 -26
- package/src/scripts/measure_turn_end_gate.ts +302 -5
- package/src/scripts/memory_lookup.ts +9 -9
- package/src/scripts/release.ts +52 -64
- package/src/scripts/release_drill.ts +193 -14
- package/src/scripts/release_env.ts +1 -1
- package/src/scripts/release_publication.ts +1 -1
- package/src/scripts/report_held_object_arrivals.ts +456 -0
- package/src/scripts/report_standing_payload_by_host.ts +7 -7
- package/src/scripts/session_memory_index.ts +5 -0
- package/src/scripts/sync_agent_settings.ts +394 -12
- package/src/server/io/yamlIO.ts +175 -17
- package/src/server/schemas/settings.ts +25 -5
- package/src/shared/settingsSurface.ts +13 -2
- package/src/templates/compact-instructions.md +8 -3
- package/dist/agent-src/commands/chat-history/import.md +0 -170
- package/dist/agent-src/commands/chat-history.md +0 -63
package/src/scripts/release.ts
CHANGED
|
@@ -30,21 +30,21 @@
|
|
|
30
30
|
* 3. Confirm — show preview, ask once (skippable with --yes;
|
|
31
31
|
* `--ci` always needs --yes — CI has no terminal).
|
|
32
32
|
* 4. Branch + bump — create `release/X.Y.Z`, update package.json,
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* check fails — see PR #226 post-mortem).
|
|
33
|
+
* marketplace.json and CHANGELOG.md, then run
|
|
34
|
+
* `task release-prepare` so pack manifests and tool
|
|
35
|
+
* projections pick up the new version (skip it and
|
|
36
|
+
* the PR's own consistency check fails — PR #226).
|
|
38
37
|
* 5. Commit + push — `release: X.Y.Z`, push branch, open PR.
|
|
39
38
|
* 6. Wait for CI — `gh pr checks --watch` (skippable with --no-wait).
|
|
40
|
-
* 7.
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* release-guard.yml
|
|
47
|
-
* cloud-release.yml explicitly.
|
|
39
|
+
* 7. Findings ledger — VERIFY it is on the branch and dispositioned, and
|
|
40
|
+
* STOP otherwise; `self-review-gate.yml` builds it.
|
|
41
|
+
* 8. Merge — `gh pr merge --merge --delete-branch`.
|
|
42
|
+
* 9. Tag main — fast-forward main, tag the merge commit, push the
|
|
43
|
+
* tag (triggers publish-npm.yml, except under --ci).
|
|
44
|
+
* 10. GitHub Release — `gh release create X.Y.Z --notes <changelog>`; under
|
|
45
|
+
* `--ci`, also dispatches release-guard.yml,
|
|
46
|
+
* publish-npm.yml and cloud-release.yml explicitly.
|
|
47
|
+
* 11. Cleanup — delete the merged release branch, local + remote.
|
|
48
48
|
*
|
|
49
49
|
* Idempotency: pass `--resume` to recover from a partial failure. Each
|
|
50
50
|
* step then probes existing state (branch, commit, PR, tag, GitHub
|
|
@@ -128,6 +128,8 @@ import {
|
|
|
128
128
|
} from './_lib/release_highlights.js';
|
|
129
129
|
import { canPrompt, promptLine } from './_lib/tty_prompt.js';
|
|
130
130
|
import { preflightPosition } from './_lib/release_position.js';
|
|
131
|
+
import { settleFindingsLedger } from './_lib/release_findings_ingest.js';
|
|
132
|
+
import { TAG_TRIGGERED_WORKFLOWS, dispatchTagWorkflows } from './_lib/release_tag_dispatch.js';
|
|
131
133
|
import {
|
|
132
134
|
RELEASE_HEAD_DEFAULT,
|
|
133
135
|
extract_changelog_section,
|
|
@@ -858,7 +860,7 @@ function preflight(target: string, opts: { resume?: boolean; ci?: boolean } = {}
|
|
|
858
860
|
// The local-in-sync-with-origin check only applies to main; if we're
|
|
859
861
|
// already on the release branch in resume mode, the relevant invariant
|
|
860
862
|
// is "main hasn't moved beyond what release/X.Y.Z branched off", which
|
|
861
|
-
// `git pull --ff-only` enforces in step
|
|
863
|
+
// `git pull --ff-only` enforces in step 9 anyway.
|
|
862
864
|
if (branch === MAIN_BRANCH) {
|
|
863
865
|
const local = git(['rev-parse', 'HEAD'], { capture: true });
|
|
864
866
|
const remote = git(['rev-parse', `${REMOTE}/${MAIN_BRANCH}`], { capture: true });
|
|
@@ -972,7 +974,7 @@ export function confirmGate(target: string, yes: boolean): ConfirmVerdict {
|
|
|
972
974
|
return { proceed: true };
|
|
973
975
|
}
|
|
974
976
|
|
|
975
|
-
//
|
|
977
|
+
// Orchestration.
|
|
976
978
|
|
|
977
979
|
function _step(n: number, total: number, msg: string): void {
|
|
978
980
|
process.stdout.write(`[${n}/${total}] ${msg}\n`);
|
|
@@ -988,7 +990,7 @@ function execute(
|
|
|
988
990
|
const ci = opts.ci ?? false;
|
|
989
991
|
|
|
990
992
|
const branch = `release/${plan.target}`;
|
|
991
|
-
const total =
|
|
993
|
+
const total = 11;
|
|
992
994
|
|
|
993
995
|
if (dry_run) {
|
|
994
996
|
process.stdout.write('(dry-run) no git/gh mutations will be performed.\n');
|
|
@@ -1000,12 +1002,12 @@ function execute(
|
|
|
1000
1002
|
const pr_state = pr_info ? pr_info['state'] : undefined;
|
|
1001
1003
|
const pr_merged = pr_state === 'MERGED';
|
|
1002
1004
|
|
|
1003
|
-
//
|
|
1005
|
+
// Step 1 — branch
|
|
1004
1006
|
checkout_release_branch(branch, pr_merged, (m) => {
|
|
1005
1007
|
_step(1, total, m);
|
|
1006
1008
|
});
|
|
1007
1009
|
|
|
1008
|
-
//
|
|
1010
|
+
// Step 1b — era split (optional, separate commit)
|
|
1009
1011
|
// Lands as `chore(changelog): split era ...` BEFORE the release commit
|
|
1010
1012
|
// so the split is reviewable on its own and the release commit only
|
|
1011
1013
|
// touches the bump + new entry. Idempotent: archive already on disk
|
|
@@ -1038,7 +1040,7 @@ function execute(
|
|
|
1038
1040
|
}
|
|
1039
1041
|
}
|
|
1040
1042
|
|
|
1041
|
-
//
|
|
1043
|
+
// Step 2 — file mutations
|
|
1042
1044
|
if (pr_merged) {
|
|
1043
1045
|
_step(2, total, 'PR already merged — skip file bumps');
|
|
1044
1046
|
} else {
|
|
@@ -1074,7 +1076,7 @@ function execute(
|
|
|
1074
1076
|
|
|
1075
1077
|
guard_release_curation(plan.target, pr_merged);
|
|
1076
1078
|
|
|
1077
|
-
//
|
|
1079
|
+
// Step 3 — commit
|
|
1078
1080
|
if (pr_merged) {
|
|
1079
1081
|
_step(3, total, 'PR already merged — skip commit');
|
|
1080
1082
|
} else {
|
|
@@ -1110,7 +1112,7 @@ function execute(
|
|
|
1110
1112
|
// `git push -u` is naturally idempotent — it prints "Everything
|
|
1111
1113
|
// up-to-date" when remote already matches. push_release_branch
|
|
1112
1114
|
// additionally absorbs a remote that moved under us.
|
|
1113
|
-
// Not a `_step`: a second `[4/
|
|
1115
|
+
// Not a `_step`: a second `[4/11]` makes the cited evidence anchors ambiguous.
|
|
1114
1116
|
process.stdout.write(' · verifying release gates locally (`task release:verify -- --cheap`)\n');
|
|
1115
1117
|
run(local_release_gate_argv());
|
|
1116
1118
|
|
|
@@ -1147,7 +1149,7 @@ function execute(
|
|
|
1147
1149
|
'--title', `release: ${plan.target}`, '--body', pr_body]);
|
|
1148
1150
|
}
|
|
1149
1151
|
|
|
1150
|
-
//
|
|
1152
|
+
// Step 6 — wait for checks
|
|
1151
1153
|
if (pr_merged) {
|
|
1152
1154
|
_step(6, total, 'PR already merged — skip checks wait');
|
|
1153
1155
|
} else if (wait_for_checks) {
|
|
@@ -1157,17 +1159,23 @@ function execute(
|
|
|
1157
1159
|
_step(6, total, 'Skip waiting for checks (--no-wait)');
|
|
1158
1160
|
}
|
|
1159
1161
|
|
|
1160
|
-
//
|
|
1162
|
+
// Step 7 — the findings ledger: verify, never produce; the module says why.
|
|
1163
|
+
settleFindingsLedger({
|
|
1164
|
+
run, die, repoRoot: REPO_ROOT, remote: REMOTE, trunk: MAIN_BRANCH,
|
|
1165
|
+
step: (m) => { _step(7, total, m); }, write: (s) => process.stdout.write(s),
|
|
1166
|
+
resolvePr: () => Number((pr_info ?? _pr_for_branch(branch))?.['number'] ?? NaN) || null,
|
|
1167
|
+
}, plan.target, branch, pr_merged);
|
|
1168
|
+
// Step 8 — merge
|
|
1161
1169
|
if (pr_merged) {
|
|
1162
|
-
_step(
|
|
1170
|
+
_step(8, total, `PR #${pr_info!['number']} already merged — skip`);
|
|
1163
1171
|
} else {
|
|
1164
|
-
_step(
|
|
1172
|
+
_step(8, total, 'Merge pull request (merge commit) and delete branch');
|
|
1165
1173
|
merge_release_pr(branch, wait_for_checks);
|
|
1166
1174
|
}
|
|
1167
1175
|
|
|
1168
|
-
//
|
|
1176
|
+
// Step 9 — tag main + push tag
|
|
1169
1177
|
// Always idempotent — even outside resume mode this prevents a mid-flight
|
|
1170
|
-
// crash on step
|
|
1178
|
+
// crash on step 10 from leaving a half-tagged release that subsequent
|
|
1171
1179
|
// `task release` invocations can't recover from without `--resume`.
|
|
1172
1180
|
if (git(['rev-parse', '--abbrev-ref', 'HEAD'], { capture: true }) !== MAIN_BRANCH) {
|
|
1173
1181
|
run(['git', 'checkout', MAIN_BRANCH]);
|
|
@@ -1176,29 +1184,29 @@ function execute(
|
|
|
1176
1184
|
|
|
1177
1185
|
if (_tag_exists_local(plan.target)) {
|
|
1178
1186
|
if (_tag_exists_remote(plan.target)) {
|
|
1179
|
-
_step(
|
|
1187
|
+
_step(9, total, `Tag ${plan.target} already on ${REMOTE} — skip`);
|
|
1180
1188
|
} else {
|
|
1181
|
-
_step(
|
|
1189
|
+
_step(9, total, `Tag ${plan.target} exists locally — push only`);
|
|
1182
1190
|
guard_publication(plan.target, 'tag push (resumed)');
|
|
1183
1191
|
_push_tag(plan.target);
|
|
1184
1192
|
}
|
|
1185
1193
|
} else {
|
|
1186
1194
|
// Sequencing is load-bearing (release-truth Phase 1, council
|
|
1187
|
-
// 2026-08-03): merge FIRST (step
|
|
1195
|
+
// 2026-08-03): merge FIRST (step 8), pull main (above), THEN derive
|
|
1188
1196
|
// the tag message from the MERGED changelog — tagging before the
|
|
1189
1197
|
// merge would read a section that does not exist yet. The annotated
|
|
1190
1198
|
// tag replaces the previous lightweight one so tag metadata is a
|
|
1191
1199
|
// fourth surface carrying the same single-source content.
|
|
1192
|
-
_step(
|
|
1200
|
+
_step(9, total, `Tag merge commit (annotated, from merged CHANGELOG) and push ${plan.target}`);
|
|
1193
1201
|
create_and_push_annotated_tag(plan.target);
|
|
1194
1202
|
}
|
|
1195
1203
|
|
|
1196
|
-
//
|
|
1204
|
+
// Step 10 — GitHub Release
|
|
1197
1205
|
if (_release_exists(plan.target)) {
|
|
1198
|
-
_step(
|
|
1206
|
+
_step(10, total, `GitHub Release ${plan.target} already exists — skip`);
|
|
1199
1207
|
} else {
|
|
1200
1208
|
_step(
|
|
1201
|
-
|
|
1209
|
+
10,
|
|
1202
1210
|
total,
|
|
1203
1211
|
ci
|
|
1204
1212
|
? 'Create GitHub Release (tag push under GITHUB_TOKEN triggers nothing — dispatching next)'
|
|
@@ -1223,7 +1231,7 @@ function execute(
|
|
|
1223
1231
|
guard_publication(plan.target, 'GitHub Release notes');
|
|
1224
1232
|
gh(['release', 'create', plan.target, '--title', plan.target, '--notes', notes]);
|
|
1225
1233
|
|
|
1226
|
-
//
|
|
1234
|
+
// Step 10b — dispatch-chain the tag-triggered workflows (--ci only)
|
|
1227
1235
|
// release-guard.yml, publish-npm.yml, and cloud-release.yml all
|
|
1228
1236
|
// trigger on `push: tags: [0-9]+.[0-9]+.[0-9]+`, but a tag pushed
|
|
1229
1237
|
// with the default GITHUB_TOKEN does NOT fire other workflows
|
|
@@ -1234,41 +1242,21 @@ function execute(
|
|
|
1234
1242
|
// branch above), so a --resume re-run never re-dispatches a
|
|
1235
1243
|
// publish that already happened.
|
|
1236
1244
|
if (ci) {
|
|
1237
|
-
_step(
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
// NOT fire tag-triggered workflows (GitHub's recursion guard). When
|
|
1243
|
-
// the tag was pushed with a PAT (RELEASE_PR_TOKEN), those three
|
|
1244
|
-
// workflows already fired on the push and this dispatch is redundant.
|
|
1245
|
-
// Dispatching via the API additionally needs the token's
|
|
1246
|
-
// `actions:write` scope; a 403 here (scope missing) must NOT mark an
|
|
1247
|
-
// already-shipped release as failed — warn and continue.
|
|
1248
|
-
for (const wf of ['release-guard.yml', 'publish-npm.yml', 'cloud-release.yml']) {
|
|
1249
|
-
const r = run(['gh', 'workflow', 'run', wf, '--ref', MAIN_BRANCH, '-f', `tag=${plan.target}`], {
|
|
1250
|
-
check: false,
|
|
1251
|
-
});
|
|
1252
|
-
if (r.returncode !== 0) {
|
|
1253
|
-
process.stderr.write(
|
|
1254
|
-
`⚠️ Could not dispatch ${wf} (exit ${r.returncode}) — the release ${plan.target} is ` +
|
|
1255
|
-
`already complete (tag + GitHub Release created; npm publishes async). If the tag was ` +
|
|
1256
|
-
`pushed with a PAT, ${wf} already fired on the tag push. If you rely on the explicit ` +
|
|
1257
|
-
`dispatch, grant RELEASE_PR_TOKEN the "Actions: read and write" scope (fine-grained PAT) ` +
|
|
1258
|
-
`or the "workflow" scope (classic PAT).\n`,
|
|
1259
|
-
);
|
|
1260
|
-
}
|
|
1261
|
-
}
|
|
1245
|
+
_step(10, total, `Dispatch ${TAG_TRIGGERED_WORKFLOWS.join(' + ')} for the tag`);
|
|
1246
|
+
dispatchTagWorkflows(
|
|
1247
|
+
{ run, warn: (s) => process.stderr.write(s), trunk: MAIN_BRANCH },
|
|
1248
|
+
plan.target,
|
|
1249
|
+
);
|
|
1262
1250
|
}
|
|
1263
1251
|
}
|
|
1264
1252
|
|
|
1265
|
-
//
|
|
1253
|
+
// Step 11 — delete the merged release branch (local + remote)
|
|
1266
1254
|
// Branch hygiene: a merged-but-undeleted release/X.Y.Z is what made
|
|
1267
1255
|
// `--resume` mis-detect an old version. Delete it now so it can never
|
|
1268
1256
|
// accumulate. Idempotent — skips whatever is already gone. Never touches
|
|
1269
1257
|
// `main` or any tag.
|
|
1270
1258
|
if (dry_run) {
|
|
1271
|
-
_step(
|
|
1259
|
+
_step(11, total, `Would delete merged branch ${branch} (local + remote)`);
|
|
1272
1260
|
} else {
|
|
1273
1261
|
const deleted: string[] = [];
|
|
1274
1262
|
if (
|
|
@@ -1283,7 +1271,7 @@ function execute(
|
|
|
1283
1271
|
deleted.push('remote');
|
|
1284
1272
|
}
|
|
1285
1273
|
const where = deleted.length > 0 ? deleted.join(' + ') : 'already gone';
|
|
1286
|
-
_step(
|
|
1274
|
+
_step(11, total, `Delete merged branch ${branch} (${where})`);
|
|
1287
1275
|
}
|
|
1288
1276
|
|
|
1289
1277
|
process.stdout.write('\n');
|
|
@@ -1292,7 +1280,7 @@ function execute(
|
|
|
1292
1280
|
process.stdout.write(' npm publish runs asynchronously via publish-npm.yml on the tag.\n');
|
|
1293
1281
|
}
|
|
1294
1282
|
|
|
1295
|
-
//
|
|
1283
|
+
// Entrypoint.
|
|
1296
1284
|
|
|
1297
1285
|
/** Mirror of `argparse.Namespace` for this CLI. */
|
|
1298
1286
|
interface Args {
|
|
@@ -143,6 +143,27 @@ interface WorldConfig {
|
|
|
143
143
|
merge_fails_hard?: boolean;
|
|
144
144
|
/** PR checks fail (watch exits non-zero) — the release must die. */
|
|
145
145
|
checks_fail?: boolean;
|
|
146
|
+
/**
|
|
147
|
+
* Step 7's world — two knobs, because the step asks two questions.
|
|
148
|
+
*
|
|
149
|
+
* It VERIFIES: the ledger is produced by the self-review workflow, so the
|
|
150
|
+
* only things a scenario can vary are whether the file is on the remote
|
|
151
|
+
* branch and what the disposition gate answers. An earlier version of this
|
|
152
|
+
* step ingested, and carried four more knobs for run discovery and artifact
|
|
153
|
+
* download; those went with it when the owner moved the ingest into CI.
|
|
154
|
+
*/
|
|
155
|
+
ledger_on_branch?: boolean;
|
|
156
|
+
/**
|
|
157
|
+
* Whether the ledger is on the TRUNK — the ref the merged path asks.
|
|
158
|
+
*
|
|
159
|
+
* Separate from `ledger_on_branch` because the two states worth testing are
|
|
160
|
+
* exactly the ones a single boolean cannot express: present on the branch
|
|
161
|
+
* and not on the trunk, and the reverse. Defaults to `ledger_on_branch`, so
|
|
162
|
+
* every scenario written before this knob keeps its answer.
|
|
163
|
+
*/
|
|
164
|
+
ledger_on_trunk?: boolean;
|
|
165
|
+
/** Exit code + streams the disposition gate answers with. */
|
|
166
|
+
disposition_verdict?: { status: number; stdout: string; stderr: string };
|
|
146
167
|
/**
|
|
147
168
|
* Content `git show <target>:CHANGELOG.md` returns.
|
|
148
169
|
*
|
|
@@ -169,7 +190,7 @@ interface WorldConfig {
|
|
|
169
190
|
changelog?: string;
|
|
170
191
|
/**
|
|
171
192
|
* Content the WORKING-TREE read returns — `read_changelog_text()`, used by
|
|
172
|
-
* step 5 (PR body) and step
|
|
193
|
+
* step 5 (PR body) and step 9 (annotated-tag message).
|
|
173
194
|
*
|
|
174
195
|
* Added 2026-09-01 with the publication guard (roadmap § 3.1). `changelog`
|
|
175
196
|
* above only covers `git show <tag>:CHANGELOG.md`; the working tree was
|
|
@@ -189,19 +210,20 @@ interface WorldConfig {
|
|
|
189
210
|
*/
|
|
190
211
|
tag_created_unpushed?: boolean;
|
|
191
212
|
/**
|
|
192
|
-
* The tag is already on the remote, so step
|
|
213
|
+
* The tag is already on the remote, so step 9 skips entirely and step 10 —
|
|
193
214
|
* the GitHub Release body — is the FIRST irreversible transition the run
|
|
194
215
|
* reaches. The only state in which the Release guard can be exercised on
|
|
195
|
-
* its own, because a marker otherwise stops the run at step
|
|
216
|
+
* its own, because a marker otherwise stops the run at step 9.
|
|
196
217
|
*/
|
|
197
218
|
tag_already_remote?: boolean;
|
|
198
219
|
/**
|
|
199
220
|
* The release PR is ALREADY merged when the run starts — the real
|
|
200
|
-
* resume-after-merge state, in which steps 1 through
|
|
201
|
-
* the
|
|
221
|
+
* resume-after-merge state, in which steps 1 through 6 skip, step 7 still
|
|
222
|
+
* verifies the ledger (on the trunk, since the branch is gone) and step 8
|
|
223
|
+
* is the first step that does work.
|
|
202
224
|
*
|
|
203
225
|
* Added 2026-09-02 with `guard_release_branch_push`. Before that guard, a
|
|
204
|
-
* marker scenario could start from scratch and still reach step
|
|
226
|
+
* marker scenario could start from scratch and still reach step 9, because
|
|
205
227
|
* nothing between the changelog write and the tag looked at the section.
|
|
206
228
|
* The push guard now stops such a run at step 4 — correctly, and that is
|
|
207
229
|
* the point of it — which makes this knob the only way left to exercise
|
|
@@ -300,6 +322,9 @@ class FakeWorld {
|
|
|
300
322
|
private merge_races_once: boolean;
|
|
301
323
|
private merge_fails_hard: boolean;
|
|
302
324
|
private checks_fail: boolean;
|
|
325
|
+
private readonly ledger_on_branch: boolean;
|
|
326
|
+
private readonly ledger_on_trunk: boolean | undefined;
|
|
327
|
+
private readonly disposition_verdict: { status: number; stdout: string; stderr: string };
|
|
303
328
|
private readonly changelog: string;
|
|
304
329
|
/** Working-tree content; see `WorldConfig.changelog_file`. */
|
|
305
330
|
readonly changelog_file: string;
|
|
@@ -321,6 +346,12 @@ class FakeWorld {
|
|
|
321
346
|
this.checks_fail = cfg.checks_fail ?? false;
|
|
322
347
|
this.pr_merged = cfg.pr_already_merged ?? false;
|
|
323
348
|
this.release_verify_fails = cfg.release_verify_fails ?? false;
|
|
349
|
+
// Defaults keep every pre-2026-09-11 scenario green: the ledger is
|
|
350
|
+
// already on the branch and the gate is happy, so step 7 is a two-call
|
|
351
|
+
// no-op and the sequencing scenarios stay about sequencing.
|
|
352
|
+
this.ledger_on_branch = cfg.ledger_on_branch ?? true;
|
|
353
|
+
this.ledger_on_trunk = cfg.ledger_on_trunk;
|
|
354
|
+
this.disposition_verdict = cfg.disposition_verdict ?? { status: 0, stdout: '', stderr: '' };
|
|
324
355
|
}
|
|
325
356
|
|
|
326
357
|
exec(args: readonly string[]): ExecResult {
|
|
@@ -483,6 +514,21 @@ class FakeWorld {
|
|
|
483
514
|
return OK;
|
|
484
515
|
}
|
|
485
516
|
|
|
517
|
+
// Step 7 — the findings ledger.
|
|
518
|
+
if (cmd.startsWith('git cat-file -e ')) {
|
|
519
|
+
// REF-AWARE, because one boolean for every ref made the two states
|
|
520
|
+
// that distinguish right from wrong inexpressible: on the branch
|
|
521
|
+
// but not the trunk, and the reverse. A fourth review named the
|
|
522
|
+
// merged-path scenario as asserting a string in the argv rather
|
|
523
|
+
// than the ref that was read.
|
|
524
|
+
const onTrunk = this.ledger_on_trunk ?? this.ledger_on_branch;
|
|
525
|
+
const present = cmd.includes('/main:') ? onTrunk : this.ledger_on_branch;
|
|
526
|
+
return present ? OK : { ...OK, status: 1 };
|
|
527
|
+
}
|
|
528
|
+
if (cmd.includes('check_finding_dispositions --release')) {
|
|
529
|
+
return { ...this.disposition_verdict };
|
|
530
|
+
}
|
|
531
|
+
|
|
486
532
|
throw new Error(`FakeWorld: unscripted command: ${cmd}`);
|
|
487
533
|
}
|
|
488
534
|
}
|
|
@@ -515,6 +561,139 @@ function _count(world: FakeWorld, needle: string): number {
|
|
|
515
561
|
}
|
|
516
562
|
|
|
517
563
|
const SCENARIOS: Record<string, Scenario> = {
|
|
564
|
+
'findings-ledger-verified-on-the-remote-branch': {
|
|
565
|
+
summary:
|
|
566
|
+
'step 7: the ledger is on the remote branch and the gate passes — the release continues without producing anything',
|
|
567
|
+
// Step 7 VERIFIES. The ingest lives in the self-review workflow, which
|
|
568
|
+
// commits the ledger to the release branch; two review rounds showed no
|
|
569
|
+
// placement inside this script can produce it, because the gate it
|
|
570
|
+
// anticipates already reds the check step 6 waits on.
|
|
571
|
+
// `resume: false` is load-bearing, not tidiness. `resume` defaults to
|
|
572
|
+
// TRUE here, and on a resumed run the PR number is already in hand — so
|
|
573
|
+
// a scenario that kept the default could not see the `--pr` flag being
|
|
574
|
+
// dropped, which is exactly the hole this scenario asserts against.
|
|
575
|
+
config: { ledger_on_branch: true, resume: false },
|
|
576
|
+
expect_success: true,
|
|
577
|
+
verify: (w) => {
|
|
578
|
+
const f: string[] = [];
|
|
579
|
+
const probe = w.calls.find((c) => c.startsWith('git cat-file -e '));
|
|
580
|
+
_expect(probe !== undefined, 'the ledger presence was never probed', f);
|
|
581
|
+
_expect(
|
|
582
|
+
(probe ?? '').includes('origin/'),
|
|
583
|
+
`the probe read a local ref, which a failed push makes true: ${probe ?? '(none)'}`,
|
|
584
|
+
f,
|
|
585
|
+
);
|
|
586
|
+
_expect(
|
|
587
|
+
!w.calls.some((c) => c.includes('--ingest')),
|
|
588
|
+
'step 7 ingested — that belongs to the workflow now, not the release',
|
|
589
|
+
f,
|
|
590
|
+
);
|
|
591
|
+
_expect(
|
|
592
|
+
!w.calls.some((c) => c.startsWith('gh run download')),
|
|
593
|
+
'step 7 downloaded an artifact — the release no longer produces the ledger',
|
|
594
|
+
f,
|
|
595
|
+
);
|
|
596
|
+
// `--pr` is what makes the gate compare the review's own report
|
|
597
|
+
// against the committed ledger. The PR number used to come only
|
|
598
|
+
// from the resume-time probe, so on a FIRST run — this scenario —
|
|
599
|
+
// the flag was silently dropped and the release passed a strictly
|
|
600
|
+
// weaker check than the one it was trying to pre-satisfy.
|
|
601
|
+
_expect(
|
|
602
|
+
w.calls.some(
|
|
603
|
+
(c) => c.includes('check_finding_dispositions --release') && c.includes('--pr '),
|
|
604
|
+
),
|
|
605
|
+
'the disposition gate ran without --pr, so an un-ingested finding would pass here',
|
|
606
|
+
f,
|
|
607
|
+
);
|
|
608
|
+
_expect(
|
|
609
|
+
w.calls.includes(`gh pr merge ${w.branch} --merge --delete-branch`),
|
|
610
|
+
'the release never reached the merge',
|
|
611
|
+
f,
|
|
612
|
+
);
|
|
613
|
+
return f;
|
|
614
|
+
},
|
|
615
|
+
},
|
|
616
|
+
'findings-ledger-absent-stops-the-release': {
|
|
617
|
+
summary:
|
|
618
|
+
'step 7: no ledger on the remote branch — the release STOPS rather than merging and tagging without one',
|
|
619
|
+
config: { ledger_on_branch: false },
|
|
620
|
+
expect_success: false,
|
|
621
|
+
verify: (w, error) => {
|
|
622
|
+
const f: string[] = [];
|
|
623
|
+
_expect(
|
|
624
|
+
(error ?? '').includes('is not on origin/'),
|
|
625
|
+
`the stop did not name the ref it checked: ${error ?? '(no error)'}`,
|
|
626
|
+
f,
|
|
627
|
+
);
|
|
628
|
+
_expect(
|
|
629
|
+
!w.calls.includes(`gh pr merge ${w.branch} --merge --delete-branch`),
|
|
630
|
+
'merged with no ledger — the failure this step exists to end',
|
|
631
|
+
f,
|
|
632
|
+
);
|
|
633
|
+
_expect(!w.tag_remote, 'tagged with no ledger', f);
|
|
634
|
+
return f;
|
|
635
|
+
},
|
|
636
|
+
},
|
|
637
|
+
'findings-ledger-absent-after-a-hand-merge-still-stops': {
|
|
638
|
+
summary:
|
|
639
|
+
'step 7: the PR is already merged and no ledger reached the trunk — the release STOPS instead of tagging a version whose ledger does not exist',
|
|
640
|
+
// The reachable path to a shipped version with no ledger, and the one
|
|
641
|
+
// the old code asserted away: the ingest produces nothing, step 7
|
|
642
|
+
// stops, a human merges the PR, and the resumed run used to print "the
|
|
643
|
+
// ledger rode in with it" without reading anything.
|
|
644
|
+
// The two knobs differ on purpose: the ledger IS on the release branch
|
|
645
|
+
// and is NOT on the trunk. A run that read the branch ref would pass
|
|
646
|
+
// here, which is the wrong answer — the branch is deleted and the merge
|
|
647
|
+
// is what decides whether the ledger shipped.
|
|
648
|
+
config: { pr_already_merged: true, ledger_on_branch: true, ledger_on_trunk: false },
|
|
649
|
+
expect_success: false,
|
|
650
|
+
verify: (w, error) => {
|
|
651
|
+
const f: string[] = [];
|
|
652
|
+
_expect(
|
|
653
|
+
(error ?? '').includes('already merged'),
|
|
654
|
+
`the stop did not name the merged state: ${error ?? '(no error)'}`,
|
|
655
|
+
f,
|
|
656
|
+
);
|
|
657
|
+
_expect(
|
|
658
|
+
w.calls.some((c) => c.startsWith('git cat-file -e ') && c.includes('/main:')),
|
|
659
|
+
'the merged path never asked the trunk whether the ledger is there',
|
|
660
|
+
f,
|
|
661
|
+
);
|
|
662
|
+
_expect(!w.tag_remote, 'tagged a version whose findings ledger does not exist', f);
|
|
663
|
+
return f;
|
|
664
|
+
},
|
|
665
|
+
},
|
|
666
|
+
'findings-ledger-undispositioned-stops-and-shows-why': {
|
|
667
|
+
summary:
|
|
668
|
+
'step 7: the disposition gate refuses — the release stops and the operator is shown the gate report, not just its scan line',
|
|
669
|
+
config: {
|
|
670
|
+
ledger_on_branch: true,
|
|
671
|
+
disposition_verdict: {
|
|
672
|
+
status: 1,
|
|
673
|
+
stdout: 'scanned: 1',
|
|
674
|
+
stderr: '- `a1` (critical security: x): no disposition status',
|
|
675
|
+
},
|
|
676
|
+
},
|
|
677
|
+
expect_success: false,
|
|
678
|
+
verify: (w, error) => {
|
|
679
|
+
const f: string[] = [];
|
|
680
|
+
// The defect an independent review reproduced: the stop message
|
|
681
|
+
// preferred stdout, so the operator saw `scanned: 1` and the entire
|
|
682
|
+
// per-finding diagnosis — which the gate writes to stderr — was
|
|
683
|
+
// discarded on the one path where the message has to carry content.
|
|
684
|
+
_expect(
|
|
685
|
+
(error ?? '').includes('no disposition status'),
|
|
686
|
+
`the gate's own diagnosis was swallowed: ${error ?? '(no error)'}`,
|
|
687
|
+
f,
|
|
688
|
+
);
|
|
689
|
+
_expect(
|
|
690
|
+
!w.calls.includes(`gh pr merge ${w.branch} --merge --delete-branch`),
|
|
691
|
+
'merged over an undispositioned ledger',
|
|
692
|
+
f,
|
|
693
|
+
);
|
|
694
|
+
return f;
|
|
695
|
+
},
|
|
696
|
+
},
|
|
518
697
|
'plain-run-reuses-an-existing-branch': {
|
|
519
698
|
summary:
|
|
520
699
|
'step 1: a PLAIN run (no --resume) over an existing release branch checks it out instead of dying at `git checkout -b`',
|
|
@@ -664,7 +843,7 @@ const SCENARIOS: Record<string, Scenario> = {
|
|
|
664
843
|
},
|
|
665
844
|
'marker-refuses-before-tag': {
|
|
666
845
|
summary:
|
|
667
|
-
'step
|
|
846
|
+
'step 9: a draft marker in the merged section refuses BEFORE the annotated tag is created',
|
|
668
847
|
config: {
|
|
669
848
|
pr_already_merged: true,
|
|
670
849
|
changelog_file: markedChangelogFixture(current_version()),
|
|
@@ -691,7 +870,7 @@ const SCENARIOS: Record<string, Scenario> = {
|
|
|
691
870
|
},
|
|
692
871
|
'marker-refuses-resumed-tag-push': {
|
|
693
872
|
summary:
|
|
694
|
-
'step
|
|
873
|
+
'step 9 (§ 3.2): a tag created but never pushed is NOT pushed when its section carries the marker',
|
|
695
874
|
config: {
|
|
696
875
|
pr_already_merged: true,
|
|
697
876
|
tag_created_unpushed: true,
|
|
@@ -720,7 +899,7 @@ const SCENARIOS: Record<string, Scenario> = {
|
|
|
720
899
|
},
|
|
721
900
|
'marker-refuses-github-release': {
|
|
722
901
|
summary:
|
|
723
|
-
'step
|
|
902
|
+
'step 10: with the tag already pushed, a marker in the TAGGED section refuses before the Release is created',
|
|
724
903
|
config: {
|
|
725
904
|
pr_already_merged: true,
|
|
726
905
|
tag_already_remote: true,
|
|
@@ -793,7 +972,7 @@ const SCENARIOS: Record<string, Scenario> = {
|
|
|
793
972
|
},
|
|
794
973
|
},
|
|
795
974
|
'behind-then-merge': {
|
|
796
|
-
summary: 'step
|
|
975
|
+
summary: 'step 8: head BEHIND main — update branch, re-run checks, merge (9.16.0)',
|
|
797
976
|
config: { behind_probes: 1 },
|
|
798
977
|
expect_success: true,
|
|
799
978
|
verify: (w, _err) => {
|
|
@@ -813,7 +992,7 @@ const SCENARIOS: Record<string, Scenario> = {
|
|
|
813
992
|
},
|
|
814
993
|
},
|
|
815
994
|
'merge-race-recovers': {
|
|
816
|
-
summary: 'step
|
|
995
|
+
summary: 'step 8: main moves between the CLEAN probe and the merge — retry, not crash',
|
|
817
996
|
config: { merge_races_once: true },
|
|
818
997
|
expect_success: true,
|
|
819
998
|
verify: (w, _err) => {
|
|
@@ -828,7 +1007,7 @@ const SCENARIOS: Record<string, Scenario> = {
|
|
|
828
1007
|
},
|
|
829
1008
|
},
|
|
830
1009
|
'behind-forever-dies': {
|
|
831
|
-
summary: `step
|
|
1010
|
+
summary: `step 8: BEHIND persists past ${_MERGE_UPDATE_ROUNDS} update rounds — die with the resume command`,
|
|
832
1011
|
config: { behind_probes: 99 },
|
|
833
1012
|
expect_success: false,
|
|
834
1013
|
verify: (w, err) => {
|
|
@@ -845,7 +1024,7 @@ const SCENARIOS: Record<string, Scenario> = {
|
|
|
845
1024
|
},
|
|
846
1025
|
},
|
|
847
1026
|
'merge-fails-hard-surfaces': {
|
|
848
|
-
summary: 'step
|
|
1027
|
+
summary: 'step 8: a non-BEHIND merge failure surfaces unchanged instead of looping',
|
|
849
1028
|
config: { merge_fails_hard: true },
|
|
850
1029
|
expect_success: false,
|
|
851
1030
|
verify: (w, err) => {
|
|
@@ -905,7 +1084,7 @@ function run_scenario(name: string): ScenarioOutcome {
|
|
|
905
1084
|
const tree_snapshot = _snapshot_step_2_files();
|
|
906
1085
|
_set_exec_override((args) => world.exec(args));
|
|
907
1086
|
// The working-tree read, faked for the same reason the command layer is.
|
|
908
|
-
// Without this the drill's step
|
|
1087
|
+
// Without this the drill's step 9 reads the repository's real CHANGELOG.md.
|
|
909
1088
|
_set_changelog_reader(() => world.changelog_file);
|
|
910
1089
|
try {
|
|
911
1090
|
execute(plan, { wait_for_checks: true, dry_run: false, resume: scenario.config.resume ?? true });
|
|
@@ -98,7 +98,7 @@ const CHANGELOG = path.join(REPO_ROOT, 'CHANGELOG.md');
|
|
|
98
98
|
* Mirrors `_set_exec_override` in `release_publication.ts`, and exists for the
|
|
99
99
|
* same reason: `execute()` reads `CHANGELOG.md` off disk at two points (the PR
|
|
100
100
|
* body and the annotated-tag message), and the release drill fakes commands
|
|
101
|
-
* but not the filesystem. Before this seam the drill's step
|
|
101
|
+
* but not the filesystem. Before this seam the drill's step 9 read the
|
|
102
102
|
* repository's REAL changelog — whose current section carries four
|
|
103
103
|
* `_auto-derived, rewrite before merge:_` lines at `14.13.0` — so a
|
|
104
104
|
* publication guard added at that call site refused every drill scenario for a
|
|
@@ -956,7 +956,7 @@ function _remote_tag_commit(tag: string): string | null {
|
|
|
956
956
|
|
|
957
957
|
/**
|
|
958
958
|
* Push a tag, tolerating exactly ONE failure: the concurrent-release race.
|
|
959
|
-
* `_tag_exists_remote` in step
|
|
959
|
+
* `_tag_exists_remote` in step 9 is a live check, but between it and this
|
|
960
960
|
* push a parallel `task release` run can land the same tag (measured
|
|
961
961
|
* 2026-08-09, 9.28.0). When the remote tag already points at the same commit
|
|
962
962
|
* as the local one, the repository IS in the desired state — continue. Any
|