@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
|
@@ -44,14 +44,13 @@ concerns:
|
|
|
44
44
|
fail_closed: false
|
|
45
45
|
severity: advisory
|
|
46
46
|
needs_payload_bodies: [result]
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
#
|
|
50
|
-
#
|
|
51
|
-
#
|
|
52
|
-
#
|
|
53
|
-
#
|
|
54
|
-
# session entries. Never blocks.
|
|
47
|
+
# Restore persisted memory session index (road-to-memory-retrieval-economy
|
|
48
|
+
# P5). session_start only: the dispatcher forwards the returned `context`
|
|
49
|
+
# block to its own stdout (Claude Code SessionStart injection).
|
|
50
|
+
# The working-memory CACHE this concern used to write on stop / session_end /
|
|
51
|
+
# pre_compact was retired in road-to-continuity-writer-activation step 3.1;
|
|
52
|
+
# the id is kept deliberately, so the restore stays a tagged concern rather
|
|
53
|
+
# than untagged running code. Never blocks.
|
|
55
54
|
hot-context:
|
|
56
55
|
script: src/scripts/hot_context_hook.ts
|
|
57
56
|
args: []
|
|
@@ -62,7 +61,7 @@ concerns:
|
|
|
62
61
|
# agents/runtime/state/handoff-context.md, inject it as spotlighted DATA
|
|
63
62
|
# and DELETE the file (consume-once; a >48h stamp discards instead).
|
|
64
63
|
# Runs directly AFTER hot-context so the handoff lands after the generic
|
|
65
|
-
#
|
|
64
|
+
# session-index block. Never blocks.
|
|
66
65
|
handoff-context:
|
|
67
66
|
script: src/scripts/handoff_context_hook.ts
|
|
68
67
|
args: []
|
|
@@ -416,8 +415,25 @@ concerns:
|
|
|
416
415
|
# and 5,037 of those were a leading `VAR=…` assignment — a shape no allowlist
|
|
417
416
|
# pattern can express. It shrinks only by not being written.
|
|
418
417
|
#
|
|
419
|
-
#
|
|
420
|
-
#
|
|
418
|
+
# SECOND SHAPE CLASS (2026-09-10). A Bash command that fills a file — `sed
|
|
419
|
+
# -i`, `cat > f`, `tee f`, `perl -i`, a `python3 -c` opening a path for
|
|
420
|
+
# writing — costs a confirmation no allowlist entry removes: the host's own
|
|
421
|
+
# permission documentation records a permanent saved rule for a read-only
|
|
422
|
+
# command and a session-lifetime one for a write-shaped command, so the same
|
|
423
|
+
# shape is confirmed again next session. Edit and Write carry no such expiry
|
|
424
|
+
# inside the working directory. Measured 2026-09-10 over 7,569 distinct real
|
|
425
|
+
# Bash calls in 39 transcripts: 306 (4.0 %) wrote a file through the shell,
|
|
426
|
+
# 216 of them `cat >` — a FLOOR, since the rules are a positive list of five
|
|
427
|
+
# commands rather than a redirect scanner. Re-measure with
|
|
428
|
+
# `./scripts-run src/scripts/autonomy_friction_traffic`.
|
|
429
|
+
#
|
|
430
|
+
# Warn-only, once per SHAPE CLASS per session, ON by default with
|
|
431
|
+
# `hooks.chain_nudge.enabled: false` as the opt-out. Per class, not per
|
|
432
|
+
# call: the anti-nagging decision this concern was written under refuses
|
|
433
|
+
# repeating a line every call, and a single boolean latch would have let
|
|
434
|
+
# whichever shape came first silence the other for the rest of the session.
|
|
435
|
+
#
|
|
436
|
+
# The inverted default is deliberate and differs from
|
|
421
437
|
# `code-graph-context` below: that one gates on a project capability that may
|
|
422
438
|
# be absent, while the fact this one carries is a property of the HOST's
|
|
423
439
|
# permission matcher and therefore holds in every consumer.
|
|
@@ -1262,16 +1278,39 @@ platforms:
|
|
|
1262
1278
|
augment:
|
|
1263
1279
|
session_start: [chat-history, hot-context, handoff-context, session-canary, council-availability, telemetry-disclosure, first-run-gate, onboarding-gate, verify-before-complete, minimal-safe-diff, profile-staleness, wrapper-freshness, surface-probe, session-register]
|
|
1264
1280
|
session_end: [chat-history, memory-learn, session-register, roadmap-progress, telemetry-flush]
|
|
1265
|
-
stop: [chat-history,
|
|
1281
|
+
stop: [chat-history, verify-before-complete, self-repair, session-register, roadmap-progress, design-pass-stop]
|
|
1266
1282
|
pre_tool_use: [block-no-verify, evidence-independence, block-kernel-rule-writes, block-config-weakening, block-speaking-inbox-dir, rtk-wrap, design-slop, ui-route-nudge, code-graph-context, chain-nudge, ship-diff-volume, reread-guard]
|
|
1267
1283
|
post_tool_use: [chat-history, roadmap-progress, context-hygiene, verify-before-complete, minimal-safe-diff, injection-scan, pr-url-reminder, push-settle, orchestration-record, telemetry-usage, tool-result-bytes, edit-shape, comment-discipline, design-pass]
|
|
1268
1284
|
|
|
1269
1285
|
claude:
|
|
1270
1286
|
session_start: [chat-history, hot-context, handoff-context, session-canary, council-availability, telemetry-disclosure, first-run-gate, onboarding-gate, verify-before-complete, minimal-safe-diff, profile-staleness, wrapper-freshness, surface-probe, session-register, journal-record]
|
|
1271
1287
|
session_end: [chat-history, memory-learn, session-register, roadmap-progress, telemetry-flush, journal-record]
|
|
1272
|
-
stop: [chat-history,
|
|
1288
|
+
stop: [chat-history, verify-before-complete, team-review-gate, end-review-nudge, turn-end-gate, self-repair, session-register, session-eol, interruption-ledger, roadmap-progress, design-pass-stop, suggestion-capture, journal-record, run-continuation]
|
|
1273
1289
|
user_prompt_submit: [chat-history, verify-before-complete, minimal-safe-diff, language-mirror, delegation-nudge, skill-route, git-authorization, session-canary, self-repair, session-register, rule-inject, suggestion-capture, journal-record]
|
|
1274
|
-
|
|
1290
|
+
# `rule-inject` was bound here and is not any more
|
|
1291
|
+
# (road-to-delivery-for-every-host 3.2, owner ruling E2). E2's strategy is
|
|
1292
|
+
# `user_prompt_submit` + `pre_compact`; this slot is the hottest one in the
|
|
1293
|
+
# manifest and its measured gate-open p90 for the concern is 19,649 B against
|
|
1294
|
+
# a 2,048-byte slot sum cap E2 keeps unchanged. The three rules that were
|
|
1295
|
+
# reachable ONLY from this slot — design-review-after-ui-write,
|
|
1296
|
+
# source-of-truth, ui-audit-gate — lose nothing: `project_thin_rules.path_only_ids`
|
|
1297
|
+
# keeps a path-only rule full-bodied, the same exemption a trigger-less rule
|
|
1298
|
+
# already had, so they are projected eagerly instead of delivered.
|
|
1299
|
+
#
|
|
1300
|
+
# WHAT "LOSE NOTHING" DOES NOT COVER, added 2026-09-08 after R2 finding 1 read
|
|
1301
|
+
# the sentence above as covering more than those three. It is accurate for the
|
|
1302
|
+
# three and silent about the class next to them: 18 rules carry BOTH path and
|
|
1303
|
+
# non-path triggers, `path_only_ids` uses `every`, so all 18 are THINNED and
|
|
1304
|
+
# their path-shaped half has no carrier once this binding is gone. They keep
|
|
1305
|
+
# every keyword / phrase / command route through the concern, and on this host
|
|
1306
|
+
# they never had a separate host-native path route — `_claude_paths_plan` emits
|
|
1307
|
+
# no `paths:` for a mixed-trigger rule on purpose — so what is lost is the
|
|
1308
|
+
# difference between loading unconditionally and being delivered on a prompt
|
|
1309
|
+
# match. The names, the measurement and the reason the exemption is not widened
|
|
1310
|
+
# (+16,329 GPT tok, +69 % on the thin rule layer) are in
|
|
1311
|
+
# `project_thin_rules.path_only_ids`; the receiver is
|
|
1312
|
+
# `agents/roadmaps/stubs/road-to-a-path-route-under-delivery.md`.
|
|
1313
|
+
pre_tool_use: [block-no-verify, evidence-independence, block-kernel-rule-writes, block-config-weakening, block-speaking-inbox-dir, one-question-per-ask, rtk-wrap, design-slop, ui-route-nudge, code-graph-context, chain-nudge, ship-diff-volume, reread-guard, spawn-guard-shadow, source-first-gate]
|
|
1275
1314
|
post_tool_use: [chat-history, roadmap-progress, context-hygiene, verify-before-complete, minimal-safe-diff, injection-scan, pr-url-reminder, push-settle, orchestration-record, telemetry-usage, tool-result-bytes, edit-shape, comment-discipline, language-mirror, design-pass, journal-record]
|
|
1276
1315
|
# `language-mirror` — round-5 § 6.1. `pre_compact` sets a pin-lost marker;
|
|
1277
1316
|
# the `post_tool_use` entry above re-emits the pin exactly once while that
|
|
@@ -1281,15 +1320,7 @@ platforms:
|
|
|
1281
1320
|
# Claude Code transcript fact. (It was the ONLY binding on this slot until
|
|
1282
1321
|
# the entry below; that sentence is retired rather than left to rot.)
|
|
1283
1322
|
#
|
|
1284
|
-
|
|
1285
|
-
# This is the one slot that fires WHILE state is being destroyed, and it
|
|
1286
|
-
# carried no WRITER at all: the cache a post-compaction `session_start`
|
|
1287
|
-
# restores was written at the last `stop`, so everything the session did
|
|
1288
|
-
# between that stop and the compaction was lost with it. The concern is
|
|
1289
|
-
# already bound on `stop` and `session_start`; this adds the write at the
|
|
1290
|
-
# moment the loss actually happens. Deterministic rebuild, emits nothing
|
|
1291
|
-
# here — the 4,096-byte row it carries is for its session_start restore.
|
|
1292
|
-
pre_compact: [language-mirror, hot-context, rule-inject, journal-record]
|
|
1323
|
+
pre_compact: [language-mirror, rule-inject, journal-record]
|
|
1293
1324
|
# road-to-subagent-lifecycle-integrity Phase 1 Step 1. `claude` is the only
|
|
1294
1325
|
# platform where both native events were measured present on the installed
|
|
1295
1326
|
# binary (2.1.229 — see the evidence page cited on the alias rows below).
|
|
@@ -1323,7 +1354,7 @@ platforms:
|
|
|
1323
1354
|
# is later verified to forward it. Binding them here would be dead
|
|
1324
1355
|
# weight: the concern still runs (git diff, transcript scan, classifier),
|
|
1325
1356
|
# still costs the dispatch, and its entire output is thrown away.
|
|
1326
|
-
stop: [chat-history,
|
|
1357
|
+
stop: [chat-history, verify-before-complete, self-repair, session-register, roadmap-progress, design-pass-stop]
|
|
1327
1358
|
user_prompt_submit: [chat-history, verify-before-complete, minimal-safe-diff, language-mirror, git-authorization, session-canary, self-repair, session-register]
|
|
1328
1359
|
pre_tool_use: [block-no-verify, evidence-independence, block-kernel-rule-writes, block-config-weakening, block-speaking-inbox-dir, rtk-wrap, design-slop, ui-route-nudge, code-graph-context, chain-nudge, ship-diff-volume, reread-guard, spawn-guard-shadow, source-first-gate]
|
|
1329
1360
|
post_tool_use: [chat-history, roadmap-progress, context-hygiene, verify-before-complete, minimal-safe-diff, injection-scan, pr-url-reminder, push-settle, orchestration-record, telemetry-usage, tool-result-bytes, edit-shape, comment-discipline, design-pass]
|
|
@@ -1348,7 +1379,7 @@ platforms:
|
|
|
1348
1379
|
cursor:
|
|
1349
1380
|
session_start: [chat-history, hot-context, handoff-context, session-canary, council-availability, telemetry-disclosure, first-run-gate, onboarding-gate, verify-before-complete, minimal-safe-diff, profile-staleness, wrapper-freshness, surface-probe, session-register]
|
|
1350
1381
|
session_end: [chat-history, memory-learn, session-register, roadmap-progress, telemetry-flush]
|
|
1351
|
-
stop: [chat-history,
|
|
1382
|
+
stop: [chat-history, verify-before-complete, self-repair, session-register, roadmap-progress, design-pass-stop]
|
|
1352
1383
|
user_prompt_submit: [chat-history, verify-before-complete, minimal-safe-diff, language-mirror, git-authorization, session-canary, self-repair, session-register]
|
|
1353
1384
|
post_tool_use: [chat-history, roadmap-progress, context-hygiene, verify-before-complete, minimal-safe-diff, injection-scan, pr-url-reminder, push-settle, orchestration-record, telemetry-usage, tool-result-bytes, edit-shape, comment-discipline, design-pass]
|
|
1354
1385
|
|
|
@@ -1363,7 +1394,7 @@ platforms:
|
|
|
1363
1394
|
cline:
|
|
1364
1395
|
session_start: [chat-history, hot-context, handoff-context, session-canary, council-availability, telemetry-disclosure, first-run-gate, onboarding-gate, verify-before-complete, minimal-safe-diff, profile-staleness, wrapper-freshness, surface-probe, session-register]
|
|
1365
1396
|
session_end: [chat-history, memory-learn, session-register, roadmap-progress, telemetry-flush]
|
|
1366
|
-
stop: [chat-history,
|
|
1397
|
+
stop: [chat-history, verify-before-complete, self-repair, session-register, roadmap-progress, design-pass-stop]
|
|
1367
1398
|
user_prompt_submit: [chat-history, verify-before-complete, minimal-safe-diff, language-mirror, git-authorization, session-canary, self-repair, session-register]
|
|
1368
1399
|
post_tool_use: [chat-history, roadmap-progress, context-hygiene, verify-before-complete, minimal-safe-diff, injection-scan, pr-url-reminder, push-settle, orchestration-record, telemetry-usage, tool-result-bytes, edit-shape, comment-discipline, design-pass]
|
|
1369
1400
|
|
|
@@ -1381,7 +1412,7 @@ platforms:
|
|
|
1381
1412
|
# minimal-safe-diff is omitted entirely on Windsurf for the same reason.
|
|
1382
1413
|
windsurf:
|
|
1383
1414
|
session_start: [chat-history, hot-context, handoff-context, session-canary, council-availability, telemetry-disclosure, first-run-gate, onboarding-gate, verify-before-complete, profile-staleness, wrapper-freshness, surface-probe, session-register]
|
|
1384
|
-
stop: [chat-history,
|
|
1415
|
+
stop: [chat-history, verify-before-complete, self-repair, session-register, design-pass-stop]
|
|
1385
1416
|
# language-mirror IS bound here: unlike minimal-safe-diff it needs only the
|
|
1386
1417
|
# user_prompt_submit slot, which Windsurf has.
|
|
1387
1418
|
user_prompt_submit: [chat-history, verify-before-complete, language-mirror, git-authorization, session-canary, self-repair, session-register]
|
|
@@ -1399,7 +1430,7 @@ platforms:
|
|
|
1399
1430
|
gemini:
|
|
1400
1431
|
session_start: [chat-history, hot-context, handoff-context, session-canary, council-availability, telemetry-disclosure, first-run-gate, onboarding-gate, verify-before-complete, minimal-safe-diff, profile-staleness, wrapper-freshness, surface-probe, session-register]
|
|
1401
1432
|
session_end: [chat-history, memory-learn, session-register, roadmap-progress, telemetry-flush]
|
|
1402
|
-
stop: [chat-history,
|
|
1433
|
+
stop: [chat-history, verify-before-complete, self-repair, session-register, roadmap-progress, design-pass-stop]
|
|
1403
1434
|
user_prompt_submit: [chat-history, verify-before-complete, minimal-safe-diff, language-mirror, git-authorization, session-canary, self-repair, session-register]
|
|
1404
1435
|
post_tool_use: [chat-history, roadmap-progress, context-hygiene, verify-before-complete, minimal-safe-diff, injection-scan, pr-url-reminder, push-settle, orchestration-record, telemetry-usage, tool-result-bytes, edit-shape, comment-discipline, design-pass]
|
|
1405
1436
|
|
|
@@ -22,7 +22,13 @@
|
|
|
22
22
|
*
|
|
23
23
|
* Refuses: a Write/Edit/NotebookEdit (or cross-platform equivalent) whose
|
|
24
24
|
* target path introduces a **new** first-level directory under `agents/tmp/`
|
|
25
|
-
* or `agents/tmp.old/` whose name is not an opaque round identifier
|
|
25
|
+
* or `agents/tmp.old/` whose name is not an opaque round identifier — and a
|
|
26
|
+
* shell command carrying its path. Two narrowings bring the code closer to
|
|
27
|
+
* that sentence without classifying commands: a read tool's `file_path` is
|
|
28
|
+
* filtered by `_READ_ONLY_TOOLS`, and a directory name that is a GLOB over an
|
|
29
|
+
* acceptable one is not a creatable literal
|
|
30
|
+
* ({@link isGlobOverAcceptableInboxDir}). Both were judged unconditionally
|
|
31
|
+
* before, which is what refused a read command in this guard's own workflow.
|
|
26
32
|
*
|
|
27
33
|
* Allowed, deliberately:
|
|
28
34
|
*
|
|
@@ -62,6 +68,7 @@ import * as path from 'node:path';
|
|
|
62
68
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
63
69
|
|
|
64
70
|
import { isNonHarvestTmpDir, isOpaqueRoundId } from '../_lib/source_shape.js';
|
|
71
|
+
import { invokedSegments } from './git_command_classifier.js';
|
|
65
72
|
import { readHookStdin } from './hook_stdin.js';
|
|
66
73
|
|
|
67
74
|
const _HERE = fileURLToPath(import.meta.url);
|
|
@@ -76,10 +83,146 @@ const _PATH_KEYS: readonly string[] = [
|
|
|
76
83
|
'file_path', 'path', 'target_file', 'filename', 'filePath', 'notebook_path',
|
|
77
84
|
];
|
|
78
85
|
|
|
86
|
+
/**
|
|
87
|
+
* Tools whose `file_path` names something to READ, never something to write.
|
|
88
|
+
*
|
|
89
|
+
* `_PATH_KEYS` covers `file_path` and `path`, which is exactly what a Read,
|
|
90
|
+
* Grep or Glob call carries — so a search under a speaking round that does not
|
|
91
|
+
* exist yet was refused by a guard whose own docstring scopes itself to
|
|
92
|
+
* `Write/Edit/NotebookEdit`. Filtering here rather than through the manifest's
|
|
93
|
+
* `tools:` key on purpose: that key is an exact match on the host's own tool
|
|
94
|
+
* name, so an allowlist written in Claude's vocabulary would silence this
|
|
95
|
+
* guard on every host that spells its write tools differently. A DENY-list of
|
|
96
|
+
* read tools fails the other way — an unrecognised tool is still judged.
|
|
97
|
+
*
|
|
98
|
+
* An envelope with no tool name is judged too, for the same reason
|
|
99
|
+
* `_concern_matches_tool` runs a concern when the field is absent: a key that
|
|
100
|
+
* cannot decide must not be what silences a blocking guard.
|
|
101
|
+
*/
|
|
102
|
+
const _READ_ONLY_TOOLS: ReadonlySet<string> = new Set([
|
|
103
|
+
'read', 'grep', 'glob', 'notebookread', 'ls', 'view', 'search',
|
|
104
|
+
'codebase-retrieval', 'codebase_retrieval', 'file_search', 'grep_search',
|
|
105
|
+
'read_file', 'list_dir', 'semantic_search',
|
|
106
|
+
]);
|
|
107
|
+
|
|
79
108
|
function _isObject(v: JsonValue | undefined): v is JsonObject {
|
|
80
109
|
return v !== null && v !== undefined && typeof v === 'object' && !Array.isArray(v);
|
|
81
110
|
}
|
|
82
111
|
|
|
112
|
+
/**
|
|
113
|
+
* A directory name that is a GLOB over an already-acceptable name.
|
|
114
|
+
*
|
|
115
|
+
* READING IS NOT CREATING, AND THE COMMAND SCAN DID NOT KNOW IT. Measured
|
|
116
|
+
* twice in one session while running the inbox flow over a real round:
|
|
117
|
+
* `ls -d agents/tmp/inbox-2026-09-*` — the command the naming rule tells an
|
|
118
|
+
* operator to run to find a free round identifier — was refused, because the
|
|
119
|
+
* scan in `main` offered every whitespace token to the same verdict that judges
|
|
120
|
+
* a Write target and `inbox-2026-09-*` is not an opaque identifier: the `*`
|
|
121
|
+
* fails the 1-3 char disambiguator. So the guard stood between the operator and
|
|
122
|
+
* the rule it exists to enforce.
|
|
123
|
+
*
|
|
124
|
+
* WHY THIS AXIS AND NOT THE VERB. The first two attempts classified the
|
|
125
|
+
* COMMAND — an allowlist of read-only verbs, then per-verb writing markers.
|
|
126
|
+
* Two rounds of neutral review took that apart from both ends: round 1 found
|
|
127
|
+
* `sed -i`, `find -exec` and `awk system()` allowed where the plain token scan
|
|
128
|
+
* had blocked them; round 2 found the siblings the resulting deny-list did not
|
|
129
|
+
* reach (`sed`'s `s///w`, `awk`'s output pipe, `sort -o`, `yq -i`), a false
|
|
130
|
+
* positive the awk marker reintroduced by running past the program into a shell
|
|
131
|
+
* redirect, mention-blocking on heredoc bodies, and a fail-OPEN when the
|
|
132
|
+
* segmenter returned nothing. Its handoff named the shape of the problem:
|
|
133
|
+
* *"3 and 5 pull in opposite directions, so patching them one probe at a time
|
|
134
|
+
* will keep oscillating."*
|
|
135
|
+
*
|
|
136
|
+
* It was the wrong axis, and the measured defect never needed it. What is
|
|
137
|
+
* actually decidable from the token alone is whether the name could be created
|
|
138
|
+
* AS WRITTEN, and a glob cannot: the shell expands it against what exists. The
|
|
139
|
+
* one thing that could — `mkdir 'inbox-2026-09-*'`, creating a literal
|
|
140
|
+
* directory with a `*` in it — produces a name this predicate accepts anyway,
|
|
141
|
+
* because its non-glob part is opaque and carries no source. So the carve-out
|
|
142
|
+
* is safe by construction rather than by enumeration, and every writing form
|
|
143
|
+
* above is judged again by the unchanged token scan.
|
|
144
|
+
*
|
|
145
|
+
* A pattern over a SPEAKING name (`my-source-*`) is not accepted: the glob
|
|
146
|
+
* characters are removed and the remainder must itself pass.
|
|
147
|
+
*/
|
|
148
|
+
function isGlobOverAcceptableInboxDir(name: string): boolean {
|
|
149
|
+
if (!/[*?[\]]/.test(name)) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
const literal = name.replace(/[*?]|\[[^\]]*\]/g, '');
|
|
153
|
+
const trimmed = literal.replace(/-+$/, '');
|
|
154
|
+
return trimmed !== '' && isAcceptableInboxDir(trimmed);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* The paths a redirect inside one segment would create.
|
|
159
|
+
*
|
|
160
|
+
* `splitOutsideQuotes` treats `;`, `|`, `&` and newline as separators and `>`
|
|
161
|
+
* as ordinary text, so a redirect target stays inside its segment. Collected
|
|
162
|
+
* separately from the token scan because the quotes matter: the token split
|
|
163
|
+
* removes them, this does not, and both inbox regexes need `agents` at a `/`
|
|
164
|
+
* or at the start — so `> "agents/tmp/<name>/x"` read as not-an-inbox-path
|
|
165
|
+
* until the strip below. Also run over the RAW command, because the heredoc
|
|
166
|
+
* regex in `invokedSegments` swallows a redirect that follows the delimiter.
|
|
167
|
+
*/
|
|
168
|
+
function _redirectTargets(segment: string): string[] {
|
|
169
|
+
const out: string[] = [];
|
|
170
|
+
const re = /(?:^|[^0-9<>&])[0-9]*>>?\s*([^\s|&;<>]+)/g;
|
|
171
|
+
let m: RegExpExecArray | null = re.exec(segment);
|
|
172
|
+
while (m !== null) {
|
|
173
|
+
// The character class stops at whitespace and separators but NOT at a
|
|
174
|
+
// quote, while both inbox regexes require `agents` at a `/` or at the
|
|
175
|
+
// start of the string. So `> "agents/tmp/<name>/x"` came back as
|
|
176
|
+
// `"agents/tmp/…` and read as not-an-inbox-path — allowed, where the
|
|
177
|
+
// unquoted form blocked. A neutral review probed it; stripping the
|
|
178
|
+
// quotes is the whole fix.
|
|
179
|
+
const target = (m[1] ?? '').replace(/^['"`]+|['"`]+$/g, '');
|
|
180
|
+
if (target) {
|
|
181
|
+
out.push(target);
|
|
182
|
+
}
|
|
183
|
+
m = re.exec(segment);
|
|
184
|
+
}
|
|
185
|
+
return out;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* The tokens of a shell command whose CREATION this guard should judge.
|
|
190
|
+
*
|
|
191
|
+
* Every whitespace token, exactly as before this change — the classification
|
|
192
|
+
* that tried to be cleverer than this is gone, and the docstring on
|
|
193
|
+
* {@link isGlobOverAcceptableInboxDir} records why. The two things kept are
|
|
194
|
+
* the ones no review disputed: the RAW command is scanned as well, because
|
|
195
|
+
* `invokedSegments` strips heredoc bodies as data and a `python3 - <<PY` body
|
|
196
|
+
* calling `makedirs` is precisely this guard's input; and redirect targets are
|
|
197
|
+
* collected separately with their quotes stripped, because `>` is not a
|
|
198
|
+
* segment separator and `> "path"` otherwise read as not-a-path.
|
|
199
|
+
*
|
|
200
|
+
* Scanning the raw command in addition to the segments is deliberately
|
|
201
|
+
* redundant rather than conditional: a heredoc predicate is one more thing to
|
|
202
|
+
* get wrong, the extra tokens can only ever matter if one of them names a
|
|
203
|
+
* speaking inbox directory, and the mention-blocking a review found came from
|
|
204
|
+
* the read-only SKIP being dropped for heredocs — not from the extra scan.
|
|
205
|
+
*
|
|
206
|
+
* Exported so the harness can pin the polarity pair on the tokens themselves,
|
|
207
|
+
* without an envelope.
|
|
208
|
+
*/
|
|
209
|
+
export function creatableTokens(command: string): string[] {
|
|
210
|
+
const out: string[] = [];
|
|
211
|
+
const segments = invokedSegments(command);
|
|
212
|
+
for (const seg of segments) {
|
|
213
|
+
out.push(..._redirectTargets(seg));
|
|
214
|
+
}
|
|
215
|
+
out.push(..._redirectTargets(command));
|
|
216
|
+
for (const text of [...segments, command]) {
|
|
217
|
+
for (const tok of text.split(/[\s"'`(){};|&<>]+/)) {
|
|
218
|
+
if (tok) {
|
|
219
|
+
out.push(tok);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return out;
|
|
224
|
+
}
|
|
225
|
+
|
|
83
226
|
/** `agents/tmp/<name>/…` or `agents/tmp.old/<name>/…`, after normalisation. */
|
|
84
227
|
const INBOX_RE = /(?:^|\/)agents\/tmp(?:\.old)?\/([^/]+)\/./;
|
|
85
228
|
|
|
@@ -145,6 +288,9 @@ export function verdictFor(
|
|
|
145
288
|
if (isAcceptableInboxDir(dir)) {
|
|
146
289
|
return { block: false, dir, reason: 'opaque round identifier or named working set' };
|
|
147
290
|
}
|
|
291
|
+
if (isGlobOverAcceptableInboxDir(dir)) {
|
|
292
|
+
return { block: false, dir, reason: 'glob over an acceptable name — not a creatable literal' };
|
|
293
|
+
}
|
|
148
294
|
// Already created — a rename is the fix, and refusing every later write
|
|
149
295
|
// would wedge the round without removing the name.
|
|
150
296
|
//
|
|
@@ -153,17 +299,36 @@ export function verdictFor(
|
|
|
153
299
|
// `agents/tmp-notes/` and `agents/tmpfiles/`, and taking the FIRST
|
|
154
300
|
// occurrence meant a path carrying a decoy earlier segment probed the wrong
|
|
155
301
|
// directory — in either direction. Found by the R2 review of this branch.
|
|
302
|
+
// THE CAPTURE CARRIES THE PATH'S OWN PREFIX, and it did not. Anchoring the
|
|
303
|
+
// group at `agents/` discarded everything before it, so a nested inbox —
|
|
304
|
+
// `app/Modules/<m>/agents/tmp/<round>/…`, the shape a module-per-package
|
|
305
|
+
// tree produces — probed `<repoRoot>/agents/tmp/<round>`, a directory that
|
|
306
|
+
// does not exist. The already-exists carve-out could therefore never fire
|
|
307
|
+
// there, and every write into a nested speaking round was refused forever
|
|
308
|
+
// instead of once.
|
|
309
|
+
//
|
|
310
|
+
// The prefix group is `??` — optional AND preferring ABSENT — and that is
|
|
311
|
+
// the half a neutral review had to point out. A greedy `(?:.*\/)?`
|
|
312
|
+
// resolves to the LAST inbox segment in the path while `inboxDirName`
|
|
313
|
+
// reads the FIRST, so a path carrying two of them judged one directory and
|
|
314
|
+
// probed another, reporting "already exists" for a name that does not.
|
|
315
|
+
// Making only `.*` lazy is NOT enough: `(...)?` still prefers one
|
|
316
|
+
// repetition, so the engine grows the prefix rather than trying the
|
|
317
|
+
// no-prefix branch, and the long match wins anyway — the test for this
|
|
318
|
+
// caught exactly that. `??` tries no-prefix first, so both reads agree.
|
|
319
|
+
// The decoy case below still resolves: `agents/tmp-notes/` fails the `/`
|
|
320
|
+
// after `tmp`, so the no-prefix branch is rejected and the match advances.
|
|
156
321
|
const normalized = filePath.replace(/\\/g, '/').replace(/^(\.\/)+/, '');
|
|
157
322
|
const m =
|
|
158
|
-
|
|
159
|
-
|
|
323
|
+
/^((?:.*?\/)??agents\/tmp(?:\.old)?\/[^/]+)\//.exec(normalized) ??
|
|
324
|
+
/^((?:.*?\/)??agents\/tmp(?:\.old)?\/[^/.]+)\/?$/.exec(normalized);
|
|
160
325
|
if (m === null) {
|
|
161
326
|
// `inboxDirName` matched but this did not — treat as unattributable and
|
|
162
327
|
// BLOCK, since the name is speaking and we cannot prove it pre-exists.
|
|
163
328
|
return { block: true, dir, reason: 'new inbox directory with a speaking name (path not re-anchorable)' };
|
|
164
329
|
}
|
|
165
330
|
const upto = m[1] as string;
|
|
166
|
-
const probe = repoRoot === '' ? upto : path.join(repoRoot, upto);
|
|
331
|
+
const probe = repoRoot === '' || path.isAbsolute(upto) ? upto : path.join(repoRoot, upto);
|
|
167
332
|
if (exists(probe)) {
|
|
168
333
|
return { block: false, dir, reason: 'directory already exists — rename, do not re-refuse' };
|
|
169
334
|
}
|
|
@@ -216,11 +381,15 @@ export function main(): number {
|
|
|
216
381
|
return 0;
|
|
217
382
|
}
|
|
218
383
|
const repoRoot = typeof envelope['project_dir'] === 'string' ? envelope['project_dir'] : '';
|
|
384
|
+
const rawTool = payload['tool_name'] ?? envelope['tool_name'];
|
|
385
|
+
const toolName = typeof rawTool === 'string' ? rawTool.trim().toLowerCase() : '';
|
|
219
386
|
const candidates: string[] = [];
|
|
220
|
-
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
387
|
+
if (!_READ_ONLY_TOOLS.has(toolName)) {
|
|
388
|
+
for (const key of _PATH_KEYS) {
|
|
389
|
+
const v = ti[key];
|
|
390
|
+
if (typeof v === 'string' && v) {
|
|
391
|
+
candidates.push(v);
|
|
392
|
+
}
|
|
224
393
|
}
|
|
225
394
|
}
|
|
226
395
|
// A shell command creates the directory just as effectively as a Write,
|
|
@@ -228,16 +397,13 @@ export function main(): number {
|
|
|
228
397
|
// agents/tmp/<speaking-name>`, a `git mv` into one, or a redirect
|
|
229
398
|
// bypassed it entirely. Both siblings on this slot (`block_no_verify`,
|
|
230
399
|
// `block_kernel_rule_writes`) parse the command string; this one did
|
|
231
|
-
// not, and the R2 review of this branch caught it.
|
|
232
|
-
//
|
|
233
|
-
// decision logic is shared rather than duplicated
|
|
400
|
+
// not, and the R2 review of this branch caught it. The tokens that
|
|
401
|
+
// could CREATE something are offered to the same pure verdict, so the
|
|
402
|
+
// decision logic is shared rather than duplicated — see
|
|
403
|
+
// `creatableTokens` for why "every whitespace token" was too many.
|
|
234
404
|
const cmd = ti['command'] ?? (_isObject(envelope['payload']) ? (envelope['payload'] as JsonObject)['command'] : undefined);
|
|
235
405
|
if (typeof cmd === 'string' && cmd) {
|
|
236
|
-
|
|
237
|
-
if (tok) {
|
|
238
|
-
candidates.push(tok);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
406
|
+
candidates.push(...creatableTokens(cmd));
|
|
241
407
|
}
|
|
242
408
|
for (const v of candidates) {
|
|
243
409
|
const verdict = verdictFor(v, (p) => fs.existsSync(p), repoRoot);
|
|
@@ -57,7 +57,7 @@ const PATH_KEYS: readonly string[] = [
|
|
|
57
57
|
* tries to parse past them is a shell parser with a security boundary attached.
|
|
58
58
|
* Refusing the whole shape is both smaller and correct.
|
|
59
59
|
*/
|
|
60
|
-
const SHELL_METACHARACTERS = /[;&|`$><\n\r(){}\\]/;
|
|
60
|
+
export const SHELL_METACHARACTERS = /[;&|`$><\n\r(){}\\]/;
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
63
|
* Words naming a consequence operation, matched as whole tokens anywhere in
|