@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
|
@@ -41,15 +41,21 @@ import * as path from 'node:path';
|
|
|
41
41
|
import { read_lockfile } from './installed_lock.js';
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
|
-
* The
|
|
44
|
+
* The five detectors, in the order the gate runs them.
|
|
45
45
|
*
|
|
46
46
|
* The roadmap's § 0 names three (A promissory, B language, C verification).
|
|
47
47
|
* That was true of the draft and is not true of the tree: detector D
|
|
48
|
-
* (`completion`) landed under round 7 § Phase 1
|
|
49
|
-
*
|
|
48
|
+
* (`completion`) landed under round 7 § Phase 1, detector E
|
|
49
|
+
* (`pending-decision`) under road-to-a-question-that-survives-the-turn, and
|
|
50
|
+
* detector F (`untested`) on 2026-09-11 — all of which run in the same detector
|
|
51
|
+
* list as the first three. Counting three would silently drop a detector's
|
|
50
52
|
* refusals, so the set is read off `DetectorId` in the gate rather than off the
|
|
51
53
|
* prose.
|
|
52
54
|
*
|
|
55
|
+
* F is the one that asks whether a change is TESTED rather than whether
|
|
56
|
+
* something ran: C is satisfied by `eslint`, which is how a feature with zero
|
|
57
|
+
* test lines passed every guard in that file.
|
|
58
|
+
*
|
|
53
59
|
* This said "the same UNCONDITIONAL list" until 2026-08-18, which was wrong and
|
|
54
60
|
* is worth naming rather than quietly rewording: `main()` runs A and D only when
|
|
55
61
|
* no subagent dispatch is open. It does not change this set — every detector
|
|
@@ -63,6 +69,8 @@ export const DETECTOR_IDS = [
|
|
|
63
69
|
'language',
|
|
64
70
|
'verification',
|
|
65
71
|
'completion',
|
|
72
|
+
'pending-decision',
|
|
73
|
+
'untested',
|
|
66
74
|
] as const;
|
|
67
75
|
|
|
68
76
|
export type RefusalDetectorId = (typeof DETECTOR_IDS)[number];
|
|
@@ -138,10 +146,39 @@ export interface RefusalRecord {
|
|
|
138
146
|
counts?: Partial<DetectorCounts>;
|
|
139
147
|
/** Package version recorded at the most recent refusal, when readable. */
|
|
140
148
|
agent_config_version?: string;
|
|
149
|
+
/**
|
|
150
|
+
* The host's own id for the prompt being processed at the most recent
|
|
151
|
+
* refusal, when the payload carries one.
|
|
152
|
+
*
|
|
153
|
+
* Recorded BESIDE `refused_turn`, never instead of it. The ordinal stays the
|
|
154
|
+
* re-entrancy key — its drift history is why both guard layers exist, and
|
|
155
|
+
* swapping the key of a wedge-critical guard on an axis nothing measures is
|
|
156
|
+
* a behaviour change dressed as a correction. What the pair buys is the
|
|
157
|
+
* measurement: two refusals carrying the same `refused_prompt_id` and
|
|
158
|
+
* different `refused_turn` are one prompt whose ordinal drifted, which is
|
|
159
|
+
* the failure this file's own header describes and which the ordinal alone
|
|
160
|
+
* cannot distinguish from two genuine turns.
|
|
161
|
+
*/
|
|
162
|
+
refused_prompt_id?: string;
|
|
141
163
|
}
|
|
142
164
|
|
|
165
|
+
/**
|
|
166
|
+
* A zeroed counter per detector, DERIVED from `DETECTOR_IDS` rather than
|
|
167
|
+
* written out.
|
|
168
|
+
*
|
|
169
|
+
* It was an object literal of four keys until detector E landed, and the
|
|
170
|
+
* literal is what made adding a detector a silent arithmetic defect rather than
|
|
171
|
+
* a type error: `DetectorCounts` is `Record<RefusalDetectorId, number>`, the
|
|
172
|
+
* literal satisfied it for the union of the day, and a fifth id then read back
|
|
173
|
+
* as `undefined` — so every `+=` over it produced `NaN` and the whole rollup
|
|
174
|
+
* went quiet. The sibling test asserts that the id list and the gate's union
|
|
175
|
+
* agree; nothing asserted that the COUNTER covered the list, which is the half
|
|
176
|
+
* this construction removes the need to assert.
|
|
177
|
+
*/
|
|
143
178
|
export function emptyCounts(): DetectorCounts {
|
|
144
|
-
|
|
179
|
+
const out = {} as DetectorCounts;
|
|
180
|
+
for (const id of DETECTOR_IDS) out[id] = 0;
|
|
181
|
+
return out;
|
|
145
182
|
}
|
|
146
183
|
|
|
147
184
|
function isDetector(v: unknown): v is RefusalDetectorId {
|
|
@@ -174,6 +211,9 @@ export function parseRecord(raw: string): RefusalRecord | null {
|
|
|
174
211
|
if (typeof o['agent_config_version'] === 'string') {
|
|
175
212
|
rec.agent_config_version = o['agent_config_version'];
|
|
176
213
|
}
|
|
214
|
+
if (typeof o['refused_prompt_id'] === 'string') {
|
|
215
|
+
rec.refused_prompt_id = o['refused_prompt_id'];
|
|
216
|
+
}
|
|
177
217
|
const counts = o['counts'];
|
|
178
218
|
if (typeof counts === 'object' && counts !== null && !Array.isArray(counts)) {
|
|
179
219
|
const parsed: Partial<DetectorCounts> = {};
|
|
@@ -231,6 +271,7 @@ export function foldRefusal(
|
|
|
231
271
|
turnOrdinal: number;
|
|
232
272
|
at: string;
|
|
233
273
|
version?: string | undefined;
|
|
274
|
+
promptId?: string | undefined;
|
|
234
275
|
},
|
|
235
276
|
): RefusalRecord {
|
|
236
277
|
const counts = prev === null ? emptyCounts() : countsOf(prev);
|
|
@@ -247,6 +288,12 @@ export function foldRefusal(
|
|
|
247
288
|
else if (prev?.agent_config_version !== undefined) {
|
|
248
289
|
rec.agent_config_version = prev.agent_config_version;
|
|
249
290
|
}
|
|
291
|
+
// Not inherited from `prev` when this refusal carries none: the field
|
|
292
|
+
// describes THIS refusal's prompt, and carrying a previous one forward would
|
|
293
|
+
// read as an identity the payload never supplied.
|
|
294
|
+
if (input.promptId !== undefined && input.promptId !== '') {
|
|
295
|
+
rec.refused_prompt_id = input.promptId;
|
|
296
|
+
}
|
|
250
297
|
return rec;
|
|
251
298
|
}
|
|
252
299
|
|
|
@@ -33,6 +33,14 @@
|
|
|
33
33
|
* 7. Business-context SQL identifiers — caller-supplied table / column
|
|
34
34
|
* allow-list. Default empty.
|
|
35
35
|
* 8. Inline code excerpts > 40 chars — any backtick-fenced run > 40.
|
|
36
|
+
*
|
|
37
|
+
* loss_class: exact
|
|
38
|
+
*
|
|
39
|
+
* Named despite the module's name: the redactor never rewrites. It returns a
|
|
40
|
+
* {@link RedactionResult} verdict and the caller refuses, so no byte of the
|
|
41
|
+
* input is dropped or replaced here — "a rewritten secret is still a leaked
|
|
42
|
+
* secret". `exact` is the class that says nothing is lost, and it is what this
|
|
43
|
+
* module guarantees its callers.
|
|
36
44
|
*/
|
|
37
45
|
|
|
38
46
|
import { _RAW_KEY_PREFIXES } from './config.js';
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autonomy_friction_traffic — what share of REAL Bash traffic this package
|
|
3
|
+
* can spare a host confirmation, and what the rest is shaped like.
|
|
4
|
+
*
|
|
5
|
+
* WHY A SECOND FRICTION INSTRUMENT. `autonomy_friction_corpus` measures seven
|
|
6
|
+
* declared payload classes through the real dispatcher: it answers "does the
|
|
7
|
+
* classifier behave as designed" and it answers it exactly. What it cannot
|
|
8
|
+
* answer is "how much of what the agent actually types does the design
|
|
9
|
+
* cover", because a hand-written corpus contains the shapes its author
|
|
10
|
+
* thought of. That number turned out to be the one that mattered: measured
|
|
11
|
+
* over 7,569 distinct real Bash calls in 39 transcripts on 2026-09-10,
|
|
12
|
+
* category A covered 126 of them — 1.7 %.
|
|
13
|
+
*
|
|
14
|
+
* WHAT IT MEASURES, STATED NARROWLY. Three things, over a transcript store:
|
|
15
|
+
* the share of Bash calls that are category A (the calls this package hands
|
|
16
|
+
* the host an explicit `permissionDecision: allow` for); which disqualifier
|
|
17
|
+
* each remaining call hits FIRST; and how many carry one of the two shapes
|
|
18
|
+
* the chain-nudge concern flags. It is NOT a measurement of confirmations the
|
|
19
|
+
* operator saw. The host's own permission documentation records that
|
|
20
|
+
* `permissions.allow` does not bypass the auto-mode classifier, so a consumer
|
|
21
|
+
* whose settings already allow a call may see no prompt for a call counted
|
|
22
|
+
* here as uncovered, and a call inside category A may still be classified by
|
|
23
|
+
* the host. Reading this as host behaviour is the
|
|
24
|
+
* fact-about-our-plumbing-written-as-a-fact-about-the-host collapse the hook
|
|
25
|
+
* contract warns about three times.
|
|
26
|
+
*
|
|
27
|
+
* NOT A GATE. It has no baseline and fails nothing. A gate over this number
|
|
28
|
+
* would ratchet a figure that moves with how the operator happened to work
|
|
29
|
+
* that week, which is a measurement of the week and not of the tree. Exit 1
|
|
30
|
+
* means the store was unreadable or empty — a probe that reports zeros from
|
|
31
|
+
* an absent store is worse than one that refuses.
|
|
32
|
+
*
|
|
33
|
+
* SHARED DETECTORS, NOT A SECOND COPY. The avoidable-shape counts come from
|
|
34
|
+
* the concern's own exported `detectEditByShell` / `detectChaining`, and the
|
|
35
|
+
* metacharacter class is `category_a`'s own exported constant, so a change to
|
|
36
|
+
* either moves this report and the live carrier together. A private copy here
|
|
37
|
+
* would let the two drift and the report would then describe a carrier that
|
|
38
|
+
* does not exist — the first draft held exactly such a copy, and it computed
|
|
39
|
+
* the split the whole report turns on.
|
|
40
|
+
*
|
|
41
|
+
* WHAT MAKES A FIGURE FROM THIS PROBE COMPARABLE. Two properties, both of
|
|
42
|
+
* which the first draft lacked. Calls are deduplicated by tool-use id, because
|
|
43
|
+
* a resumed session rewrites its earlier turns into a new transcript and a
|
|
44
|
+
* window of files therefore counts them twice. And the running session's own
|
|
45
|
+
* transcript is excluded by default, because every call the probe itself makes
|
|
46
|
+
* lands in a file it is about to read — two runs minutes apart reported 7,518
|
|
47
|
+
* and 7,653 for the same tree before that. What remains uncontrolled is the
|
|
48
|
+
* window: `--limit 40` names the 40 most recent transcripts, and which files
|
|
49
|
+
* those are moves as new sessions appear. So pin the DATE with the figure and
|
|
50
|
+
* read a later run as measuring the window as well as the tree.
|
|
51
|
+
*
|
|
52
|
+
* Usage:
|
|
53
|
+
* ./scripts-run src/scripts/autonomy_friction_traffic [--store DIR] [--limit N] [--json]
|
|
54
|
+
* … [--include-current] include the running session's own transcript
|
|
55
|
+
*/
|
|
56
|
+
import * as fs from "node:fs";
|
|
57
|
+
import * as os from "node:os";
|
|
58
|
+
import * as path from "node:path";
|
|
59
|
+
import process from "node:process";
|
|
60
|
+
import { fileURLToPath } from "node:url";
|
|
61
|
+
|
|
62
|
+
import { detectChaining, detectEditByShell } from "./hooks/chain_nudge_hook.js";
|
|
63
|
+
import {
|
|
64
|
+
isCategoryABashCommand,
|
|
65
|
+
namesConsequenceOperation,
|
|
66
|
+
SHELL_METACHARACTERS,
|
|
67
|
+
} from "./hooks/category_a.js";
|
|
68
|
+
|
|
69
|
+
// Re-exported so a test can assert this module refuses on the CLASSIFIER's
|
|
70
|
+
// metacharacter set rather than on a copy of it. The first draft held a private
|
|
71
|
+
// regex literal here while the header claimed shared detectors, and that copy
|
|
72
|
+
// computed the split the whole report turns on.
|
|
73
|
+
export { SHELL_METACHARACTERS };
|
|
74
|
+
|
|
75
|
+
/** How many transcripts to read when `--limit` is absent. */
|
|
76
|
+
const DEFAULT_LIMIT = 40;
|
|
77
|
+
|
|
78
|
+
/** One measured report. */
|
|
79
|
+
export interface TrafficReport {
|
|
80
|
+
store: string;
|
|
81
|
+
transcripts: number;
|
|
82
|
+
calls: number;
|
|
83
|
+
categoryA: number;
|
|
84
|
+
/** First disqualifier for each non-category-A call. */
|
|
85
|
+
disqualifiers: Record<string, number>;
|
|
86
|
+
/** Head token → count, for non-category-A calls only. */
|
|
87
|
+
heads: Record<string, number>;
|
|
88
|
+
/** The chain-nudge shape classes, counted over every call. */
|
|
89
|
+
shapes: { editByShell: number; chain: number };
|
|
90
|
+
/** Which write shapes, in the concern's own words. */
|
|
91
|
+
editShapes: Record<string, number>;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** One Bash call, with the tool-use id that identifies it across files. */
|
|
95
|
+
export interface BashCall {
|
|
96
|
+
/** The host's `tool_use` id, or `""` when the record carries none. */
|
|
97
|
+
id: string;
|
|
98
|
+
command: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Every Bash call in one transcript's text.
|
|
103
|
+
*
|
|
104
|
+
* Line-delimited JSON, one record per line, so a malformed line is skipped
|
|
105
|
+
* rather than costing the file. The `"Bash"` pre-filter is a cheap reject: a
|
|
106
|
+
* transcript is megabytes and most lines carry no tool call at all.
|
|
107
|
+
*
|
|
108
|
+
* The id comes out with the command because a resumed session writes a new
|
|
109
|
+
* transcript carrying the earlier turns again — counting a window of files
|
|
110
|
+
* therefore counts some calls twice, and the id is what tells the copies apart
|
|
111
|
+
* from two genuinely identical commands.
|
|
112
|
+
*/
|
|
113
|
+
export function extractCommands(text: string): BashCall[] {
|
|
114
|
+
const out: BashCall[] = [];
|
|
115
|
+
for (const line of text.split("\n")) {
|
|
116
|
+
if (!line.includes('"Bash"')) continue;
|
|
117
|
+
let rec: unknown;
|
|
118
|
+
try {
|
|
119
|
+
rec = JSON.parse(line) as unknown;
|
|
120
|
+
} catch {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const content = (rec as { message?: { content?: unknown } })?.message?.content;
|
|
124
|
+
if (!Array.isArray(content)) continue;
|
|
125
|
+
for (const block of content) {
|
|
126
|
+
const b = block as { type?: unknown; name?: unknown; id?: unknown; input?: { command?: unknown } };
|
|
127
|
+
if (b?.type !== "tool_use" || b?.name !== "Bash") continue;
|
|
128
|
+
if (typeof b.input?.command !== "string") continue;
|
|
129
|
+
out.push({ id: typeof b.id === "string" ? b.id : "", command: b.input.command });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The distinct calls in `calls`, keyed by tool-use id.
|
|
137
|
+
*
|
|
138
|
+
* A call with no id cannot be deduplicated and is kept — dropping it would
|
|
139
|
+
* silently shrink the denominator, and an over-count biases the report toward
|
|
140
|
+
* looking worse than it is, which is the safe direction for a friction figure.
|
|
141
|
+
*/
|
|
142
|
+
export function dedupeCalls(calls: readonly BashCall[]): string[] {
|
|
143
|
+
const seen = new Set<string>();
|
|
144
|
+
const out: string[] = [];
|
|
145
|
+
for (const call of calls) {
|
|
146
|
+
if (call.id) {
|
|
147
|
+
if (seen.has(call.id)) continue;
|
|
148
|
+
seen.add(call.id);
|
|
149
|
+
}
|
|
150
|
+
out.push(call.command);
|
|
151
|
+
}
|
|
152
|
+
return out;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* The transcript of the session running this probe, if the host names one.
|
|
157
|
+
*
|
|
158
|
+
* Excluded by default. A probe whose window includes its own session measures
|
|
159
|
+
* the measurement: every call this run makes lands in the file it is reading,
|
|
160
|
+
* so two runs minutes apart report different totals for the same tree and the
|
|
161
|
+
* figure cannot be pinned. `--include-current` opts back in.
|
|
162
|
+
*/
|
|
163
|
+
export function currentSessionTranscript(store: string): string | null {
|
|
164
|
+
const id = process.env["CLAUDE_CODE_SESSION_ID"];
|
|
165
|
+
return id ? path.join(store, `${id}.jsonl`) : null;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** The head token of a command, lower-cased, or `""`. */
|
|
169
|
+
export function headToken(command: string): string {
|
|
170
|
+
return (command.trim().split(/\s+/)[0] ?? "").toLowerCase();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Why this call is not category A, in one word.
|
|
175
|
+
*
|
|
176
|
+
* Only the FIRST disqualifier is reported, because that is the one a change
|
|
177
|
+
* would have to remove: a chained command whose head is also unlisted stays
|
|
178
|
+
* uncovered if only the head is added.
|
|
179
|
+
*
|
|
180
|
+
* The buckets mirror `category_a`'s own order of refusal, including the
|
|
181
|
+
* consequence-word check — without it `git push origin main` and `gh pr merge`
|
|
182
|
+
* landed in the head bucket, and a report saying "N fail on the head token"
|
|
183
|
+
* then counted operations that would be refused whatever the head list said.
|
|
184
|
+
*
|
|
185
|
+
* The last bucket is still an UPPER BOUND rather than an exact head count: a
|
|
186
|
+
* simple command can also be refused for a directory flag whose value escapes
|
|
187
|
+
* the working tree, and that case is not separable from here without
|
|
188
|
+
* reimplementing the argv walk. Read it as "refused after the shape and the
|
|
189
|
+
* operation were cleared", and never as "adding this head would cover it".
|
|
190
|
+
*/
|
|
191
|
+
export function firstDisqualifier(command: string): string {
|
|
192
|
+
if (!command.trim()) return "empty-command";
|
|
193
|
+
if (SHELL_METACHARACTERS.test(command)) return "shell-metacharacter";
|
|
194
|
+
if (namesConsequenceOperation(command)) return "names-a-consequence-operation";
|
|
195
|
+
return "not-an-allowlisted-operation";
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** Classify a command set. Pure — the caller supplies the strings. */
|
|
199
|
+
export function classify(store: string, transcripts: number, commands: readonly string[]): TrafficReport {
|
|
200
|
+
const report: TrafficReport = {
|
|
201
|
+
store,
|
|
202
|
+
transcripts,
|
|
203
|
+
calls: commands.length,
|
|
204
|
+
categoryA: 0,
|
|
205
|
+
disqualifiers: {},
|
|
206
|
+
heads: {},
|
|
207
|
+
shapes: { editByShell: 0, chain: 0 },
|
|
208
|
+
editShapes: {},
|
|
209
|
+
};
|
|
210
|
+
for (const command of commands) {
|
|
211
|
+
const write = detectEditByShell(command);
|
|
212
|
+
if (write) {
|
|
213
|
+
report.shapes.editByShell += 1;
|
|
214
|
+
report.editShapes[write] = (report.editShapes[write] ?? 0) + 1;
|
|
215
|
+
} else if (detectChaining(command)) {
|
|
216
|
+
report.shapes.chain += 1;
|
|
217
|
+
}
|
|
218
|
+
if (isCategoryABashCommand(command)) {
|
|
219
|
+
report.categoryA += 1;
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
const why = firstDisqualifier(command);
|
|
223
|
+
report.disqualifiers[why] = (report.disqualifiers[why] ?? 0) + 1;
|
|
224
|
+
const head = headToken(command);
|
|
225
|
+
report.heads[head] = (report.heads[head] ?? 0) + 1;
|
|
226
|
+
}
|
|
227
|
+
return report;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/** The default transcript store for the checkout this file lives in. */
|
|
231
|
+
export function defaultStore(repoRoot: string): string {
|
|
232
|
+
const slug = repoRoot.replace(/\//g, "-");
|
|
233
|
+
return path.join(os.homedir(), ".claude", "projects", slug);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** The `--limit` most recently modified transcripts in `store`. */
|
|
237
|
+
export function transcriptPaths(store: string, limit: number): string[] {
|
|
238
|
+
let names: string[];
|
|
239
|
+
try {
|
|
240
|
+
names = fs.readdirSync(store);
|
|
241
|
+
} catch {
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
return names
|
|
245
|
+
.filter((n) => n.endsWith(".jsonl"))
|
|
246
|
+
.map((n) => path.join(store, n))
|
|
247
|
+
.map((p) => {
|
|
248
|
+
try {
|
|
249
|
+
return { p, m: fs.statSync(p).mtimeMs };
|
|
250
|
+
} catch {
|
|
251
|
+
return { p, m: 0 };
|
|
252
|
+
}
|
|
253
|
+
})
|
|
254
|
+
.sort((a, b) => b.m - a.m)
|
|
255
|
+
.slice(0, limit)
|
|
256
|
+
.map((x) => x.p);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/** Top `n` entries of a histogram, descending. */
|
|
260
|
+
function top(hist: Record<string, number>, n: number): Array<[string, number]> {
|
|
261
|
+
return Object.entries(hist)
|
|
262
|
+
.sort((a, b) => b[1] - a[1])
|
|
263
|
+
.slice(0, n);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function pct(part: number, whole: number): string {
|
|
267
|
+
return whole === 0 ? "n/a" : `${((part / whole) * 100).toFixed(1)} %`;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export function render(r: TrafficReport): string {
|
|
271
|
+
const lines: string[] = [];
|
|
272
|
+
lines.push("autonomy_friction_traffic — category-A coverage over real Bash traffic\n");
|
|
273
|
+
lines.push(` store ${r.store}`);
|
|
274
|
+
lines.push(` transcripts ${r.transcripts}`);
|
|
275
|
+
lines.push(` Bash calls ${r.calls}\n`);
|
|
276
|
+
lines.push(` category A (this package hands the host an allow) ${r.categoryA} (${pct(r.categoryA, r.calls)})`);
|
|
277
|
+
lines.push(` no allow emitted ${r.calls - r.categoryA} (${pct(r.calls - r.categoryA, r.calls)})\n`);
|
|
278
|
+
lines.push(" first disqualifier:");
|
|
279
|
+
for (const [k, v] of top(r.disqualifiers, 10)) lines.push(` ${String(v).padStart(6)} ${k}`);
|
|
280
|
+
lines.push("\n top head tokens among the uncovered:");
|
|
281
|
+
for (const [k, v] of top(r.heads, 15)) lines.push(` ${String(v).padStart(6)} ${k}`);
|
|
282
|
+
lines.push("\n chain-nudge shape classes (counted over every call):");
|
|
283
|
+
lines.push(` ${String(r.shapes.editByShell).padStart(6)} edit-by-shell (${pct(r.shapes.editByShell, r.calls)})`);
|
|
284
|
+
lines.push(` ${String(r.shapes.chain).padStart(6)} chain (${pct(r.shapes.chain, r.calls)})`);
|
|
285
|
+
for (const [k, v] of top(r.editShapes, 6)) lines.push(` ${String(v).padStart(4)} ${k}`);
|
|
286
|
+
lines.push("\n Not a gate: no baseline, fails nothing. See this file's header for what");
|
|
287
|
+
lines.push(" the number does and does not say about what the operator was prompted for.\n");
|
|
288
|
+
return `${lines.join("\n")}\n`;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* The value of `flag`, `undefined` when the flag is absent, `null` when it is
|
|
293
|
+
* present with no value.
|
|
294
|
+
*
|
|
295
|
+
* The three states are distinct because the caller must refuse the third. A
|
|
296
|
+
* valueless `--store` used to collapse into "absent" and fall back to the
|
|
297
|
+
* default store silently, which is the same class of defect as the `--limit`
|
|
298
|
+
* coercion beside it: an argument that silently changes the window.
|
|
299
|
+
*/
|
|
300
|
+
function argValue(argv: readonly string[], flag: string): string | null | undefined {
|
|
301
|
+
const i = argv.indexOf(flag);
|
|
302
|
+
if (i === -1) return undefined;
|
|
303
|
+
const value = argv[i + 1];
|
|
304
|
+
return value === undefined || value.startsWith("--") ? null : value;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
308
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
309
|
+
process.stdout.write(
|
|
310
|
+
"usage: autonomy_friction_traffic [--store DIR] [--limit N] [--json] [--include-current]\n" +
|
|
311
|
+
" Category-A coverage over the Bash calls in a transcript store,\n" +
|
|
312
|
+
" plus the shape classes the chain-nudge concern flags. Calls are\n" +
|
|
313
|
+
" deduplicated by tool-use id and the running session's own\n" +
|
|
314
|
+
" transcript is excluded unless --include-current is passed.\n" +
|
|
315
|
+
" Exit 1 when the store is unreadable or holds no Bash call.\n",
|
|
316
|
+
);
|
|
317
|
+
return 0;
|
|
318
|
+
}
|
|
319
|
+
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
320
|
+
const storeArg = argValue(argv, "--store");
|
|
321
|
+
if (storeArg === null) {
|
|
322
|
+
process.stderr.write("autonomy_friction_traffic: --store needs a directory\n");
|
|
323
|
+
return 1;
|
|
324
|
+
}
|
|
325
|
+
const store = storeArg ?? defaultStore(repoRoot);
|
|
326
|
+
const limitRaw = argValue(argv, "--limit");
|
|
327
|
+
let limit = DEFAULT_LIMIT;
|
|
328
|
+
if (limitRaw !== undefined) {
|
|
329
|
+
const parsed = limitRaw === null ? NaN : Number(limitRaw);
|
|
330
|
+
// Validated rather than coerced: `--limit -5` silently dropped the
|
|
331
|
+
// five OLDEST transcripts through `Array.slice`, `--limit 0` reported
|
|
332
|
+
// an empty store as the reason, and a typo fell back to 40 without
|
|
333
|
+
// saying so. A window is the report's denominator; a wrong one is a
|
|
334
|
+
// wrong measurement wearing the right shape.
|
|
335
|
+
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
336
|
+
process.stderr.write(`autonomy_friction_traffic: --limit must be a positive integer, got ${limitRaw ?? "no value"}\n`);
|
|
337
|
+
return 1;
|
|
338
|
+
}
|
|
339
|
+
limit = parsed;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const current = argv.includes("--include-current") ? null : currentSessionTranscript(store);
|
|
343
|
+
const paths = transcriptPaths(store, limit).filter((p) => p !== current);
|
|
344
|
+
const calls: BashCall[] = [];
|
|
345
|
+
for (const p of paths) {
|
|
346
|
+
let text: string;
|
|
347
|
+
try {
|
|
348
|
+
text = fs.readFileSync(p, "utf8");
|
|
349
|
+
} catch {
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
calls.push(...extractCommands(text));
|
|
353
|
+
}
|
|
354
|
+
const commands = dedupeCalls(calls);
|
|
355
|
+
if (commands.length === 0) {
|
|
356
|
+
process.stderr.write(
|
|
357
|
+
`autonomy_friction_traffic: no Bash call found under ${store} ` +
|
|
358
|
+
`(${paths.length} transcript(s) read) — nothing measured\n`,
|
|
359
|
+
);
|
|
360
|
+
return 1;
|
|
361
|
+
}
|
|
362
|
+
const report = classify(store, paths.length, commands);
|
|
363
|
+
process.stdout.write(argv.includes("--json") ? `${JSON.stringify(report, null, 2)}\n` : render(report));
|
|
364
|
+
return 0;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
function _isCliEntry(): boolean {
|
|
368
|
+
const argv1 = process.argv[1];
|
|
369
|
+
if (argv1 === undefined) return false;
|
|
370
|
+
try {
|
|
371
|
+
return fs.realpathSync(argv1) === fs.realpathSync(fileURLToPath(import.meta.url));
|
|
372
|
+
} catch {
|
|
373
|
+
return false;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
if (_isCliEntry()) {
|
|
378
|
+
process.exit(main());
|
|
379
|
+
}
|
|
@@ -42,6 +42,12 @@ const KEEP_RE = /^keep-beta-until:\s*(\d{4}-\d{2}-\d{2})\s*$/m;
|
|
|
42
42
|
* - a lapsed contract **in** the baseline -> warning (inherited debt)
|
|
43
43
|
* - a lapsed contract **not** in it -> ERROR (a fresh lapse, today)
|
|
44
44
|
*
|
|
45
|
+
* SUPERSEDED 2026-09-11 on the second line: a fresh lapse is a warning too, and
|
|
46
|
+
* the reason is at {@link LAPSED_SEVERITY_FRESH}. The council's choice of a
|
|
47
|
+
* ratchet over a flat error stands as the record of what was decided then; what
|
|
48
|
+
* changed is the owner's ruling that no date may red CI by itself. The baseline
|
|
49
|
+
* therefore labels rather than gates.
|
|
50
|
+
*
|
|
45
51
|
* So new work is enforced immediately while the 86-contract cohort does not red
|
|
46
52
|
* an arbitrary future PR whose author caused none of it. The cohort is real:
|
|
47
53
|
* 44 of the 86 lapsed on the same day and 64 within four days, which is one past
|
|
@@ -116,7 +122,31 @@ export function _resetLapsedBaseline(): void {
|
|
|
116
122
|
* whether this becomes an error is that roadmap's step 0.2 and is not taken here.
|
|
117
123
|
*/
|
|
118
124
|
const LAPSED_SEVERITY_IN_BASELINE: 'error' | 'warning' = 'warning';
|
|
119
|
-
|
|
125
|
+
/**
|
|
126
|
+
* A fresh lapse is a WARNING since 2026-09-11, by owner decision.
|
|
127
|
+
*
|
|
128
|
+
* It was an error, and the error said: this contract must still be beta,
|
|
129
|
+
* because a date passed. That is the one thing a date cannot establish.
|
|
130
|
+
* Stability is decided on observable criteria — active enforcement, consumer
|
|
131
|
+
* reliance, no known pending incompatible change — and none of them contains an
|
|
132
|
+
* elapsed-time term. `keep-beta-until` SCHEDULES A REVIEW. It does not prohibit
|
|
133
|
+
* promotion before that date, does not require continued beta after it, and
|
|
134
|
+
* must not turn CI red on its own.
|
|
135
|
+
*
|
|
136
|
+
* What this gate still errors on is unchanged and is the part that was never
|
|
137
|
+
* about time: a beta contract declaring NO disposition at all, one declaring
|
|
138
|
+
* two, and a window set further out than the maximum — a contract that says
|
|
139
|
+
* nothing about its own maturity, or parks the question indefinitely. Those are
|
|
140
|
+
* statements about missing or contradictory evidence, which CI may absolutely
|
|
141
|
+
* refuse. "The window expired" is not one of them.
|
|
142
|
+
*
|
|
143
|
+
* The inherited/fresh distinction stays in the REPORT because it still tells a
|
|
144
|
+
* reader which lapses are cohort debt and which arrived since. It no longer
|
|
145
|
+
* gates anything, so the frozen baseline is now a label rather than a ratchet;
|
|
146
|
+
* retiring it is the remaining step, recorded in
|
|
147
|
+
* `stubs/road-to-evidence-driven-stability.md`.
|
|
148
|
+
*/
|
|
149
|
+
const LAPSED_SEVERITY_FRESH: 'error' | 'warning' = 'warning';
|
|
120
150
|
const SUPERSEDED_RE = /^superseded-by:\s*\S+\s*$/m;
|
|
121
151
|
|
|
122
152
|
const MAX_REVIEW_WINDOW_DAYS = 90;
|
|
@@ -569,9 +599,10 @@ function main(): number {
|
|
|
569
599
|
}
|
|
570
600
|
if (upcoming.length > 0) {
|
|
571
601
|
process.stdout.write(
|
|
572
|
-
`\
|
|
573
|
-
'exit code unchanged
|
|
574
|
-
'
|
|
602
|
+
`\nReviews falling due within ${String(args.horizon)} day(s) — advisory, ` +
|
|
603
|
+
'exit code unchanged, and it stays unchanged when the date passes:\n' +
|
|
604
|
+
'the window schedules a maturity DECISION, it does not require continued\n' +
|
|
605
|
+
'beta and it never reds CI on its own. Evidence decides; the date only asks:\n',
|
|
575
606
|
);
|
|
576
607
|
for (const u of upcoming) {
|
|
577
608
|
process.stdout.write(
|