@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
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session review baseline — the shape, the path, and the subtraction.
|
|
3
|
+
*
|
|
4
|
+
* WHY IT EXISTS. `end_review_nudge_hook` measures "did this session mutate
|
|
5
|
+
* enough to owe a review" as `git diff --numstat HEAD` plus untracked non-doc
|
|
6
|
+
* files, and its own header records the defect that reading produces: an
|
|
7
|
+
* uncommitted change that PREDATES the session is charged to the session. The
|
|
8
|
+
* header also records why it was not fixed — "no such baseline exists anywhere a
|
|
9
|
+
* `stop` concern can read it (recording one would be new session-wide state, out
|
|
10
|
+
* of this roadmap phase's one-concern scope)".
|
|
11
|
+
*
|
|
12
|
+
* That reason went stale. `session_start` is bound on seven hosts carrying
|
|
13
|
+
* fourteen concerns (`hook_manifest.yaml`), so a per-session baseline has a slot
|
|
14
|
+
* to be written from. The measured cost of leaving it: on an accumulator branch
|
|
15
|
+
* the nudge fired on 1,771 lines of another session's uncommitted work and
|
|
16
|
+
* became noise, which is worse than silence — an advisory that always fires is
|
|
17
|
+
* an advisory nobody reads.
|
|
18
|
+
*
|
|
19
|
+
* ONE MODULE FOR BOTH SIDES, deliberately. The writer is a `session_start`
|
|
20
|
+
* concern and the reader is a `stop` concern; if each owned its own idea of the
|
|
21
|
+
* path or the field names, the reader would silently find nothing and the whole
|
|
22
|
+
* mechanism would degrade to today's behaviour with no signal. That is the same
|
|
23
|
+
* argument `turn_end_refusals.ts` makes for its own shared path, and it is why
|
|
24
|
+
* `BASELINE_STATE_REL` is here rather than in either hook.
|
|
25
|
+
*
|
|
26
|
+
* ONE SELF-REFERENCE, named because it is invisible: the file this concern
|
|
27
|
+
* writes is itself an untracked non-doc file, so in a workspace where
|
|
28
|
+
* `agents/runtime/` is NOT gitignored it is counted by the very measurement it
|
|
29
|
+
* feeds — about six lines, once. This repository ignores that path, so the
|
|
30
|
+
* effect is zero here; a consumer whose ignore file does not cover it sees the
|
|
31
|
+
* nudge's count six lines high for the session.
|
|
32
|
+
*
|
|
33
|
+
* WHAT IT IS NOT. It is not a change set: no paths, no fingerprints, no patch.
|
|
34
|
+
* It answers exactly the question the nudge asks — how many non-doc lines were
|
|
35
|
+
* already dirty when this session began — and nothing else. A path-level ledger
|
|
36
|
+
* is a bigger object with a bigger privacy surface, and nothing in the nudge
|
|
37
|
+
* consumes one.
|
|
38
|
+
*/
|
|
39
|
+
import { spawnSync } from 'node:child_process';
|
|
40
|
+
import * as fs from 'node:fs';
|
|
41
|
+
import * as path from 'node:path';
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* HEAD at this moment, or null.
|
|
45
|
+
*
|
|
46
|
+
* It lives HERE rather than in the writer because both sides need it and the
|
|
47
|
+
* writer already imports from the reader's module: putting it in the hook would
|
|
48
|
+
* make `end_review_nudge_hook → review_baseline_hook → end_review_nudge_hook` a
|
|
49
|
+
* cycle. The shared module is the only place with no edge back.
|
|
50
|
+
*
|
|
51
|
+
* Null is a real answer and not an error path — a workspace that is not a git
|
|
52
|
+
* repository, or one with no commit yet, has no HEAD, and `applyBaseline`
|
|
53
|
+
* compares null to null happily. What it must never do is throw: one caller runs
|
|
54
|
+
* on session start and the other on the stop path.
|
|
55
|
+
*/
|
|
56
|
+
export function currentHeadSha(cwd: string): string | null {
|
|
57
|
+
try {
|
|
58
|
+
const r = spawnSync('git', ['rev-parse', 'HEAD'], { cwd, encoding: 'utf8' });
|
|
59
|
+
if (r.status !== 0) return null;
|
|
60
|
+
const out = (r.stdout ?? '').trim();
|
|
61
|
+
return out === '' ? null : out;
|
|
62
|
+
} catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** State directory, relative to a workspace root. */
|
|
68
|
+
export const BASELINE_STATE_REL = path.join('agents', 'runtime', 'state', 'review-baseline');
|
|
69
|
+
|
|
70
|
+
export function baselineStateDir(workspaceRoot: string): string {
|
|
71
|
+
return path.join(workspaceRoot, BASELINE_STATE_REL);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function baselineStateFile(workspaceRoot: string, sessionKey: string): string {
|
|
75
|
+
return path.join(baselineStateDir(workspaceRoot), `${sessionKey}.json`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Whether a line count is an exact sum or the capped, guaranteed-over-threshold
|
|
80
|
+
* approximation `end_review_nudge_hook` returns past `UNTRACKED_FILE_CAP`.
|
|
81
|
+
*
|
|
82
|
+
* Structurally identical to that module's `MutationMeasure` and deliberately
|
|
83
|
+
* NOT imported from it: this module is the shared floor both hooks sit on, and
|
|
84
|
+
* importing the consumer would put the cycle back that `currentHeadSha` lives
|
|
85
|
+
* here to avoid.
|
|
86
|
+
*/
|
|
87
|
+
export type BaselineMeasure = 'exact' | 'capped_approximation';
|
|
88
|
+
|
|
89
|
+
/** What `session_start` records, and `stop` reads back. */
|
|
90
|
+
export interface ReviewBaseline {
|
|
91
|
+
/** HEAD at session start, or null where there is no repo / no commit yet. */
|
|
92
|
+
head_sha: string | null;
|
|
93
|
+
/** Non-doc mutated lines already present when the session began. */
|
|
94
|
+
baseline_lines: number;
|
|
95
|
+
/**
|
|
96
|
+
* Whether `baseline_lines` is exact or the capped approximation.
|
|
97
|
+
*
|
|
98
|
+
* It is recorded because subtracting one kind from the other is arithmetic
|
|
99
|
+
* over two different quantities — the same defect `head_sha` catches on the
|
|
100
|
+
* other axis. The capped path returns `THRESHOLD + 1 + tracked`, a synthetic
|
|
101
|
+
* number chosen to be over the bar rather than to be true, so a session that
|
|
102
|
+
* starts past the cap and then cleans up would have a real `exact` stop
|
|
103
|
+
* measurement reduced by a number that never counted anything.
|
|
104
|
+
*
|
|
105
|
+
* Optional: a record written before this field existed has no measure, and
|
|
106
|
+
* defaulting it to `exact` would assert the more permissive of the two on no
|
|
107
|
+
* evidence. Absent reads as unknown and refuses to subtract.
|
|
108
|
+
*/
|
|
109
|
+
measure?: BaselineMeasure;
|
|
110
|
+
written_at: string;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Why a `stop` read could not subtract. Each value is written into the
|
|
115
|
+
* `review_skipped` telemetry row, because a fallback nobody can see is
|
|
116
|
+
* indistinguishable from the mechanism never having shipped.
|
|
117
|
+
*/
|
|
118
|
+
export type BaselineFallback =
|
|
119
|
+
| 'absent' // no file — a host without session_start, or a session older than this
|
|
120
|
+
| 'unreadable' // present and malformed, or unreadable for any non-ENOENT reason
|
|
121
|
+
| 'head-moved' // the session committed, so the baseline's denominator is gone
|
|
122
|
+
| 'mixed-measure'; // one side is a capped approximation and the other is not
|
|
123
|
+
|
|
124
|
+
export type BaselineOutcome =
|
|
125
|
+
| { readonly applied: true; readonly baseline: ReviewBaseline; readonly lines: number }
|
|
126
|
+
| { readonly applied: false; readonly fallback: BaselineFallback; readonly lines: number };
|
|
127
|
+
|
|
128
|
+
export function parseBaseline(raw: string): ReviewBaseline | null {
|
|
129
|
+
let decoded: unknown;
|
|
130
|
+
try {
|
|
131
|
+
decoded = JSON.parse(raw);
|
|
132
|
+
} catch {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
if (typeof decoded !== 'object' || decoded === null || Array.isArray(decoded)) return null;
|
|
136
|
+
const o = decoded as Record<string, unknown>;
|
|
137
|
+
const lines = o['baseline_lines'];
|
|
138
|
+
if (typeof lines !== 'number' || !Number.isFinite(lines) || lines < 0) return null;
|
|
139
|
+
const written = o['written_at'];
|
|
140
|
+
if (typeof written !== 'string') return null;
|
|
141
|
+
const head = o['head_sha'];
|
|
142
|
+
const measure = o['measure'];
|
|
143
|
+
return {
|
|
144
|
+
head_sha: typeof head === 'string' && head !== '' ? head : null,
|
|
145
|
+
baseline_lines: lines,
|
|
146
|
+
...(measure === 'exact' || measure === 'capped_approximation' ? { measure } : {}),
|
|
147
|
+
written_at: written,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* The baseline, or WHICH of the two not-found states applies.
|
|
153
|
+
*
|
|
154
|
+
* `absent` and `unreadable` are kept apart all the way to the telemetry row,
|
|
155
|
+
* and collapsing them would have been the easy shape: both mean "cannot
|
|
156
|
+
* subtract", both fall back identically. They are different findings. `absent`
|
|
157
|
+
* is the expected steady state on a host with no `session_start` slot and on
|
|
158
|
+
* every session that started before this shipped; `unreadable` is a corrupt
|
|
159
|
+
* write, and a rate of it above noise is a defect in this mechanism rather than
|
|
160
|
+
* a property of the host. A single bucket would hide the second inside the
|
|
161
|
+
* first, which is the population it is smallest against.
|
|
162
|
+
*/
|
|
163
|
+
export function readBaseline(
|
|
164
|
+
workspaceRoot: string,
|
|
165
|
+
sessionKey: string,
|
|
166
|
+
): ReviewBaseline | 'absent' | 'unreadable' {
|
|
167
|
+
const file = baselineStateFile(workspaceRoot, sessionKey);
|
|
168
|
+
let raw: string;
|
|
169
|
+
try {
|
|
170
|
+
raw = fs.readFileSync(file, 'utf-8');
|
|
171
|
+
} catch (exc) {
|
|
172
|
+
// ONLY a genuinely missing file is `absent`. Every other IO failure —
|
|
173
|
+
// EACCES, EISDIR, EMFILE — is a defect in this mechanism, which is the
|
|
174
|
+
// population `unreadable` exists to make visible; routing them all to
|
|
175
|
+
// `absent` would bury them inside the one bucket that is legitimately
|
|
176
|
+
// large on every host without a session_start slot.
|
|
177
|
+
const code = (exc as NodeJS.ErrnoException | null)?.code;
|
|
178
|
+
return code === 'ENOENT' ? 'absent' : 'unreadable';
|
|
179
|
+
}
|
|
180
|
+
return parseBaseline(raw) ?? 'unreadable';
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Apply the baseline to a measured line count.
|
|
185
|
+
*
|
|
186
|
+
* FAIL OPEN, NEVER SILENT — the three not-applied branches all return the
|
|
187
|
+
* UNSUBTRACTED count, so every failure mode of this mechanism degrades to
|
|
188
|
+
* exactly the behaviour that shipped before it. The alternative, returning zero
|
|
189
|
+
* or refusing to fire, would let a missing state file silence a genuine review
|
|
190
|
+
* obligation, and a safety advisory must not be disarmed by its own
|
|
191
|
+
* instrumentation failing.
|
|
192
|
+
*
|
|
193
|
+
* `head-moved` is the branch worth naming, and worth naming honestly: it is
|
|
194
|
+
* TERMINAL for the session. A session that committed mid-run moved HEAD, so
|
|
195
|
+
* `git diff HEAD` now measures against a different base than the baseline did
|
|
196
|
+
* and the subtraction is arithmetic over two different quantities. It is caught
|
|
197
|
+
* rather than absorbed, because absorbing it would UNDER-report on exactly the
|
|
198
|
+
* sessions that did the most work — but the baseline is written once per
|
|
199
|
+
* session and never refreshed, so from the first commit onward that session is
|
|
200
|
+
* charged for the whole pre-existing dirty tree again. The mechanism's useful
|
|
201
|
+
* life is "until this session's first commit", which is stated here rather than
|
|
202
|
+
* discovered later. Re-baselining after a commit is the obvious repair and is
|
|
203
|
+
* NOT taken here: a second write has to distinguish "HEAD moved because we
|
|
204
|
+
* committed our own work" from "a peer session committed underneath us", and
|
|
205
|
+
* nothing in a stop payload answers that.
|
|
206
|
+
*
|
|
207
|
+
* `mixed-measure` is the same defect on the third axis, and it covers the
|
|
208
|
+
* SYMMETRIC case too. Past `UNTRACKED_FILE_CAP` the measurement is a synthetic
|
|
209
|
+
* `THRESHOLD + 1 + tracked` chosen to be over the bar rather than to be true, so
|
|
210
|
+
* subtracting it from — or out of — an exact count is meaningless in both
|
|
211
|
+
* directions; and subtracting one capped reading from another cancels the
|
|
212
|
+
* constant, which is worse than meaningless because it silences the nudge. The
|
|
213
|
+
* name is kept over a more literal `not-both-exact` because the fallback's
|
|
214
|
+
* subject is the measure, and a telemetry enum is read far more often than it is
|
|
215
|
+
* renamed.
|
|
216
|
+
*
|
|
217
|
+
* The clamp at zero is not cosmetic either: a session that reverts part of a
|
|
218
|
+
* pre-existing dirty tree measures below its own baseline, and a negative
|
|
219
|
+
* comparison against the threshold would read as "no mutation" for a session
|
|
220
|
+
* that deleted a thousand lines.
|
|
221
|
+
*/
|
|
222
|
+
export function applyBaseline(
|
|
223
|
+
measuredLines: number,
|
|
224
|
+
baseline: ReviewBaseline | 'absent' | 'unreadable',
|
|
225
|
+
headSha: () => string | null,
|
|
226
|
+
measuredMeasure: BaselineMeasure = 'exact',
|
|
227
|
+
): BaselineOutcome {
|
|
228
|
+
if (baseline === 'absent' || baseline === 'unreadable') {
|
|
229
|
+
return { applied: false, fallback: baseline, lines: measuredLines };
|
|
230
|
+
}
|
|
231
|
+
// The measure check runs BEFORE the HEAD check because it needs no subprocess.
|
|
232
|
+
// `headSha` is a thunk for the same reason: on the two fallback branches above
|
|
233
|
+
// — the steady state on every host without the nudge, and on every session
|
|
234
|
+
// before its first baseline write — the value is discarded, and evaluating it
|
|
235
|
+
// eagerly spent an 11-14 ms `git rev-parse` on each of those stops.
|
|
236
|
+
// Refused when the two measures DISAGREE, and equally when both are capped.
|
|
237
|
+
// The symmetric case is the dangerous one and the first version missed it:
|
|
238
|
+
// the capped path returns `THRESHOLD + 1 + tracked`, so two capped readings
|
|
239
|
+
// cancel their synthetic constant and an untracked-only session that started
|
|
240
|
+
// past the cap subtracts to ZERO — silencing the nudge, which is the one
|
|
241
|
+
// direction this module's own header forbids. Only `exact` minus `exact` is
|
|
242
|
+
// arithmetic over two counts of the same thing.
|
|
243
|
+
if (baseline.measure !== 'exact' || measuredMeasure !== 'exact') {
|
|
244
|
+
return { applied: false, fallback: 'mixed-measure', lines: measuredLines };
|
|
245
|
+
}
|
|
246
|
+
if (baseline.head_sha !== headSha()) {
|
|
247
|
+
return { applied: false, fallback: 'head-moved', lines: measuredLines };
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
applied: true,
|
|
251
|
+
baseline,
|
|
252
|
+
lines: Math.max(0, measuredLines - baseline.baseline_lines),
|
|
253
|
+
};
|
|
254
|
+
}
|
|
@@ -34,6 +34,49 @@
|
|
|
34
34
|
*/
|
|
35
35
|
export type MutationMeasure = 'exact' | 'capped_approximation';
|
|
36
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Whether `diff_lines` had this session's start-of-session baseline subtracted,
|
|
39
|
+
* and when it did not, WHY.
|
|
40
|
+
*
|
|
41
|
+
* A closed enum, never free text, so the privacy floor below still holds by
|
|
42
|
+
* construction. It exists because the subtraction's failure modes all fall back
|
|
43
|
+
* to the unsubtracted count — which is the safe direction and also an invisible
|
|
44
|
+
* one: without this field, a line reading 1,771 cannot be told apart from a
|
|
45
|
+
* session that really did mutate 1,771 lines.
|
|
46
|
+
*
|
|
47
|
+
* WHAT IT MEASURES, and the half it cannot. This line is written only when the
|
|
48
|
+
* nudge FIRES, so the distribution here is the fallback rate among firing
|
|
49
|
+
* sessions. The sessions the subtraction silenced — the mechanism working —
|
|
50
|
+
* produce no line at all, so the silence rate is NOT observable from this
|
|
51
|
+
* stream and no clause here should be read as claiming it is. Recording a row
|
|
52
|
+
* for a nudge that did not fire would put a `review_skipped` event in the audit
|
|
53
|
+
* log for a session where no review was skipped, which is a worse defect than
|
|
54
|
+
* the blind spot; measuring it properly needs a counter of its own, and that is
|
|
55
|
+
* a decision rather than an oversight.
|
|
56
|
+
*
|
|
57
|
+
* `absent` is the expected steady state on a host with no `session_start` slot
|
|
58
|
+
* and on every session that predates the baseline concern; `unreadable` is a
|
|
59
|
+
* corrupt write and a rate above noise is a defect in the mechanism itself;
|
|
60
|
+
* `head_moved` is a session that committed mid-run, which moves `git diff
|
|
61
|
+
* HEAD`'s base and makes the subtraction arithmetic over two different
|
|
62
|
+
* quantities; `mixed_measure` is the same failure on the capped-approximation
|
|
63
|
+
* axis, where one side is a synthetic over-threshold number rather than a count.
|
|
64
|
+
*/
|
|
65
|
+
export type BaselineApplication =
|
|
66
|
+
| 'applied'
|
|
67
|
+
| 'absent'
|
|
68
|
+
| 'unreadable'
|
|
69
|
+
| 'head_moved'
|
|
70
|
+
| 'mixed_measure';
|
|
71
|
+
|
|
72
|
+
const BASELINE_APPLICATIONS: readonly BaselineApplication[] = [
|
|
73
|
+
'applied',
|
|
74
|
+
'absent',
|
|
75
|
+
'unreadable',
|
|
76
|
+
'head_moved',
|
|
77
|
+
'mixed_measure',
|
|
78
|
+
];
|
|
79
|
+
|
|
37
80
|
import { appliedIds } from './audit_field_provenance.js';
|
|
38
81
|
import type { NoFreeForm } from './runtime_journal.js';
|
|
39
82
|
import { type PrivacyClass } from './privacy_class.js';
|
|
@@ -51,6 +94,13 @@ export interface ReviewSkippedInput {
|
|
|
51
94
|
diff_lines: number;
|
|
52
95
|
/** Whether `diff_lines` is exact or a capped approximation — see above. */
|
|
53
96
|
mutation_measure: MutationMeasure;
|
|
97
|
+
/**
|
|
98
|
+
* Whether the session baseline was subtracted from `diff_lines`, and if not
|
|
99
|
+
* why. OPTIONAL, and absence is honest rather than a default: a line written
|
|
100
|
+
* by a producer that predates the baseline mechanism recorded nothing about
|
|
101
|
+
* it, and writing `absent` for those would assert a measurement nobody made.
|
|
102
|
+
*/
|
|
103
|
+
baseline?: BaselineApplication | undefined;
|
|
54
104
|
/** ISO-8601 UTC timestamp; caller supplies (keeps this fn pure/deterministic). */
|
|
55
105
|
ts: string;
|
|
56
106
|
/** Stable id (ULID, UUID, or content hash); caller supplies. */
|
|
@@ -103,6 +153,9 @@ export function buildReviewSkippedLine(input: ReviewSkippedInput): BuiltReviewSk
|
|
|
103
153
|
}
|
|
104
154
|
if (!input.ts) errors.push('ts (ISO-8601 UTC) is required');
|
|
105
155
|
if (!input.id) errors.push('id (ULID, UUID, or content hash) is required');
|
|
156
|
+
if (input.baseline !== undefined && !BASELINE_APPLICATIONS.includes(input.baseline)) {
|
|
157
|
+
errors.push(`baseline must be one of ${BASELINE_APPLICATIONS.join(', ')}`);
|
|
158
|
+
}
|
|
106
159
|
|
|
107
160
|
if (errors.length) return { line: null, errors };
|
|
108
161
|
|
|
@@ -131,7 +184,14 @@ export function buildReviewSkippedLine(input: ReviewSkippedInput): BuiltReviewSk
|
|
|
131
184
|
persona: null,
|
|
132
185
|
input_kind: 'prompt',
|
|
133
186
|
type: 'note',
|
|
134
|
-
review_skipped: {
|
|
187
|
+
review_skipped: {
|
|
188
|
+
diff_lines: input.diff_lines,
|
|
189
|
+
mutation_measure: input.mutation_measure,
|
|
190
|
+
// Omitted, not defaulted, when the producer recorded nothing —
|
|
191
|
+
// audit-log-v1's absent-versus-present split is the same one
|
|
192
|
+
// `skills_applied` uses above, for the same reason.
|
|
193
|
+
...(input.baseline === undefined ? {} : { baseline: input.baseline }),
|
|
194
|
+
},
|
|
135
195
|
};
|
|
136
196
|
|
|
137
197
|
return { line, errors: [] };
|
|
@@ -149,18 +149,39 @@ export function path_weight(rel_path: string): number {
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
const PROJECTION_PREFIX = 'dist/agent-src/';
|
|
152
|
+
/**
|
|
153
|
+
* Lanes whose source does NOT live under `src/`. The projection folds several
|
|
154
|
+
* trees into one output directory, so the `src/` default below is right for
|
|
155
|
+
* most of it and wrong for these.
|
|
156
|
+
*/
|
|
157
|
+
const PROJECTION_SOURCE_LANES: ReadonlyArray<readonly [string, string]> = [
|
|
158
|
+
// The guidelines lane copies `docs/guidelines/` (`_lib/guidelines_lane.ts`),
|
|
159
|
+
// not `src/guidelines/`, which does not exist. Without this row a projected
|
|
160
|
+
// guideline gets a DIFFERENT identity from its own source, so a bound
|
|
161
|
+
// pragma written in the source cannot suppress the projection's copy of the
|
|
162
|
+
// very same line — measured on
|
|
163
|
+
// `untrusted-input-spotlighting.md`, a defense guideline that quotes
|
|
164
|
+
// role-takeover phrases to teach refusal and carries three accepted
|
|
165
|
+
// fingerprints for exactly that.
|
|
166
|
+
['guidelines/', 'docs/guidelines/'],
|
|
167
|
+
];
|
|
152
168
|
|
|
153
169
|
/**
|
|
154
170
|
* Fold a projected path back onto the source it was copied from.
|
|
155
171
|
*
|
|
156
|
-
* `dist/agent-src/` is a byte-for-byte copy of
|
|
172
|
+
* `dist/agent-src/` is a byte-for-byte copy of its sources with paths rewritten
|
|
157
173
|
* (ADR-201), so an artifact and its projection are the same artifact for the
|
|
158
174
|
* purpose of "which evidence did a human accept". Two identities would mean two
|
|
159
175
|
* fingerprints for one accepted line, and only one of them could be written
|
|
160
176
|
* into the pragma the projection copies verbatim.
|
|
161
177
|
*/
|
|
162
178
|
export function source_identity(rel: string): string {
|
|
163
|
-
|
|
179
|
+
if (!rel.startsWith(PROJECTION_PREFIX)) return rel;
|
|
180
|
+
const tail = rel.slice(PROJECTION_PREFIX.length);
|
|
181
|
+
for (const [lane, sourceRoot] of PROJECTION_SOURCE_LANES) {
|
|
182
|
+
if (tail.startsWith(lane)) return sourceRoot + tail.slice(lane.length);
|
|
183
|
+
}
|
|
184
|
+
return `src/${tail}`;
|
|
164
185
|
}
|
|
165
186
|
|
|
166
187
|
/** A file pre-split into lines with a fence/pragma mask the linters reuse. */
|
|
@@ -24,6 +24,27 @@
|
|
|
24
24
|
*
|
|
25
25
|
* Everything in this module is pure and clock-injected so the detectors can be
|
|
26
26
|
* unit-tested without a host, a transcript, or a network.
|
|
27
|
+
*
|
|
28
|
+
* loss_class: ephemeral-lossy
|
|
29
|
+
*
|
|
30
|
+
* `sanitizeEvidence` replaces home paths and e-mail addresses with placeholders
|
|
31
|
+
* and hard-cuts the span at `MAX_EVIDENCE`. It owes no recovery locator and
|
|
32
|
+
* must not have one: storing what was dropped for privacy would defeat the
|
|
33
|
+
* reason it was dropped, which is the same ruling the retired `hot_context_hook`
|
|
34
|
+
* carried. `egressBlockedReason` is the gate; this is a narrowing pass.
|
|
35
|
+
*
|
|
36
|
+
* THE GATE DOES NOT SEE THAT CAP, and the declaration is here anyway.
|
|
37
|
+
* `check_loss_class_declared`'s cap pattern requires a unit word followed by a
|
|
38
|
+
* size noun (`ROW_CAP`, `WORD_CHARS`), so `MAX_EVIDENCE` does not match it.
|
|
39
|
+
* What pulls this module into the corpus is `\bredact` firing on the
|
|
40
|
+
* `redact_low_impact_entry` identifier imported just below — for the EGRESS
|
|
41
|
+
* gate, which loses nothing. So the real lossy operation in this file is
|
|
42
|
+
* declared and unenforced, and the enforcement rests on an unrelated import:
|
|
43
|
+
* rename or drop that import and this module leaves the corpus while still
|
|
44
|
+
* cutting the span. Widening the pattern to any `MAX_<WORD>` was measured and
|
|
45
|
+
* refused (it admits seven constants that cut nothing — see that gate's
|
|
46
|
+
* docstring), so the mismatch is recorded rather than closed. Keep this
|
|
47
|
+
* declaration on its own merits, not because the gate is watching.
|
|
27
48
|
*/
|
|
28
49
|
import { createHash } from 'node:crypto';
|
|
29
50
|
|
|
@@ -34,6 +34,18 @@
|
|
|
34
34
|
* check's. Nor does it make the index trustworthy in the sense that a model may
|
|
35
35
|
* act on it: the block stays spotlighted as DATA, per `untrusted-input-defense`,
|
|
36
36
|
* and this module bounds only WHICH bytes reach that block.
|
|
37
|
+
*
|
|
38
|
+
* loss_class: recoverable-lossy
|
|
39
|
+
* loss_recovery: agents/memory/ — every row the P6 cap drops is a projection of
|
|
40
|
+
* a curated entry that stays on disk untouched and stays addressable by id
|
|
41
|
+
* through `agent-config memory:lookup` / `memory:get`.
|
|
42
|
+
*
|
|
43
|
+
* The cap bounds what the index ADVERTISES, never what the corpus holds, which
|
|
44
|
+
* is why this is not `ephemeral-lossy`: nothing is destroyed, and the drop is a
|
|
45
|
+
* cost bound rather than a privacy one. The retired `hot_context_hook` went the
|
|
46
|
+
* other way for exactly that reason — storing a recovery for a line dropped for
|
|
47
|
+
* privacy would have defeated the reason it was dropped. Nothing here is
|
|
48
|
+
* dropped for privacy.
|
|
37
49
|
*/
|
|
38
50
|
import * as fs from 'node:fs';
|
|
39
51
|
import * as path from 'node:path';
|
|
@@ -54,6 +66,35 @@ export const SESSION_INDEX_ROW_CAP = 30;
|
|
|
54
66
|
*/
|
|
55
67
|
export const MAX_ROOT_AGE_DAYS = 400;
|
|
56
68
|
|
|
69
|
+
/**
|
|
70
|
+
* P3's other direction — how far ahead of now a source mtime may sit.
|
|
71
|
+
*
|
|
72
|
+
* A STATED DEFAULT, on the same terms as `MAX_ROOT_AGE_DAYS` above, and written
|
|
73
|
+
* down because a 14.23.0 self-review finding named it as the one threshold in
|
|
74
|
+
* this module carrying no threat model while its neighbour carried one. That
|
|
75
|
+
* asymmetry was the real defect; the number was not.
|
|
76
|
+
*
|
|
77
|
+
* What the grace is FOR: ordinary clock disagreement. An NTP correction, a
|
|
78
|
+
* resumed VM snapshot, or a filesystem whose mtime comes from a host with a
|
|
79
|
+
* slightly different clock can date a file a few seconds ahead of this process
|
|
80
|
+
* without anything being wrong. Zero grace would refuse those, and a refusal
|
|
81
|
+
* there costs the session its memory index for a reason the operator cannot act
|
|
82
|
+
* on.
|
|
83
|
+
*
|
|
84
|
+
* What it is NOT for, stated because the finding read it as an attack window:
|
|
85
|
+
* it buys an attacker nothing. Writing a curated source requires write access
|
|
86
|
+
* INSIDE the workspace, and an attacker holding that can date the file at `now`
|
|
87
|
+
* and pass P3 outright — a future date is strictly worse for them. Freshness
|
|
88
|
+
* here bounds an ABANDONED root, not a hostile one; the module's own docblock
|
|
89
|
+
* says content authenticity is out of scope and that boundary is unchanged.
|
|
90
|
+
*
|
|
91
|
+
* The grace is only harmless while that reading holds. If this check is ever
|
|
92
|
+
* repurposed as a content-integrity control, or a measured population of
|
|
93
|
+
* legitimate skew exceeds the value, the number has to be derived rather than
|
|
94
|
+
* stated.
|
|
95
|
+
*/
|
|
96
|
+
export const MAX_FUTURE_SKEW_MS = 60_000;
|
|
97
|
+
|
|
57
98
|
/**
|
|
58
99
|
* Curated sources, matching the layouts `memory_lookup._iter_curated_entries`
|
|
59
100
|
* actually reads: `<root>/<type>.yml` AND `<root>/<type>/**\/*.yml`, plus the
|
|
@@ -255,7 +296,7 @@ export function verifyMemoryRoot(input: TrustInput): TrustVerdict {
|
|
|
255
296
|
|
|
256
297
|
// P3 — freshness, in the two directions it can fail.
|
|
257
298
|
const newestSourceMs = walk.newestMs;
|
|
258
|
-
if (newestSourceMs > now.getTime() +
|
|
299
|
+
if (newestSourceMs > now.getTime() + MAX_FUTURE_SKEW_MS) {
|
|
259
300
|
return refuse(
|
|
260
301
|
'source-mtime-in-future',
|
|
261
302
|
`newest curated source is dated in the future (${new Date(newestSourceMs).toISOString()}) — clock skew or tampering`,
|