@event4u/agent-config 2.25.0 → 3.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/.agent-src/commands/agent-handoff.md +15 -3
- package/.agent-src/commands/agent-status.md +12 -0
- package/.agent-src/commands/agents/audit.md +12 -0
- package/.agent-src/commands/agents/init.md +12 -0
- package/.agent-src/commands/agents/optimize.md +12 -0
- package/.agent-src/commands/agents/user/accept.md +12 -0
- package/.agent-src/commands/agents/user/init.md +12 -0
- package/.agent-src/commands/agents/user/review.md +12 -0
- package/.agent-src/commands/agents/user/show.md +12 -0
- package/.agent-src/commands/agents/user/update.md +12 -0
- package/.agent-src/commands/agents/user.md +12 -0
- package/.agent-src/commands/agents.md +12 -0
- package/.agent-src/commands/analyze-reference-repo.md +15 -3
- package/.agent-src/commands/bug-fix.md +13 -0
- package/.agent-src/commands/bug-investigate.md +13 -1
- package/.agent-src/commands/challenge-me/vision.md +12 -0
- package/.agent-src/commands/challenge-me/with-docs.md +12 -0
- package/.agent-src/commands/challenge-me.md +12 -0
- package/.agent-src/commands/chat-history/import.md +16 -4
- package/.agent-src/commands/chat-history/learn.md +15 -3
- package/.agent-src/commands/chat-history/show.md +17 -5
- package/.agent-src/commands/chat-history.md +14 -2
- package/.agent-src/commands/check-current-md.md +12 -0
- package/.agent-src/commands/commit/in-chunks.md +12 -0
- package/.agent-src/commands/commit.md +12 -0
- package/.agent-src/commands/compress.md +12 -0
- package/.agent-src/commands/context/create.md +17 -5
- package/.agent-src/commands/context/refactor.md +15 -3
- package/.agent-src/commands/context.md +12 -0
- package/.agent-src/commands/cost-report.md +12 -0
- package/.agent-src/commands/council/analysis.md +15 -3
- package/.agent-src/commands/council/debate.md +17 -5
- package/.agent-src/commands/council/default.md +17 -5
- package/.agent-src/commands/council/design.md +12 -0
- package/.agent-src/commands/council/optimize.md +12 -0
- package/.agent-src/commands/council/pr.md +12 -0
- package/.agent-src/commands/council.md +13 -1
- package/.agent-src/commands/create-pr/description-only.md +12 -0
- package/.agent-src/commands/create-pr.md +39 -0
- package/.agent-src/commands/e2e-heal.md +12 -0
- package/.agent-src/commands/e2e-plan.md +12 -0
- package/.agent-src/commands/estimate-ticket.md +12 -0
- package/.agent-src/commands/feature/dev.md +13 -1
- package/.agent-src/commands/feature/explore.md +12 -0
- package/.agent-src/commands/feature/plan.md +14 -2
- package/.agent-src/commands/feature/refactor.md +12 -0
- package/.agent-src/commands/feature/roadmap.md +14 -2
- package/.agent-src/commands/feature.md +12 -0
- package/.agent-src/commands/fix/ci.md +12 -0
- package/.agent-src/commands/fix/portability.md +12 -0
- package/.agent-src/commands/fix/pr-bot-comments.md +12 -0
- package/.agent-src/commands/fix/pr-comments.md +12 -0
- package/.agent-src/commands/fix/pr-developer-comments.md +12 -0
- package/.agent-src/commands/fix/refs.md +12 -0
- package/.agent-src/commands/fix/seeder.md +15 -2
- package/.agent-src/commands/fix.md +12 -0
- package/.agent-src/commands/ghostwriter/delete.md +20 -8
- package/.agent-src/commands/ghostwriter/fetch.md +19 -7
- package/.agent-src/commands/ghostwriter/list.md +19 -7
- package/.agent-src/commands/ghostwriter/show.md +14 -2
- package/.agent-src/commands/ghostwriter/write.md +15 -3
- package/.agent-src/commands/ghostwriter.md +14 -2
- package/.agent-src/commands/grill-me.md +12 -0
- package/.agent-src/commands/implement-ticket.md +12 -0
- package/.agent-src/commands/jira-ticket.md +12 -0
- package/.agent-src/commands/judge/on-diff.md +12 -0
- package/.agent-src/commands/judge/solo.md +12 -0
- package/.agent-src/commands/judge/steps.md +12 -0
- package/.agent-src/commands/judge.md +12 -0
- package/.agent-src/commands/memory/add.md +15 -3
- package/.agent-src/commands/memory/learn-low-impact.md +18 -6
- package/.agent-src/commands/memory/load.md +12 -0
- package/.agent-src/commands/memory/mine-session.md +12 -0
- package/.agent-src/commands/memory/promote.md +12 -0
- package/.agent-src/commands/memory/propose.md +12 -0
- package/.agent-src/commands/memory.md +12 -0
- package/.agent-src/commands/mode.md +12 -0
- package/.agent-src/commands/module/create.md +13 -0
- package/.agent-src/commands/module/explore.md +23 -7
- package/.agent-src/commands/module.md +12 -0
- package/.agent-src/commands/optimize/agents-dir.md +14 -2
- package/.agent-src/commands/optimize/augmentignore.md +64 -20
- package/.agent-src/commands/optimize/rtk.md +68 -30
- package/.agent-src/commands/optimize/skills.md +12 -0
- package/.agent-src/commands/optimize-prompt.md +12 -0
- package/.agent-src/commands/optimize.md +12 -0
- package/.agent-src/commands/orchestrate.md +13 -1
- package/.agent-src/commands/override/create.md +12 -0
- package/.agent-src/commands/override/manage.md +12 -0
- package/.agent-src/commands/override.md +12 -0
- package/.agent-src/commands/package-reset.md +12 -0
- package/.agent-src/commands/package-test.md +98 -10
- package/.agent-src/commands/post-as/ghostwriter.md +12 -0
- package/.agent-src/commands/post-as/me.md +13 -1
- package/.agent-src/commands/post-as.md +12 -0
- package/.agent-src/commands/prepare-for-review.md +12 -0
- package/.agent-src/commands/project-analyze.md +27 -15
- package/.agent-src/commands/project-health.md +13 -1
- package/.agent-src/commands/quality-fix.md +61 -27
- package/.agent-src/commands/refine-ticket.md +12 -0
- package/.agent-src/commands/research/deep.md +12 -0
- package/.agent-src/commands/research/report.md +12 -0
- package/.agent-src/commands/research.md +12 -0
- package/.agent-src/commands/review-changes.md +12 -0
- package/.agent-src/commands/review-routing.md +12 -0
- package/.agent-src/commands/roadmap/ai-council.md +15 -3
- package/.agent-src/commands/roadmap/create.md +13 -1
- package/.agent-src/commands/roadmap/process-full.md +12 -0
- package/.agent-src/commands/roadmap/process-phase.md +12 -0
- package/.agent-src/commands/roadmap/process-step.md +12 -0
- package/.agent-src/commands/roadmap.md +12 -0
- package/.agent-src/commands/rule-compliance-audit.md +12 -0
- package/.agent-src/commands/set-cost-profile.md +12 -0
- package/.agent-src/commands/sync-agent-settings.md +12 -0
- package/.agent-src/commands/sync-gitignore/fix.md +32 -13
- package/.agent-src/commands/sync-gitignore.md +13 -1
- package/.agent-src/commands/tests/create.md +12 -0
- package/.agent-src/commands/tests/execute.md +12 -0
- package/.agent-src/commands/tests.md +12 -0
- package/.agent-src/commands/threat-model.md +12 -0
- package/.agent-src/commands/update-form-request-messages.md +14 -1
- package/.agent-src/commands/upstream-contribute.md +12 -0
- package/.agent-src/commands/video/from-script.md +12 -0
- package/.agent-src/commands/video/scene.md +12 -0
- package/.agent-src/commands/video/stitch.md +13 -1
- package/.agent-src/commands/video/storyboard.md +12 -0
- package/.agent-src/commands/video.md +12 -0
- package/.agent-src/commands/work.md +12 -0
- package/.agent-src/contexts/augment-infrastructure.md +6 -9
- package/.agent-src/contexts/authority/scope-mechanics.md +11 -0
- package/.agent-src/contexts/communication/rules-auto/guidelines-mechanics.md +1 -1
- package/.agent-src/contexts/contracts/agents-md-anatomy.md +1 -1
- package/.agent-src/contexts/contracts/research-schema.md +1 -1
- package/.agent-src/contexts/documentation-hierarchy.md +2 -2
- package/.agent-src/contexts/execution/interrupt-examples.md +34 -0
- package/.agent-src/contexts/execution/roadmap-process-loop.md +19 -0
- package/.agent-src/contexts/skills-and-commands.md +2 -2
- package/.agent-src/ghostwriter/README.md +2 -2
- package/.agent-src/ghostwriter/fictional-fixture-v1.md +1 -1
- package/.agent-src/personas/README.md +1 -1
- package/.agent-src/personas/advisors/contrarian.md +1 -1
- package/.agent-src/personas/advisors/executor.md +1 -1
- package/.agent-src/personas/advisors/expansionist.md +1 -1
- package/.agent-src/personas/advisors/first-principles.md +1 -1
- package/.agent-src/personas/advisors/outsider.md +1 -1
- package/.agent-src/rules/agent-authority.md +12 -0
- package/.agent-src/rules/analysis-skill-routing.md +12 -0
- package/.agent-src/rules/architecture.md +37 -11
- package/.agent-src/rules/artifact-drafting-protocol.md +19 -1
- package/.agent-src/rules/artifact-engagement-recording.md +13 -1
- package/.agent-src/rules/ask-when-uncertain.md +12 -0
- package/.agent-src/rules/augment-edit-discipline.md +40 -0
- package/.agent-src/rules/augment-source-of-truth.md +15 -3
- package/.agent-src/rules/autonomous-execution.md +44 -1
- package/.agent-src/rules/caveman-speak.md +13 -1
- package/.agent-src/rules/cli-output-handling.md +13 -1
- package/.agent-src/rules/command-suggestion-policy.md +13 -1
- package/.agent-src/rules/commit-conventions.md +13 -1
- package/.agent-src/rules/commit-policy.md +12 -0
- package/.agent-src/rules/context-hygiene.md +16 -4
- package/.agent-src/rules/copilot-routing.md +13 -1
- package/.agent-src/rules/devcontainer-routing.md +13 -1
- package/.agent-src/rules/direct-answers.md +12 -0
- package/.agent-src/rules/docker-commands.md +13 -1
- package/.agent-src/rules/domain-adoption-policy.md +21 -10
- package/.agent-src/rules/domain-safety-disclaimer.md +126 -0
- package/.agent-src/rules/domain-safety-pii.md +154 -0
- package/.agent-src/rules/domain-safety-retention.md +98 -0
- package/.agent-src/rules/downstream-changes.md +17 -5
- package/.agent-src/rules/external-reference-deep-dive.md +13 -1
- package/.agent-src/rules/fast-path-marker-visibility.md +21 -1
- package/.agent-src/rules/framework-neutrality-in-generic-skills.md +142 -0
- package/.agent-src/rules/git-history-discipline.md +111 -0
- package/.agent-src/rules/guidelines.md +12 -0
- package/.agent-src/rules/improve-before-implement.md +13 -1
- package/.agent-src/rules/invite-challenge.md +13 -1
- package/.agent-src/rules/language-and-tone.md +12 -0
- package/.agent-src/rules/laravel-routing.md +13 -1
- package/.agent-src/rules/laravel-translations.md +13 -1
- package/.agent-src/rules/low-impact-corpus-privacy-floor.md +17 -5
- package/.agent-src/rules/markdown-safe-codeblocks.md +13 -1
- package/.agent-src/rules/media-governance-routing.md +27 -15
- package/.agent-src/rules/minimal-safe-diff.md +19 -1
- package/.agent-src/rules/missing-tool-handling.md +13 -1
- package/.agent-src/rules/model-recommendation.md +13 -1
- package/.agent-src/rules/no-attribution-footers.md +13 -1
- package/.agent-src/rules/no-cheap-questions.md +12 -0
- package/.agent-src/rules/no-roadmap-references.md +32 -18
- package/.agent-src/rules/non-destructive-by-default.md +12 -0
- package/.agent-src/rules/onboarding-gate.md +19 -6
- package/.agent-src/rules/package-ci-checks.md +12 -0
- package/.agent-src/rules/persona-governance.md +13 -1
- package/.agent-src/rules/php-coding.md +13 -1
- package/.agent-src/rules/preservation-guard.md +13 -1
- package/.agent-src/rules/provider-lifecycle-discipline.md +14 -2
- package/.agent-src/rules/reviewer-awareness.md +13 -1
- package/.agent-src/rules/roadmap-ci-steps-policy.md +13 -1
- package/.agent-src/rules/roadmap-progress-sync.md +18 -1
- package/.agent-src/rules/role-mode-adherence.md +13 -1
- package/.agent-src/rules/rule-type-governance.md +13 -1
- package/.agent-src/rules/runtime-safety.md +13 -1
- package/.agent-src/rules/scope-control.md +12 -0
- package/.agent-src/rules/security-sensitive-stop.md +13 -1
- package/.agent-src/rules/size-enforcement.md +12 -0
- package/.agent-src/rules/skill-improvement-trigger.md +13 -1
- package/.agent-src/rules/skill-quality.md +13 -1
- package/.agent-src/rules/slash-command-routing-policy.md +13 -1
- package/.agent-src/rules/symfony-routing.md +13 -1
- package/.agent-src/rules/think-before-action.md +13 -1
- package/.agent-src/rules/token-efficiency.md +13 -1
- package/.agent-src/rules/token-optimizer-maintenance.md +12 -0
- package/.agent-src/rules/tool-safety.md +13 -1
- package/.agent-src/rules/ui-audit-gate.md +13 -1
- package/.agent-src/rules/upstream-proposal.md +13 -1
- package/.agent-src/rules/user-interaction.md +13 -1
- package/.agent-src/rules/user-interrupt-priority.md +58 -0
- package/.agent-src/rules/verify-before-complete.md +23 -2
- package/.agent-src/skills/accessibility-auditor/SKILL.md +12 -0
- package/.agent-src/skills/activation-design/SKILL.md +12 -0
- package/.agent-src/skills/adr-create/SKILL.md +12 -0
- package/.agent-src/skills/adversarial-review/SKILL.md +13 -1
- package/.agent-src/skills/agent-docs-writing/SKILL.md +16 -4
- package/.agent-src/skills/agents-md-thin-root/SKILL.md +14 -2
- package/.agent-src/skills/ai-council/SKILL.md +29 -15
- package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +12 -0
- package/.agent-src/skills/analysis-skill-router/SKILL.md +12 -0
- package/.agent-src/skills/api-design/SKILL.md +13 -3
- package/.agent-src/skills/api-endpoint/SKILL.md +70 -154
- package/.agent-src/skills/api-testing/SKILL.md +23 -0
- package/.agent-src/skills/architecture-review-lens/SKILL.md +12 -0
- package/.agent-src/skills/artisan-commands/SKILL.md +12 -0
- package/.agent-src/skills/async-python-patterns/SKILL.md +13 -1
- package/.agent-src/skills/authz-review/SKILL.md +12 -2
- package/.agent-src/skills/aws-infrastructure/SKILL.md +12 -0
- package/.agent-src/skills/blade-ui/SKILL.md +12 -0
- package/.agent-src/skills/blast-radius-analyzer/SKILL.md +12 -0
- package/.agent-src/skills/bug-analyzer/SKILL.md +14 -2
- package/.agent-src/skills/build-buy-partner/SKILL.md +12 -0
- package/.agent-src/skills/canvas-design/SKILL.md +12 -0
- package/.agent-src/skills/character-consistency/SKILL.md +23 -11
- package/.agent-src/skills/check-refs/SKILL.md +12 -0
- package/.agent-src/skills/churn-prevention/SKILL.md +12 -0
- package/.agent-src/skills/code-refactoring/SKILL.md +52 -34
- package/.agent-src/skills/code-review/SKILL.md +53 -36
- package/.agent-src/skills/command-routing/SKILL.md +12 -0
- package/.agent-src/skills/command-writing/SKILL.md +14 -2
- package/.agent-src/skills/comp-banding/SKILL.md +12 -0
- package/.agent-src/skills/competitive-moat-analysis/SKILL.md +12 -2
- package/.agent-src/skills/competitive-positioning/SKILL.md +12 -2
- package/.agent-src/skills/composer-packages/SKILL.md +12 -0
- package/.agent-src/skills/compress-memory/SKILL.md +12 -0
- package/.agent-src/skills/content-funnel-design/SKILL.md +12 -2
- package/.agent-src/skills/context-authoring/SKILL.md +19 -7
- package/.agent-src/skills/context-document/SKILL.md +17 -5
- package/.agent-src/skills/contracts-cognition/SKILL.md +12 -2
- package/.agent-src/skills/conventional-commits-writing/SKILL.md +12 -0
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +13 -1
- package/.agent-src/skills/copilot-config/SKILL.md +12 -0
- package/.agent-src/skills/customer-research/SKILL.md +12 -0
- package/.agent-src/skills/dashboard-design/SKILL.md +13 -2
- package/.agent-src/skills/data-flow-mapper/SKILL.md +12 -0
- package/.agent-src/skills/data-handling-judgment/SKILL.md +12 -2
- package/.agent-src/skills/database/SKILL.md +22 -5
- package/.agent-src/skills/dcf-modeling/SKILL.md +12 -2
- package/.agent-src/skills/deal-qualification-meddic/SKILL.md +12 -2
- package/.agent-src/skills/decision-record/SKILL.md +12 -0
- package/.agent-src/skills/deep-reading-analyst/SKILL.md +12 -0
- package/.agent-src/skills/defense-in-depth/SKILL.md +13 -1
- package/.agent-src/skills/dependency-upgrade/SKILL.md +77 -19
- package/.agent-src/skills/description-assist/SKILL.md +12 -0
- package/.agent-src/skills/design-review/SKILL.md +12 -0
- package/.agent-src/skills/devcontainer/SKILL.md +12 -0
- package/.agent-src/skills/developer-like-execution/SKILL.md +37 -14
- package/.agent-src/skills/discovery-interview/SKILL.md +12 -2
- package/.agent-src/skills/doc-coauthoring/SKILL.md +12 -0
- package/.agent-src/skills/docker/SKILL.md +12 -0
- package/.agent-src/skills/editorial-calendar/SKILL.md +12 -2
- package/.agent-src/skills/eloquent/SKILL.md +13 -1
- package/.agent-src/skills/eloquent/evals/triggers.json +1 -1
- package/.agent-src/skills/error-handling-patterns/SKILL.md +13 -1
- package/.agent-src/skills/estimate-ticket/SKILL.md +12 -0
- package/.agent-src/skills/existing-ui-audit/SKILL.md +12 -0
- package/.agent-src/skills/expansion-playbook/SKILL.md +12 -0
- package/.agent-src/skills/fe-design/SKILL.md +12 -0
- package/.agent-src/skills/feature-planning/SKILL.md +13 -1
- package/.agent-src/skills/file-editor/SKILL.md +57 -19
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +14 -2
- package/.agent-src/skills/flux/SKILL.md +12 -0
- package/.agent-src/skills/forecast-accuracy/SKILL.md +12 -2
- package/.agent-src/skills/forecasting/SKILL.md +12 -2
- package/.agent-src/skills/form-handler/SKILL.md +12 -0
- package/.agent-src/skills/fundraising-narrative/SKILL.md +12 -2
- package/.agent-src/skills/funnel-analysis/SKILL.md +12 -0
- package/.agent-src/skills/git-workflow/SKILL.md +16 -4
- package/.agent-src/skills/github-ci/SKILL.md +12 -0
- package/.agent-src/skills/grafana/SKILL.md +12 -0
- package/.agent-src/skills/gtm-launch/SKILL.md +12 -2
- package/.agent-src/skills/guideline-writing/SKILL.md +12 -0
- package/.agent-src/skills/hiring-loop-design/SKILL.md +12 -0
- package/.agent-src/skills/incident-commander/SKILL.md +12 -2
- package/.agent-src/skills/jira-integration/SKILL.md +12 -0
- package/.agent-src/skills/jobs-events/SKILL.md +12 -0
- package/.agent-src/skills/judge-bug-hunter/SKILL.md +12 -0
- package/.agent-src/skills/judge-code-quality/SKILL.md +12 -0
- package/.agent-src/skills/judge-security-auditor/SKILL.md +12 -0
- package/.agent-src/skills/judge-test-coverage/SKILL.md +12 -0
- package/.agent-src/skills/laravel/SKILL.md +12 -0
- package/.agent-src/skills/laravel-api-endpoint/SKILL.md +199 -0
- package/.agent-src/skills/{dto-creator → laravel-dto}/SKILL.md +19 -6
- package/.agent-src/skills/laravel-horizon/SKILL.md +12 -0
- package/.agent-src/skills/laravel-mail/SKILL.md +12 -0
- package/.agent-src/skills/laravel-middleware/SKILL.md +12 -0
- package/.agent-src/skills/{migration-creator → laravel-migration}/SKILL.md +23 -10
- package/.agent-src/skills/laravel-notifications/SKILL.md +12 -0
- package/.agent-src/skills/laravel-pennant/SKILL.md +12 -0
- package/.agent-src/skills/laravel-pulse/SKILL.md +12 -0
- package/.agent-src/skills/laravel-reverb/SKILL.md +15 -3
- package/.agent-src/skills/laravel-scheduling/SKILL.md +12 -0
- package/.agent-src/skills/laravel-validation/SKILL.md +12 -0
- package/.agent-src/skills/{websocket → laravel-websocket}/SKILL.md +16 -3
- package/.agent-src/skills/launch-readiness/SKILL.md +12 -2
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +16 -4
- package/.agent-src/skills/lint-skills/SKILL.md +12 -0
- package/.agent-src/skills/livewire/SKILL.md +12 -0
- package/.agent-src/skills/livewire-architect/SKILL.md +12 -0
- package/.agent-src/skills/logging-monitoring/SKILL.md +12 -0
- package/.agent-src/skills/market-entry-analysis/SKILL.md +12 -0
- package/.agent-src/skills/markitdown/SKILL.md +14 -2
- package/.agent-src/skills/mcp/SKILL.md +12 -0
- package/.agent-src/skills/mcp-builder/SKILL.md +14 -2
- package/.agent-src/skills/md-language-check/SKILL.md +13 -1
- package/.agent-src/skills/memory-consolidation/SKILL.md +12 -0
- package/.agent-src/skills/merge-conflicts/SKILL.md +61 -17
- package/.agent-src/skills/messaging-architecture/SKILL.md +12 -2
- package/.agent-src/skills/migration-architect/SKILL.md +18 -6
- package/.agent-src/skills/mobile-e2e-strategy/SKILL.md +12 -0
- package/.agent-src/skills/module-management/SKILL.md +13 -0
- package/.agent-src/skills/motion-choreographer/SKILL.md +16 -4
- package/.agent-src/skills/multi-tenancy/SKILL.md +29 -10
- package/.agent-src/skills/nextjs-patterns/SKILL.md +12 -0
- package/.agent-src/skills/okr-tree-modeling/SKILL.md +12 -2
- package/.agent-src/skills/onboarding-design/SKILL.md +12 -0
- package/.agent-src/skills/onboarding-program/SKILL.md +12 -0
- package/.agent-src/skills/one-on-one-cadence/SKILL.md +12 -0
- package/.agent-src/skills/openapi/SKILL.md +13 -1
- package/.agent-src/skills/org-design/SKILL.md +12 -0
- package/.agent-src/skills/override-management/SKILL.md +12 -0
- package/.agent-src/skills/perf-feedback-craft/SKILL.md +12 -0
- package/.agent-src/skills/performance/SKILL.md +12 -0
- package/.agent-src/skills/performance-analysis/SKILL.md +12 -0
- package/.agent-src/skills/persona-writing/SKILL.md +12 -0
- package/.agent-src/skills/pest-testing/SKILL.md +30 -0
- package/.agent-src/skills/php-coder/SKILL.md +12 -0
- package/.agent-src/skills/php-debugging/SKILL.md +40 -0
- package/.agent-src/skills/php-service/SKILL.md +15 -3
- package/.agent-src/skills/pipeline-strategy/SKILL.md +12 -2
- package/.agent-src/skills/pixar-storyteller/SKILL.md +17 -5
- package/.agent-src/skills/playwright-architect/SKILL.md +12 -2
- package/.agent-src/skills/playwright-testing/SKILL.md +28 -1
- package/.agent-src/skills/po-discovery/SKILL.md +12 -0
- package/.agent-src/skills/positioning-strategy/SKILL.md +12 -0
- package/.agent-src/skills/privacy-review/SKILL.md +12 -2
- package/.agent-src/skills/project-analysis-core/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-laravel/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-nextjs/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-node-express/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-react/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-symfony/SKILL.md +12 -0
- package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +12 -0
- package/.agent-src/skills/project-analyzer/SKILL.md +98 -60
- package/.agent-src/skills/project-docs/SKILL.md +25 -13
- package/.agent-src/skills/prompt-engineering-patterns/SKILL.md +13 -1
- package/.agent-src/skills/prompt-optimizer/SKILL.md +13 -1
- package/.agent-src/skills/quality-tools/SKILL.md +12 -2
- package/.agent-src/skills/react-native-setup/SKILL.md +12 -0
- package/.agent-src/skills/react-shadcn-ui/SKILL.md +12 -0
- package/.agent-src/skills/readme-reviewer/SKILL.md +12 -0
- package/.agent-src/skills/readme-writing/SKILL.md +12 -0
- package/.agent-src/skills/readme-writing-package/SKILL.md +106 -23
- package/.agent-src/skills/receiving-code-review/SKILL.md +12 -0
- package/.agent-src/skills/refine-prompt/SKILL.md +13 -1
- package/.agent-src/skills/refine-ticket/SKILL.md +14 -2
- package/.agent-src/skills/refine-ticket/detection-map.yml +2 -2
- package/.agent-src/skills/release-comms/SKILL.md +12 -2
- package/.agent-src/skills/repomix-packer/SKILL.md +13 -1
- package/.agent-src/skills/requesting-code-review/SKILL.md +12 -0
- package/.agent-src/skills/retention-loops/SKILL.md +12 -0
- package/.agent-src/skills/review-routing/SKILL.md +12 -0
- package/.agent-src/skills/rice-prioritization/SKILL.md +12 -0
- package/.agent-src/skills/risk-officer/SKILL.md +12 -0
- package/.agent-src/skills/roadmap-management/SKILL.md +13 -1
- package/.agent-src/skills/roadmap-writing/SKILL.md +12 -0
- package/.agent-src/skills/rtk-output-filtering/SKILL.md +35 -8
- package/.agent-src/skills/rule-refactor/SKILL.md +157 -0
- package/.agent-src/skills/rule-writing/SKILL.md +46 -8
- package/.agent-src/skills/runway-cognition/SKILL.md +12 -2
- package/.agent-src/skills/scenario-modeling/SKILL.md +12 -2
- package/.agent-src/skills/scene-expander/SKILL.md +18 -6
- package/.agent-src/skills/script-writing/SKILL.md +13 -1
- package/.agent-src/skills/secrets-management/SKILL.md +13 -3
- package/.agent-src/skills/security/SKILL.md +50 -29
- package/.agent-src/skills/security-audit/SKILL.md +12 -0
- package/.agent-src/skills/sentry-integration/SKILL.md +12 -0
- package/.agent-src/skills/sequential-thinking/SKILL.md +12 -0
- package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +12 -0
- package/.agent-src/skills/skill-management/SKILL.md +12 -0
- package/.agent-src/skills/skill-reviewer/SKILL.md +13 -1
- package/.agent-src/skills/skill-writing/SKILL.md +12 -0
- package/.agent-src/skills/sql-writing/SKILL.md +12 -0
- package/.agent-src/skills/stakeholder-tradeoff/SKILL.md +12 -0
- package/.agent-src/skills/subagent-orchestration/SKILL.md +13 -1
- package/.agent-src/skills/symfony-workflow/SKILL.md +12 -0
- package/.agent-src/skills/systematic-debugging/SKILL.md +12 -0
- package/.agent-src/skills/tailwind-engineer/SKILL.md +12 -0
- package/.agent-src/skills/tech-debt-tracker/SKILL.md +12 -2
- package/.agent-src/skills/technical-specification/SKILL.md +12 -0
- package/.agent-src/skills/terraform/SKILL.md +12 -0
- package/.agent-src/skills/terragrunt/SKILL.md +12 -0
- package/.agent-src/skills/test-driven-development/SKILL.md +16 -4
- package/.agent-src/skills/test-performance/SKILL.md +19 -6
- package/.agent-src/skills/testing-anti-patterns/SKILL.md +13 -1
- package/.agent-src/skills/threat-modeling/SKILL.md +12 -0
- package/.agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +12 -0
- package/.agent-src/skills/token-optimizer/SKILL.md +12 -0
- package/.agent-src/skills/traefik/SKILL.md +12 -0
- package/.agent-src/skills/ui-component-architect/SKILL.md +12 -0
- package/.agent-src/skills/unit-economics-modeling/SKILL.md +12 -2
- package/.agent-src/skills/universal-project-analysis/SKILL.md +12 -0
- package/.agent-src/skills/upstream-contribute/SKILL.md +12 -0
- package/.agent-src/skills/using-git-worktrees/SKILL.md +12 -0
- package/.agent-src/skills/validate-feature-fit/SKILL.md +12 -0
- package/.agent-src/skills/verify-completion-evidence/SKILL.md +36 -27
- package/.agent-src/skills/video-director/SKILL.md +18 -6
- package/.agent-src/skills/vision-articulation/SKILL.md +12 -0
- package/.agent-src/skills/voc-extract/SKILL.md +12 -2
- package/.agent-src/skills/voice-and-tone-design/SKILL.md +12 -2
- package/.agent-src/templates/agent-settings.md +5 -5
- package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/.agent-src/templates/agents/memory/ownership.example.yml +1 -1
- package/.agent-src/templates/agents/proposal.example.md +12 -0
- package/.agent-src/templates/command.md +1 -1
- package/.agent-src/templates/contexts/auth-model.md +2 -2
- package/.agent-src/templates/contexts/data-sensitivity.md +3 -3
- package/.agent-src/templates/contexts/deployment-order.md +2 -2
- package/.agent-src/templates/contexts/observability.md +3 -3
- package/.agent-src/templates/contexts/tenant-boundaries.md +3 -3
- package/.agent-src/templates/contexts.md +1 -1
- package/.agent-src/templates/copilot-instructions.md +2 -2
- package/.agent-src/templates/rule.md +3 -3
- package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +3 -3
- package/.agent-src/templates/scripts/work_engine/cli.py +6 -6
- package/.agent-src/templates/scripts/work_engine/emitters.py +29 -4
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.py +3 -3
- package/.agent-src/templates/scripts/work_engine/state.py +53 -0
- package/.agent-src/templates/skill-archive-note.md +4 -4
- package/.claude-plugin/marketplace.json +6 -5
- package/AGENTS.md +5 -4
- package/CHANGELOG.md +178 -194
- package/CONTRIBUTING.md +61 -0
- package/README.md +23 -20
- package/config/agent-settings.template.yml +11 -1
- package/config/discovery/packs.yml +142 -0
- package/config/discovery/unassigned-artefacts.yml +66 -0
- package/config/discovery/workspaces.yml +59 -0
- package/config/gitignore-block.txt +17 -20
- package/dist/cli/agent-config.js +199 -0
- package/dist/cli/agent-config.js.map +1 -0
- package/dist/cli/bash/runBash.js +40 -0
- package/dist/cli/bash/runBash.js.map +1 -0
- package/dist/cli/commands/doctorShell.js +91 -0
- package/dist/cli/commands/doctorShell.js.map +1 -0
- package/dist/cli/commands/packs.js +59 -0
- package/dist/cli/commands/packs.js.map +1 -0
- package/dist/cli/commands/settings.js +35 -0
- package/dist/cli/commands/settings.js.map +1 -0
- package/dist/cli/commands/uiServe.js +110 -0
- package/dist/cli/commands/uiServe.js.map +1 -0
- package/dist/cli/commands/versions.js +64 -0
- package/dist/cli/commands/versions.js.map +1 -0
- package/dist/cli/commands/workspaces.js +58 -0
- package/dist/cli/commands/workspaces.js.map +1 -0
- package/dist/cli/discovery/loadManifest.js +62 -0
- package/dist/cli/discovery/loadManifest.js.map +1 -0
- package/dist/cli/log/logger.js +41 -0
- package/dist/cli/log/logger.js.map +1 -0
- package/dist/cli/paths.js +60 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/python/resolvePython.js +38 -0
- package/dist/cli/python/resolvePython.js.map +1 -0
- package/dist/cli/registry.js +75 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/discovery/discovery-manifest.json +9195 -0
- package/dist/discovery/discovery-manifest.json.sha256 +1 -0
- package/dist/discovery/discovery-manifest.summary.md +93 -0
- package/dist/mcp/awesome-mcp-servers.row.md +1 -0
- package/dist/mcp/mcp-cloudflare-catalogue.json +27 -0
- package/dist/mcp/registry-manifest.json +63 -0
- package/dist/server/app.js +117 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/io/atomicMultiWrite.js +202 -0
- package/dist/server/io/atomicMultiWrite.js.map +1 -0
- package/dist/server/io/atomicWrite.js +79 -0
- package/dist/server/io/atomicWrite.js.map +1 -0
- package/dist/server/io/substituteTemplate.js +87 -0
- package/dist/server/io/substituteTemplate.js.map +1 -0
- package/dist/server/io/yamlIO.js +140 -0
- package/dist/server/io/yamlIO.js.map +1 -0
- package/dist/server/port.js +97 -0
- package/dist/server/port.js.map +1 -0
- package/dist/server/routes/discovery.js +72 -0
- package/dist/server/routes/discovery.js.map +1 -0
- package/dist/server/routes/ping.js +49 -0
- package/dist/server/routes/ping.js.map +1 -0
- package/dist/server/routes/schema.js +41 -0
- package/dist/server/routes/schema.js.map +1 -0
- package/dist/server/routes/settings.js +155 -0
- package/dist/server/routes/settings.js.map +1 -0
- package/dist/server/routes/userMd.js +117 -0
- package/dist/server/routes/userMd.js.map +1 -0
- package/dist/server/routes/wizard.js +138 -0
- package/dist/server/routes/wizard.js.map +1 -0
- package/dist/server/schemas/settings.js +138 -0
- package/dist/server/schemas/settings.js.map +1 -0
- package/dist/server/token.js +68 -0
- package/dist/server/token.js.map +1 -0
- package/dist/server/writeRoot.js +67 -0
- package/dist/server/writeRoot.js.map +1 -0
- package/dist/server/writeRoot.test.js +73 -0
- package/dist/server/writeRoot.test.js.map +1 -0
- package/dist/shared/userMd/formAdapter.js +105 -0
- package/dist/shared/userMd/formAdapter.js.map +1 -0
- package/dist/shared/userMd/schema.js +118 -0
- package/dist/shared/userMd/schema.js.map +1 -0
- package/dist/shared/userMd/utils.js +74 -0
- package/dist/shared/userMd/utils.js.map +1 -0
- package/dist/ui/assets/index-BTRcKDlB.js +39 -0
- package/dist/ui/assets/index-BTRcKDlB.js.map +1 -0
- package/dist/ui/assets/index-Dqfhmg-d.css +1 -0
- package/dist/ui/index.html +14 -0
- package/docs/adrs/caveman/0001-default-off-until-bench.md +2 -2
- package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
- package/docs/adrs/schema/0001-json-schema-frontmatter.md +4 -4
- package/docs/adrs/schema/README.md +1 -1
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +2 -2
- package/docs/architecture/setup-vs-settings-shared-surface.md +114 -0
- package/docs/architecture.md +4 -3
- package/docs/archive/CHANGELOG-pre-2.2.0.md +7 -7
- package/docs/archive/CHANGELOG-pre-2.25.0.md +191 -0
- package/docs/archive/CHANGELOG-pre-3.0.0.md +130 -0
- package/docs/catalog.md +77 -84
- package/docs/contracts/STABILITY.md +1 -1
- package/docs/contracts/adr-architectural-consensus-mechanism.md +5 -5
- package/docs/contracts/adr-chat-history-split.md +1 -1
- package/docs/contracts/adr-implement-ticket-runtime.md +1 -1
- package/docs/contracts/adr-install-user-type-axis.md +1 -1
- package/docs/contracts/adr-mcp-runtime.md +2 -2
- package/docs/contracts/agent-user-schema.md +11 -2
- package/docs/contracts/ai-council-config.md +13 -13
- package/docs/contracts/audit-log-v1.md +2 -2
- package/docs/contracts/command-clusters.md +2 -2
- package/docs/contracts/compression-default-kill-criterion.md +3 -3
- package/docs/contracts/decision-trace-v1.md +5 -5
- package/docs/contracts/discovery-manifest.schema.json +146 -0
- package/docs/contracts/explain-trace.schema.json +144 -0
- package/docs/contracts/file-ownership-matrix.json +515 -309
- package/docs/contracts/file-ownership-matrix.md +1 -1
- package/docs/contracts/ghostwriter-schema.md +3 -3
- package/docs/contracts/hook-architecture-v1.md +10 -10
- package/docs/contracts/kernel-membership.md +21 -4
- package/docs/contracts/linter-structural-model.md +3 -3
- package/docs/contracts/load-context-schema.md +5 -5
- package/docs/contracts/local-server-api.md +134 -0
- package/docs/contracts/low-impact-corpus-format.md +1 -1
- package/docs/contracts/mcp-cloud-scope.md +2 -2
- package/docs/contracts/mcp-discovery-phase-notice.md +1 -1
- package/docs/contracts/mcp-phase-1-scope.md +5 -4
- package/docs/contracts/mcp-registry-manifest.schema.json +129 -0
- package/docs/contracts/mcp-tool-stub-envelope.md +1 -1
- package/docs/contracts/memory-visibility-v1.md +2 -2
- package/docs/contracts/multi-tool-projection-fidelity.md +3 -3
- package/docs/contracts/namespace.md +1 -1
- package/docs/contracts/one-off-script-lifecycle.md +1 -1
- package/docs/contracts/package-self-orientation.md +1 -1
- package/docs/contracts/provider-lifecycle.md +2 -2
- package/docs/contracts/router-blending.md +1 -1
- package/docs/contracts/rule-classification.md +2 -2
- package/docs/contracts/settings-api.md +160 -0
- package/docs/contracts/settings-gui-agent-mode.schema.json +128 -0
- package/docs/contracts/smoke-contracts.md +8 -8
- package/docs/contracts/tier-3-contrib-plugin.md +1 -1
- package/docs/contracts/universal-skills.md +1 -1
- package/docs/contracts/write-engine.md +1 -1
- package/docs/customization.md +137 -11
- package/docs/decisions/ADR-001-kernel-swap-deferred.md +1 -1
- package/docs/decisions/ADR-002-kernel-bucket-overrides.md +1 -1
- package/docs/decisions/ADR-004-rule-governance-pruning.md +8 -8
- package/docs/decisions/ADR-006-skill-tools-python-pilot.md +5 -5
- package/docs/decisions/ADR-007-agent-discovery-scopes.md +4 -4
- package/docs/decisions/ADR-008-installed-tools-manifest.md +2 -2
- package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +2 -2
- package/docs/decisions/ADR-011-domain-pack-readiness.md +4 -4
- package/docs/decisions/ADR-012-typescript-cli-shell.md +162 -0
- package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +210 -0
- package/docs/decisions/ADR-014-gui-framework-choice.md +136 -0
- package/docs/decisions/ADR-rule-kernel-and-router.md +2 -2
- package/docs/decisions/INDEX.md +3 -0
- package/docs/distribution/mcp-submission-checklist.md +95 -0
- package/docs/distribution/topics-equivalents-decay-policy.md +51 -0
- package/docs/examples/agent-user.example.md +3 -1
- package/docs/getting-started.md +6 -5
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +1 -1
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +10 -1
- package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
- package/docs/guidelines/agent-infra/tool-integration.md +1 -1
- package/docs/guidelines/php/api-design.md +2 -2
- package/docs/guidelines/php/controllers.md +1 -1
- package/docs/guidelines/php/resources.md +1 -1
- package/docs/guidelines/php/validations.md +1 -1
- package/docs/guidelines/prompt-templates.md +2 -2
- package/docs/hook-payload-capture.md +3 -3
- package/docs/installation.md +12 -4
- package/docs/migrations/commands-1.15.0.md +3 -3
- package/docs/parity/bench-ruflo.json +1 -1
- package/docs/parity/ruflo.md +3 -3
- package/docs/profiles.md +1 -1
- package/docs/quality.md +2 -2
- package/docs/recruits/_template.md +3 -3
- package/docs/setup/enterprise-and-offline.md +3 -3
- package/docs/setup/mcp-server-docker.md +5 -3
- package/docs/skills-catalog.md +62 -18
- package/docs/wizard.md +121 -0
- package/llms.txt +61 -17
- package/package.json +46 -3
- package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
- package/scripts/_archive/README.md +2 -2
- package/scripts/_archive/_p4_migrate.py +1 -1
- package/scripts/_cli/cmd_doctor.py +5 -5
- package/scripts/_cli/cmd_explain.py +106 -2
- package/scripts/_cli/cmd_migrate.py +2 -2
- package/scripts/_cli/explain_last/__init__.py +122 -0
- package/scripts/_cli/explain_last/assumptions.py +59 -0
- package/scripts/_cli/explain_last/council.py +105 -0
- package/scripts/_cli/explain_last/halt.py +44 -0
- package/scripts/_cli/explain_last/inputs.py +125 -0
- package/scripts/_cli/explain_last/memory.py +94 -0
- package/scripts/_cli/explain_last/provider.py +52 -0
- package/scripts/_cli/explain_last/render.py +52 -0
- package/scripts/_cli/explain_last/route.py +58 -0
- package/scripts/_cli/explain_last/scrubber.py +105 -0
- package/scripts/_cli/explain_last/sections/__init__.py +35 -0
- package/scripts/_cli/explain_last/sections/assumptions.py +21 -0
- package/scripts/_cli/explain_last/sections/council.py +27 -0
- package/scripts/_cli/explain_last/sections/halt.py +31 -0
- package/scripts/_cli/explain_last/sections/header.py +24 -0
- package/scripts/_cli/explain_last/sections/inputs.py +27 -0
- package/scripts/_cli/explain_last/sections/memory.py +21 -0
- package/scripts/_cli/explain_last/sections/pack.py +16 -0
- package/scripts/_cli/explain_last/sections/provider.py +26 -0
- package/scripts/_cli/explain_last/sections/route.py +22 -0
- package/scripts/_cli/explain_last/state_loader.py +76 -0
- package/scripts/_dispatch.bash +954 -0
- package/scripts/_lib/agent_settings.py +3 -3
- package/scripts/_lib/agents_overlay.py +3 -3
- package/scripts/_phase4_bucket.py +210 -0
- package/scripts/agent-config +35 -943
- package/scripts/ai-video/adapters/higgsfield.sh +1 -1
- package/scripts/ai-video/adapters/sora.sh +1 -1
- package/scripts/ai-video/test-pipeline.sh +2 -2
- package/scripts/ai_council/_default_prices.py +5 -5
- package/scripts/ai_council/advisors.py +1 -1
- package/scripts/ai_council/clients.py +2 -2
- package/scripts/ai_council/compile_corpus.py +9 -8
- package/scripts/ai_council/config.py +3 -3
- package/scripts/ai_council/events_log.py +8 -4
- package/scripts/ai_council/low_impact_corpus.py +1 -1
- package/scripts/ai_council/low_impact_intake.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +2 -2
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_structural_optimization.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +3 -3
- package/scripts/ai_council/pricing.py +8 -7
- package/scripts/ai_council/probation_gate.py +1 -1
- package/scripts/ai_council/redact_low_impact_entry.py +1 -1
- package/scripts/ai_council/session.py +13 -13
- package/scripts/ai_council/shadow_dispatch.py +2 -2
- package/scripts/annotate_discovery.py +149 -0
- package/scripts/audit_adr_coverage.py +1 -1
- package/scripts/audit_auto_rules.py +2 -2
- package/scripts/audit_cloud_compatibility.py +1 -1
- package/scripts/audit_command_surface.py +2 -2
- package/scripts/audit_likelihood.py +4 -4
- package/scripts/audit_overlap.py +3 -3
- package/scripts/audit_user_type_axis.py +1 -1
- package/scripts/build_discovery_manifest.py +302 -0
- package/scripts/build_linear_digest.py +0 -1
- package/scripts/build_mcp_registry_manifest.py +181 -0
- package/scripts/build_rule_trigger_matrix.py +2 -2
- package/scripts/capture_showcase_session.py +1 -1
- package/scripts/chat_history.py +5 -5
- package/scripts/check_always_budget.py +7 -2
- package/scripts/check_council_layout.py +26 -20
- package/scripts/check_council_references.py +10 -10
- package/scripts/check_discovery_determinism.py +70 -0
- package/scripts/check_kernel_rule_bundle.py +2 -2
- package/scripts/check_no_roadmap_refs.py +2 -2
- package/scripts/check_one_off_location.py +1 -1
- package/scripts/check_public_links.py +2 -2
- package/scripts/check_references.py +14 -21
- package/scripts/check_release_includes_discovery.py +61 -0
- package/scripts/ci_summary.py +2 -2
- package/scripts/ci_time_ratio.py +1 -1
- package/scripts/command_suggester/__init__.py +1 -1
- package/scripts/context_hygiene_hook.py +2 -2
- package/scripts/council_cli.py +22 -22
- package/scripts/council_prune.py +3 -3
- package/scripts/extract_audit_patterns.py +2 -2
- package/scripts/gen_discovery_baseline.py +127 -0
- package/scripts/generate_ownership_matrix.py +1 -1
- package/scripts/hook_manifest.yaml +5 -5
- package/scripts/hooks/cline-dispatcher.sh +1 -1
- package/scripts/hooks/cowork-dispatcher.sh +1 -1
- package/scripts/hooks/dispatch_hook.py +3 -3
- package/scripts/hooks/gemini-dispatcher.sh +1 -1
- package/scripts/hooks/replay_hook.py +1 -1
- package/scripts/hooks/state_io.py +5 -5
- package/scripts/hooks_doctor.py +4 -4
- package/scripts/install-hooks.sh +2 -2
- package/scripts/install.py +3 -3
- package/scripts/install.sh +120 -18
- package/scripts/inventory_frontmatter.py +1 -1
- package/scripts/lint_agents_layout.py +103 -0
- package/scripts/lint_archived_skills.py +3 -3
- package/scripts/lint_artefact_frontmatter.py +180 -0
- package/scripts/lint_discovery_manifest.py +136 -0
- package/scripts/lint_discovery_vocabulary.py +148 -0
- package/scripts/lint_explain_trace.py +80 -0
- package/scripts/lint_framework_leakage.py +348 -0
- package/scripts/lint_framework_leakage_allowlist.json +477 -0
- package/scripts/lint_ghostwriter_source.py +1 -1
- package/scripts/lint_load_context.py +3 -3
- package/scripts/lint_mcp_registry_manifest.py +69 -0
- package/scripts/lint_media_policy_linkage.py +6 -6
- package/scripts/lint_positioning.py +143 -0
- package/scripts/lint_rule_tiers.py +2 -2
- package/scripts/lint_skill_tools.py +1 -1
- package/scripts/lint_topics_yaml.py +89 -0
- package/scripts/mcp_server/consumer_tool_catalog.json +3 -3
- package/scripts/mcp_server/telemetry.py +2 -2
- package/scripts/mcp_server/tools.py +27 -11
- package/scripts/mcp_telemetry_health.py +2 -2
- package/scripts/mcp_telemetry_store.py +1 -1
- package/scripts/measure_augment_budget.py +9 -3
- package/scripts/measure_density.py +2 -2
- package/scripts/measure_frugality_savings.py +3 -3
- package/scripts/measure_roadmap_trajectory.py +1 -1
- package/scripts/measure_rule_budget.py +3 -3
- package/scripts/memory_report.py +1 -1
- package/scripts/migrate_command_suggestions.py +3 -3
- package/scripts/minimal_safe_diff_hook.py +1 -1
- package/scripts/onboarding_gate_hook.py +4 -4
- package/scripts/prepack-check.mjs +62 -0
- package/scripts/probe_projection_fidelity.py +2 -2
- package/scripts/refine_ticket_detect.py +1 -1
- package/scripts/schemas/command.schema.json +46 -1
- package/scripts/schemas/persona.schema.json +1 -1
- package/scripts/schemas/rule.schema.json +44 -4
- package/scripts/schemas/skill.schema.json +46 -1
- package/scripts/score_skill_selection.py +1 -1
- package/scripts/skill_collision_clusters.py +1 -1
- package/scripts/skill_linter.py +62 -9
- package/scripts/skill_overlap.py +1 -1
- package/scripts/skill_tools/run_block_d_eval.py +1 -1
- package/scripts/skill_usage_collect.py +3 -3
- package/scripts/skill_usage_report.py +3 -3
- package/scripts/smoke/kernel.sh +4 -4
- package/scripts/smoke/router.sh +2 -2
- package/scripts/smoke_quickstart.py +1 -1
- package/scripts/spotcheck_thin_root.py +1 -1
- package/scripts/sync_github_metadata.py +147 -0
- package/scripts/sync_gitignore.py +15 -5
- package/scripts/update_prices.py +4 -3
- package/scripts/verify_before_complete_hook.py +1 -1
- package/scripts/verify_roadmap_closure.py +1 -1
- package/templates/agent-user.md +35 -0
- package/.agent-src/commands/onboard.md +0 -459
- package/.agent-src/rules/agent-docs.md +0 -20
- package/.agent-src/rules/augment-portability.md +0 -23
- package/.agent-src/rules/capture-learnings.md +0 -19
- package/.agent-src/rules/docs-sync.md +0 -20
- package/.agent-src/rules/domain-safety-disclaimer-consulting.md +0 -52
- package/.agent-src/rules/domain-safety-disclaimer-financial.md +0 -54
- package/.agent-src/rules/domain-safety-disclaimer-legal.md +0 -49
- package/.agent-src/rules/domain-safety-disclaimer-medical.md +0 -56
- package/.agent-src/rules/domain-safety-export-redact.md +0 -65
- package/.agent-src/rules/domain-safety-logging-pii-floor.md +0 -55
- package/.agent-src/rules/domain-safety-pii-finance.md +0 -57
- package/.agent-src/rules/domain-safety-pii-marketing.md +0 -60
- package/.agent-src/rules/domain-safety-pii-recruiting.md +0 -56
- package/.agent-src/rules/domain-safety-pii-support.md +0 -57
- package/.agent-src/rules/domain-safety-retention-finance.md +0 -48
- package/.agent-src/rules/domain-safety-retention-support.md +0 -55
- package/.agent-src/rules/e2e-testing.md +0 -19
- package/.agent-src/rules/no-unsolicited-rebase.md +0 -107
- package/.agent-src/rules/post-push-rewrite-discipline.md +0 -70
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""``agent-config explain last`` — execution-trace builder.
|
|
2
|
+
|
|
3
|
+
Phase 2 of the *Explainability v2* roadmap
|
|
4
|
+
(``agents/roadmaps/explainability-v2-explain-last.md``). Reads the
|
|
5
|
+
persisted :mod:`work_engine` state plus its sibling artefacts (council
|
|
6
|
+
sessions, memory hits, router snapshot) and projects them into the
|
|
7
|
+
versioned :data:`ExplainTrace` v1 contract documented at
|
|
8
|
+
``docs/contracts/explain-trace.schema.json``.
|
|
9
|
+
|
|
10
|
+
Read-only by construction:
|
|
11
|
+
|
|
12
|
+
* never writes back to disk;
|
|
13
|
+
* never opens a network socket (Phase 4 enforces via ``test_no_network``);
|
|
14
|
+
* never raises on missing data — every slot degrades to ``null`` and the
|
|
15
|
+
Markdown renderer emits a ``(none)`` placeholder instead.
|
|
16
|
+
|
|
17
|
+
The public surface is :func:`build_trace`. Everything else is internal
|
|
18
|
+
plumbing. The CLI dispatcher lives in :mod:`scripts._cli.cmd_explain`
|
|
19
|
+
and is the only intended caller besides the test suite.
|
|
20
|
+
"""
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from datetime import datetime, timezone
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from typing import Any
|
|
26
|
+
|
|
27
|
+
from scripts._cli.explain_last import (
|
|
28
|
+
assumptions as _assumptions,
|
|
29
|
+
council as _council,
|
|
30
|
+
halt as _halt,
|
|
31
|
+
inputs as _inputs,
|
|
32
|
+
memory as _memory,
|
|
33
|
+
provider as _provider,
|
|
34
|
+
route as _route,
|
|
35
|
+
)
|
|
36
|
+
from scripts._cli.explain_last.scrubber import scrub_string
|
|
37
|
+
from scripts._cli.explain_last.state_loader import StateLoadError, load_state
|
|
38
|
+
|
|
39
|
+
TRACE_VERSION = 1
|
|
40
|
+
SUBJECT_BY_KIND = {
|
|
41
|
+
"ticket": "implement-ticket",
|
|
42
|
+
"prompt": "work",
|
|
43
|
+
"diff": "work",
|
|
44
|
+
"file": "work",
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _derive_subject(state: dict[str, Any]) -> str:
|
|
49
|
+
"""Map ``state.input.kind`` + ``state.directive_set`` to a trace subject.
|
|
50
|
+
|
|
51
|
+
The schema enum is ``work | implement-ticket | council | video |
|
|
52
|
+
unknown``. ``council`` and ``video`` are reserved for Phase 3 and
|
|
53
|
+
forward; today they only fire when the engine explicitly stamps the
|
|
54
|
+
directive set, never from a kind alone.
|
|
55
|
+
"""
|
|
56
|
+
directive_set = state.get("directive_set") or ""
|
|
57
|
+
if directive_set == "video":
|
|
58
|
+
return "video"
|
|
59
|
+
if directive_set == "council":
|
|
60
|
+
return "council"
|
|
61
|
+
kind = (state.get("input") or {}).get("kind")
|
|
62
|
+
return SUBJECT_BY_KIND.get(kind or "", "unknown")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _derive_run_id(state: dict[str, Any], state_file: Path) -> str:
|
|
66
|
+
"""Pull ``state.input.data.id`` with mtime fallback.
|
|
67
|
+
|
|
68
|
+
Schema requires a non-empty string; the file mtime serialised as
|
|
69
|
+
ISO-8601 UTC is the documented fallback. Both branches return scrub
|
|
70
|
+
pre-processed values so a ticket id containing PII never leaks.
|
|
71
|
+
"""
|
|
72
|
+
data = (state.get("input") or {}).get("data") or {}
|
|
73
|
+
raw_id = data.get("id")
|
|
74
|
+
if isinstance(raw_id, str) and raw_id.strip():
|
|
75
|
+
return scrub_string(raw_id.strip())
|
|
76
|
+
try:
|
|
77
|
+
mtime = state_file.stat().st_mtime
|
|
78
|
+
except OSError:
|
|
79
|
+
mtime = 0.0
|
|
80
|
+
return datetime.fromtimestamp(mtime, tz=timezone.utc).isoformat()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def build_trace(
|
|
84
|
+
project_root: Path,
|
|
85
|
+
state_file: Path,
|
|
86
|
+
*,
|
|
87
|
+
now: datetime | None = None,
|
|
88
|
+
) -> dict[str, Any]:
|
|
89
|
+
"""Aggregate every why-slot for the most recent ``/work`` run.
|
|
90
|
+
|
|
91
|
+
Returns a JSON-serialisable dict that conforms to
|
|
92
|
+
``explain-trace.schema.json``. ``now`` is only injected by the test
|
|
93
|
+
harness; the production caller passes ``None`` and gets the wall
|
|
94
|
+
clock. All free-form strings pass through :func:`scrub_string`
|
|
95
|
+
before being placed in the output (FATAL council fix — see roadmap
|
|
96
|
+
§ "External AI-Council pass").
|
|
97
|
+
"""
|
|
98
|
+
state = load_state(state_file)
|
|
99
|
+
generated_at = (now or datetime.now(tz=timezone.utc)).isoformat()
|
|
100
|
+
return {
|
|
101
|
+
"version": TRACE_VERSION,
|
|
102
|
+
"generated_at": generated_at,
|
|
103
|
+
"run_id": _derive_run_id(state, state_file),
|
|
104
|
+
"subject": _derive_subject(state),
|
|
105
|
+
"inputs": _inputs.build(project_root),
|
|
106
|
+
"route": _route.build(project_root, state),
|
|
107
|
+
"council": _council.build(project_root, state_file),
|
|
108
|
+
"memory": _memory.build(project_root, state),
|
|
109
|
+
"pack": _inputs.build_pack(project_root),
|
|
110
|
+
"assumptions": _assumptions.build(state),
|
|
111
|
+
"halt": _halt.build(state),
|
|
112
|
+
"provider": _provider.build(state),
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
__all__ = [
|
|
117
|
+
"TRACE_VERSION",
|
|
118
|
+
"StateLoadError",
|
|
119
|
+
"build_trace",
|
|
120
|
+
"load_state",
|
|
121
|
+
"scrub_string",
|
|
122
|
+
]
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""Resolve the ``assumptions`` why-slot for the trace.
|
|
2
|
+
|
|
3
|
+
The work-engine writes ``state.input.data.assumptions[]`` at the end
|
|
4
|
+
of the ``refine`` step and on every ``halt``. Each entry is either a
|
|
5
|
+
plain string (legacy shape) or a dict with ``{id, accepted, source}``
|
|
6
|
+
(R2+ shape). Both shapes are normalised here so the schema gate sees a
|
|
7
|
+
uniform list of objects.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from scripts._cli.explain_last.scrubber import scrub_string
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _normalise(raw: Any, fallback_idx: int) -> dict[str, Any] | None:
|
|
17
|
+
if isinstance(raw, str):
|
|
18
|
+
text = raw.strip()
|
|
19
|
+
if not text:
|
|
20
|
+
return None
|
|
21
|
+
return {
|
|
22
|
+
"id": scrub_string(text)[:120] or f"assumption-{fallback_idx}",
|
|
23
|
+
"accepted": True,
|
|
24
|
+
"source": "refine",
|
|
25
|
+
}
|
|
26
|
+
if isinstance(raw, dict):
|
|
27
|
+
ident = raw.get("id") or raw.get("text") or f"assumption-{fallback_idx}"
|
|
28
|
+
if not isinstance(ident, str):
|
|
29
|
+
ident = str(ident)
|
|
30
|
+
ident = scrub_string(ident.strip()) or f"assumption-{fallback_idx}"
|
|
31
|
+
accepted = bool(raw.get("accepted", True))
|
|
32
|
+
source = raw.get("source") or raw.get("step") or "refine"
|
|
33
|
+
return {
|
|
34
|
+
"id": ident,
|
|
35
|
+
"accepted": accepted,
|
|
36
|
+
"source": scrub_string(str(source)),
|
|
37
|
+
}
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def build(state: dict[str, Any]) -> list[dict[str, Any]]:
|
|
42
|
+
"""Return the assumptions list (possibly empty).
|
|
43
|
+
|
|
44
|
+
Schema requires an array; ``null`` is not allowed. An empty list
|
|
45
|
+
is the documented signal that no assumptions were captured.
|
|
46
|
+
"""
|
|
47
|
+
data = (state.get("input") or {}).get("data") or {}
|
|
48
|
+
raw_list = data.get("assumptions") or []
|
|
49
|
+
if not isinstance(raw_list, list):
|
|
50
|
+
return []
|
|
51
|
+
out: list[dict[str, Any]] = []
|
|
52
|
+
for idx, raw in enumerate(raw_list):
|
|
53
|
+
entry = _normalise(raw, idx)
|
|
54
|
+
if entry is not None:
|
|
55
|
+
out.append(entry)
|
|
56
|
+
return out
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
__all__ = ["build"]
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""Resolve the ``council`` why-slot for the trace.
|
|
2
|
+
|
|
3
|
+
Picks the most recent ``council-responses.json`` whose ``mtime`` lies
|
|
4
|
+
within the run window (state file mtime ± 1h). Cost-metadata fields
|
|
5
|
+
(``input_tokens``, ``output_tokens``, ``cost_usd``, ``latency_ms``) are
|
|
6
|
+
intentionally NOT surfaced — they leak business-intelligence about
|
|
7
|
+
spend rate per the security-engineer council fix.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from scripts._cli.explain_last.scrubber import scrub_string
|
|
16
|
+
|
|
17
|
+
RUN_WINDOW_SECONDS = 3600
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _candidate_files(project_root: Path) -> list[Path]:
|
|
21
|
+
"""Return every council-response file the loader knows about.
|
|
22
|
+
|
|
23
|
+
Implementation spec for the council loader; the glob path is the
|
|
24
|
+
contract it implements.
|
|
25
|
+
"""
|
|
26
|
+
# council-ref-allowed: council loader implementation per roadmap.
|
|
27
|
+
sessions_root = project_root / "agents" / "runtime" / "council" / "sessions"
|
|
28
|
+
tmp_root = project_root / "tmp"
|
|
29
|
+
candidates: list[Path] = []
|
|
30
|
+
if sessions_root.exists():
|
|
31
|
+
for sub in sessions_root.iterdir():
|
|
32
|
+
if sub.is_dir():
|
|
33
|
+
candidate = sub / "council-responses.json"
|
|
34
|
+
if candidate.exists():
|
|
35
|
+
candidates.append(candidate)
|
|
36
|
+
if tmp_root.exists():
|
|
37
|
+
candidates.extend(sorted(tmp_root.glob("council-*.json")))
|
|
38
|
+
return candidates
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _pick_recent(candidates: list[Path], anchor_mtime: float) -> Path | None:
|
|
42
|
+
best: tuple[float, Path] | None = None
|
|
43
|
+
for path in candidates:
|
|
44
|
+
try:
|
|
45
|
+
mtime = path.stat().st_mtime
|
|
46
|
+
except OSError:
|
|
47
|
+
continue
|
|
48
|
+
if abs(mtime - anchor_mtime) > RUN_WINDOW_SECONDS:
|
|
49
|
+
continue
|
|
50
|
+
if best is None or mtime > best[0]:
|
|
51
|
+
best = (mtime, path)
|
|
52
|
+
return best[1] if best else None
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _extract_member(entry: dict[str, Any]) -> dict[str, Any] | None:
|
|
56
|
+
provider = entry.get("provider") or ""
|
|
57
|
+
model = entry.get("model") or ""
|
|
58
|
+
member_id = "/".join(part for part in (provider, model) if part) or "unknown"
|
|
59
|
+
text = entry.get("text")
|
|
60
|
+
if not isinstance(text, str) or not text.strip():
|
|
61
|
+
return None
|
|
62
|
+
verdict = scrub_string(text.strip().splitlines()[0][:200])
|
|
63
|
+
citations = []
|
|
64
|
+
for cite in entry.get("citations", []) or []:
|
|
65
|
+
if isinstance(cite, str):
|
|
66
|
+
citations.append(scrub_string(cite))
|
|
67
|
+
return {
|
|
68
|
+
"member_id": scrub_string(member_id),
|
|
69
|
+
"verdict": verdict,
|
|
70
|
+
"citations": citations,
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def build(
|
|
75
|
+
project_root: Path,
|
|
76
|
+
state_file: Path,
|
|
77
|
+
) -> list[dict[str, Any]] | None:
|
|
78
|
+
"""Return the ``council`` slot or ``None`` if no session matches."""
|
|
79
|
+
try:
|
|
80
|
+
anchor = state_file.stat().st_mtime
|
|
81
|
+
except OSError:
|
|
82
|
+
return None
|
|
83
|
+
candidates = _candidate_files(project_root)
|
|
84
|
+
if not candidates:
|
|
85
|
+
return None
|
|
86
|
+
picked = _pick_recent(candidates, anchor)
|
|
87
|
+
if picked is None:
|
|
88
|
+
return None
|
|
89
|
+
try:
|
|
90
|
+
raw = json.loads(picked.read_text(encoding="utf-8"))
|
|
91
|
+
except (OSError, json.JSONDecodeError):
|
|
92
|
+
return None
|
|
93
|
+
if not isinstance(raw, dict):
|
|
94
|
+
return None
|
|
95
|
+
members: list[dict[str, Any]] = []
|
|
96
|
+
for entry in raw.get("responses", []) or []:
|
|
97
|
+
if not isinstance(entry, dict):
|
|
98
|
+
continue
|
|
99
|
+
member = _extract_member(entry)
|
|
100
|
+
if member is not None:
|
|
101
|
+
members.append(member)
|
|
102
|
+
return members or None
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
__all__ = ["build"]
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Builder for the ``trace.halt`` slot.
|
|
2
|
+
|
|
3
|
+
Reads ``state.halts[]`` (the append-only halt log persisted by
|
|
4
|
+
:mod:`work_engine.emitters._emit_halt`) and projects the most recent
|
|
5
|
+
entry into the v1 explain-trace shape: ``{reason, step, surface}``.
|
|
6
|
+
|
|
7
|
+
Returns ``None`` when the engine never halted (clean run) or when the
|
|
8
|
+
state file predates the halts-bearing schema (forward-compatible read:
|
|
9
|
+
older state files just omit the key). Free-form strings pass through
|
|
10
|
+
:func:`scripts._cli.explain_last.scrubber.scrub_string` so PII or
|
|
11
|
+
cost-metadata leakage from halt surfaces never escapes the trace.
|
|
12
|
+
"""
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
from scripts._cli.explain_last.scrubber import scrub_string
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def build(state: dict[str, Any]) -> dict[str, Any] | None:
|
|
21
|
+
halts = state.get("halts") or []
|
|
22
|
+
if not isinstance(halts, list) or not halts:
|
|
23
|
+
return None
|
|
24
|
+
last = halts[-1]
|
|
25
|
+
if not isinstance(last, dict):
|
|
26
|
+
return None
|
|
27
|
+
reason = last.get("reason")
|
|
28
|
+
if not isinstance(reason, str) or not reason:
|
|
29
|
+
return None
|
|
30
|
+
step = last.get("step")
|
|
31
|
+
surface = last.get("surface") or []
|
|
32
|
+
scrubbed_surface: list[str] = []
|
|
33
|
+
if isinstance(surface, list):
|
|
34
|
+
for line in surface:
|
|
35
|
+
if isinstance(line, str):
|
|
36
|
+
scrubbed_surface.append(scrub_string(line))
|
|
37
|
+
return {
|
|
38
|
+
"reason": scrub_string(reason),
|
|
39
|
+
"step": scrub_string(step) if isinstance(step, str) and step else "",
|
|
40
|
+
"surface": scrubbed_surface,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
__all__ = ["build"]
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"""Resolve the ``inputs`` and ``pack`` why-slots for the trace.
|
|
2
|
+
|
|
3
|
+
Reuses :mod:`scripts.config.profiles` and :mod:`scripts.config.presets`
|
|
4
|
+
so the rendered chain matches what the runtime loader actually
|
|
5
|
+
consulted (no parallel logic — the v1 ``explain config`` surface
|
|
6
|
+
already covers this and we read through the same resolvers).
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from contextlib import contextmanager
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from scripts._cli.explain_last.scrubber import scrub_string
|
|
16
|
+
from scripts._lib.agent_settings import DEFAULT_PROJECT_FILE, load_agent_settings
|
|
17
|
+
from scripts.config import presets, profiles
|
|
18
|
+
|
|
19
|
+
_DEFAULT_COST_PROFILE = "balanced"
|
|
20
|
+
_SILENCED_LOGGERS = ("scripts.config.profiles", "scripts.config.presets")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@contextmanager
|
|
24
|
+
def _silence_resolver_warnings():
|
|
25
|
+
# Profile / preset loggers emit absolute paths on read failure;
|
|
26
|
+
# the explain trace must never leak them. Failures bubble up via
|
|
27
|
+
# ProfileError / PresetError anyway, so the warning has no signal.
|
|
28
|
+
previous: list[tuple[logging.Logger, int]] = []
|
|
29
|
+
for name in _SILENCED_LOGGERS:
|
|
30
|
+
log = logging.getLogger(name)
|
|
31
|
+
previous.append((log, log.level))
|
|
32
|
+
log.setLevel(logging.ERROR)
|
|
33
|
+
try:
|
|
34
|
+
yield
|
|
35
|
+
finally:
|
|
36
|
+
for log, level in previous:
|
|
37
|
+
log.setLevel(level)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _load_settings(project_root: Path) -> dict[str, Any]:
|
|
41
|
+
path = project_root / DEFAULT_PROJECT_FILE
|
|
42
|
+
if not path.exists():
|
|
43
|
+
return {}
|
|
44
|
+
return load_agent_settings(project_path=path) or {}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def build(project_root: Path) -> dict[str, Any] | None:
|
|
48
|
+
"""Return the ``inputs`` slot or ``None`` on broken settings.
|
|
49
|
+
|
|
50
|
+
Each knob carries its source (``pack | profile | preset | user |
|
|
51
|
+
env | runtime | default``) so the renderer's table can attribute
|
|
52
|
+
the value to the layer that won the resolution race.
|
|
53
|
+
"""
|
|
54
|
+
try:
|
|
55
|
+
with _silence_resolver_warnings():
|
|
56
|
+
settings = _load_settings(project_root)
|
|
57
|
+
resolved_profile = profiles.resolve_profile(
|
|
58
|
+
project_root=project_root,
|
|
59
|
+
user_settings=settings,
|
|
60
|
+
)
|
|
61
|
+
resolved_preset = presets.resolve_preset(
|
|
62
|
+
project_root=project_root,
|
|
63
|
+
user_settings=settings,
|
|
64
|
+
profile_preset_id=resolved_profile.preset_id,
|
|
65
|
+
)
|
|
66
|
+
except (profiles.ProfileError, presets.PresetError, OSError):
|
|
67
|
+
return None
|
|
68
|
+
cost_profile = settings.get("cost_profile") if isinstance(settings, dict) else None
|
|
69
|
+
cost_profile_source = "user" if cost_profile else "default"
|
|
70
|
+
if not cost_profile or cost_profile == "__COST_PROFILE__":
|
|
71
|
+
cost_profile = _DEFAULT_COST_PROFILE
|
|
72
|
+
cost_profile_source = "default"
|
|
73
|
+
return {
|
|
74
|
+
"profile": scrub_string(resolved_profile.id),
|
|
75
|
+
"preset": scrub_string(resolved_preset.id),
|
|
76
|
+
"cost_profile": scrub_string(str(cost_profile)),
|
|
77
|
+
"source_per_knob": {
|
|
78
|
+
"profile": resolved_profile.source,
|
|
79
|
+
"preset": resolved_preset.source,
|
|
80
|
+
"cost_profile": cost_profile_source,
|
|
81
|
+
},
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _pack_marker(project_root: Path) -> Path | None:
|
|
86
|
+
for candidate in (
|
|
87
|
+
project_root / ".agent-pack.yml",
|
|
88
|
+
project_root / ".agent-src.uncompressed" / ".agent-pack.yml",
|
|
89
|
+
):
|
|
90
|
+
if candidate.exists():
|
|
91
|
+
return candidate
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def build_pack(project_root: Path) -> dict[str, Any] | None:
|
|
96
|
+
"""Return the active workspace pack or ``None``.
|
|
97
|
+
|
|
98
|
+
The discovery pipeline (R3) writes a ``.agent-pack.yml`` marker
|
|
99
|
+
when a pack is bound to the project. We surface only the id and a
|
|
100
|
+
short reason; pack-internal payloads stay invisible to the trace.
|
|
101
|
+
"""
|
|
102
|
+
marker = _pack_marker(project_root)
|
|
103
|
+
if marker is None:
|
|
104
|
+
return None
|
|
105
|
+
try:
|
|
106
|
+
import yaml # type: ignore[import-not-found]
|
|
107
|
+
except ImportError:
|
|
108
|
+
return None
|
|
109
|
+
try:
|
|
110
|
+
raw = yaml.safe_load(marker.read_text(encoding="utf-8")) or {}
|
|
111
|
+
except (OSError, yaml.YAMLError):
|
|
112
|
+
return None
|
|
113
|
+
if not isinstance(raw, dict):
|
|
114
|
+
return None
|
|
115
|
+
pack_id = raw.get("id") or raw.get("pack")
|
|
116
|
+
if not isinstance(pack_id, str) or not pack_id.strip():
|
|
117
|
+
return None
|
|
118
|
+
reason = raw.get("reason") or f"declared in {marker.name}"
|
|
119
|
+
return {
|
|
120
|
+
"id": scrub_string(pack_id.strip()),
|
|
121
|
+
"reason": scrub_string(str(reason)),
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
__all__ = ["build", "build_pack"]
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""Resolve the ``memory`` why-slot for the trace.
|
|
2
|
+
|
|
3
|
+
Two sources are consulted:
|
|
4
|
+
|
|
5
|
+
* ``state.memory[]`` — the work-engine writes per-run memory hits here
|
|
6
|
+
during the ``memory`` step. Each entry carries ``{entry_id,
|
|
7
|
+
hit_score, used_in}`` already shaped to the trace contract.
|
|
8
|
+
* ``<root>/.agent-memory/hits.jsonl`` — optional sidecar produced by
|
|
9
|
+
the memory-MCP integration. Filtered to entries tagged with the run
|
|
10
|
+
id when present.
|
|
11
|
+
|
|
12
|
+
Returns ``null`` when neither source produced a non-empty list (the
|
|
13
|
+
schema accepts a null memory slot so the renderer can drop the
|
|
14
|
+
section cleanly).
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import json
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any
|
|
21
|
+
|
|
22
|
+
from scripts._cli.explain_last.scrubber import scrub_string
|
|
23
|
+
|
|
24
|
+
MEMORY_SIDECAR = Path(".agent-memory") / "hits.jsonl"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _coerce_entry(raw: dict[str, Any]) -> dict[str, Any] | None:
|
|
28
|
+
entry_id = raw.get("entry_id") or raw.get("id")
|
|
29
|
+
if not isinstance(entry_id, str) or not entry_id.strip():
|
|
30
|
+
return None
|
|
31
|
+
hit_score = raw.get("hit_score")
|
|
32
|
+
if hit_score is None:
|
|
33
|
+
hit_score = raw.get("score", 0.0)
|
|
34
|
+
try:
|
|
35
|
+
hit_score = float(hit_score)
|
|
36
|
+
except (TypeError, ValueError):
|
|
37
|
+
hit_score = 0.0
|
|
38
|
+
used_in = raw.get("used_in") or raw.get("step") or "unspecified"
|
|
39
|
+
return {
|
|
40
|
+
"entry_id": scrub_string(entry_id.strip()),
|
|
41
|
+
"hit_score": hit_score,
|
|
42
|
+
"used_in": scrub_string(str(used_in)),
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _from_state(state: dict[str, Any]) -> list[dict[str, Any]]:
|
|
47
|
+
entries: list[dict[str, Any]] = []
|
|
48
|
+
for raw in state.get("memory", []) or []:
|
|
49
|
+
if not isinstance(raw, dict):
|
|
50
|
+
continue
|
|
51
|
+
entry = _coerce_entry(raw)
|
|
52
|
+
if entry is not None:
|
|
53
|
+
entries.append(entry)
|
|
54
|
+
return entries
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _from_sidecar(project_root: Path, run_id: str | None) -> list[dict[str, Any]]:
|
|
58
|
+
path = project_root / MEMORY_SIDECAR
|
|
59
|
+
if not path.exists():
|
|
60
|
+
return []
|
|
61
|
+
entries: list[dict[str, Any]] = []
|
|
62
|
+
try:
|
|
63
|
+
for line in path.read_text(encoding="utf-8").splitlines():
|
|
64
|
+
line = line.strip()
|
|
65
|
+
if not line:
|
|
66
|
+
continue
|
|
67
|
+
try:
|
|
68
|
+
raw = json.loads(line)
|
|
69
|
+
except json.JSONDecodeError:
|
|
70
|
+
continue
|
|
71
|
+
if not isinstance(raw, dict):
|
|
72
|
+
continue
|
|
73
|
+
if run_id and raw.get("run_id") not in (None, run_id):
|
|
74
|
+
continue
|
|
75
|
+
entry = _coerce_entry(raw)
|
|
76
|
+
if entry is not None:
|
|
77
|
+
entries.append(entry)
|
|
78
|
+
except OSError:
|
|
79
|
+
return []
|
|
80
|
+
return entries
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def build(
|
|
84
|
+
project_root: Path,
|
|
85
|
+
state: dict[str, Any],
|
|
86
|
+
) -> list[dict[str, Any]] | None:
|
|
87
|
+
"""Return the ``memory`` slot or ``None`` if no hits were captured."""
|
|
88
|
+
run_id = (state.get("input") or {}).get("data", {}).get("id")
|
|
89
|
+
entries = _from_state(state)
|
|
90
|
+
entries.extend(_from_sidecar(project_root, run_id if isinstance(run_id, str) else None))
|
|
91
|
+
return entries or None
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
__all__ = ["build"]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Builder for the ``trace.provider`` slot.
|
|
2
|
+
|
|
3
|
+
Bounded to video runs (``state.directive_set == "video"``). The
|
|
4
|
+
work_engine does not yet ship a video directive set — this builder is
|
|
5
|
+
forward-compatible: when the engine eventually persists a provider
|
|
6
|
+
selection (``state.video_provider`` or
|
|
7
|
+
``state.contract.video_provider`` are both accepted shapes), the slot
|
|
8
|
+
populates; otherwise it returns ``None``.
|
|
9
|
+
|
|
10
|
+
The v1 schema requires ``{id, selection_reason}``. Both fields pass
|
|
11
|
+
through :func:`scripts._cli.explain_last.scrubber.scrub_string` so a
|
|
12
|
+
reason explaining "selected because user has $40/m budget on
|
|
13
|
+
provider-x.internal" never leaks billing or hostnames.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
from scripts._cli.explain_last.scrubber import scrub_string
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _extract(state: dict[str, Any]) -> dict[str, Any] | None:
|
|
23
|
+
direct = state.get("video_provider")
|
|
24
|
+
if isinstance(direct, dict):
|
|
25
|
+
return direct
|
|
26
|
+
contract = state.get("contract")
|
|
27
|
+
if isinstance(contract, dict):
|
|
28
|
+
nested = contract.get("video_provider")
|
|
29
|
+
if isinstance(nested, dict):
|
|
30
|
+
return nested
|
|
31
|
+
return None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def build(state: dict[str, Any]) -> dict[str, Any] | None:
|
|
35
|
+
if (state.get("directive_set") or "") != "video":
|
|
36
|
+
return None
|
|
37
|
+
payload = _extract(state)
|
|
38
|
+
if payload is None:
|
|
39
|
+
return None
|
|
40
|
+
pid = payload.get("id")
|
|
41
|
+
reason = payload.get("selection_reason")
|
|
42
|
+
if not isinstance(pid, str) or not pid:
|
|
43
|
+
return None
|
|
44
|
+
if not isinstance(reason, str) or not reason:
|
|
45
|
+
reason = ""
|
|
46
|
+
return {
|
|
47
|
+
"id": scrub_string(pid),
|
|
48
|
+
"selection_reason": scrub_string(reason),
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
__all__ = ["build"]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Deterministic Markdown projection of an :class:`ExplainTrace`.
|
|
2
|
+
|
|
3
|
+
Pure-function ``render(trace) -> str``. Same input ``ExplainTrace``
|
|
4
|
+
always yields byte-identical Markdown — Phase 4 snapshot tests rely on
|
|
5
|
+
this. Each section lives in its own module under :mod:`sections/`; the
|
|
6
|
+
orchestrator only fixes the order. Phase 3 wired ``halt`` and
|
|
7
|
+
``provider`` sections; ``halt`` always renders (clean / dirty branch
|
|
8
|
+
both deterministic), ``provider`` emits an empty string on non-video
|
|
9
|
+
runs so the orchestrator drops it silently.
|
|
10
|
+
"""
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from scripts._cli.explain_last import sections
|
|
16
|
+
|
|
17
|
+
_SECTION_ORDER = (
|
|
18
|
+
sections.header,
|
|
19
|
+
sections.route,
|
|
20
|
+
sections.inputs,
|
|
21
|
+
sections.memory,
|
|
22
|
+
sections.council,
|
|
23
|
+
sections.halt,
|
|
24
|
+
sections.provider,
|
|
25
|
+
sections.assumptions,
|
|
26
|
+
sections.pack,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
TIP_FOOTER = (
|
|
30
|
+
"_tip: pass `--json` to emit machine-readable trace; "
|
|
31
|
+
"`--quiet` to drop this footer._\n"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def render(trace: dict[str, Any], *, with_footer: bool = True) -> str:
|
|
36
|
+
"""Render ``trace`` to Markdown.
|
|
37
|
+
|
|
38
|
+
``with_footer=False`` suppresses the trailing tip line (council
|
|
39
|
+
fix: CI scripts parse the output and choke on a stray footer).
|
|
40
|
+
"""
|
|
41
|
+
parts: list[str] = []
|
|
42
|
+
for section in _SECTION_ORDER:
|
|
43
|
+
chunk = section.render(trace)
|
|
44
|
+
if chunk:
|
|
45
|
+
parts.append(chunk)
|
|
46
|
+
body = "\n".join(parts).rstrip() + "\n"
|
|
47
|
+
if with_footer:
|
|
48
|
+
body += "\n" + TIP_FOOTER
|
|
49
|
+
return body
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
__all__ = ["TIP_FOOTER", "render"]
|