@event4u/agent-config 14.23.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 +198 -0
- 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 +1 -1
- 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 +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 +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/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/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-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 +4 -4
- 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 +1 -1
- 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 +22 -75
- 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 +8607 -8930
- package/dist/install/install.mjs +35 -8
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1433 -1342
- 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/condense.js +2 -5
- package/dist/server/io/yamlIO.js +125 -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 +4 -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 +2 -3
- 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/_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_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/guidelines_lane.ts +164 -0
- package/src/scripts/_lib/obligation_frequency.ts +2 -3
- package/src/scripts/_lib/platform_anchor.ts +1053 -0
- package/src/scripts/_lib/ratification_artifact.ts +278 -0
- 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 +103 -37
- package/src/scripts/_lib/tolerance_shadow.ts +177 -0
- 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_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 +292 -4
- package/src/scripts/check_projected_rule_routes.ts +395 -0
- 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 +35 -27
- package/src/scripts/hooks/category_a.ts +1 -1
- package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
- 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/ui_route_nudge_hook.ts +52 -15
- package/src/scripts/hot_context_hook.ts +41 -401
- package/src/scripts/lint_evidence_artifacts.ts +1 -0
- package/src/scripts/lint_knowledge_scale.ts +0 -26
- package/src/scripts/memory_lookup.ts +9 -9
- 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 +270 -10
- package/src/server/io/yamlIO.ts +127 -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,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ratification artifact — ADR-268 § 4's control, in one reader.
|
|
3
|
+
*
|
|
4
|
+
* ADR-268 § 4 permits an agent to edit kernel rules, governance hooks and
|
|
5
|
+
* authority schemas inside an authorised mission, and forbids it to ratify its
|
|
6
|
+
* own increase in power:
|
|
7
|
+
*
|
|
8
|
+
* ```
|
|
9
|
+
* AN AGENT MAY MODIFY ITS CONSTITUTION. IT MAY NOT RATIFY ITS OWN INCREASE IN POWER.
|
|
10
|
+
* THE PARTY GAINING THE AUTHORITY IS NEVER THE PARTY RECORDING THE RATIFICATION.
|
|
11
|
+
* PROVIDER DIVERSITY IS REQUIRED WHERE TWO PROVIDERS ARE CONFIGURED.
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* That sentence is the whole reason this module exists as a pure reader with
|
|
15
|
+
* no filesystem and no network: the gate that reds a PR
|
|
16
|
+
* (`check_kernel_edit_ratified`) and the tests that prove it reds must decide
|
|
17
|
+
* from the same code, or the fixture proves a second implementation rather
|
|
18
|
+
* than the shipped one.
|
|
19
|
+
*
|
|
20
|
+
* Why `reviewed_by` is checked against BOTH producer fields.
|
|
21
|
+
* `road-to-typed-grants-that-persist` Phase 5.1 names one fixture — an
|
|
22
|
+
* artifact whose `proposed_by` equals its `reviewed_by` is rejected. The Iron
|
|
23
|
+
* Law above is broader than that fixture: the party gaining the authority is
|
|
24
|
+
* the party that proposed the expansion AND the party that implemented it, and
|
|
25
|
+
* an artifact reviewed by its own implementer is the same defect wearing the
|
|
26
|
+
* other field's name. Both are rejected, and this paragraph is why the code is
|
|
27
|
+
* wider than the step that asked for it.
|
|
28
|
+
*
|
|
29
|
+
* What this module does NOT decide: whether a diff is authority-EXPANDING.
|
|
30
|
+
* That is a judgement over rule prose, not a property of the artifact, and
|
|
31
|
+
* ADR-268 § 4 makes the artifact required for the expanding case only.
|
|
32
|
+
* `check_kernel_edit_ratified` requires the artifact for every kernel-rule
|
|
33
|
+
* diff instead — a strictly stronger and decidable rule — and says so in its
|
|
34
|
+
* own header rather than pretending to classify.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import { readAdrFrontmatter, type AdrFrontmatter } from './adr_frontmatter.js';
|
|
38
|
+
|
|
39
|
+
/** Where a ratification artifact lives. One directory, so the gate can find it. */
|
|
40
|
+
export const RATIFICATION_DIR = 'agents/evidence/ratifications';
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The verdict vocabulary — closed, because an open one is a free-text field
|
|
44
|
+
* that always reads as approval to a grep.
|
|
45
|
+
*/
|
|
46
|
+
export const RATIFICATION_VERDICTS = [
|
|
47
|
+
'ratified',
|
|
48
|
+
'confirmed-non-expanding',
|
|
49
|
+
'refused',
|
|
50
|
+
'non-convergent',
|
|
51
|
+
] as const;
|
|
52
|
+
export type RatificationVerdict = (typeof RATIFICATION_VERDICTS)[number];
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The two verdicts that let a diff land.
|
|
56
|
+
*
|
|
57
|
+
* `confirmed-non-expanding` exists because the gate demands an artifact for
|
|
58
|
+
* EVERY kernel and governance-hook diff, including a typo fix. Calling that a
|
|
59
|
+
* ratification of an authority expansion would be false, and a vocabulary that
|
|
60
|
+
* forces a false label is a vocabulary people route around. Adopted from the
|
|
61
|
+
* round-1 review, which named the pressure this relieves.
|
|
62
|
+
*/
|
|
63
|
+
export const PASSING_VERDICTS: ReadonlySet<string> = new Set([
|
|
64
|
+
'ratified',
|
|
65
|
+
'confirmed-non-expanding',
|
|
66
|
+
]);
|
|
67
|
+
|
|
68
|
+
/** The six fields Phase 5.1 names, all required. */
|
|
69
|
+
export const RATIFICATION_FIELDS = [
|
|
70
|
+
'proposed_by',
|
|
71
|
+
'implemented_by',
|
|
72
|
+
'reviewed_by',
|
|
73
|
+
'providers',
|
|
74
|
+
'verdict',
|
|
75
|
+
'effective_after',
|
|
76
|
+
] as const;
|
|
77
|
+
|
|
78
|
+
export interface RatificationArtifact {
|
|
79
|
+
proposed_by: string;
|
|
80
|
+
implemented_by: string;
|
|
81
|
+
reviewed_by: string;
|
|
82
|
+
/** Provider ids consulted, in source order. Diversity is counted over this. */
|
|
83
|
+
providers: string[];
|
|
84
|
+
verdict: RatificationVerdict;
|
|
85
|
+
/** `merge`, or an ISO-8601 instant. Never a bare "later". */
|
|
86
|
+
effective_after: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface RatificationProblem {
|
|
90
|
+
/** Stable code, so a test asserts the reason rather than the wording. */
|
|
91
|
+
code:
|
|
92
|
+
| 'no-frontmatter'
|
|
93
|
+
| 'missing-field'
|
|
94
|
+
| 'unknown-verdict'
|
|
95
|
+
| 'self-ratified'
|
|
96
|
+
| 'no-providers'
|
|
97
|
+
| 'diversity-required'
|
|
98
|
+
| 'diversity-unverifiable'
|
|
99
|
+
| 'bad-effective-after';
|
|
100
|
+
message: string;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export interface RatificationReading {
|
|
104
|
+
artifact: RatificationArtifact | null;
|
|
105
|
+
problems: RatificationProblem[];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** `merge`, or an ISO-8601 instant with a timezone. */
|
|
109
|
+
const EFFECTIVE_AFTER_RE =
|
|
110
|
+
/^(merge|\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2}))$/;
|
|
111
|
+
|
|
112
|
+
function scalarOf(fm: AdrFrontmatter, key: string): string | null {
|
|
113
|
+
const raw = fm.scalars[key];
|
|
114
|
+
if (typeof raw !== 'string') {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const trimmed = raw.trim();
|
|
118
|
+
return trimmed === '' ? null : trimmed;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Read `providers` in either shape the frontmatter parser can produce — a YAML
|
|
123
|
+
* list (nested) or an inline `[a, b]` scalar. Accepting both is not laxity:
|
|
124
|
+
* the ADR frontmatter corpus already carries both shapes for `basis`, and a
|
|
125
|
+
* reader that took only one would reject a correctly-authored artifact.
|
|
126
|
+
*/
|
|
127
|
+
export function readProviders(fm: AdrFrontmatter): string[] {
|
|
128
|
+
const nested = fm.nested['providers'];
|
|
129
|
+
if (Array.isArray(nested)) {
|
|
130
|
+
return nested.map((p) => String(p).trim()).filter((p) => p !== '');
|
|
131
|
+
}
|
|
132
|
+
const scalar = scalarOf(fm, 'providers');
|
|
133
|
+
if (scalar === null) {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
return scalar
|
|
137
|
+
.replace(/^\[|\]$/g, '')
|
|
138
|
+
.split(',')
|
|
139
|
+
.map((p) => p.trim().replace(/^["']|["']$/g, ''))
|
|
140
|
+
.filter((p) => p !== '');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Validate one artifact's text.
|
|
145
|
+
*
|
|
146
|
+
* `configuredProviders` is the count `agent-config council:status` reports.
|
|
147
|
+
* Pass `null` when it could not be established — the diversity rule then does
|
|
148
|
+
* not fire, and the caller says so, because an unmeasured count is not
|
|
149
|
+
* evidence that diversity was unavailable.
|
|
150
|
+
*/
|
|
151
|
+
export function readRatification(
|
|
152
|
+
text: string,
|
|
153
|
+
configuredProviders: number | null,
|
|
154
|
+
): RatificationReading {
|
|
155
|
+
const problems: RatificationProblem[] = [];
|
|
156
|
+
const fm = readAdrFrontmatter(text);
|
|
157
|
+
if (fm === null) {
|
|
158
|
+
return {
|
|
159
|
+
artifact: null,
|
|
160
|
+
problems: [{ code: 'no-frontmatter', message: 'no YAML frontmatter block' }],
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const providers = readProviders(fm);
|
|
165
|
+
const values: Record<string, string | null> = {};
|
|
166
|
+
for (const field of RATIFICATION_FIELDS) {
|
|
167
|
+
if (field === 'providers') {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
values[field] = scalarOf(fm, field);
|
|
171
|
+
if (values[field] === null) {
|
|
172
|
+
problems.push({ code: 'missing-field', message: `missing or empty \`${field}:\`` });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (providers.length === 0) {
|
|
176
|
+
problems.push({ code: 'no-providers', message: 'missing or empty `providers:`' });
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const verdict = values['verdict'] ?? null;
|
|
180
|
+
if (verdict !== null && !(RATIFICATION_VERDICTS as readonly string[]).includes(verdict)) {
|
|
181
|
+
problems.push({
|
|
182
|
+
code: 'unknown-verdict',
|
|
183
|
+
message: `verdict \`${verdict}\` is not one of ${RATIFICATION_VERDICTS.join(', ')}`,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const effective = values['effective_after'] ?? null;
|
|
188
|
+
if (effective !== null && !EFFECTIVE_AFTER_RE.test(effective)) {
|
|
189
|
+
problems.push({
|
|
190
|
+
code: 'bad-effective-after',
|
|
191
|
+
message: `effective_after \`${effective}\` is neither \`merge\` nor an ISO-8601 instant`,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// The Iron Law. Checked against both producer fields — see the header.
|
|
196
|
+
const reviewer = values['reviewed_by'];
|
|
197
|
+
if (reviewer !== null) {
|
|
198
|
+
for (const producerField of ['proposed_by', 'implemented_by'] as const) {
|
|
199
|
+
const producer = values[producerField];
|
|
200
|
+
if (producer !== null && producer === reviewer) {
|
|
201
|
+
problems.push({
|
|
202
|
+
code: 'self-ratified',
|
|
203
|
+
message:
|
|
204
|
+
`\`${producerField}\` equals \`reviewed_by\` (${reviewer}) — ` +
|
|
205
|
+
'the party gaining the authority may not record the ratification (ADR-268 section 4)',
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Diversity, against the REQUIRED count.
|
|
212
|
+
//
|
|
213
|
+
// Round 1 refused the previous shape: the count came from the user-global
|
|
214
|
+
// council config, which is absent on a CI runner, so the rule silently did
|
|
215
|
+
// not fire there. `null` now means the required count could not be
|
|
216
|
+
// established, and that is a REFUSAL rather than a skip — a control that
|
|
217
|
+
// passes when it cannot measure is advisory.
|
|
218
|
+
if (configuredProviders === null) {
|
|
219
|
+
problems.push({
|
|
220
|
+
code: 'diversity-unverifiable',
|
|
221
|
+
message:
|
|
222
|
+
'the required provider count could not be read, so diversity is unverifiable — ' +
|
|
223
|
+
'a control that cannot measure fails closed (src/config/ratification-policy.json)',
|
|
224
|
+
});
|
|
225
|
+
} else if (configuredProviders >= 2) {
|
|
226
|
+
const distinct = new Set(providers);
|
|
227
|
+
if (distinct.size < configuredProviders) {
|
|
228
|
+
problems.push({
|
|
229
|
+
code: 'diversity-required',
|
|
230
|
+
message:
|
|
231
|
+
`${configuredProviders} distinct providers are required; ` +
|
|
232
|
+
`the artifact names ${distinct.size} (${providers.join(', ') || 'none'})`,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (problems.length > 0) {
|
|
238
|
+
return { artifact: null, problems };
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return {
|
|
242
|
+
artifact: {
|
|
243
|
+
proposed_by: values['proposed_by'] as string,
|
|
244
|
+
implemented_by: values['implemented_by'] as string,
|
|
245
|
+
reviewed_by: reviewer as string,
|
|
246
|
+
providers,
|
|
247
|
+
verdict: verdict as RatificationVerdict,
|
|
248
|
+
effective_after: effective as string,
|
|
249
|
+
},
|
|
250
|
+
problems: [],
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** True when the artifact parses and carries a verdict that lets the diff land. */
|
|
255
|
+
export function isRatified(reading: RatificationReading): boolean {
|
|
256
|
+
return reading.artifact !== null && PASSING_VERDICTS.has(reading.artifact.verdict);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* The required distinct-provider count, from the repository's own policy file.
|
|
261
|
+
*
|
|
262
|
+
* Returns `null` when the file is missing or unparseable, and the caller turns
|
|
263
|
+
* that into a refusal — never a skip. Reading the policy from the repository
|
|
264
|
+
* rather than from the user-global council config is the round-1 fix: a runner
|
|
265
|
+
* has the repository and does not have the operator's home directory.
|
|
266
|
+
*/
|
|
267
|
+
export function readRequiredProviders(policyText: string | null): number | null {
|
|
268
|
+
if (policyText === null) {
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
const parsed = JSON.parse(policyText) as { required_providers?: unknown };
|
|
273
|
+
const n = parsed.required_providers;
|
|
274
|
+
return typeof n === 'number' && Number.isInteger(n) && n >= 1 ? n : null;
|
|
275
|
+
} catch {
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
@@ -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`,
|
|
@@ -57,6 +57,17 @@ export interface BoundsRatchetVerdict {
|
|
|
57
57
|
baseRef: string | null;
|
|
58
58
|
/** Why the comparison was skipped, when it was. Printed, never silent. */
|
|
59
59
|
note: string | null;
|
|
60
|
+
/**
|
|
61
|
+
* `false` means the bound could not be READ, not that it rose.
|
|
62
|
+
*
|
|
63
|
+
* Two refusals reach a caller with `ok: false` and they need opposite
|
|
64
|
+
* actions: a risen ceiling is fixed by lowering the addition, an
|
|
65
|
+
* unverifiable one by repairing the checkout. A completion review caught
|
|
66
|
+
* both being rendered as "ROSE", which would send an operator to shrink a
|
|
67
|
+
* rule over what was a fetch problem. Absent means verified — the only
|
|
68
|
+
* `ok: false` that predates this field is a genuine rise.
|
|
69
|
+
*/
|
|
70
|
+
verified: boolean;
|
|
60
71
|
}
|
|
61
72
|
|
|
62
73
|
function showAtRef(git: GitRunner, repoRoot: string, ref: string, relPath: string): string | null {
|
|
@@ -64,22 +75,84 @@ function showAtRef(git: GitRunner, repoRoot: string, ref: string, relPath: strin
|
|
|
64
75
|
return r.ok ? r.stdout : null;
|
|
65
76
|
}
|
|
66
77
|
|
|
78
|
+
/**
|
|
79
|
+
* A condition that stops the comparison: skip when advisory, refuse when not.
|
|
80
|
+
*
|
|
81
|
+
* One helper for all four causes rather than four inline branches, so the
|
|
82
|
+
* posture cannot drift between them — the failure this closes was four
|
|
83
|
+
* independent `ok: true` returns that all had to be found before any of them
|
|
84
|
+
* could be trusted.
|
|
85
|
+
*/
|
|
86
|
+
function unverified(
|
|
87
|
+
reason: string,
|
|
88
|
+
requireBase: boolean,
|
|
89
|
+
baseGraceCeiling: number | null,
|
|
90
|
+
baseRef: string | null,
|
|
91
|
+
): BoundsRatchetVerdict {
|
|
92
|
+
if (requireBase) {
|
|
93
|
+
return {
|
|
94
|
+
ok: false,
|
|
95
|
+
verified: false,
|
|
96
|
+
baseGraceCeiling,
|
|
97
|
+
baseRef,
|
|
98
|
+
note: `${reason}, so the shrink-only bound was NOT verified in this run`,
|
|
99
|
+
violations: [
|
|
100
|
+
`the shrink-only bound could not be verified: ${reason}. This run is `
|
|
101
|
+
+ 'ENFORCING, so an unverifiable bound refuses rather than skips — an '
|
|
102
|
+
+ 'unreadable base would otherwise grant budget on an infrastructure '
|
|
103
|
+
+ 'failure. This is NOT a ceiling rise: fix the checkout (a full fetch '
|
|
104
|
+
+ 'of the base ref) rather than lowering the addition.',
|
|
105
|
+
],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
ok: true,
|
|
110
|
+
verified: false,
|
|
111
|
+
violations: [],
|
|
112
|
+
baseGraceCeiling,
|
|
113
|
+
baseRef,
|
|
114
|
+
note: `${reason}, so the shrink-only bound was NOT verified in this run`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
67
118
|
/**
|
|
68
119
|
* Compare the grace ceiling in this tree against the one at the base ref.
|
|
69
120
|
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* the
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
121
|
+
* TWO POSTURES, AND WHICH ONE APPLIES IS THE CALLER'S TO DECLARE.
|
|
122
|
+
*
|
|
123
|
+
* Advisory (the default, and what every caller got before `requireBase`): a
|
|
124
|
+
* base ref or base config that cannot be read SKIPS, reported in both the human
|
|
125
|
+
* and JSON output so it cannot pass for a check. That default is not laziness
|
|
126
|
+
* and the original reasoning still holds — a shallow clone, a first commit and
|
|
127
|
+
* a detached build all legitimately have no base, and a gate that reds on them
|
|
128
|
+
* gets switched off, which is how a repository loses the enforcement it just
|
|
129
|
+
* built.
|
|
130
|
+
*
|
|
131
|
+
* Enforcing (`requireBase: true`): the same conditions REFUSE. An AI council
|
|
132
|
+
* (2/2, 2026-09-10) made this blocking for the move to a base-measured ceiling,
|
|
133
|
+
* and the reason is that the asymmetry above inverts once the base ref stops
|
|
134
|
+
* being a cross-check and becomes the ceiling itself. Today an unreadable base
|
|
135
|
+
* costs a comparison; there it would grant an unbounded budget on an
|
|
136
|
+
* infrastructure failure — the exact fail-open the reserve decision refused.
|
|
137
|
+
* anthropic's wording was "replaced or mode-gated"; this is the mode gate, so
|
|
138
|
+
* that no existing caller silently changes behaviour.
|
|
139
|
+
*
|
|
140
|
+
* The flag is the caller's rather than derived from `GITHUB_ACTIONS` here: this
|
|
141
|
+
* module cannot tell an enforcing CI run from a diagnostic one on the same
|
|
142
|
+
* runner, and a gate that guesses its own strictness from an environment
|
|
143
|
+
* variable is one `env` change away from being advisory everywhere.
|
|
78
144
|
*/
|
|
79
145
|
export function assertBoundsDidNotRise(opts: {
|
|
80
146
|
repoRoot: string;
|
|
81
147
|
baseRef: string | null;
|
|
82
148
|
git?: GitRunner;
|
|
149
|
+
/**
|
|
150
|
+
* Refuse instead of skipping when the base cannot be read.
|
|
151
|
+
*
|
|
152
|
+
* Absent is advisory, which keeps every pre-existing caller on the
|
|
153
|
+
* behaviour it was written against. The CI path sets it.
|
|
154
|
+
*/
|
|
155
|
+
requireBase?: boolean;
|
|
83
156
|
/**
|
|
84
157
|
* The ceiling this run actually compares the payload against.
|
|
85
158
|
*
|
|
@@ -91,24 +164,18 @@ export function assertBoundsDidNotRise(opts: {
|
|
|
91
164
|
headGraceCeiling: number;
|
|
92
165
|
}): BoundsRatchetVerdict {
|
|
93
166
|
const git = opts.git ?? realGit;
|
|
167
|
+
const requireBase = opts.requireBase === true;
|
|
94
168
|
if (opts.baseRef === null || opts.baseRef.trim() === '') {
|
|
95
|
-
return
|
|
96
|
-
ok: true,
|
|
97
|
-
violations: [],
|
|
98
|
-
baseGraceCeiling: null,
|
|
99
|
-
baseRef: null,
|
|
100
|
-
note: 'no base ref resolved, so the shrink-only bound was NOT verified in this run',
|
|
101
|
-
};
|
|
169
|
+
return unverified('no base ref resolved', requireBase, null, null);
|
|
102
170
|
}
|
|
103
171
|
const cfg = showAtRef(git, opts.repoRoot, opts.baseRef, BUDGET_CONFIG_PATH);
|
|
104
172
|
if (cfg === null) {
|
|
105
|
-
return
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
};
|
|
173
|
+
return unverified(
|
|
174
|
+
`${BUDGET_CONFIG_PATH} could not be read at ${opts.baseRef}`,
|
|
175
|
+
requireBase,
|
|
176
|
+
null,
|
|
177
|
+
opts.baseRef,
|
|
178
|
+
);
|
|
112
179
|
}
|
|
113
180
|
let baseGrace: number | null = null;
|
|
114
181
|
try {
|
|
@@ -117,26 +184,25 @@ export function assertBoundsDidNotRise(opts: {
|
|
|
117
184
|
const n = Number(delivery['grace_ceiling']);
|
|
118
185
|
baseGrace = Number.isFinite(n) ? n : null;
|
|
119
186
|
} catch {
|
|
120
|
-
return
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
};
|
|
187
|
+
return unverified(
|
|
188
|
+
`${BUDGET_CONFIG_PATH} at ${opts.baseRef} is not parseable`,
|
|
189
|
+
requireBase,
|
|
190
|
+
null,
|
|
191
|
+
opts.baseRef,
|
|
192
|
+
);
|
|
127
193
|
}
|
|
128
194
|
if (baseGrace === null) {
|
|
129
|
-
return
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
};
|
|
195
|
+
return unverified(
|
|
196
|
+
`there is no ci_delivery.grace_ceiling at ${opts.baseRef} to ratchet against`,
|
|
197
|
+
requireBase,
|
|
198
|
+
null,
|
|
199
|
+
opts.baseRef,
|
|
200
|
+
);
|
|
136
201
|
}
|
|
137
202
|
if (opts.headGraceCeiling > baseGrace) {
|
|
138
203
|
return {
|
|
139
204
|
ok: false,
|
|
205
|
+
verified: true,
|
|
140
206
|
baseGraceCeiling: baseGrace,
|
|
141
207
|
baseRef: opts.baseRef,
|
|
142
208
|
note: null,
|
|
@@ -150,5 +216,5 @@ export function assertBoundsDidNotRise(opts: {
|
|
|
150
216
|
],
|
|
151
217
|
};
|
|
152
218
|
}
|
|
153
|
-
return { ok: true, violations: [], baseGraceCeiling: baseGrace, baseRef: opts.baseRef, note: null };
|
|
219
|
+
return { ok: true, verified: true, violations: [], baseGraceCeiling: baseGrace, baseRef: opts.baseRef, note: null };
|
|
154
220
|
}
|