@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
|
@@ -28,17 +28,26 @@
|
|
|
28
28
|
* (`git ls-files --others --exclude-standard`, each one READ from the
|
|
29
29
|
* filesystem rather than diffed in a subprocess — see "Untracked files" below;
|
|
30
30
|
* fixes a review finding, F6, that a brand-new file was previously invisible
|
|
31
|
-
* to this count entirely).
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
31
|
+
* to this count entirely).
|
|
32
|
+
*
|
|
33
|
+
* SINCE 2026-09-11 THIS READING IS BASELINE-CORRECTED ON `claude`, and this
|
|
34
|
+
* block used to say the opposite — that a session-start baseline was rejected
|
|
35
|
+
* "because no such baseline exists anywhere a `stop` concern can read it". That
|
|
36
|
+
* was true of a one-concern roadmap phase and stale by the time it mattered:
|
|
37
|
+
* `session_start` is bound on seven hosts, and `review-baseline` now records
|
|
38
|
+
* HEAD plus the already-dirty non-doc line count there. `_lib/review_baseline.ts`
|
|
39
|
+
* cites this paragraph as the defect it closes, so leaving the paragraph
|
|
40
|
+
* standing would have made the two files contradict each other.
|
|
41
|
+
*
|
|
42
|
+
* What the correction does and does not cover:
|
|
43
|
+
* - Uncommitted changes that PREDATE the session are SUBTRACTED where a
|
|
44
|
+
* baseline is readable and its HEAD and measure still match. Absent,
|
|
45
|
+
* unreadable, head-moved or mixed-measure → the unsubtracted count, with
|
|
46
|
+
* the reason carried in the `review_skipped` row.
|
|
47
|
+
* - The baseline is written once per session and never refreshed, so from a
|
|
48
|
+
* session's first commit onward `head-moved` holds and the pre-existing
|
|
49
|
+
* tree is charged again. Over-reporting is the safe direction; the limit is
|
|
50
|
+
* real and is stated in `review_baseline.ts` rather than implied away.
|
|
42
51
|
* - A session that DID commit mid-turn (one of `commit-policy`'s four
|
|
43
52
|
* exceptions) moves HEAD, so mutations already committed are invisible
|
|
44
53
|
* to this diff. Declared, not silently assumed away.
|
|
@@ -207,11 +216,20 @@
|
|
|
207
216
|
* exit-2 warn onto an unverified propagation path is exactly the
|
|
208
217
|
* speculative mapping `host_semantics.ts` exists to avoid.
|
|
209
218
|
*
|
|
210
|
-
* CONTRACT: never
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
219
|
+
* CONTRACT: never REFUSES a turn. The DISPATCHER-INTERNAL exit is 2 on a fire
|
|
220
|
+
* (never 1/BLOCK, never >=3), `fail_closed: false`; the HOST-FACING exit on
|
|
221
|
+
* `claude` is 0 either way, per the proof above. Doc-only diffs, a reviewer
|
|
222
|
+
* having run, or any unreadable/malformed input all resolve to silence
|
|
223
|
+
* (dispatcher-internal exit 0), not a crash.
|
|
224
|
+
*
|
|
225
|
+
* WHAT THE PROOF ABOVE DOES NOT COVER. Every term of it is an exit code, so it
|
|
226
|
+
* settles refusal and nothing else. Whether the `additionalContext` payload
|
|
227
|
+
* this concern emits at `stop` causes the host to run the agent AGAIN is a
|
|
228
|
+
* separate question, and this tree does not answer it — see
|
|
229
|
+
* `docs/contracts/hook-architecture-v1.md` under the exit-code table, which
|
|
230
|
+
* names the measurement that would. So do not read the proof above as
|
|
231
|
+
* establishing that this concern leaves the turn alone; it establishes only
|
|
232
|
+
* that the concern never refuses it.
|
|
215
233
|
*/
|
|
216
234
|
import { spawnSync } from 'node:child_process';
|
|
217
235
|
import * as crypto from 'node:crypto';
|
|
@@ -220,7 +238,18 @@ import * as os from 'node:os';
|
|
|
220
238
|
import * as path from 'node:path';
|
|
221
239
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
222
240
|
|
|
223
|
-
import {
|
|
241
|
+
import {
|
|
242
|
+
applyBaseline,
|
|
243
|
+
currentHeadSha,
|
|
244
|
+
readBaseline,
|
|
245
|
+
type BaselineFallback,
|
|
246
|
+
type BaselineOutcome,
|
|
247
|
+
} from '../_lib/review_baseline.js';
|
|
248
|
+
import {
|
|
249
|
+
buildReviewSkippedLine,
|
|
250
|
+
type BaselineApplication,
|
|
251
|
+
type MutationMeasure,
|
|
252
|
+
} from '../_lib/review_skipped_record.js';
|
|
224
253
|
import { unwrap, type JsonObject, type JsonValue } from './envelope.js';
|
|
225
254
|
import { readHookStdin } from './hook_stdin.js';
|
|
226
255
|
import { atomic_write_json, is_replay_mode } from './state_io.js';
|
|
@@ -606,6 +635,7 @@ export function appendReviewSkippedTelemetry(
|
|
|
606
635
|
workspaceRoot: string,
|
|
607
636
|
diffLines: number,
|
|
608
637
|
mutationMeasure: MutationMeasure,
|
|
638
|
+
baseline?: BaselineApplication,
|
|
609
639
|
): void {
|
|
610
640
|
if (is_replay_mode()) return;
|
|
611
641
|
const ts = new Date().toISOString();
|
|
@@ -614,6 +644,7 @@ export function appendReviewSkippedTelemetry(
|
|
|
614
644
|
mutation_measure: mutationMeasure,
|
|
615
645
|
ts,
|
|
616
646
|
id: crypto.randomUUID(),
|
|
647
|
+
baseline,
|
|
617
648
|
});
|
|
618
649
|
if (errors.length || line === null) return; // refused input — never write a broken line
|
|
619
650
|
try {
|
|
@@ -694,6 +725,23 @@ function _read_stdin(): string {
|
|
|
694
725
|
return readHookStdin();
|
|
695
726
|
}
|
|
696
727
|
|
|
728
|
+
/**
|
|
729
|
+
* The one place the two spellings meet.
|
|
730
|
+
*
|
|
731
|
+
* `BaselineFallback` is kebab-cased because it is a TypeScript union read only
|
|
732
|
+
* in this process; `BaselineApplication` is snake_cased because it is written
|
|
733
|
+
* into an audit line and every other enum in that stream is. A hand-written
|
|
734
|
+
* ternary translated them until a review pointed out that `head-moved` and
|
|
735
|
+
* `head_moved` differ by one character in a conditional nobody would re-read —
|
|
736
|
+
* an exhaustive record makes a new fallback a compile error instead.
|
|
737
|
+
*/
|
|
738
|
+
const FALLBACK_TO_TELEMETRY: Readonly<Record<BaselineFallback, BaselineApplication>> = {
|
|
739
|
+
absent: 'absent',
|
|
740
|
+
unreadable: 'unreadable',
|
|
741
|
+
'head-moved': 'head_moved',
|
|
742
|
+
'mixed-measure': 'mixed_measure',
|
|
743
|
+
};
|
|
744
|
+
|
|
697
745
|
export function main(): number {
|
|
698
746
|
const [envelope, payload] = unwrap(_read_stdin(), 'claude');
|
|
699
747
|
|
|
@@ -705,15 +753,43 @@ export function main(): number {
|
|
|
705
753
|
const workspace_root =
|
|
706
754
|
String(envelope['workspace_root'] ?? '').trim() || process.cwd();
|
|
707
755
|
|
|
708
|
-
let
|
|
756
|
+
let measuredLines: number;
|
|
709
757
|
let mutationMeasure: MutationMeasure;
|
|
710
758
|
try {
|
|
711
759
|
const measured = totalNonDocMutatedLinesWithMeasure(workspace_root);
|
|
712
|
-
|
|
760
|
+
measuredLines = measured.lines;
|
|
713
761
|
mutationMeasure = measured.measure;
|
|
714
762
|
} catch {
|
|
715
763
|
return 0; // fail-open — never block the agent loop
|
|
716
764
|
}
|
|
765
|
+
|
|
766
|
+
// The session key is derived HERE rather than after the threshold test,
|
|
767
|
+
// because the threshold is now taken on the SUBTRACTED count and the
|
|
768
|
+
// baseline is keyed on the session. That is a real reordering: one extra
|
|
769
|
+
// `sha256` of a string and one `readFileSync` of a ~100-byte JSON file now
|
|
770
|
+
// run on every stop, including the majority that end below threshold. The
|
|
771
|
+
// alternative — testing the unsubtracted count first as a cheap
|
|
772
|
+
// pre-filter — is wrong in the one direction that matters: on an
|
|
773
|
+
// accumulator branch EVERY turn clears the unsubtracted threshold, so the
|
|
774
|
+
// pre-filter would pass exactly when the subtraction is needed and save
|
|
775
|
+
// nothing.
|
|
776
|
+
const sessionKey = deriveSessionKey(envelope, payload);
|
|
777
|
+
const baselineOutcome: BaselineOutcome = applyBaseline(
|
|
778
|
+
measuredLines,
|
|
779
|
+
readBaseline(workspace_root, sessionKey),
|
|
780
|
+
// A THUNK, not a value: on the `absent` and `unreadable` branches the
|
|
781
|
+
// result is discarded, and those two are the steady state on every host
|
|
782
|
+
// without this nudge and on every session before its first baseline
|
|
783
|
+
// write. Passing the value eagerly spent an 11-14 ms `git rev-parse` on
|
|
784
|
+
// each of those stops for nothing.
|
|
785
|
+
() => currentHeadSha(workspace_root),
|
|
786
|
+
mutationMeasure,
|
|
787
|
+
);
|
|
788
|
+
const diffLines = baselineOutcome.lines;
|
|
789
|
+
const baselineApplication: BaselineApplication = baselineOutcome.applied
|
|
790
|
+
? 'applied'
|
|
791
|
+
: FALLBACK_TO_TELEMETRY[baselineOutcome.fallback];
|
|
792
|
+
|
|
717
793
|
if (diffLines <= MUTATION_LINE_THRESHOLD) {
|
|
718
794
|
return 0; // below threshold, or a doc-only diff — nothing to nudge
|
|
719
795
|
}
|
|
@@ -723,7 +799,6 @@ export function main(): number {
|
|
|
723
799
|
// JSON parse below. A session that already fired stops here, at a
|
|
724
800
|
// single `fs.existsSync` call, without re-reading a (potentially
|
|
725
801
|
// large) transcript file it already knows the answer for.
|
|
726
|
-
const sessionKey = deriveSessionKey(envelope, payload);
|
|
727
802
|
if (hasFiredThisSession(workspace_root, sessionKey)) {
|
|
728
803
|
return 0;
|
|
729
804
|
}
|
|
@@ -756,7 +831,12 @@ export function main(): number {
|
|
|
756
831
|
markFiredThisSession(workspace_root, sessionKey, new Date().toISOString());
|
|
757
832
|
|
|
758
833
|
try {
|
|
759
|
-
appendReviewSkippedTelemetry(
|
|
834
|
+
appendReviewSkippedTelemetry(
|
|
835
|
+
workspace_root,
|
|
836
|
+
diffLines,
|
|
837
|
+
mutationMeasure,
|
|
838
|
+
baselineApplication,
|
|
839
|
+
);
|
|
760
840
|
} catch {
|
|
761
841
|
// never let a telemetry failure block or fail the turn
|
|
762
842
|
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* review-baseline — `session_start` concern
|
|
4
|
+
* (road-to-a-question-that-survives-the-turn Phase 2).
|
|
5
|
+
*
|
|
6
|
+
* WHAT IT DOES, and it is the whole of it: on session start, record how many
|
|
7
|
+
* non-doc lines were ALREADY dirty, and what HEAD was. `end-review-nudge`
|
|
8
|
+
* subtracts that at `stop` so a session is charged for its own mutation instead
|
|
9
|
+
* of for whatever the working tree happened to be carrying.
|
|
10
|
+
*
|
|
11
|
+
* THE DEFECT IT CLOSES. `end_review_nudge_hook`'s own header names it: a dirty
|
|
12
|
+
* tree that predates the session is counted as the session's, and the reason it
|
|
13
|
+
* was not fixed was "no such baseline exists anywhere a `stop` concern can read
|
|
14
|
+
* it". That was true of a phase with a one-concern scope, and stale by the time
|
|
15
|
+
* it mattered — `session_start` is bound on seven hosts carrying fourteen
|
|
16
|
+
* concerns. The measured consequence of leaving it: on a branch deliberately
|
|
17
|
+
* accumulating work, the nudge read 1,771 lines of two crashed sessions'
|
|
18
|
+
* uncommitted work and fired every turn. An advisory that always fires is noise,
|
|
19
|
+
* and noise is worse than silence because it trains the reader to skip the one
|
|
20
|
+
* that mattered.
|
|
21
|
+
*
|
|
22
|
+
* MEASURED WITH THE READER'S OWN INSTRUMENT. `totalNonDocMutatedLinesWithMeasure`
|
|
23
|
+
* is imported from the nudge rather than reimplemented, so the two sides cannot
|
|
24
|
+
* drift on what a "non-doc mutated line" is. A second counting implementation
|
|
25
|
+
* would produce a baseline in one unit and a measurement in another, and the
|
|
26
|
+
* subtraction would be silently wrong rather than visibly broken.
|
|
27
|
+
*
|
|
28
|
+
* CAPTURE ONLY. It never emits context, never warns, and always returns 0. A
|
|
29
|
+
* `session_start` concern that could refuse would turn an unreadable git
|
|
30
|
+
* directory into a session that cannot start, which is a far worse failure than
|
|
31
|
+
* the noise it is fixing.
|
|
32
|
+
*
|
|
33
|
+
* NO PATHS, NO FINGERPRINTS. The record is two numbers and a timestamp. A
|
|
34
|
+
* path-level change set was the shape the source draft proposed; it is a bigger
|
|
35
|
+
* object with a bigger privacy surface, and nothing in the nudge consumes one.
|
|
36
|
+
* The file cannot hold a path, a diff or a file body by construction, which is
|
|
37
|
+
* the same PII-exclusion-by-construction the telemetry record keeps.
|
|
38
|
+
*/
|
|
39
|
+
import * as fs from 'node:fs';
|
|
40
|
+
import * as path from 'node:path';
|
|
41
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
42
|
+
|
|
43
|
+
import {
|
|
44
|
+
baselineStateFile,
|
|
45
|
+
currentHeadSha,
|
|
46
|
+
type ReviewBaseline,
|
|
47
|
+
} from '../_lib/review_baseline.js';
|
|
48
|
+
import { deriveSessionKey, totalNonDocMutatedLinesWithMeasure } from './end_review_nudge_hook.js';
|
|
49
|
+
import { unwrap, type JsonObject, type JsonValue } from './envelope.js';
|
|
50
|
+
import { readHookStdin } from './hook_stdin.js';
|
|
51
|
+
import { atomic_write_json } from './state_io.js';
|
|
52
|
+
|
|
53
|
+
const EXIT_OK = 0;
|
|
54
|
+
|
|
55
|
+
export function buildBaseline(workspaceRoot: string, now: Date = new Date()): ReviewBaseline {
|
|
56
|
+
const measured = totalNonDocMutatedLinesWithMeasure(workspaceRoot);
|
|
57
|
+
return {
|
|
58
|
+
head_sha: currentHeadSha(workspaceRoot),
|
|
59
|
+
baseline_lines: measured.lines,
|
|
60
|
+
// Carried, not discarded. Past `UNTRACKED_FILE_CAP` the count is a
|
|
61
|
+
// synthetic `THRESHOLD + 1 + tracked` chosen to be over the bar rather
|
|
62
|
+
// than to be true, and subtracting that from a later exact count is
|
|
63
|
+
// arithmetic over two different quantities. The consumer refuses the
|
|
64
|
+
// subtraction when the two measures disagree; it can only do that if the
|
|
65
|
+
// writer says which one it took.
|
|
66
|
+
measure: measured.measure,
|
|
67
|
+
written_at: now.toISOString(),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function main(): number {
|
|
72
|
+
let envelope: JsonObject;
|
|
73
|
+
let payload: JsonObject;
|
|
74
|
+
try {
|
|
75
|
+
[envelope, payload] = unwrap(readHookStdin(), 'claude');
|
|
76
|
+
} catch {
|
|
77
|
+
return EXIT_OK;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const event = String(envelope['event'] ?? '');
|
|
81
|
+
if (event !== '' && event !== 'session_start') return EXIT_OK;
|
|
82
|
+
|
|
83
|
+
const workspaceRoot =
|
|
84
|
+
String((envelope['workspace_root'] as JsonValue | undefined) ?? '').trim() || process.cwd();
|
|
85
|
+
|
|
86
|
+
// A baseline is written ONCE per session. A host that fires session_start
|
|
87
|
+
// twice — Cline maps both TaskStart and TaskResume onto it — must not
|
|
88
|
+
// re-baseline mid-session: the second write would fold everything the
|
|
89
|
+
// session had already changed into its own baseline and the nudge would go
|
|
90
|
+
// permanently quiet for that session. Over-writing is the silent failure
|
|
91
|
+
// direction, so it is the one guarded.
|
|
92
|
+
const sessionKey = deriveSessionKey(envelope, payload);
|
|
93
|
+
const file = baselineStateFile(workspaceRoot, sessionKey);
|
|
94
|
+
try {
|
|
95
|
+
if (fs.existsSync(file)) return EXIT_OK;
|
|
96
|
+
} catch {
|
|
97
|
+
return EXIT_OK;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
// `atomic_write_json` is already `AGENT_CONFIG_REPLAY`-aware, so a
|
|
102
|
+
// fixture-replay run leaves no baseline behind.
|
|
103
|
+
atomic_write_json(file, buildBaseline(workspaceRoot) as unknown as JsonObject);
|
|
104
|
+
} catch {
|
|
105
|
+
// An unwritable state dir degrades to today's behaviour — the nudge
|
|
106
|
+
// reads `absent` and does not subtract. Never a failed session start.
|
|
107
|
+
}
|
|
108
|
+
return EXIT_OK;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Bundle-safety: never auto-run when inlined into an esbuild bundle, where
|
|
112
|
+
// every module shares the bundle's `import.meta.url`.
|
|
113
|
+
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
114
|
+
function _isCliEntry(): boolean {
|
|
115
|
+
if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) return false;
|
|
116
|
+
if (process.argv[1] === undefined) return false;
|
|
117
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
118
|
+
if (import.meta.url === argvUrl) return true;
|
|
119
|
+
try {
|
|
120
|
+
const here = fs.realpathSync(fileURLToPath(import.meta.url));
|
|
121
|
+
const argv = fs.realpathSync(path.resolve(process.argv[1]));
|
|
122
|
+
return here === argv;
|
|
123
|
+
} catch {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (_isCliEntry()) {
|
|
129
|
+
process.exit(main());
|
|
130
|
+
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* session-eol — Stop-slot session end-of-life instrument +
|
|
4
|
-
* (road-to-token-economy-recycling Phases 1.1 / 3.2 / 4.2
|
|
3
|
+
* session-eol — Stop-slot session end-of-life instrument + automatic
|
|
4
|
+
* continuity record (road-to-token-economy-recycling Phases 1.1 / 3.2 / 4.2,
|
|
5
|
+
* road-to-continuity-writer-activation Phase 1 and step 3.2).
|
|
5
6
|
*
|
|
6
7
|
* Phase 1.1 (record-only): per session, maintain counts-only end-of-life
|
|
7
8
|
* state — final main-chain context size in parsed tokens (via
|
|
@@ -10,22 +11,31 @@
|
|
|
10
11
|
* `agents/runtime/state/session-eol/<sha256(session)>.json`. Incremental:
|
|
11
12
|
* each Stop reads only the transcript bytes appended since the last scan.
|
|
12
13
|
*
|
|
13
|
-
* Phase 3.2
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* `
|
|
17
|
-
*
|
|
18
|
-
*
|
|
14
|
+
* Phase 3.2 — RETIRED 2026-09-10 (road-to-continuity-writer-activation step
|
|
15
|
+
* 3.2). This hook used to inject one line past the committed recycle threshold
|
|
16
|
+
* (`src/config/recycle-threshold-budget.json`) advising a human to run
|
|
17
|
+
* `agent-config session:recycle` before `/clear`, plus a second line when that
|
|
18
|
+
* advice had been given and no envelope had appeared. Both are gone. They
|
|
19
|
+
* existed because nothing else wrote the continuity record, and
|
|
20
|
+
* `writeContinuityRecord` below now does — armed by default since the same
|
|
21
|
+
* change, on an AI-council verdict of 2026-09-10 (2 seats, convergent, under
|
|
22
|
+
* the owner's written delegation). An advisory telling a human to do by hand
|
|
23
|
+
* what the concern now does on its own is a manual action on the normal path,
|
|
24
|
+
* which is what step 3.2 removes and what `check_continuity_surface` counts on
|
|
25
|
+
* its `normal_path_manual_actions` axis.
|
|
19
26
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
27
|
+
* `agent-config session:recycle` itself is RETAINED, and deliberately: the
|
|
28
|
+
* same verdict refused to retire a public callable contract, and the automatic
|
|
29
|
+
* writer is not a strict superset of it — it skips a session that claimed no
|
|
30
|
+
* roadmap and omits the `git status` anchors the command collects. It is an
|
|
31
|
+
* explicit affordance now, not a step anybody is told to remember.
|
|
32
|
+
*
|
|
33
|
+
* What SURVIVES the retirement is the state machine underneath it.
|
|
34
|
+
* `advisory_fired_at` still stamps the first Stop at which a session crosses
|
|
35
|
+
* the recycle threshold, because the run-checkpoint writer below gates on
|
|
36
|
+
* exactly that edge. The field keeps its name: it is a persisted state key
|
|
37
|
+
* under `agents/runtime/state/session-eol/`, and renaming it would strand
|
|
38
|
+
* every state file already on disk to make one docblock read better.
|
|
29
39
|
*
|
|
30
40
|
* Phase 4.2 (read surface): every Stop also overwrites
|
|
31
41
|
* `agents/runtime/state/context-fill.json` with the machine-readable fill
|
|
@@ -33,9 +43,10 @@
|
|
|
33
43
|
* carries counts only, and this hook's behaviour is identical whether or
|
|
34
44
|
* not anything reads it.
|
|
35
45
|
*
|
|
36
|
-
* Never blocks: exit 0 on every
|
|
37
|
-
* exit
|
|
38
|
-
*
|
|
46
|
+
* Never blocks: exit 0 on every path. With both advisory emitters retired this
|
|
47
|
+
* hook no longer returns the warn exit at all — it records, writes the context
|
|
48
|
+
* fill, the run checkpoint and the continuity record, and says nothing.
|
|
49
|
+
* `AGENT_CONFIG_REPLAY=1` → no-op.
|
|
39
50
|
*/
|
|
40
51
|
|
|
41
52
|
import * as fs from 'node:fs';
|
|
@@ -48,7 +59,6 @@ import recycleThresholdConfig from '../../config/recycle-threshold-budget.json';
|
|
|
48
59
|
import {
|
|
49
60
|
listContinuityRecords,
|
|
50
61
|
RECYCLE_MAX_AGE_HOURS,
|
|
51
|
-
recycle_envelope_rel,
|
|
52
62
|
} from '../_lib/recycle_envelope_paths.js';
|
|
53
63
|
import {
|
|
54
64
|
emptyCounters,
|
|
@@ -72,12 +82,11 @@ import { readHookStdin } from './hook_stdin.js';
|
|
|
72
82
|
import { atomic_write_json, is_replay_mode } from './state_io.js';
|
|
73
83
|
import { isSafeTranscriptPath } from './end_review_nudge_hook.js';
|
|
74
84
|
|
|
75
|
-
const EXIT_WARN = 2;
|
|
76
|
-
|
|
77
85
|
/**
|
|
78
86
|
* Per-process threshold override — the test seam and the emergency off
|
|
79
|
-
* switch (`0` or any non-positive value disables the
|
|
80
|
-
*
|
|
87
|
+
* switch (`0` or any non-positive value disables the threshold lane, so the
|
|
88
|
+
* run checkpoint and the continuity record stop while plain recording
|
|
89
|
+
* continues). The committed value lives in
|
|
81
90
|
* `src/config/recycle-threshold-budget.json` and is statically imported so
|
|
82
91
|
* the hook bundle carries it into consumers — one threshold, one constant.
|
|
83
92
|
*/
|
|
@@ -89,11 +98,24 @@ export const CONTEXT_FILL_REL = path.join('agents', 'runtime', 'state', 'context
|
|
|
89
98
|
export interface SessionEolState {
|
|
90
99
|
schema_version: 1;
|
|
91
100
|
counters: EolCounters;
|
|
92
|
-
/**
|
|
101
|
+
/**
|
|
102
|
+
* ISO stamp of the first Stop at which this session crossed the recycle
|
|
103
|
+
* threshold, or null.
|
|
104
|
+
*
|
|
105
|
+
* Named for the advisory it used to fire (retired 2026-09-10, step 3.2).
|
|
106
|
+
* The name is kept because this is a persisted key: renaming it would
|
|
107
|
+
* strand every `session-eol/<key>.json` already on disk. What it marks is
|
|
108
|
+
* the threshold-crossing edge, which the run-checkpoint writer still gates
|
|
109
|
+
* on.
|
|
110
|
+
*/
|
|
93
111
|
advisory_fired_at: string | null;
|
|
94
112
|
/**
|
|
95
113
|
* ISO stamp when the follow-up "advised, but no envelope exists" line
|
|
96
|
-
* fired, or null.
|
|
114
|
+
* fired, or null. NOTHING WRITES THIS ANY MORE — the counter-check was
|
|
115
|
+
* retired with the advisory on 2026-09-10 (step 3.2). It is still parsed,
|
|
116
|
+
* and `session_eol_report.ts` still counts it, because state files written
|
|
117
|
+
* before that date carry it and dropping the read would silently reinterpret
|
|
118
|
+
* their history as "never happened". Separate from `advisory_fired_at` so the counter-check
|
|
97
119
|
* is once-per-session in its own right: one reminder is a safety net, one
|
|
98
120
|
* per Stop for the rest of the session is a nag the reader learns to skip.
|
|
99
121
|
*/
|
|
@@ -172,54 +194,6 @@ export function readState(file: string): SessionEolState {
|
|
|
172
194
|
};
|
|
173
195
|
}
|
|
174
196
|
|
|
175
|
-
/**
|
|
176
|
-
* Is there a recycle envelope under this workspace, written since `since`?
|
|
177
|
-
*
|
|
178
|
-
* Two properties, both load-bearing:
|
|
179
|
-
*
|
|
180
|
-
* **Only ENOENT counts as missing.** `fs.existsSync` swallows every error into
|
|
181
|
-
* `false`, so an unreadable directory (EACCES on a mounted or root-owned tree)
|
|
182
|
-
* would read as "no envelope" and produce the manufactured "your envelope is
|
|
183
|
-
* gone" warning this check exists to avoid. `statSync` + an errno test is the
|
|
184
|
-
* only shape that can tell the two apart.
|
|
185
|
-
*
|
|
186
|
-
* **Freshness, not mere existence.** The consumer moves the envelope aside at
|
|
187
|
-
* session_start, so a file still sitting here belongs to a session that never
|
|
188
|
-
* cleared. Counting it would silence the warning in the case it exists to
|
|
189
|
-
* catch, and worse: `/clear` would then resume the successor from another
|
|
190
|
-
* session's state — a wrong resume instead of an empty one. An envelope whose
|
|
191
|
-
* `written_at` predates the advisory is not this session's.
|
|
192
|
-
*/
|
|
193
|
-
export function envelopeExists(
|
|
194
|
-
workspaceRoot: string,
|
|
195
|
-
since: string | null = null,
|
|
196
|
-
sessionId: string | null = null,
|
|
197
|
-
): boolean {
|
|
198
|
-
// Phase 2.1: the record is keyed by session, so the counter-check must look
|
|
199
|
-
// at THIS session's path. Checking the shared name would read a peer's
|
|
200
|
-
// record as proof that this session wrote one — the same cross-session
|
|
201
|
-
// confusion the key exists to remove, re-created in the checker.
|
|
202
|
-
const target = path.join(workspaceRoot, recycle_envelope_rel(sessionId));
|
|
203
|
-
let raw: string;
|
|
204
|
-
try {
|
|
205
|
-
raw = fs.readFileSync(target, 'utf-8');
|
|
206
|
-
} catch (exc) {
|
|
207
|
-
// ENOENT is the real "no envelope"; anything else is a failed CHECK,
|
|
208
|
-
// and a failed check must never assert absence.
|
|
209
|
-
return (exc as NodeJS.ErrnoException)?.code !== 'ENOENT';
|
|
210
|
-
}
|
|
211
|
-
if (since === null) return true;
|
|
212
|
-
try {
|
|
213
|
-
const written = (JSON.parse(raw) as { written_at?: unknown }).written_at;
|
|
214
|
-
// Unparseable or undated: present, and not provably stale. Treat it as
|
|
215
|
-
// this session's — the alternative warns about a file that is there.
|
|
216
|
-
if (typeof written !== 'string') return true;
|
|
217
|
-
return Date.parse(written) >= Date.parse(since);
|
|
218
|
-
} catch {
|
|
219
|
-
return true;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
197
|
/**
|
|
224
198
|
* Records that were written and never read — the detection layer this defect
|
|
225
199
|
* did not have.
|
|
@@ -276,25 +250,6 @@ export function unconsumedRecordLines(
|
|
|
276
250
|
return out;
|
|
277
251
|
}
|
|
278
252
|
|
|
279
|
-
/**
|
|
280
|
-
* The follow-up line: the advisory already fired, and no envelope arrived.
|
|
281
|
-
*
|
|
282
|
-
* This is the half of the reported minimum fix that lives outside the command
|
|
283
|
-
* — the hook that recommends the call making the same counter-check before the
|
|
284
|
-
* operator acts on it. Whatever stopped the write (a wrong root, a refusal
|
|
285
|
-
* scrolled past, a forgotten step), the state visible here is identical, and
|
|
286
|
-
* the next action the advisory recommended is the one that destroys the
|
|
287
|
-
* session.
|
|
288
|
-
*/
|
|
289
|
-
export function buildMissingEnvelopeLine(workspaceRoot: string, sessionId: string | null = null): string {
|
|
290
|
-
return (
|
|
291
|
-
`recycle advised earlier, but no envelope exists at ` +
|
|
292
|
-
`${path.join(workspaceRoot, recycle_envelope_rel(sessionId))} — /clear now starts the successor ` +
|
|
293
|
-
`from nothing. Re-run \`agent-config session:recycle\` and check that it prints the ` +
|
|
294
|
-
`absolute path it wrote before clearing.`
|
|
295
|
-
);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
253
|
/**
|
|
299
254
|
* Resolve the recycle threshold (Phase 3.1): the per-process override wins
|
|
300
255
|
* (tests; `0` = advisory lane off), else the committed constant from
|
|
@@ -312,25 +267,6 @@ export function readThresholdTokens(): number | null {
|
|
|
312
267
|
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : null;
|
|
313
268
|
}
|
|
314
269
|
|
|
315
|
-
/**
|
|
316
|
-
* The exactly-one advisory line injected past threshold (Phase 3.2).
|
|
317
|
-
*
|
|
318
|
-
* The `/clear` half is conditional on purpose. An earlier wording read
|
|
319
|
-
* `run X … then /clear`, which is an instruction to destroy the session with
|
|
320
|
-
* no check in between — and a reader who followed it while the command was
|
|
321
|
-
* silently writing nothing lost everything. The proof to wait for is the
|
|
322
|
-
* absolute path the command prints; naming it costs one clause.
|
|
323
|
-
*/
|
|
324
|
-
export function buildAdvisoryLine(tokens: number, threshold: number): string {
|
|
325
|
-
return (
|
|
326
|
-
`context past recycle threshold (${tokens.toLocaleString('en-US')} of ` +
|
|
327
|
-
`${threshold.toLocaleString('en-US')} tokens): run \`agent-config session:recycle\` to ` +
|
|
328
|
-
`write the recycle envelope. It prints the absolute path it wrote — /clear only after ` +
|
|
329
|
-
`you have seen that line. The successor session then resumes from the envelope at ` +
|
|
330
|
-
`session_start (road-to-token-economy-recycling)`
|
|
331
|
-
);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
270
|
/** Overwrite the Phase 4.2 read surface. Counts only; failures are swallowed. */
|
|
335
271
|
function writeContextFill(
|
|
336
272
|
workspaceRoot: string,
|
|
@@ -392,38 +328,32 @@ export function main(): number {
|
|
|
392
328
|
const threshold = readThresholdTokens();
|
|
393
329
|
const tokens = counters.final_context_tokens;
|
|
394
330
|
|
|
395
|
-
|
|
331
|
+
// The threshold-crossing edge: the first Stop at which this session went
|
|
332
|
+
// past the recycle threshold. It used to fire the recycle advisory (retired
|
|
333
|
+
// 2026-09-10, step 3.2) and it still gates the run-checkpoint writer below,
|
|
334
|
+
// which needs "crossed, once" rather than "is above".
|
|
335
|
+
const crossedThresholdNow =
|
|
396
336
|
threshold !== null &&
|
|
397
337
|
tokens !== null &&
|
|
398
338
|
tokens >= threshold &&
|
|
399
339
|
state.advisory_fired_at === null;
|
|
400
340
|
|
|
401
|
-
// The counter-check: the advisory fired on an EARLIER Stop (so `state`,
|
|
402
|
-
// the pre-update snapshot, already carries the stamp) and no envelope has
|
|
403
|
-
// appeared since. It can never collide with `shouldAdvise` — that branch
|
|
404
|
-
// requires `advisory_fired_at === null` — so at most one line is emitted
|
|
405
|
-
// per Stop, and this one at most once per session.
|
|
406
|
-
//
|
|
407
|
-
// `threshold !== null` gates it for the same reason the advisory is gated:
|
|
408
|
-
// `AGENT_RECYCLE_THRESHOLD_TOKENS=0` is documented as the emergency switch
|
|
409
|
-
// for the whole advisory lane, and a lane that keeps one more warn after
|
|
410
|
-
// being switched off is not off.
|
|
411
341
|
// Raw id, not `sessionKey`: the record path is built from the id the host
|
|
412
342
|
// exported (`safe_stem`), never from the hashed state-file key.
|
|
413
343
|
const rawSessionId = payloadSessionId(payload, envelope) || null;
|
|
414
|
-
const shouldWarnMissing =
|
|
415
|
-
threshold !== null &&
|
|
416
|
-
state.advisory_fired_at !== null &&
|
|
417
|
-
(state.missing_envelope_warned_at ?? null) === null &&
|
|
418
|
-
!envelopeExists(workspaceRoot, state.advisory_fired_at, rawSessionId);
|
|
419
344
|
|
|
345
|
+
// `missing_envelope_warned_at` is carried forward, never set. Its writer —
|
|
346
|
+
// the "advised, but no envelope exists" counter-check — retired with the
|
|
347
|
+
// advisory it was checking on: with the record written automatically there
|
|
348
|
+
// is no advice to have been ignored, and the line it emitted told a human
|
|
349
|
+
// to run the command that step 3.2 removed from the normal path. The field
|
|
350
|
+
// is preserved on read so state written before that date keeps its history
|
|
351
|
+
// (`session_eol_report.ts` still counts it).
|
|
420
352
|
const nextState: SessionEolState = {
|
|
421
353
|
schema_version: 1,
|
|
422
354
|
counters,
|
|
423
|
-
advisory_fired_at:
|
|
424
|
-
missing_envelope_warned_at:
|
|
425
|
-
? now
|
|
426
|
-
: (state.missing_envelope_warned_at ?? null),
|
|
355
|
+
advisory_fired_at: crossedThresholdNow ? now : state.advisory_fired_at,
|
|
356
|
+
missing_envelope_warned_at: state.missing_envelope_warned_at ?? null,
|
|
427
357
|
updated_at: now,
|
|
428
358
|
};
|
|
429
359
|
try {
|
|
@@ -455,7 +385,7 @@ export function main(): number {
|
|
|
455
385
|
// Best-effort throughout. A checkpoint is a recovery aid, and a
|
|
456
386
|
// recovery aid that can fail a Stop is a liability.
|
|
457
387
|
const checkpointRunId = payloadSessionId(payload, envelope);
|
|
458
|
-
if (
|
|
388
|
+
if (crossedThresholdNow && checkpointRunId !== '' && run_checkpoints_enabled(workspaceRoot)) {
|
|
459
389
|
try {
|
|
460
390
|
const slug = read_claimed_slug(workspaceRoot, checkpointRunId);
|
|
461
391
|
if (slug !== null) {
|
|
@@ -479,26 +409,10 @@ export function main(): number {
|
|
|
479
409
|
|
|
480
410
|
writeContinuityRecord(workspaceRoot, rawSessionId, counters, threshold, tokens);
|
|
481
411
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
reason: `session-eol: context ${tokens} >= recycle threshold ${threshold}`,
|
|
487
|
-
additional_context: buildAdvisoryLine(tokens, threshold),
|
|
488
|
-
})}\n`,
|
|
489
|
-
);
|
|
490
|
-
return EXIT_WARN;
|
|
491
|
-
}
|
|
492
|
-
if (shouldWarnMissing) {
|
|
493
|
-
process.stdout.write(
|
|
494
|
-
`${JSON.stringify({
|
|
495
|
-
decision: 'warn',
|
|
496
|
-
reason: 'session-eol: recycle advised, no envelope written',
|
|
497
|
-
additional_context: buildMissingEnvelopeLine(workspaceRoot, rawSessionId),
|
|
498
|
-
})}\n`,
|
|
499
|
-
);
|
|
500
|
-
return EXIT_WARN;
|
|
501
|
-
}
|
|
412
|
+
// No warn path. Both emitters this hook used to carry were the recycle
|
|
413
|
+
// advisory and its counter-check, and both are retired (step 3.2). The hook
|
|
414
|
+
// records, writes the context fill, the checkpoint and the continuity
|
|
415
|
+
// record, and returns silently.
|
|
502
416
|
return 0;
|
|
503
417
|
}
|
|
504
418
|
|
|
@@ -70,6 +70,18 @@
|
|
|
70
70
|
* candidate spread is what tells them apart. Picking one now would be the
|
|
71
71
|
* threshold-first mistake the activation policy names.
|
|
72
72
|
*
|
|
73
|
+
* ── A SECOND RECORD KIND SHARES THIS LOG ──────────────────────────────────
|
|
74
|
+
*
|
|
75
|
+
* `_lib/tolerance_shadow.ts` appends `record: "tolerance_shadow"` lines here.
|
|
76
|
+
* It is NOT a second concern and registers nothing: `check_estate_count`
|
|
77
|
+
* reports zero growth allowance on hook concerns, so the value-reconciliation
|
|
78
|
+
* window rides this file rather than opening its own
|
|
79
|
+
* (`road-to-design-intent-conformance` 4.2). Readers of this log MUST
|
|
80
|
+
* discriminate on `record` — a consumer that assumed one shape would silently
|
|
81
|
+
* mis-parse the other. That module carries its own pre-registered flip
|
|
82
|
+
* criterion, on the same terms as the one above and with the same reverse
|
|
83
|
+
* trigger discipline.
|
|
84
|
+
*
|
|
73
85
|
* PRIVACY BY CONSTRUCTION: booleans, counts, a matcher label, and the
|
|
74
86
|
* id-shaped `agent_type` enum (recorded verbatim, the same stance
|
|
75
87
|
* `subagent_ledger_hook.ts` states for that field). No prompt, no command
|