@event4u/agent-config 14.22.0 → 15.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 +333 -356
- 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 +48 -39
- 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 +1 -1
- package/dist/agent-src/commands/roadmap/materialize.md +2 -2
- package/dist/agent-src/commands/roadmap/next.md +9 -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 +1 -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 +13 -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 +36 -25
- 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/scripts/archive_completed_roadmaps.ts +106 -4
- 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-intelligence/SKILL.md +57 -1
- 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/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/git-workflow/references/push-closes-its-loop.md +9 -0
- 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 +60 -4
- 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/registry.js +1 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +52 -4
- package/dist/cli-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/{chunk-TGIPZBCW.js → chunk-2KKXJW25.js} +22 -8
- package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
- package/dist/cli-delegate/{chunk-4FS4WRXP.js → chunk-3FKR64R5.js} +34 -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-BIXEDQPZ.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-HZ52BRGG.js} +24 -18
- package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.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 +3 -3
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_explain.js +2 -2
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +24 -16
- 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 +2 -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 +4 -14
- 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 +41 -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 +27 -80
- 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 +9249 -8981
- package/dist/install/install.mjs +47 -8
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +5496 -2400
- 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/lean_projection_mode.js +108 -0
- package/dist/scripts/_lib/router_match.js +243 -0
- package/dist/scripts/_lib/rule_injection.js +216 -0
- package/dist/scripts/condense.js +22 -25
- package/dist/scripts/project_thin_rules.js +139 -19
- package/dist/server/io/yamlIO.js +125 -17
- package/dist/server/schemas/settings.js +32 -5
- package/dist/shared/settingsSurface.js +6 -1
- package/docs/MIGRATION.md +56 -0
- package/docs/contracts/settings-classes.md +48 -7
- 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/notes-horizon-mechanics.md +90 -0
- 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/llms.txt +1 -1
- package/package.json +7 -3
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +106 -4
- package/src/config/agent-settings.template.yml +94 -1
- package/src/config/ci-local-parity.yml +34 -0
- package/src/config/continuity-surface.json +8 -29
- package/src/config/evaluator-budgets.json +4 -4
- 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 +8 -7
- package/src/config/host-injection-effect.json +2 -2
- package/src/config/pack-size-budget.json +55 -4
- package/src/config/packed-binary-manifest.json +1 -1
- package/src/config/platform-anchor.json +47 -0
- package/src/config/preamble-payload-budget.json +2 -3
- package/src/config/publish-surface.json +4 -2
- package/src/config/ratification-policy.json +7 -0
- package/src/config/routing-coverage-seed.json +9 -2
- package/src/config/rule-stub-ceilings.json +16 -9
- package/src/scripts/_cli/cmd_session_recycle.ts +2 -25
- package/src/scripts/_cli/cmd_settings_get.ts +22 -7
- package/src/scripts/_cli/handoff_sessions.ts +14 -44
- 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/conformance_report.ts +403 -0
- package/src/scripts/_lib/continuity_slot.ts +295 -0
- package/src/scripts/_lib/continuity_writer.ts +312 -0
- package/src/scripts/_lib/design_system_import.ts +20 -0
- package/src/scripts/_lib/design_tolerance.ts +281 -0
- package/src/scripts/_lib/guidelines_lane.ts +164 -0
- package/src/scripts/_lib/hook_settings.ts +85 -0
- package/src/scripts/_lib/lean_projection_mode.ts +127 -0
- package/src/scripts/_lib/obligation_frequency.ts +2 -3
- package/src/scripts/_lib/packed_binary_predicate.ts +37 -0
- package/src/scripts/_lib/platform_anchor.ts +1053 -0
- package/src/scripts/_lib/ratification_artifact.ts +278 -0
- package/src/scripts/_lib/recycle_envelope_paths.ts +109 -21
- package/src/scripts/_lib/regression_neighbourhood.ts +159 -22
- package/src/scripts/_lib/security_lint.ts +23 -2
- package/src/scripts/_lib/self_repair.ts +21 -0
- package/src/scripts/_lib/session_eol.ts +44 -0
- package/src/scripts/_lib/session_index_trust.ts +387 -0
- package/src/scripts/_lib/standing_bound_ratchet.ts +220 -0
- package/src/scripts/_lib/tolerance_shadow.ts +177 -0
- package/src/scripts/_lib/vendored_grammar_upstream.ts +280 -0
- package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
- package/src/scripts/audit_mcp_tools.ts +69 -25
- package/src/scripts/autonomy_friction_traffic.ts +379 -0
- package/src/scripts/build_mcp_catalog.ts +24 -1
- package/src/scripts/check_host_tree_parity.ts +291 -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 +424 -7
- package/src/scripts/check_projected_rule_routes.ts +395 -0
- package/src/scripts/check_rule_projection_integrity.ts +102 -2
- package/src/scripts/ci_settle.ts +205 -5
- package/src/scripts/code_graph/build.ts +79 -0
- package/src/scripts/code_graph/cli.ts +264 -7
- package/src/scripts/code_graph/detect.ts +38 -0
- package/src/scripts/code_graph/query.ts +25 -2
- package/src/scripts/code_graph/sqlite_store.ts +16 -1
- package/src/scripts/code_graph/types.ts +52 -3
- package/src/scripts/code_graph/validate.ts +3 -1
- package/src/scripts/code_graph/verbs.ts +590 -0
- package/src/scripts/condense.ts +22 -26
- package/src/scripts/generate_host_cost_table.ts +354 -0
- package/src/scripts/handoff_context_hook.ts +39 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +59 -28
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +182 -16
- package/src/scripts/hooks/category_a.ts +1 -1
- package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
- package/src/scripts/hooks/code_graph_context_hook.ts +7 -18
- package/src/scripts/hooks/push_settle_hook.ts +3 -2
- package/src/scripts/hooks/rule_inject_hook.ts +107 -20
- package/src/scripts/hooks/session_eol_hook.ts +177 -145
- package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
- package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
- package/src/scripts/hot_context_hook.ts +103 -408
- package/src/scripts/lint_evidence_artifacts.ts +1 -0
- package/src/scripts/lint_knowledge_scale.ts +0 -26
- package/src/scripts/lint_roadmap_blockers.ts +164 -1
- package/src/scripts/mcp_server/consumer_tool_catalog.json +152 -2
- package/src/scripts/mcp_server/graph_tools.ts +294 -0
- package/src/scripts/mcp_server/path_util.ts +31 -0
- package/src/scripts/mcp_server/tool_catalog_source.ts +7 -1
- package/src/scripts/mcp_server/tools.ts +3 -13
- package/src/scripts/memory_lookup.ts +9 -9
- package/src/scripts/model_rule_injection.ts +61 -4
- package/src/scripts/project_thin_rules.ts +149 -16
- package/src/scripts/report_standing_payload_by_host.ts +650 -0
- package/src/scripts/schemas/agent-settings.schema.json +7 -1
- package/src/scripts/session_memory_index.ts +86 -8
- package/src/scripts/sync_agent_settings.ts +270 -10
- package/src/server/io/yamlIO.ts +127 -17
- package/src/server/schemas/settings.ts +45 -6
- package/src/shared/settingsSurface.ts +13 -2
- package/src/templates/compact-instructions.md +8 -3
- package/src/vendor/grammars/README.md +27 -2
- package/dist/agent-src/commands/chat-history/import.md +0 -170
- package/dist/agent-src/commands/chat-history.md +0 -63
|
@@ -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';
|
|
@@ -45,7 +56,10 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
45
56
|
|
|
46
57
|
import recycleThresholdConfig from '../../config/recycle-threshold-budget.json';
|
|
47
58
|
|
|
48
|
-
import {
|
|
59
|
+
import {
|
|
60
|
+
listContinuityRecords,
|
|
61
|
+
RECYCLE_MAX_AGE_HOURS,
|
|
62
|
+
} from '../_lib/recycle_envelope_paths.js';
|
|
49
63
|
import {
|
|
50
64
|
emptyCounters,
|
|
51
65
|
eolSessionKey,
|
|
@@ -56,18 +70,23 @@ import {
|
|
|
56
70
|
} from '../_lib/session_eol.js';
|
|
57
71
|
import { readContextObservation } from '../_lib/context_observation.js';
|
|
58
72
|
import { buildCheckpoint, writeCheckpoint } from '../_lib/run_checkpoint.js';
|
|
73
|
+
import {
|
|
74
|
+
auto_record_enabled,
|
|
75
|
+
buildContinuityRecord,
|
|
76
|
+
run_checkpoints_enabled,
|
|
77
|
+
} from '../_lib/continuity_writer.js';
|
|
78
|
+
import { publishContinuityRecord } from '../_lib/continuity_slot.js';
|
|
59
79
|
import { read_claimed_slug } from '../session_register_hook.js';
|
|
60
80
|
import { unwrap, type JsonObject, type JsonValue } from './envelope.js';
|
|
61
81
|
import { readHookStdin } from './hook_stdin.js';
|
|
62
82
|
import { atomic_write_json, is_replay_mode } from './state_io.js';
|
|
63
83
|
import { isSafeTranscriptPath } from './end_review_nudge_hook.js';
|
|
64
84
|
|
|
65
|
-
const EXIT_WARN = 2;
|
|
66
|
-
|
|
67
85
|
/**
|
|
68
86
|
* Per-process threshold override — the test seam and the emergency off
|
|
69
|
-
* switch (`0` or any non-positive value disables the
|
|
70
|
-
*
|
|
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
|
|
71
90
|
* `src/config/recycle-threshold-budget.json` and is statically imported so
|
|
72
91
|
* the hook bundle carries it into consumers — one threshold, one constant.
|
|
73
92
|
*/
|
|
@@ -79,11 +98,24 @@ export const CONTEXT_FILL_REL = path.join('agents', 'runtime', 'state', 'context
|
|
|
79
98
|
export interface SessionEolState {
|
|
80
99
|
schema_version: 1;
|
|
81
100
|
counters: EolCounters;
|
|
82
|
-
/**
|
|
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
|
+
*/
|
|
83
111
|
advisory_fired_at: string | null;
|
|
84
112
|
/**
|
|
85
113
|
* ISO stamp when the follow-up "advised, but no envelope exists" line
|
|
86
|
-
* 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
|
|
87
119
|
* is once-per-session in its own right: one reminder is a safety net, one
|
|
88
120
|
* per Stop for the rest of the session is a nag the reader learns to skip.
|
|
89
121
|
*/
|
|
@@ -163,70 +195,59 @@ export function readState(file: string): SessionEolState {
|
|
|
163
195
|
}
|
|
164
196
|
|
|
165
197
|
/**
|
|
166
|
-
*
|
|
198
|
+
* Records that were written and never read — the detection layer this defect
|
|
199
|
+
* did not have.
|
|
167
200
|
*
|
|
168
|
-
*
|
|
201
|
+
* `road-to-a-recycle-envelope-that-is-consumed` step 1.2. Twelve unconsumed
|
|
202
|
+
* envelopes accumulated across the estate over roughly a month, and the only
|
|
203
|
+
* reason anyone found them was a stray-copy check during an unrelated task. The
|
|
204
|
+
* producer reported success, the consumer reported `absent`, and nothing
|
|
205
|
+
* compared the two — so the mechanism was inert for weeks with no signal.
|
|
169
206
|
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
* gone" warning this check exists to avoid. `statSync` + an errno test is the
|
|
174
|
-
* only shape that can tell the two apart.
|
|
207
|
+
* Advisory ONLY. A hook that blocks a session end over a stale runtime file is
|
|
208
|
+
* worse than the file, and that is Kill-register K3 of the roadmap rather than
|
|
209
|
+
* a preference here.
|
|
175
210
|
*
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
* `written_at` predates the advisory is not this session's.
|
|
211
|
+
* Silent in the normal case, which is what keeps it worth reading: a record
|
|
212
|
+
* younger than {@link RECYCLE_MAX_AGE_HOURS} is a pending resume, not a defect,
|
|
213
|
+
* and past that age the consumer discards it loudly on its own. What this
|
|
214
|
+
* reports is the third state — old enough to be dead, still sitting there,
|
|
215
|
+
* which means no successor ever came for it.
|
|
182
216
|
*/
|
|
183
|
-
export function
|
|
217
|
+
export function unconsumedRecordLines(
|
|
184
218
|
workspaceRoot: string,
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
):
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
219
|
+
now: Date = new Date(),
|
|
220
|
+
maxAgeHours: number = RECYCLE_MAX_AGE_HOURS,
|
|
221
|
+
): string[] {
|
|
222
|
+
const out: string[] = [];
|
|
223
|
+
for (const file of listContinuityRecords(workspaceRoot)) {
|
|
224
|
+
let raw: string;
|
|
225
|
+
try {
|
|
226
|
+
raw = fs.readFileSync(file, 'utf-8');
|
|
227
|
+
} catch {
|
|
228
|
+
continue; // an unreadable record proves nothing in either direction
|
|
229
|
+
}
|
|
230
|
+
let written: unknown;
|
|
231
|
+
let nextTask: unknown;
|
|
232
|
+
try {
|
|
233
|
+
const parsed = JSON.parse(raw) as { written_at?: unknown; next_task?: unknown };
|
|
234
|
+
written = parsed.written_at;
|
|
235
|
+
nextTask = parsed.next_task;
|
|
236
|
+
} catch {
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
if (typeof written !== 'string') continue;
|
|
240
|
+
const stamp = Date.parse(written);
|
|
241
|
+
if (Number.isNaN(stamp)) continue;
|
|
242
|
+
const ageHours = (now.getTime() - stamp) / 3_600_000;
|
|
243
|
+
if (ageHours <= maxAgeHours) continue;
|
|
244
|
+
const task = typeof nextTask === 'string' && nextTask.trim() !== '' ? nextTask.trim() : '(no next_task)';
|
|
245
|
+
out.push(
|
|
246
|
+
`unconsumed continuity record: ${path.relative(workspaceRoot, file)} is ` +
|
|
247
|
+
`${ageHours.toFixed(0)}h old and was never read — next_task was "${task.slice(0, 120)}"`,
|
|
248
|
+
);
|
|
210
249
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* The follow-up line: the advisory already fired, and no envelope arrived.
|
|
215
|
-
*
|
|
216
|
-
* This is the half of the reported minimum fix that lives outside the command
|
|
217
|
-
* — the hook that recommends the call making the same counter-check before the
|
|
218
|
-
* operator acts on it. Whatever stopped the write (a wrong root, a refusal
|
|
219
|
-
* scrolled past, a forgotten step), the state visible here is identical, and
|
|
220
|
-
* the next action the advisory recommended is the one that destroys the
|
|
221
|
-
* session.
|
|
222
|
-
*/
|
|
223
|
-
export function buildMissingEnvelopeLine(workspaceRoot: string, sessionId: string | null = null): string {
|
|
224
|
-
return (
|
|
225
|
-
`recycle advised earlier, but no envelope exists at ` +
|
|
226
|
-
`${path.join(workspaceRoot, recycle_envelope_rel(sessionId))} — /clear now starts the successor ` +
|
|
227
|
-
`from nothing. Re-run \`agent-config session:recycle\` and check that it prints the ` +
|
|
228
|
-
`absolute path it wrote before clearing.`
|
|
229
|
-
);
|
|
250
|
+
return out;
|
|
230
251
|
}
|
|
231
252
|
|
|
232
253
|
/**
|
|
@@ -246,25 +267,6 @@ export function readThresholdTokens(): number | null {
|
|
|
246
267
|
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : null;
|
|
247
268
|
}
|
|
248
269
|
|
|
249
|
-
/**
|
|
250
|
-
* The exactly-one advisory line injected past threshold (Phase 3.2).
|
|
251
|
-
*
|
|
252
|
-
* The `/clear` half is conditional on purpose. An earlier wording read
|
|
253
|
-
* `run X … then /clear`, which is an instruction to destroy the session with
|
|
254
|
-
* no check in between — and a reader who followed it while the command was
|
|
255
|
-
* silently writing nothing lost everything. The proof to wait for is the
|
|
256
|
-
* absolute path the command prints; naming it costs one clause.
|
|
257
|
-
*/
|
|
258
|
-
export function buildAdvisoryLine(tokens: number, threshold: number): string {
|
|
259
|
-
return (
|
|
260
|
-
`context past recycle threshold (${tokens.toLocaleString('en-US')} of ` +
|
|
261
|
-
`${threshold.toLocaleString('en-US')} tokens): run \`agent-config session:recycle\` to ` +
|
|
262
|
-
`write the recycle envelope. It prints the absolute path it wrote — /clear only after ` +
|
|
263
|
-
`you have seen that line. The successor session then resumes from the envelope at ` +
|
|
264
|
-
`session_start (road-to-token-economy-recycling)`
|
|
265
|
-
);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
270
|
/** Overwrite the Phase 4.2 read surface. Counts only; failures are swallowed. */
|
|
269
271
|
function writeContextFill(
|
|
270
272
|
workspaceRoot: string,
|
|
@@ -326,38 +328,32 @@ export function main(): number {
|
|
|
326
328
|
const threshold = readThresholdTokens();
|
|
327
329
|
const tokens = counters.final_context_tokens;
|
|
328
330
|
|
|
329
|
-
|
|
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 =
|
|
330
336
|
threshold !== null &&
|
|
331
337
|
tokens !== null &&
|
|
332
338
|
tokens >= threshold &&
|
|
333
339
|
state.advisory_fired_at === null;
|
|
334
340
|
|
|
335
|
-
// The counter-check: the advisory fired on an EARLIER Stop (so `state`,
|
|
336
|
-
// the pre-update snapshot, already carries the stamp) and no envelope has
|
|
337
|
-
// appeared since. It can never collide with `shouldAdvise` — that branch
|
|
338
|
-
// requires `advisory_fired_at === null` — so at most one line is emitted
|
|
339
|
-
// per Stop, and this one at most once per session.
|
|
340
|
-
//
|
|
341
|
-
// `threshold !== null` gates it for the same reason the advisory is gated:
|
|
342
|
-
// `AGENT_RECYCLE_THRESHOLD_TOKENS=0` is documented as the emergency switch
|
|
343
|
-
// for the whole advisory lane, and a lane that keeps one more warn after
|
|
344
|
-
// being switched off is not off.
|
|
345
341
|
// Raw id, not `sessionKey`: the record path is built from the id the host
|
|
346
342
|
// exported (`safe_stem`), never from the hashed state-file key.
|
|
347
343
|
const rawSessionId = payloadSessionId(payload, envelope) || null;
|
|
348
|
-
const shouldWarnMissing =
|
|
349
|
-
threshold !== null &&
|
|
350
|
-
state.advisory_fired_at !== null &&
|
|
351
|
-
(state.missing_envelope_warned_at ?? null) === null &&
|
|
352
|
-
!envelopeExists(workspaceRoot, state.advisory_fired_at, rawSessionId);
|
|
353
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).
|
|
354
352
|
const nextState: SessionEolState = {
|
|
355
353
|
schema_version: 1,
|
|
356
354
|
counters,
|
|
357
|
-
advisory_fired_at:
|
|
358
|
-
missing_envelope_warned_at:
|
|
359
|
-
? now
|
|
360
|
-
: (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,
|
|
361
357
|
updated_at: now,
|
|
362
358
|
};
|
|
363
359
|
try {
|
|
@@ -389,7 +385,7 @@ export function main(): number {
|
|
|
389
385
|
// Best-effort throughout. A checkpoint is a recovery aid, and a
|
|
390
386
|
// recovery aid that can fail a Stop is a liability.
|
|
391
387
|
const checkpointRunId = payloadSessionId(payload, envelope);
|
|
392
|
-
if (
|
|
388
|
+
if (crossedThresholdNow && checkpointRunId !== '' && run_checkpoints_enabled(workspaceRoot)) {
|
|
393
389
|
try {
|
|
394
390
|
const slug = read_claimed_slug(workspaceRoot, checkpointRunId);
|
|
395
391
|
if (slug !== null) {
|
|
@@ -411,29 +407,65 @@ export function main(): number {
|
|
|
411
407
|
}
|
|
412
408
|
}
|
|
413
409
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
})}\n`,
|
|
421
|
-
);
|
|
422
|
-
return EXIT_WARN;
|
|
423
|
-
}
|
|
424
|
-
if (shouldWarnMissing) {
|
|
425
|
-
process.stdout.write(
|
|
426
|
-
`${JSON.stringify({
|
|
427
|
-
decision: 'warn',
|
|
428
|
-
reason: 'session-eol: recycle advised, no envelope written',
|
|
429
|
-
additional_context: buildMissingEnvelopeLine(workspaceRoot, rawSessionId),
|
|
430
|
-
})}\n`,
|
|
431
|
-
);
|
|
432
|
-
return EXIT_WARN;
|
|
433
|
-
}
|
|
410
|
+
writeContinuityRecord(workspaceRoot, rawSessionId, counters, threshold, tokens);
|
|
411
|
+
|
|
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.
|
|
434
416
|
return 0;
|
|
435
417
|
}
|
|
436
418
|
|
|
419
|
+
/**
|
|
420
|
+
* The continuity-record handler — one of the three lifecycle handlers this
|
|
421
|
+
* concern carries, and independently switchable from the other two.
|
|
422
|
+
*
|
|
423
|
+
* `road-to-continuity-writer-activation` step 1.2, and it lands INSIDE this
|
|
424
|
+
* concern rather than as a fourth concern id on purpose: `check_estate_count`
|
|
425
|
+
* ratchets `concern_count` with allowance 0, and the 2026-09-08 AI council
|
|
426
|
+
* refused a temporary allowance 2/2. The substance the 2026-09-07 council's D2
|
|
427
|
+
* asked for is independent switching and failure isolation, and a handler
|
|
428
|
+
* behind its own settings key inside a `try` gives both without a manifest
|
|
429
|
+
* split. The split itself is step 2.1 and stays blocked until a concern is
|
|
430
|
+
* retired to pay for it.
|
|
431
|
+
*
|
|
432
|
+
* Fires from the recycle THRESHOLD, not from the once-per-session advisory
|
|
433
|
+
* stamp: the stamp fires once, so a record written from it would be frozen at
|
|
434
|
+
* the moment the session crossed the threshold and would go stale as the
|
|
435
|
+
* session continued. Driving it from the raw threshold condition instead means
|
|
436
|
+
* every later Stop supersedes the record under the slot's own policy, so what a
|
|
437
|
+
* successor reads is always the newest state, and the write rate is still
|
|
438
|
+
* bounded to the end phase of a session rather than every turn of it.
|
|
439
|
+
*
|
|
440
|
+
* Best-effort throughout, like the checkpoint above it: a continuity record is
|
|
441
|
+
* a recovery aid, and a recovery aid that can fail a Stop is a liability.
|
|
442
|
+
*/
|
|
443
|
+
function writeContinuityRecord(
|
|
444
|
+
workspaceRoot: string,
|
|
445
|
+
rawSessionId: string | null,
|
|
446
|
+
counters: EolCounters,
|
|
447
|
+
threshold: number | null,
|
|
448
|
+
tokens: number | null,
|
|
449
|
+
): void {
|
|
450
|
+
if (threshold === null || tokens === null || tokens < threshold) return;
|
|
451
|
+
const sessionId = String(rawSessionId ?? '').trim();
|
|
452
|
+
if (sessionId === '') return;
|
|
453
|
+
try {
|
|
454
|
+
if (!auto_record_enabled(workspaceRoot)) return;
|
|
455
|
+
const slug = read_claimed_slug(workspaceRoot, sessionId);
|
|
456
|
+
const decision = buildContinuityRecord({
|
|
457
|
+
root: workspaceRoot,
|
|
458
|
+
sessionId,
|
|
459
|
+
slug,
|
|
460
|
+
counters,
|
|
461
|
+
});
|
|
462
|
+
if (decision.record === null) return;
|
|
463
|
+
publishContinuityRecord(workspaceRoot, sessionId, decision.record);
|
|
464
|
+
} catch {
|
|
465
|
+
// never block the Stop path, and never suppress a sibling handler
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
437
469
|
// Bundle-safety: never auto-run when inlined into an esbuild bundle, where
|
|
438
470
|
// every module shares the bundle's `import.meta.url` (see cmd_migrate.ts).
|
|
439
471
|
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
@@ -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
|
|
@@ -132,12 +132,17 @@ export function isUiWrite(event: ToolEvent): boolean {
|
|
|
132
132
|
* `path_prefix: .claude/design-system/`. Reading one is the agent reaching
|
|
133
133
|
* rung 1 of the data-basis ladder before it writes.
|
|
134
134
|
*
|
|
135
|
-
* A SHARED PREDICATE, NOT A DECISION INPUT
|
|
136
|
-
* it
|
|
137
|
-
* that
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* and
|
|
135
|
+
* A SHARED PREDICATE, AND A RECORDED ONE — NOT A DECISION INPUT. `decide`
|
|
136
|
+
* evaluates it on every event and latches the result into `SessionState`, but
|
|
137
|
+
* no branch reads that latch: every `warn` value is what it was before, so the
|
|
138
|
+
* nudge's behaviour is unchanged and the phase's `nothing behavioural` still
|
|
139
|
+
* holds. Recording it closes the gap the predicate shipped with — it was
|
|
140
|
+
* exported here and consumed only by `report_consultation_rate`, so a live
|
|
141
|
+
* session's own state said nothing about whether the artifact had been read.
|
|
142
|
+
* The concern is default-OFF, so this changes nothing for a consumer and makes
|
|
143
|
+
* the shadow record honest (`road-to-design-intent-conformance` 2.6). Keeping
|
|
144
|
+
* the predicate beside `isUiWrite` / `isConsultation` is what stops the
|
|
145
|
+
* analyzer and the nudge from classifying the same event differently.
|
|
141
146
|
*
|
|
142
147
|
* THIS IS A COPY OF THE RULE'S TRIGGERS, NOT A READ OF THEM — same honesty
|
|
143
148
|
* boundary the header states for `ui_surface.ts`: nothing here parses
|
|
@@ -162,12 +167,27 @@ export function isUiWrite(event: ToolEvent): boolean {
|
|
|
162
167
|
export function isArtifactRead(event: ToolEvent): boolean {
|
|
163
168
|
if (event.isWrite || !event.file) return false;
|
|
164
169
|
const normalized = event.file.replace(/\\/g, '/').toLowerCase();
|
|
165
|
-
return
|
|
170
|
+
return (
|
|
171
|
+
normalized.endsWith('design.html') ||
|
|
172
|
+
// The Claude Design canvas artboard. NOT covered by the line above:
|
|
173
|
+
// `ToDo.dc.html` does not end in `design.html`, which is exactly why
|
|
174
|
+
// the rule needed a second file pattern (2.5) and why the drift guard
|
|
175
|
+
// below reds when one is added here without the other.
|
|
176
|
+
normalized.endsWith('.dc.html') ||
|
|
177
|
+
normalized.includes('.claude/design-system/')
|
|
178
|
+
);
|
|
166
179
|
}
|
|
167
180
|
|
|
168
181
|
export interface SessionState {
|
|
169
182
|
consulted: boolean;
|
|
170
183
|
nudges: number;
|
|
184
|
+
/**
|
|
185
|
+
* Latched once a provided design artifact has been READ this session.
|
|
186
|
+
* Shadow-only: nothing branches on it. It exists so the session's own
|
|
187
|
+
* record can answer "did this agent open the handover before writing UI",
|
|
188
|
+
* which until 2.6 only a transcript analyzer could answer after the fact.
|
|
189
|
+
*/
|
|
190
|
+
artifactRead: boolean;
|
|
171
191
|
}
|
|
172
192
|
|
|
173
193
|
function stateFile(root: string): string {
|
|
@@ -182,12 +202,17 @@ export function readState(root: string, session: string): SessionState {
|
|
|
182
202
|
>;
|
|
183
203
|
const entry = all[session];
|
|
184
204
|
if (entry && typeof entry.consulted === 'boolean' && typeof entry.nudges === 'number') {
|
|
185
|
-
|
|
205
|
+
// `artifactRead` arrived after the file shape did, so a state file
|
|
206
|
+
// written by an older build carries the two older fields and not
|
|
207
|
+
// this one. Default it rather than rejecting the entry: dropping a
|
|
208
|
+
// valid latch to gain a boolean would lose the `consulted` flag and
|
|
209
|
+
// re-nudge a session that had already consulted.
|
|
210
|
+
return { ...entry, artifactRead: entry.artifactRead === true };
|
|
186
211
|
}
|
|
187
212
|
} catch {
|
|
188
213
|
/* fresh session */
|
|
189
214
|
}
|
|
190
|
-
return { consulted: false, nudges: 0 };
|
|
215
|
+
return { consulted: false, nudges: 0, artifactRead: false };
|
|
191
216
|
}
|
|
192
217
|
|
|
193
218
|
/** Sessions retained in the state file; oldest entries drop past this. */
|
|
@@ -236,13 +261,21 @@ export function decide(
|
|
|
236
261
|
event: ToolEvent,
|
|
237
262
|
state: SessionState,
|
|
238
263
|
): { state: SessionState; warn: boolean } {
|
|
264
|
+
// Evaluated FIRST and independently of every branch below, because
|
|
265
|
+
// `isArtifactRead` and `isConsultation` are NOT disjoint — a read of
|
|
266
|
+
// `src/skills/design-review/references/design.html` satisfies both. Folding
|
|
267
|
+
// it into one of the branches would silently drop such an event from
|
|
268
|
+
// whichever classification lost the race, which is the failure
|
|
269
|
+
// `isArtifactRead`'s own header warns callers about. Latching, never
|
|
270
|
+
// clearing: the question is "was it read at any point this session".
|
|
271
|
+
const artifactRead = state.artifactRead || isArtifactRead(event);
|
|
239
272
|
if (isConsultation(event)) {
|
|
240
|
-
return { state: { ...state, consulted: true }, warn: false };
|
|
273
|
+
return { state: { ...state, artifactRead, consulted: true }, warn: false };
|
|
241
274
|
}
|
|
242
|
-
if (!isUiWrite(event)) return { state, warn: false };
|
|
243
|
-
if (state.consulted) return { state, warn: false };
|
|
244
|
-
if (state.nudges >= MAX_NUDGES) return { state, warn: false };
|
|
245
|
-
return { state: { ...state, nudges: state.nudges + 1 }, warn: true };
|
|
275
|
+
if (!isUiWrite(event)) return { state: { ...state, artifactRead }, warn: false };
|
|
276
|
+
if (state.consulted) return { state: { ...state, artifactRead }, warn: false };
|
|
277
|
+
if (state.nudges >= MAX_NUDGES) return { state: { ...state, artifactRead }, warn: false };
|
|
278
|
+
return { state: { ...state, artifactRead, nudges: state.nudges + 1 }, warn: true };
|
|
246
279
|
}
|
|
247
280
|
|
|
248
281
|
/**
|
|
@@ -256,7 +289,11 @@ export function decide(
|
|
|
256
289
|
* but the guard stays enumerated and this note stays with it.
|
|
257
290
|
*/
|
|
258
291
|
export function stateChanged(before: SessionState, after: SessionState): boolean {
|
|
259
|
-
return
|
|
292
|
+
return (
|
|
293
|
+
before.consulted !== after.consulted ||
|
|
294
|
+
before.nudges !== after.nudges ||
|
|
295
|
+
before.artifactRead !== after.artifactRead
|
|
296
|
+
);
|
|
260
297
|
}
|
|
261
298
|
|
|
262
299
|
export function nudgeReason(file: string): string {
|