@event4u/agent-config 14.22.0 → 15.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +333 -356
- package/README.md +1 -1
- package/dist/agent-src/commands/agent-handoff.md +8 -7
- package/dist/agent-src/commands/agents/init.md +1 -1
- package/dist/agent-src/commands/agents/user/accept.md +4 -4
- package/dist/agent-src/commands/agents/user/delete.md +2 -2
- package/dist/agent-src/commands/agents/user/init.md +3 -3
- package/dist/agent-src/commands/agents/user/review.md +3 -3
- package/dist/agent-src/commands/agents/user/show.md +3 -3
- package/dist/agent-src/commands/agents/user/update.md +2 -2
- package/dist/agent-src/commands/agents/user.md +6 -6
- package/dist/agent-src/commands/analytics/prune.md +1 -1
- package/dist/agent-src/commands/analytics/show.md +2 -2
- package/dist/agent-src/commands/analyze/decision.md +2 -2
- package/dist/agent-src/commands/analyze/inbox.md +5 -5
- package/dist/agent-src/commands/analyze/incident.md +3 -3
- package/dist/agent-src/commands/analyze/near-miss.md +3 -3
- package/dist/agent-src/commands/analyze/postmortem.md +4 -4
- package/dist/agent-src/commands/analyze/premortem.md +2 -2
- package/dist/agent-src/commands/analyze.md +2 -2
- package/dist/agent-src/commands/bug/fix.md +1 -1
- package/dist/agent-src/commands/bug/investigate.md +2 -2
- package/dist/agent-src/commands/cost/profile.md +3 -3
- package/dist/agent-src/commands/design.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +1 -1
- package/dist/agent-src/commands/feature/plan.md +2 -2
- package/dist/agent-src/commands/feature/roadmap.md +2 -2
- package/dist/agent-src/commands/ghostwriter/fetch.md +4 -4
- package/dist/agent-src/commands/ghostwriter/list.md +1 -1
- package/dist/agent-src/commands/ghostwriter/show.md +1 -1
- package/dist/agent-src/commands/ghostwriter/write.md +9 -9
- package/dist/agent-src/commands/humanize.md +6 -6
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/judge/solo.md +1 -1
- package/dist/agent-src/commands/judge.md +1 -1
- package/dist/agent-src/commands/knowledge/cross-repo.md +1 -1
- package/dist/agent-src/commands/knowledge/forget.md +1 -1
- package/dist/agent-src/commands/knowledge/ingest.md +2 -2
- package/dist/agent-src/commands/knowledge/list.md +1 -1
- package/dist/agent-src/commands/memory/add.md +3 -3
- package/dist/agent-src/commands/memory/load.md +4 -4
- package/dist/agent-src/commands/memory/mine-session.md +1 -1
- package/dist/agent-src/commands/memory/promote.md +4 -4
- package/dist/agent-src/commands/memory/propose.md +2 -2
- package/dist/agent-src/commands/mode.md +5 -5
- package/dist/agent-src/commands/post-as/ghostwriter.md +3 -3
- package/dist/agent-src/commands/post-as/me.md +7 -7
- package/dist/agent-src/commands/pr/create.md +1 -1
- package/dist/agent-src/commands/pr/merge.md +48 -39
- package/dist/agent-src/commands/profile/activate.md +1 -1
- package/dist/agent-src/commands/profile/show.md +1 -1
- package/dist/agent-src/commands/research/deep.md +2 -2
- package/dist/agent-src/commands/research/report.md +2 -2
- package/dist/agent-src/commands/review/changes.md +1 -1
- package/dist/agent-src/commands/review/routing.md +1 -1
- package/dist/agent-src/commands/roadmap/create.md +1 -1
- package/dist/agent-src/commands/roadmap/materialize.md +2 -2
- package/dist/agent-src/commands/roadmap/next.md +9 -1
- package/dist/agent-src/commands/roadmap/process-full.md +2 -2
- package/dist/agent-src/commands/security-audit-config.md +3 -3
- package/dist/agent-src/commands/skill/preview.md +1 -1
- package/dist/agent-src/commands/skills/discover.md +1 -1
- package/dist/agent-src/commands/sync/agent-settings.md +2 -2
- package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
- package/dist/agent-src/commands/tests/create.md +1 -1
- package/dist/agent-src/commands/tests/e2e-heal.md +1 -1
- package/dist/agent-src/commands/tests/e2e-plan.md +1 -1
- package/dist/agent-src/contexts/authority/kernel-rule-edits.md +6 -6
- package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -2
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +88 -1
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +1 -1
- package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +13 -1
- package/dist/agent-src/contexts/execution/cheap-question-mechanics.md +1 -1
- package/dist/agent-src/contexts/execution/contract-decision-sheet.md +3 -3
- package/dist/agent-src/contexts/execution/mandated-lines.md +1 -1
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +1 -1
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -1
- package/dist/agent-src/contexts/execution/plan-confidence-gate.md +5 -5
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -1
- package/dist/agent-src/contexts/execution/subagent-modes-detail.md +1 -1
- package/dist/agent-src/contexts/execution/subagent-routing.md +2 -2
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +1 -1
- package/dist/agent-src/contexts/execution/user-memory-channels.md +3 -3
- package/dist/agent-src/contexts/execution/verification-mechanics.md +1 -1
- package/dist/agent-src/contexts/judges/persona-voice-rubric.md +2 -2
- package/dist/agent-src/guidelines/abstraction-thresholds.md +88 -0
- package/dist/agent-src/guidelines/agent-infra/5w2h-analysis.md +260 -0
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +99 -0
- package/dist/agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +325 -0
- package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +177 -0
- package/dist/agent-src/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +222 -0
- package/dist/agent-src/guidelines/agent-infra/ask-when-uncertain-demos.md +134 -0
- package/dist/agent-src/guidelines/agent-infra/asking-and-brevity-examples.md +198 -0
- package/dist/agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
- package/dist/agent-src/guidelines/agent-infra/carve-out-predicates.md +17 -0
- package/dist/agent-src/guidelines/agent-infra/comparison-matrix.md +179 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +165 -0
- package/dist/agent-src/guidelines/agent-infra/corpus-grounding-authoring.md +91 -0
- package/dist/agent-src/guidelines/agent-infra/critical-thinking.md +156 -0
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +109 -0
- package/dist/agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
- package/dist/agent-src/guidelines/agent-infra/direct-answers-demos.md +142 -0
- package/dist/agent-src/guidelines/agent-infra/domain-adoption-gates.md +112 -0
- package/dist/agent-src/guidelines/agent-infra/domain-eval-anti-pattern.md +53 -0
- package/dist/agent-src/guidelines/agent-infra/domain-pack-architecture.md +56 -0
- package/dist/agent-src/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/dist/agent-src/guidelines/agent-infra/emphasis-budget.md +45 -0
- package/dist/agent-src/guidelines/agent-infra/engineering-memory-data-format.md +210 -0
- package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
- package/dist/agent-src/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/dist/agent-src/guidelines/agent-infra/failure-signatures.md +70 -0
- package/dist/agent-src/guidelines/agent-infra/false-green.md +233 -0
- package/dist/agent-src/guidelines/agent-infra/first-principles.md +192 -0
- package/dist/agent-src/guidelines/agent-infra/framework-neutrality-patterns.md +66 -0
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +169 -0
- package/dist/agent-src/guidelines/agent-infra/gate-authoring.md +177 -0
- package/dist/agent-src/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/installed-tools-manifest.md +142 -0
- package/dist/agent-src/guidelines/agent-infra/inversion-thinking.md +388 -0
- package/dist/agent-src/guidelines/agent-infra/ios-simulator-guide.md +378 -0
- package/dist/agent-src/guidelines/agent-infra/language-and-tone-examples.md +141 -0
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +317 -0
- package/dist/agent-src/guidelines/agent-infra/linked-projects-onboarding-gate.md +80 -0
- package/dist/agent-src/guidelines/agent-infra/mcp-request-signing.md +197 -0
- package/dist/agent-src/guidelines/agent-infra/memory-access.md +149 -0
- package/dist/agent-src/guidelines/agent-infra/mental-models.md +314 -0
- package/dist/agent-src/guidelines/agent-infra/minimal-safe-diff-mechanics.md +241 -0
- package/dist/agent-src/guidelines/agent-infra/missing-tool-handling.md +66 -0
- package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +101 -0
- package/dist/agent-src/guidelines/agent-infra/naming.md +69 -0
- package/dist/agent-src/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
- package/dist/agent-src/guidelines/agent-infra/output-patterns.md +117 -0
- package/dist/agent-src/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
- package/dist/agent-src/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/dist/agent-src/guidelines/agent-infra/review-routing-data-format.md +143 -0
- package/dist/agent-src/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +274 -0
- package/dist/agent-src/guidelines/agent-infra/role-contracts.md +209 -0
- package/dist/agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
- package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +241 -0
- package/dist/agent-src/guidelines/agent-infra/rule-type-governance.md +73 -0
- package/dist/agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
- package/dist/agent-src/guidelines/agent-infra/scqa-framework.md +526 -0
- package/dist/agent-src/guidelines/agent-infra/security-lint-containment.md +121 -0
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +134 -0
- package/dist/agent-src/guidelines/agent-infra/simplicity-and-goal-demos.md +211 -0
- package/dist/agent-src/guidelines/agent-infra/six-hats.md +353 -0
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +229 -0
- package/dist/agent-src/guidelines/agent-infra/skill-quality-checklist.md +157 -0
- package/dist/agent-src/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/dist/agent-src/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
- package/dist/agent-src/guidelines/agent-infra/systems-thinking.md +220 -0
- package/dist/agent-src/guidelines/agent-infra/tool-description-as-policy.md +35 -0
- package/dist/agent-src/guidelines/agent-infra/tool-integration.md +73 -0
- package/dist/agent-src/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
- package/dist/agent-src/guidelines/agent-infra/untrusted-input-spotlighting.md +166 -0
- package/dist/agent-src/guidelines/agent-infra/verify-before-complete-demos.md +128 -0
- package/dist/agent-src/guidelines/augment-portability-patterns.md +70 -0
- package/dist/agent-src/guidelines/code-clarity.md +350 -0
- package/dist/agent-src/guidelines/component-oriented-and-oop-development.md +189 -0
- package/dist/agent-src/guidelines/cross-role-handoff.md +127 -0
- package/dist/agent-src/guidelines/design-antipatterns-triggers.json +18 -0
- package/dist/agent-src/guidelines/design-antipatterns.md +327 -0
- package/dist/agent-src/guidelines/design-asset-discipline.md +38 -0
- package/dist/agent-src/guidelines/design-canon.md +63 -0
- package/dist/agent-src/guidelines/design-fidelity-mechanics.md +293 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +78 -0
- package/dist/agent-src/guidelines/design-handover-extraction.md +117 -0
- package/dist/agent-src/guidelines/design-modes.md +143 -0
- package/dist/agent-src/guidelines/design-reconciliation.md +172 -0
- package/dist/agent-src/guidelines/docs/readme-size-and-splitting.md +209 -0
- package/dist/agent-src/guidelines/e2e/playwright.md +363 -0
- package/dist/agent-src/guidelines/gtm-handoff.md +114 -0
- package/dist/agent-src/guidelines/monorepo-antipatterns.md +141 -0
- package/dist/agent-src/guidelines/php/api-design.md +115 -0
- package/dist/agent-src/guidelines/php/artisan-commands.md +81 -0
- package/dist/agent-src/guidelines/php/blade-ui.md +78 -0
- package/dist/agent-src/guidelines/php/controllers.md +90 -0
- package/dist/agent-src/guidelines/php/database.md +194 -0
- package/dist/agent-src/guidelines/php/eloquent.md +208 -0
- package/dist/agent-src/guidelines/php/flux.md +80 -0
- package/dist/agent-src/guidelines/php/general.md +207 -0
- package/dist/agent-src/guidelines/php/git.md +164 -0
- package/dist/agent-src/guidelines/php/jobs.md +111 -0
- package/dist/agent-src/guidelines/php/livewire.md +71 -0
- package/dist/agent-src/guidelines/php/logging.md +79 -0
- package/dist/agent-src/guidelines/php/naming.md +89 -0
- package/dist/agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
- package/dist/agent-src/guidelines/php/patterns/dtos.md +199 -0
- package/dist/agent-src/guidelines/php/patterns/events.md +67 -0
- package/dist/agent-src/guidelines/php/patterns/factory.md +53 -0
- package/dist/agent-src/guidelines/php/patterns/pipelines.md +66 -0
- package/dist/agent-src/guidelines/php/patterns/policies.md +66 -0
- package/dist/agent-src/guidelines/php/patterns/repositories.md +122 -0
- package/dist/agent-src/guidelines/php/patterns/service-layer.md +64 -0
- package/dist/agent-src/guidelines/php/patterns/strategy.md +247 -0
- package/dist/agent-src/guidelines/php/patterns.md +28 -0
- package/dist/agent-src/guidelines/php/performance.md +92 -0
- package/dist/agent-src/guidelines/php/php-coding-patterns.md +80 -0
- package/dist/agent-src/guidelines/php/resources.md +100 -0
- package/dist/agent-src/guidelines/php/security.md +110 -0
- package/dist/agent-src/guidelines/php/sql.md +97 -0
- package/dist/agent-src/guidelines/php/validations.md +119 -0
- package/dist/agent-src/guidelines/php/websocket.md +100 -0
- package/dist/agent-src/guidelines/prompt-templates.md +189 -0
- package/dist/agent-src/guidelines/redundancy-taxonomy.md +208 -0
- package/dist/agent-src/guidelines/wing4-handoff.md +127 -0
- package/dist/agent-src/personas/README.md +1 -1
- package/dist/agent-src/personas/_template-specialist/persona.md +1 -1
- package/dist/agent-src/personas/product-owner.md +1 -1
- package/dist/agent-src/rules/active-remediation.md +1 -1
- package/dist/agent-src/rules/architecture.md +2 -2
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/ask-when-uncertain.md +2 -2
- package/dist/agent-src/rules/brand-source-of-truth.md +9 -7
- package/dist/agent-src/rules/code-comment-discipline.md +2 -2
- package/dist/agent-src/rules/code-provenance.md +1 -1
- package/dist/agent-src/rules/content-quoting-floor.md +1 -1
- package/dist/agent-src/rules/context-hygiene.md +5 -5
- package/dist/agent-src/rules/cross-source-consistency.md +1 -1
- package/dist/agent-src/rules/design-fidelity.md +36 -46
- package/dist/agent-src/rules/direct-answers.md +2 -2
- package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
- package/dist/agent-src/rules/evaluator-independence.md +1 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
- package/dist/agent-src/rules/icon-consistency.md +5 -1
- package/dist/agent-src/rules/improve-before-implement.md +1 -1
- package/dist/agent-src/rules/language-and-tone.md +3 -3
- package/dist/agent-src/rules/minimal-safe-diff.md +1 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +36 -25
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
- package/dist/agent-src/rules/role-mode-adherence.md +2 -2
- package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
- package/dist/agent-src/rules/size-enforcement.md +1 -1
- package/dist/agent-src/rules/source-confidentiality.md +2 -2
- package/dist/agent-src/rules/think-before-action.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +7 -5
- package/dist/agent-src/rules/ui-audit-gate.md +3 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +3 -3
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +106 -4
- package/dist/agent-src/skills/activation-design/SKILL.md +2 -2
- package/dist/agent-src/skills/adr-create/SKILL.md +5 -5
- package/dist/agent-src/skills/ai-council/SKILL.md +1 -1
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +1 -1
- package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +24 -3
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/build-buy-partner/SKILL.md +1 -1
- package/dist/agent-src/skills/churn-prevention/SKILL.md +2 -2
- package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -1
- package/dist/agent-src/skills/code-refactoring/SKILL.md +3 -3
- package/dist/agent-src/skills/code-review/SKILL.md +3 -3
- package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
- package/dist/agent-src/skills/comp-banding/SKILL.md +1 -1
- package/dist/agent-src/skills/competitive-moat-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
- package/dist/agent-src/skills/complexity-first-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -2
- package/dist/agent-src/skills/contracts-cognition/SKILL.md +1 -1
- package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +2 -2
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +2 -2
- package/dist/agent-src/skills/customer-research/SKILL.md +2 -2
- package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
- package/dist/agent-src/skills/data-handling-judgment/SKILL.md +1 -1
- package/dist/agent-src/skills/deal-qualification-meddic/SKILL.md +2 -2
- package/dist/agent-src/skills/decision-record/SKILL.md +3 -3
- package/dist/agent-src/skills/decision-review/SKILL.md +8 -8
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +22 -22
- package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +2 -2
- package/dist/agent-src/skills/design-review/SKILL.md +4 -4
- package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -1
- package/dist/agent-src/skills/design-tokens/SKILL.md +17 -2
- package/dist/agent-src/skills/design-variations/SKILL.md +2 -2
- package/dist/agent-src/skills/developer-like-execution/SKILL.md +2 -2
- package/dist/agent-src/skills/discovery-interview/SKILL.md +2 -2
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +3 -3
- package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -2
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +44 -1
- package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +2 -2
- package/dist/agent-src/skills/expansion-playbook/SKILL.md +2 -2
- package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/experiment-loop/references/protocol.md +1 -1
- package/dist/agent-src/skills/fe-design/SKILL.md +3 -3
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +3 -3
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/forecast-accuracy/SKILL.md +2 -2
- package/dist/agent-src/skills/forecasting/SKILL.md +2 -2
- package/dist/agent-src/skills/fundraising-narrative/SKILL.md +2 -2
- package/dist/agent-src/skills/funnel-analysis/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +9 -0
- package/dist/agent-src/skills/gtm-launch/SKILL.md +2 -2
- package/dist/agent-src/skills/hiring-loop-design/SKILL.md +1 -1
- package/dist/agent-src/skills/html-deck/SKILL.md +5 -5
- package/dist/agent-src/skills/humanizer/SKILL.md +1 -1
- package/dist/agent-src/skills/humanizer/data/patterns.md +1 -1
- package/dist/agent-src/skills/iconography/SKILL.md +3 -3
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
- package/dist/agent-src/skills/laravel-api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +3 -3
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +6 -6
- package/dist/agent-src/skills/livewire/SKILL.md +1 -1
- package/dist/agent-src/skills/market-entry-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/mcp-builder/SKILL.md +1 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +3 -3
- package/dist/agent-src/skills/messaging-architecture/SKILL.md +2 -2
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/onboarding-design/SKILL.md +2 -2
- package/dist/agent-src/skills/onboarding-program/SKILL.md +1 -1
- package/dist/agent-src/skills/one-on-one-cadence/SKILL.md +1 -1
- package/dist/agent-src/skills/org-design/SKILL.md +1 -1
- package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +3 -3
- package/dist/agent-src/skills/override-management/SKILL.md +1 -1
- package/dist/agent-src/skills/perf-feedback-craft/SKILL.md +1 -1
- package/dist/agent-src/skills/persona-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/php-coder/SKILL.md +1 -1
- package/dist/agent-src/skills/pipeline-strategy/SKILL.md +2 -2
- package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -3
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/positioning-strategy/SKILL.md +2 -2
- package/dist/agent-src/skills/privacy-review/SKILL.md +1 -1
- package/dist/agent-src/skills/prompt-optimizer/SKILL.md +3 -3
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -2
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/release-comms/SKILL.md +2 -2
- package/dist/agent-src/skills/retention-loops/SKILL.md +2 -2
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-management/SKILL.md +1 -1
- package/dist/agent-src/skills/roadmap-management/references/archival.md +1 -1
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +5 -5
- package/dist/agent-src/skills/rule-writing/SKILL.md +6 -6
- package/dist/agent-src/skills/runway-cognition/SKILL.md +2 -2
- package/dist/agent-src/skills/scenario-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-writing/references/procedure.md +1 -1
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +3 -3
- package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -3
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +1 -1
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +60 -4
- package/dist/agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -1
- package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
- package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +28 -8
- package/dist/agent-src/skills/unit-economics-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +1 -1
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +2 -2
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/skills/vision-articulation/SKILL.md +1 -1
- package/dist/agent-src/skills/voc-extract/SKILL.md +2 -2
- package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +1 -1
- package/dist/agent-src/skills/workspace-link/SKILL.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +6 -6
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/contexts/knowledge-pages.md +2 -3
- package/dist/agent-src/templates/copilot-instructions.md +1 -1
- package/dist/agent-src/templates/roadmaps.md +1 -1
- package/dist/agent-src/templates/scripts/README.md +2 -2
- package/dist/agent-src/user-types/_template/user-type.md +1 -1
- package/dist/cli/registry.js +1 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +52 -4
- package/dist/cli-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/{chunk-TGIPZBCW.js → chunk-2KKXJW25.js} +22 -8
- package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
- package/dist/cli-delegate/{chunk-4FS4WRXP.js → chunk-3FKR64R5.js} +34 -6
- package/dist/cli-delegate/{chunk-J3RFNKG4.js → chunk-55ACLDUE.js} +2 -2
- package/dist/cli-delegate/{chunk-PKOBQADP.js → chunk-57PN4GYJ.js} +1 -1
- package/dist/cli-delegate/{chunk-BIXEDQPZ.js → chunk-AK6HODNQ.js} +4 -4
- package/dist/cli-delegate/{chunk-2FTMENJL.js → chunk-GYC3VRYN.js} +1 -1
- package/dist/cli-delegate/{chunk-LWTYTX6F.js → chunk-HZ52BRGG.js} +24 -18
- package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
- package/dist/cli-delegate/{chunk-I6RHFQEG.js → chunk-YUM5KURG.js} +17 -1
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_explain.js +2 -2
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +24 -16
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +1 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +4 -4
- package/dist/cli-delegate/cmd_route_audit.js +3 -3
- package/dist/cli-delegate/cmd_route_explain.js +1 -1
- package/dist/cli-delegate/cmd_session_recycle.js +4 -14
- package/dist/cli-delegate/cmd_settings_get.js +15 -9
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +41 -11
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +27 -80
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +5 -7
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +4 -6
- package/dist/hooks/dispatch.js +9249 -8981
- package/dist/install/install.mjs +47 -8
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +5496 -2400
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +73 -0
- package/dist/scripts/_lib/agent_src.js +20 -0
- package/dist/scripts/_lib/guidelines_lane.js +158 -0
- package/dist/scripts/_lib/lean_projection_mode.js +108 -0
- package/dist/scripts/_lib/router_match.js +243 -0
- package/dist/scripts/_lib/rule_injection.js +216 -0
- package/dist/scripts/condense.js +22 -25
- package/dist/scripts/project_thin_rules.js +139 -19
- package/dist/server/io/yamlIO.js +125 -17
- package/dist/server/schemas/settings.js +32 -5
- package/dist/shared/settingsSurface.js +6 -1
- package/docs/MIGRATION.md +56 -0
- package/docs/contracts/settings-classes.md +48 -7
- package/docs/guidelines/abstraction-thresholds.md +35 -0
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +3 -3
- package/docs/guidelines/agent-infra/false-green.md +2 -2
- package/docs/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +1 -1
- package/docs/guidelines/design-fidelity-mechanics.md +4 -0
- package/docs/guidelines/design-fidelity-routing.md +78 -0
- package/docs/guidelines/design-reconciliation.md +172 -0
- package/docs/guidelines/gtm-handoff.md +2 -2
- package/docs/guidelines/wing4-handoff.md +2 -2
- package/llms.txt +1 -1
- package/package.json +7 -3
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +106 -4
- package/src/config/agent-settings.template.yml +94 -1
- package/src/config/ci-local-parity.yml +34 -0
- package/src/config/continuity-surface.json +8 -29
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +31 -8
- package/src/config/gate-reachability-exemptions.json +1 -0
- package/src/config/gate-violation-baselines.json +3 -3
- package/src/config/hook-token-budget.json +8 -7
- package/src/config/host-injection-effect.json +2 -2
- package/src/config/pack-size-budget.json +55 -4
- package/src/config/packed-binary-manifest.json +1 -1
- package/src/config/platform-anchor.json +47 -0
- package/src/config/preamble-payload-budget.json +2 -3
- package/src/config/publish-surface.json +4 -2
- package/src/config/ratification-policy.json +7 -0
- package/src/config/routing-coverage-seed.json +9 -2
- package/src/config/rule-stub-ceilings.json +16 -9
- package/src/scripts/_cli/cmd_session_recycle.ts +2 -25
- package/src/scripts/_cli/cmd_settings_get.ts +22 -7
- package/src/scripts/_cli/handoff_sessions.ts +14 -44
- package/src/scripts/_lib/agent_settings.ts +85 -0
- package/src/scripts/_lib/agent_src.ts +21 -0
- package/src/scripts/_lib/artifact_maturity.ts +242 -0
- package/src/scripts/_lib/conformance_report.ts +403 -0
- package/src/scripts/_lib/continuity_slot.ts +295 -0
- package/src/scripts/_lib/continuity_writer.ts +312 -0
- package/src/scripts/_lib/design_system_import.ts +20 -0
- package/src/scripts/_lib/design_tolerance.ts +281 -0
- package/src/scripts/_lib/guidelines_lane.ts +164 -0
- package/src/scripts/_lib/hook_settings.ts +85 -0
- package/src/scripts/_lib/lean_projection_mode.ts +127 -0
- package/src/scripts/_lib/obligation_frequency.ts +2 -3
- package/src/scripts/_lib/packed_binary_predicate.ts +37 -0
- package/src/scripts/_lib/platform_anchor.ts +1053 -0
- package/src/scripts/_lib/ratification_artifact.ts +278 -0
- package/src/scripts/_lib/recycle_envelope_paths.ts +109 -21
- package/src/scripts/_lib/regression_neighbourhood.ts +159 -22
- package/src/scripts/_lib/security_lint.ts +23 -2
- package/src/scripts/_lib/self_repair.ts +21 -0
- package/src/scripts/_lib/session_eol.ts +44 -0
- package/src/scripts/_lib/session_index_trust.ts +387 -0
- package/src/scripts/_lib/standing_bound_ratchet.ts +220 -0
- package/src/scripts/_lib/tolerance_shadow.ts +177 -0
- package/src/scripts/_lib/vendored_grammar_upstream.ts +280 -0
- package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
- package/src/scripts/audit_mcp_tools.ts +69 -25
- package/src/scripts/autonomy_friction_traffic.ts +379 -0
- package/src/scripts/build_mcp_catalog.ts +24 -1
- package/src/scripts/check_host_tree_parity.ts +291 -0
- package/src/scripts/check_kernel_edit_ratified.ts +462 -0
- package/src/scripts/check_loss_class_declared.ts +793 -46
- package/src/scripts/check_platform_anchor.ts +390 -0
- package/src/scripts/check_preamble_payload_budget.ts +424 -7
- package/src/scripts/check_projected_rule_routes.ts +395 -0
- package/src/scripts/check_rule_projection_integrity.ts +102 -2
- package/src/scripts/ci_settle.ts +205 -5
- package/src/scripts/code_graph/build.ts +79 -0
- package/src/scripts/code_graph/cli.ts +264 -7
- package/src/scripts/code_graph/detect.ts +38 -0
- package/src/scripts/code_graph/query.ts +25 -2
- package/src/scripts/code_graph/sqlite_store.ts +16 -1
- package/src/scripts/code_graph/types.ts +52 -3
- package/src/scripts/code_graph/validate.ts +3 -1
- package/src/scripts/code_graph/verbs.ts +590 -0
- package/src/scripts/condense.ts +22 -26
- package/src/scripts/generate_host_cost_table.ts +354 -0
- package/src/scripts/handoff_context_hook.ts +39 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +59 -28
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +182 -16
- package/src/scripts/hooks/category_a.ts +1 -1
- package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
- package/src/scripts/hooks/code_graph_context_hook.ts +7 -18
- package/src/scripts/hooks/push_settle_hook.ts +3 -2
- package/src/scripts/hooks/rule_inject_hook.ts +107 -20
- package/src/scripts/hooks/session_eol_hook.ts +177 -145
- package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
- package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
- package/src/scripts/hot_context_hook.ts +103 -408
- package/src/scripts/lint_evidence_artifacts.ts +1 -0
- package/src/scripts/lint_knowledge_scale.ts +0 -26
- package/src/scripts/lint_roadmap_blockers.ts +164 -1
- package/src/scripts/mcp_server/consumer_tool_catalog.json +152 -2
- package/src/scripts/mcp_server/graph_tools.ts +294 -0
- package/src/scripts/mcp_server/path_util.ts +31 -0
- package/src/scripts/mcp_server/tool_catalog_source.ts +7 -1
- package/src/scripts/mcp_server/tools.ts +3 -13
- package/src/scripts/memory_lookup.ts +9 -9
- package/src/scripts/model_rule_injection.ts +61 -4
- package/src/scripts/project_thin_rules.ts +149 -16
- package/src/scripts/report_standing_payload_by_host.ts +650 -0
- package/src/scripts/schemas/agent-settings.schema.json +7 -1
- package/src/scripts/session_memory_index.ts +86 -8
- package/src/scripts/sync_agent_settings.ts +270 -10
- package/src/server/io/yamlIO.ts +127 -17
- package/src/server/schemas/settings.ts +45 -6
- package/src/shared/settingsSurface.ts +13 -2
- package/src/templates/compact-instructions.md +8 -3
- package/src/vendor/grammars/README.md +27 -2
- package/dist/agent-src/commands/chat-history/import.md +0 -170
- package/dist/agent-src/commands/chat-history.md +0 -63
|
@@ -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
|
+
}
|
|
@@ -73,11 +73,49 @@ export function recycle_envelope_rel(session_id: string | null | undefined): str
|
|
|
73
73
|
return _sessionKeyed(session_id, RECYCLE_ENVELOPE_REL, 'recycle-envelope', '.json');
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
+
/**
|
|
77
|
+
* THE KEYING CONTRACT, in one place because its absence is what allowed the
|
|
78
|
+
* 2026-09-09 defect: the record is keyed by the **producing session** — the one
|
|
79
|
+
* that ran `session:recycle` — and it is READ by the **consuming session**,
|
|
80
|
+
* which is a different session with a different id. Those two facts were each
|
|
81
|
+
* true in their own module and were never written down together, so the
|
|
82
|
+
* producer and the consumer agreed on a PATH and disagreed about whose id
|
|
83
|
+
* filled it. {@link resolveContinuityRecord} is where that is now reconciled:
|
|
84
|
+
* it admits the unique record that is NOT the reader's own.
|
|
85
|
+
*/
|
|
86
|
+
|
|
76
87
|
/** Consumed sibling of {@link recycle_envelope_rel}, same keying. */
|
|
77
88
|
export function recycle_consumed_rel(session_id: string | null | undefined): string {
|
|
78
89
|
return _sessionKeyed(session_id, RECYCLE_CONSUMED_REL, 'recycle-envelope', '.consumed.json');
|
|
79
90
|
}
|
|
80
91
|
|
|
92
|
+
/**
|
|
93
|
+
* Where an UNUSABLE resident record is moved aside so the slot can be
|
|
94
|
+
* published into — never deleted.
|
|
95
|
+
*
|
|
96
|
+
* `road-to-continuity-writer-activation` step 1.1. The reader already discards
|
|
97
|
+
* a malformed, schema-invalid or expired record loudly
|
|
98
|
+
* ({@link resolveContinuityRecord}'s callers), so nothing is lost by taking it
|
|
99
|
+
* out of the authoritative name. What WOULD be lost by `unlink` is the evidence
|
|
100
|
+
* of why a resume did not happen, and that is the only artefact anyone
|
|
101
|
+
* debugging a missed resume has. Quarantine is one file per session and is
|
|
102
|
+
* pruned by the same janitor as the rest of `agents/runtime/state/`.
|
|
103
|
+
*
|
|
104
|
+
* Deliberately NOT the consumed name: `.consumed.json` is a claim that a
|
|
105
|
+
* successor read the record, and `predecessorTracePresent` reads exactly that
|
|
106
|
+
* file to corroborate a lineage. Writing a never-consumed record there would
|
|
107
|
+
* manufacture a predecessor trace, which is the one thing that check exists to
|
|
108
|
+
* refuse.
|
|
109
|
+
*/
|
|
110
|
+
export function recycle_quarantine_rel(session_id: string | null | undefined): string {
|
|
111
|
+
return _sessionKeyed(
|
|
112
|
+
session_id,
|
|
113
|
+
path.join(_STATE_REL, 'recycle-envelope.quarantined.json'),
|
|
114
|
+
'recycle-envelope',
|
|
115
|
+
'.quarantined.json',
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
81
119
|
/**
|
|
82
120
|
* Shared builder. Containment is asserted locally rather than trusted from
|
|
83
121
|
* `safe_stem`: a guarantee living in another module's implementation is one
|
|
@@ -133,44 +171,94 @@ export interface ContinuityResolution {
|
|
|
133
171
|
/**
|
|
134
172
|
* Which record THIS session may read.
|
|
135
173
|
*
|
|
136
|
-
*
|
|
174
|
+
* **A resume reads the PREDECESSOR's record, and this function used to look for
|
|
175
|
+
* the reader's own.** Corrected 2026-09-09 after measuring it: the producer
|
|
176
|
+
* writes under the PRODUCING session's id and the consumer arrives with its
|
|
177
|
+
* OWN, so the two never coincided and every successor was told `absent`. The
|
|
178
|
+
* mechanism resolved only for a caller with no session id at all — the one
|
|
179
|
+
* shape no host produces, and the only shape the 19 pre-existing consumer tests
|
|
180
|
+
* exercised. `road-to-a-recycle-envelope-that-is-consumed` carries the
|
|
181
|
+
* five-fixture table; AI council 2026-09-09, 2/2, chose the rule below.
|
|
182
|
+
*
|
|
183
|
+
* Four cases, and the second is the resume:
|
|
184
|
+
*
|
|
185
|
+
* 1. **Own record.** NEVER read. A session re-reading its own state is a loop,
|
|
186
|
+
* not a resume, and a second `session_start` for one session (resume, host
|
|
187
|
+
* reconnect) made it reachable. Excluded by construction here rather than
|
|
188
|
+
* guarded downstream.
|
|
189
|
+
* 2. **Exactly one record that is not the reader's own.** Read it. That is the
|
|
190
|
+
* predecessor.
|
|
191
|
+
* 3. **Several such records.** START CLEAN and say so — the existing refusal,
|
|
192
|
+
* unchanged and now reachable from both branches. Picking the newest is
|
|
193
|
+
* precisely the recency resolution the no-index rule below forbids.
|
|
194
|
+
* 4. **None.** `absent`.
|
|
137
195
|
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
* is precisely the recency resolution the no-index rule forbids: it would
|
|
146
|
-
* hand this session a stranger's state and look like a successful resume.
|
|
196
|
+
* **Why this is not recency, stated because the rule it must not become is one
|
|
197
|
+
* line away:** nothing is sorted and nothing is compared by time. Uniqueness
|
|
198
|
+
* admits; ambiguity refuses. The peer-isolation intent the per-session key was
|
|
199
|
+
* introduced for therefore moves from the KEY to the REFUSAL — a live peer's
|
|
200
|
+
* record is no longer excluded by its filename, so the branch gate in
|
|
201
|
+
* `consume_recycle_envelope` is what keeps an unrelated session from resuming
|
|
202
|
+
* it. That gate is part of this rule, not a decoration on it.
|
|
147
203
|
*/
|
|
148
204
|
export function resolveContinuityRecord(
|
|
149
205
|
workspace_root: string,
|
|
150
206
|
session_id: string | null | undefined,
|
|
151
207
|
): ContinuityResolution {
|
|
152
208
|
const id = String(session_id ?? '').trim();
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
return fs.existsSync(own)
|
|
156
|
-
? { file: own, reason: `continuity record for this session (${safe_stem(id)})` }
|
|
157
|
-
: { file: null, reason: `no continuity record for this session (${safe_stem(id)})` };
|
|
158
|
-
}
|
|
159
|
-
const candidates = listContinuityRecords(workspace_root);
|
|
209
|
+
const own = id === '' ? null : path.join(workspace_root, recycle_envelope_rel(id));
|
|
210
|
+
const candidates = listContinuityRecords(workspace_root).filter((f) => f !== own);
|
|
160
211
|
if (candidates.length === 0) {
|
|
161
|
-
return {
|
|
212
|
+
return {
|
|
213
|
+
file: null,
|
|
214
|
+
reason:
|
|
215
|
+
id === ''
|
|
216
|
+
? 'no continuity record present'
|
|
217
|
+
: `no predecessor record in this workspace (own: ${safe_stem(id)})`,
|
|
218
|
+
};
|
|
162
219
|
}
|
|
163
220
|
if (candidates.length === 1) {
|
|
164
|
-
return {
|
|
221
|
+
return {
|
|
222
|
+
file: candidates[0] as string,
|
|
223
|
+
reason:
|
|
224
|
+
id === ''
|
|
225
|
+
? 'one continuity record, no session id to key on'
|
|
226
|
+
: `predecessor record, one candidate (own: ${safe_stem(id)})`,
|
|
227
|
+
};
|
|
165
228
|
}
|
|
166
229
|
return {
|
|
167
230
|
file: null,
|
|
168
231
|
reason:
|
|
169
|
-
`starting clean: ${candidates.length} continuity records in this workspace and no
|
|
170
|
-
'
|
|
232
|
+
`starting clean: ${candidates.length} continuity records in this workspace and no way to tell ` +
|
|
233
|
+
'which is the predecessor — resuming from the newest would resume a peer session, not this one',
|
|
171
234
|
};
|
|
172
235
|
}
|
|
173
236
|
|
|
237
|
+
/**
|
|
238
|
+
* Which session this one continues — read, never composed.
|
|
239
|
+
*
|
|
240
|
+
* The chain is derivable without any new artifact: when this session started,
|
|
241
|
+
* its reader consumed the predecessor's record and MOVED it to this session's
|
|
242
|
+
* consumed path (`recycle_consumed_rel`). So the file sitting there is, by
|
|
243
|
+
* construction, the record this session resumed from, and its `session_id` is
|
|
244
|
+
* the predecessor.
|
|
245
|
+
*
|
|
246
|
+
* Returns the explicit string `none` when there is nothing there. `none` is a
|
|
247
|
+
* CLAIM — "this session starts a chain" — and is deliberately not an empty
|
|
248
|
+
* value: a reader must be able to tell "no predecessor" from "nobody wrote the
|
|
249
|
+
* field", because only the second one is a reason to go looking.
|
|
250
|
+
*/
|
|
251
|
+
export function resolvePredecessor(projectRoot: string, sessionId: string | null): string {
|
|
252
|
+
try {
|
|
253
|
+
const consumed = path.join(projectRoot, recycle_consumed_rel(sessionId));
|
|
254
|
+
const raw = JSON.parse(fs.readFileSync(consumed, 'utf-8')) as { session_id?: unknown };
|
|
255
|
+
const prior = String(raw.session_id ?? '').trim();
|
|
256
|
+
return prior === '' ? 'none' : prior;
|
|
257
|
+
} catch {
|
|
258
|
+
return 'none';
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
174
262
|
/**
|
|
175
263
|
* Is there any trace in this workspace of the session a record names as its
|
|
176
264
|
* predecessor?
|
|
@@ -12,30 +12,33 @@
|
|
|
12
12
|
* > neighbourhood names, and a fixture proves a neighbour regression is
|
|
13
13
|
* > caught.**
|
|
14
14
|
*
|
|
15
|
-
*
|
|
15
|
+
* TWO GRAPHS, BOTH DELIBERATE — the substitution is retired.
|
|
16
16
|
*
|
|
17
|
-
* The step says "the code graph".
|
|
18
|
-
*
|
|
17
|
+
* The step says "the code graph". Until 2026-09-08 this module could not read
|
|
18
|
+
* it: `agent-config code-graph detect` answered `no code-graph source detected`
|
|
19
|
+
* in a fresh checkout, so it selected over the artefact graph instead and said
|
|
20
|
+
* so. `road-to-a-graph-that-is-shipped` removed that premise — Phase 0.1 ships
|
|
21
|
+
* the parsers, Phase 1 builds the graph on install, and 3.1 added
|
|
22
|
+
* `impact --diff`, which is the reverse-reachability query this selector needs.
|
|
19
23
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* (`src/config/agent-settings.template.yml:1373-1374`), and
|
|
23
|
-
* `agent-config code-graph detect` in this checkout answers
|
|
24
|
-
* `no code-graph source detected`. There is no index to select against.
|
|
25
|
-
* · `src/scripts/discovery_graph.ts` — this suite's OWN artefact relation
|
|
26
|
-
* graph, five typed edges extracted from the discovery manifest's
|
|
27
|
-
* structured fields, with an `affected` BFS already implemented and
|
|
28
|
-
* answering. That is the surface this module builds on.
|
|
24
|
+
* So both surfaces are now first-class, and which one a candidate uses is a
|
|
25
|
+
* property OF THE CANDIDATE rather than of what happened to resolve:
|
|
29
26
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
27
|
+
* · **Code candidates** — a diff that edits `.ts` / `.php` symbols. Use
|
|
28
|
+
* {@link selectRegressionsFromCode}, which neighbours by SYMBOL relations
|
|
29
|
+
* over the native graph, filtered to accepted mechanisms
|
|
30
|
+
* (`resolved_via` not in `{name-lookup, dynamic}`) so a same-name guess
|
|
31
|
+
* never selects a regression.
|
|
32
|
+
* · **Artefact candidates** — a diff that edits rules, skills, guidelines.
|
|
33
|
+
* Use {@link selectRegressions}, which neighbours by ARTEFACT relations
|
|
34
|
+
* over `src/scripts/discovery_graph.ts` (`supersedes`, `routes_to`,
|
|
35
|
+
* `references_adr`, pack and workspace membership). For a rule rewrite that
|
|
36
|
+
* is the graph carrying the coupling a change can break; the code graph
|
|
37
|
+
* does not model it at all.
|
|
38
|
+
*
|
|
39
|
+
* Neither is a fallback for the other, and neither is silent: both paths REFUSE
|
|
40
|
+
* through {@link selectionVerdict} when a touched surface is absent from the
|
|
41
|
+
* graph they read, because an unknown neighbourhood is not an empty one.
|
|
39
42
|
*
|
|
40
43
|
* ## Why an unresolved surface refuses instead of selecting nothing
|
|
41
44
|
*
|
|
@@ -55,6 +58,9 @@
|
|
|
55
58
|
* A test asserts that identity rather than an id match, because an id match
|
|
56
59
|
* would also be satisfied by a synthesized spec carrying a copied id.
|
|
57
60
|
*/
|
|
61
|
+
import type { GraphState } from '../code_graph/detect.js';
|
|
62
|
+
import type { LoadedGraph } from '../code_graph/query.js';
|
|
63
|
+
import { impact } from '../code_graph/verbs.js';
|
|
58
64
|
import { affected, isSyntheticNode, type Graph } from '../discovery_graph.js';
|
|
59
65
|
|
|
60
66
|
/**
|
|
@@ -106,6 +112,48 @@ export interface NeighbourhoodReport {
|
|
|
106
112
|
selected: readonly Selection[];
|
|
107
113
|
/** Registry entries whose guards intersect nothing in the neighbourhood. */
|
|
108
114
|
skipped: readonly string[];
|
|
115
|
+
/**
|
|
116
|
+
* Which graph answered. Present so a verdict record can never be read as a
|
|
117
|
+
* claim about the other surface — the failure the retired substitution
|
|
118
|
+
* section describes, arriving through the report instead of through the
|
|
119
|
+
* docstring.
|
|
120
|
+
*/
|
|
121
|
+
graph: 'artefact' | 'code';
|
|
122
|
+
/**
|
|
123
|
+
* The graph's freshness at selection time: `fresh` / `behind:N` / `absent`
|
|
124
|
+
* on the code path, `null` on the artefact path (which is derived from the
|
|
125
|
+
* committed manifest and has no staleness axis).
|
|
126
|
+
*
|
|
127
|
+
* Added after an independent review found the code path hardcoding
|
|
128
|
+
* `'absent'` and dropping the value: the verbs are required to report
|
|
129
|
+
* staleness, `verbs.ts` argues the whole point is telling "dead" from "dead
|
|
130
|
+
* as of a graph 40 commits behind" — and the one in-repo CONSUMER of those
|
|
131
|
+
* verbs discarded it, so no selection could refuse on a stale graph.
|
|
132
|
+
*/
|
|
133
|
+
graph_state: GraphState | null;
|
|
134
|
+
/**
|
|
135
|
+
* Touched files in a language the code graph does not index. NOT a refusal
|
|
136
|
+
* reason: an unindexed `.md` is a file with no symbols, which is a fact
|
|
137
|
+
* about the language set rather than an unknown neighbourhood.
|
|
138
|
+
*/
|
|
139
|
+
not_indexed: readonly string[];
|
|
140
|
+
/**
|
|
141
|
+
* The edges that produced the neighbourhood, rendered, sorted.
|
|
142
|
+
*
|
|
143
|
+
* Required by step 3.4: *"the selected regressions and the producing edges
|
|
144
|
+
* enter the verdict record"*. Empty on the artefact path, whose `affected`
|
|
145
|
+
* BFS returns a relation name per hop rather than an edge — stated rather
|
|
146
|
+
* than faked, because an empty list a reader can attribute is better than a
|
|
147
|
+
* synthesised one they cannot.
|
|
148
|
+
*/
|
|
149
|
+
producing_edges: readonly string[];
|
|
150
|
+
/**
|
|
151
|
+
* The `resolved_via` histogram of the edges the walk REFUSED, on the code
|
|
152
|
+
* path. A selection that looks narrow because half the graph was a guess
|
|
153
|
+
* reads very differently from one that looks narrow because the code is
|
|
154
|
+
* decoupled, and this is the only field that distinguishes them.
|
|
155
|
+
*/
|
|
156
|
+
rejected_via: string;
|
|
109
157
|
/**
|
|
110
158
|
* Literal 0. This module selects from a registry; a non-zero value here
|
|
111
159
|
* would mean it authored a task, which is K9.
|
|
@@ -196,6 +244,80 @@ export function selectRegressions(
|
|
|
196
244
|
unresolved: unresolvedSurfaces(graph, candidate),
|
|
197
245
|
selected: selected.sort((a, b) => a.spec.id.localeCompare(b.spec.id)),
|
|
198
246
|
skipped: skipped.sort((a, b) => a.localeCompare(b)),
|
|
247
|
+
graph: 'artefact',
|
|
248
|
+
graph_state: null,
|
|
249
|
+
not_indexed: [],
|
|
250
|
+
producing_edges: [],
|
|
251
|
+
rejected_via: '(not applicable — the artefact graph has no mechanism axis)',
|
|
252
|
+
authored: 0,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* The code-graph path (step 3.4).
|
|
258
|
+
*
|
|
259
|
+
* Neighbours a candidate by the symbols its diff touched, over the native code
|
|
260
|
+
* graph, using the same `impact --diff` reverse walk the CLI verb exposes. The
|
|
261
|
+
* neighbourhood's nodes are the seeds at depth 0 (`touched`) plus every
|
|
262
|
+
* accepted reverse-reachable node at its shallowest depth (`neighbour`), which
|
|
263
|
+
* is the identical shape {@link neighbourhood} produces for the artefact graph
|
|
264
|
+
* — so `selectRegressions`' matching logic is reused rather than forked.
|
|
265
|
+
*
|
|
266
|
+
* `touches` is read as FILE paths here, not artefact ids: a code candidate is a
|
|
267
|
+
* diff, and a diff names files. A touched file with no node in the graph lands
|
|
268
|
+
* in `unresolved` and therefore refuses through {@link selectionVerdict}, on
|
|
269
|
+
* exactly the terms the artefact path already uses.
|
|
270
|
+
*/
|
|
271
|
+
export function selectRegressionsFromCode(
|
|
272
|
+
g: LoadedGraph,
|
|
273
|
+
candidate: Candidate,
|
|
274
|
+
registry: readonly RegressionSpec[],
|
|
275
|
+
depth: number = DEFAULT_NEIGHBOURHOOD_DEPTH,
|
|
276
|
+
isTest: (relPath: string) => boolean = () => false,
|
|
277
|
+
graphState: GraphState = 'absent',
|
|
278
|
+
): NeighbourhoodReport {
|
|
279
|
+
const res = impact(g, candidate.touches, graphState, depth, isTest);
|
|
280
|
+
const best = new Map<string, NeighbourhoodNode>();
|
|
281
|
+
for (const seed of res.seeds) {
|
|
282
|
+
best.set(seed, { node: seed, reason: 'touched', depth: 0, via: '', synthetic: false });
|
|
283
|
+
}
|
|
284
|
+
for (const r of res.reached) {
|
|
285
|
+
if (best.has(r.node)) continue;
|
|
286
|
+
best.set(r.node, {
|
|
287
|
+
node: r.node,
|
|
288
|
+
reason: 'neighbour',
|
|
289
|
+
depth: r.depth,
|
|
290
|
+
via: `${r.via}/${r.resolved_via}`,
|
|
291
|
+
synthetic: false,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
const hood = [...best.values()].sort((a, b) => a.depth - b.depth || a.node.localeCompare(b.node));
|
|
295
|
+
const reasonOf = new Map<string, NeighbourReason>(hood.map((n) => [n.node, n.reason]));
|
|
296
|
+
const selected: Selection[] = [];
|
|
297
|
+
const skipped: string[] = [];
|
|
298
|
+
for (const spec of registry) {
|
|
299
|
+
const matched = spec.guards.filter((x) => reasonOf.has(x)).sort((a, b) => a.localeCompare(b));
|
|
300
|
+
if (matched.length === 0) {
|
|
301
|
+
skipped.push(spec.id);
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
selected.push({
|
|
305
|
+
spec,
|
|
306
|
+
matched,
|
|
307
|
+
reason: matched.some((m) => reasonOf.get(m) === 'touched') ? 'touched' : 'neighbour',
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
return {
|
|
311
|
+
candidate_id: candidate.id,
|
|
312
|
+
neighbourhood: hood,
|
|
313
|
+
unresolved: [...res.unresolved_files].sort((a, b) => a.localeCompare(b)),
|
|
314
|
+
selected: selected.sort((a, b) => a.spec.id.localeCompare(b.spec.id)),
|
|
315
|
+
skipped: skipped.sort((a, b) => a.localeCompare(b)),
|
|
316
|
+
graph: 'code',
|
|
317
|
+
graph_state: graphState,
|
|
318
|
+
not_indexed: [...res.not_indexed_files].sort((a, b) => a.localeCompare(b)),
|
|
319
|
+
producing_edges: [...res.producing_edges].sort(),
|
|
320
|
+
rejected_via: res.rejected_via,
|
|
199
321
|
authored: 0,
|
|
200
322
|
};
|
|
201
323
|
}
|
|
@@ -209,9 +331,24 @@ export function selectRegressions(
|
|
|
209
331
|
*/
|
|
210
332
|
export function selectionVerdict(report: NeighbourhoodReport): readonly string[] | null {
|
|
211
333
|
const reasons: string[] = [];
|
|
334
|
+
// An ABSENT graph is the case the artefact path's own docstring warns
|
|
335
|
+
// about in the other direction: a lookup that cannot resolve and then
|
|
336
|
+
// selects nothing reports a clean sheet. `behind:N` is deliberately NOT a
|
|
337
|
+
// refusal — a stale graph still answers, and blocking on staleness would
|
|
338
|
+
// be the blocking-gate-on-a-stale-graph that K7 forbids. It is surfaced
|
|
339
|
+
// through `graph_state` so a caller that wants to refuse can.
|
|
340
|
+
if (report.graph === 'code' && report.graph_state === 'absent') {
|
|
341
|
+
reasons.push(
|
|
342
|
+
'the code graph is absent — a neighbourhood computed over no graph is empty for a ' +
|
|
343
|
+
'reason that has nothing to do with the candidate. Run `agent-config code-graph build`.',
|
|
344
|
+
);
|
|
345
|
+
}
|
|
212
346
|
if (report.unresolved.length > 0) {
|
|
347
|
+
// Named per graph: a code-path refusal that said "relation graph" would
|
|
348
|
+
// point a reader at the wrong surface to go fix.
|
|
349
|
+
const which = report.graph === 'code' ? 'code graph' : 'artefact relation graph';
|
|
213
350
|
reasons.push(
|
|
214
|
-
`touched surfaces absent from the
|
|
351
|
+
`touched surfaces absent from the ${which}: ${report.unresolved.join(', ')} — ` +
|
|
215
352
|
'their neighbourhood is unknown, and an unknown neighbourhood is not an empty one',
|
|
216
353
|
);
|
|
217
354
|
}
|