@event4u/agent-config 3.3.0 → 4.1.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/README.md +2 -2
- package/.agent-src/commands/agent-handoff.md +31 -2
- package/.agent-src/commands/agent-status.md +5 -5
- package/.agent-src/commands/agents/audit.md +8 -8
- package/.agent-src/commands/agents/init.md +25 -1
- package/.agent-src/commands/agents/optimize.md +3 -3
- package/.agent-src/commands/agents/user.md +1 -1
- package/.agent-src/commands/agents.md +1 -1
- package/.agent-src/commands/analyze-reference-repo.md +1 -1
- package/.agent-src/commands/check-current-md.md +8 -8
- package/.agent-src/commands/{compress.md → condense.md} +55 -55
- package/.agent-src/commands/context/create.md +7 -4
- package/.agent-src/commands/context/refactor.md +3 -1
- package/.agent-src/commands/feature/dev.md +1 -1
- package/.agent-src/commands/feature/explore.md +1 -1
- package/.agent-src/commands/feature/plan.md +10 -8
- package/.agent-src/commands/feature/refactor.md +3 -1
- package/.agent-src/commands/feature/roadmap.md +7 -4
- package/.agent-src/commands/fix/portability.md +3 -3
- package/.agent-src/commands/fix/refs.md +4 -4
- package/.agent-src/commands/ghostwriter.md +2 -2
- package/.agent-src/commands/memory/learn-low-impact.md +3 -3
- package/.agent-src/commands/module/explore.md +34 -8
- package/.agent-src/commands/optimize/agents-dir.md +9 -7
- package/.agent-src/commands/optimize/augmentignore.md +2 -2
- package/.agent-src/commands/optimize/skills.md +9 -9
- package/.agent-src/commands/post-as.md +1 -1
- package/.agent-src/commands/project-analyze.md +2 -2
- package/.agent-src/commands/project-health.md +3 -2
- package/.agent-src/commands/research/deep.md +1 -1
- package/.agent-src/commands/research/report.md +1 -1
- package/.agent-src/commands/research.md +1 -1
- package/.agent-src/commands/roadmap/ai-council.md +1 -1
- package/.agent-src/commands/roadmap/create.md +9 -4
- package/.agent-src/commands/rule-compliance-audit.md +1 -1
- package/.agent-src/commands/upstream-contribute.md +14 -14
- package/.agent-src/commands/video/from-script.md +1 -1
- package/.agent-src/commands/video/scene.md +1 -1
- package/.agent-src/commands/video/stitch.md +1 -1
- package/.agent-src/commands/video/storyboard.md +1 -1
- package/.agent-src/commands/video.md +1 -1
- package/.agent-src/contexts/augment-infrastructure.md +1 -1
- package/.agent-src/contexts/authority/commit-mechanics.md +15 -0
- package/.agent-src/contexts/authority/kernel-rule-edits.md +3 -3
- package/.agent-src/contexts/authority/scope-mechanics.md +1 -1
- package/.agent-src/contexts/communication/rules-auto/augment-source-of-truth-mechanics.md +28 -28
- package/.agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +4 -4
- package/.agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
- package/.agent-src/contexts/contracts/artifact-engagement-flow.md +6 -6
- package/.agent-src/contexts/contracts/command-suggestion-flow.md +3 -3
- package/.agent-src/contexts/contracts/emergency-triage-block.md +4 -4
- package/.agent-src/contexts/contracts/frugality-charter.md +3 -3
- package/.agent-src/contexts/documentation-hierarchy.md +14 -7
- package/.agent-src/contexts/execution/autonomy-examples.md +1 -1
- package/.agent-src/contexts/execution/cheap-question-mechanics.md +39 -2
- package/.agent-src/contexts/execution/roadmap-process-loop.md +28 -5
- package/.agent-src/contexts/override-system.md +5 -5
- package/.agent-src/ghostwriter/fictional-fixture-v1.md +1 -1
- package/.agent-src/personas/advisors/first-principles.md +1 -1
- package/.agent-src/personas/hollywood-director.md +1 -1
- package/.agent-src/rules/architecture.md +5 -1
- package/.agent-src/rules/augment-edit-discipline.md +5 -5
- package/.agent-src/rules/augment-source-of-truth.md +15 -15
- package/.agent-src/rules/commit-conventions.md +1 -1
- package/.agent-src/rules/commit-policy.md +10 -0
- package/.agent-src/rules/domain-adoption-policy.md +3 -3
- package/.agent-src/rules/fast-path-marker-visibility.md +3 -3
- package/.agent-src/rules/finance-safety-floor.md +1 -1
- package/.agent-src/rules/framework-neutrality-in-generic-skills.md +8 -8
- package/.agent-src/rules/git-history-discipline.md +1 -1
- package/.agent-src/rules/improve-before-implement.md +2 -2
- package/.agent-src/rules/language-and-tone.md +2 -2
- package/.agent-src/rules/media-governance-routing.md +5 -5
- package/.agent-src/rules/no-attribution-footers.md +1 -0
- package/.agent-src/rules/no-cheap-questions.md +3 -0
- package/.agent-src/rules/no-decorative-emojis-in-git-surfaces.md +111 -0
- package/.agent-src/rules/no-pr-progress-comments.md +118 -0
- package/.agent-src/rules/no-roadmap-references.md +3 -3
- package/.agent-src/rules/non-destructive-by-default.md +1 -1
- package/.agent-src/rules/persona-governance.md +3 -3
- package/.agent-src/rules/preservation-guard.md +15 -15
- package/.agent-src/rules/roadmap-ci-steps-policy.md +7 -3
- package/.agent-src/rules/rule-type-governance.md +1 -1
- package/.agent-src/rules/skill-quality.md +1 -1
- package/.agent-src/rules/{caveman-speak.md → telegraph-speak.md} +15 -15
- package/.agent-src/rules/token-optimizer-maintenance.md +6 -6
- package/.agent-src/skills/agent-docs-writing/SKILL.md +17 -11
- package/.agent-src/skills/agents-md-thin-root/SKILL.md +9 -9
- package/.agent-src/skills/check-refs/SKILL.md +2 -2
- package/.agent-src/skills/code-refactoring/SKILL.md +2 -2
- package/.agent-src/skills/command-writing/SKILL.md +19 -19
- package/.agent-src/skills/comp-banding/SKILL.md +1 -1
- package/.agent-src/skills/condense-memory/SKILL.md +131 -0
- package/.agent-src/skills/context-authoring/SKILL.md +2 -2
- package/.agent-src/skills/context-document/SKILL.md +5 -3
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +3 -3
- package/.agent-src/skills/description-assist/SKILL.md +2 -2
- package/.agent-src/skills/git-workflow/SKILL.md +1 -1
- package/.agent-src/skills/guideline-writing/SKILL.md +5 -5
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +4 -4
- package/.agent-src/skills/lint-skills/SKILL.md +3 -3
- package/.agent-src/skills/md-language-check/SKILL.md +2 -2
- package/.agent-src/skills/module-detect-on-the-fly/SKILL.md +138 -0
- package/.agent-src/skills/module-management/SKILL.md +166 -94
- package/.agent-src/skills/override-management/SKILL.md +1 -1
- package/.agent-src/skills/persona-writing/SKILL.md +5 -5
- package/.agent-src/skills/positioning-strategy/SKILL.md +1 -1
- package/.agent-src/skills/project-docs/SKILL.md +6 -4
- package/.agent-src/skills/readme-reviewer/SKILL.md +2 -2
- package/.agent-src/skills/roadmap-management/SKILL.md +13 -1
- package/.agent-src/skills/roadmap-writing/SKILL.md +4 -2
- package/.agent-src/skills/rule-refactor/SKILL.md +5 -5
- package/.agent-src/skills/rule-writing/SKILL.md +18 -18
- package/.agent-src/skills/script-writing/SKILL.md +1 -1
- package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +6 -6
- package/.agent-src/skills/skill-management/SKILL.md +21 -21
- package/.agent-src/skills/skill-reviewer/SKILL.md +2 -2
- package/.agent-src/skills/skill-writing/SKILL.md +8 -8
- package/.agent-src/skills/skill-writing/evals/triggers.json +1 -1
- package/.agent-src/skills/token-optimizer/SKILL.md +4 -4
- package/.agent-src/skills/unit-economics-modeling/SKILL.md +1 -1
- package/.agent-src/skills/upstream-contribute/SKILL.md +17 -17
- package/.agent-src/templates/AGENTS.md +1 -0
- package/.agent-src/templates/agent-settings.md +24 -13
- package/.agent-src/templates/agents/agent-project-settings.example.yml +61 -2
- package/.agent-src/templates/command.md +5 -5
- package/.agent-src/templates/contexts.md +1 -1
- package/.agent-src/templates/copilot-instructions.md +8 -8
- package/.agent-src/templates/features.md +1 -1
- package/.agent-src/templates/hooks/pre-commit-frontmatter +2 -2
- package/.agent-src/templates/hooks/pre-commit-roadmap-progress +3 -3
- package/.agent-src/templates/persona.md +2 -2
- package/.agent-src/templates/roadmaps.md +1 -1
- package/.agent-src/templates/rule.md +13 -13
- package/.agent-src/templates/scripts/memory_lookup.py +1 -1
- package/.agent-src/templates/scripts/memory_status.py +2 -2
- package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +195 -1
- package/.agent-src/templates/scripts/work_engine/orchestration.py +1 -1
- package/.agent-src/templates/skill-archive-note.md +5 -5
- package/.agent-src/templates/skill.md +1 -1
- package/.claude-plugin/marketplace.json +4 -4
- package/AGENTS.md +16 -17
- package/CHANGELOG.md +181 -3
- package/CONTRIBUTING.md +31 -12
- package/README.md +18 -10
- package/config/agent-settings.template.yml +22 -2
- package/config/discovery/unassigned-artefacts.yml +24 -24
- package/config/profiles/full.ini +1 -1
- package/dist/cli/agent-config.js +52 -3
- package/dist/cli/agent-config.js.map +1 -1
- package/dist/cli/commands/uiServe.js +9 -0
- package/dist/cli/commands/uiServe.js.map +1 -1
- package/dist/cli/registry.js +2 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +649 -606
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +439 -437
- package/dist/discovery/trust-report.md +5 -5
- package/dist/discovery/workspaces.json +450 -448
- package/dist/install/apply.js +238 -0
- package/dist/install/apply.js.map +1 -0
- package/dist/install/atomic.js +92 -0
- package/dist/install/atomic.js.map +1 -0
- package/dist/install/bridges/augment.js +20 -0
- package/dist/install/bridges/augment.js.map +1 -0
- package/dist/install/bridges/claude.js +44 -0
- package/dist/install/bridges/claude.js.map +1 -0
- package/dist/install/bridges/cline.js +69 -0
- package/dist/install/bridges/cline.js.map +1 -0
- package/dist/install/bridges/copilot.js +28 -0
- package/dist/install/bridges/copilot.js.map +1 -0
- package/dist/install/bridges/cursor.js +34 -0
- package/dist/install/bridges/cursor.js.map +1 -0
- package/dist/install/bridges/gemini.js +39 -0
- package/dist/install/bridges/gemini.js.map +1 -0
- package/dist/install/bridges/index.js +88 -0
- package/dist/install/bridges/index.js.map +1 -0
- package/dist/install/bridges/marker-content.js +153 -0
- package/dist/install/bridges/marker-content.js.map +1 -0
- package/dist/install/bridges/markers.js +42 -0
- package/dist/install/bridges/markers.js.map +1 -0
- package/dist/install/bridges/types.js +31 -0
- package/dist/install/bridges/types.js.map +1 -0
- package/dist/install/bridges/vscode.js +26 -0
- package/dist/install/bridges/vscode.js.map +1 -0
- package/dist/install/bridges/windsurf.js +35 -0
- package/dist/install/bridges/windsurf.js.map +1 -0
- package/dist/install/conflict.js +196 -0
- package/dist/install/conflict.js.map +1 -0
- package/dist/install/detect.js +218 -0
- package/dist/install/detect.js.map +1 -0
- package/dist/install/paths.js +82 -0
- package/dist/install/paths.js.map +1 -0
- package/dist/install/plan.js +157 -0
- package/dist/install/plan.js.map +1 -0
- package/dist/install/txlog.js +140 -0
- package/dist/install/txlog.js.map +1 -0
- package/dist/install/types.js +19 -0
- package/dist/install/types.js.map +1 -0
- package/dist/install/wizard-plan.js +184 -0
- package/dist/install/wizard-plan.js.map +1 -0
- package/dist/mcp/registry-manifest.json +4 -4
- package/dist/router.json +67 -19
- package/dist/server/app.js +6 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/routes/install.js +547 -0
- package/dist/server/routes/install.js.map +1 -0
- package/dist/server/routes/wizard.js +301 -6
- package/dist/server/routes/wizard.js.map +1 -1
- package/dist/server/routes/workspace.js +396 -0
- package/dist/server/routes/workspace.js.map +1 -0
- package/dist/server/schemas/settings.js +4 -3
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/ui/assets/index-BXZILUxe.css +1 -0
- package/dist/ui/assets/index-DLEuEW1V.js +35 -0
- package/dist/ui/assets/index-DLEuEW1V.js.map +1 -0
- package/dist/ui/index.html +2 -2
- package/docs/MIGRATION.md +1 -1
- package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
- package/docs/adrs/router/0001-three-tier-routing.md +4 -4
- package/docs/adrs/schema/0001-json-schema-frontmatter.md +1 -1
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +4 -4
- package/docs/adrs/{caveman → telegraph}/0001-default-off-until-bench.md +9 -9
- package/docs/adrs/telegraph/README.md +9 -0
- package/docs/architecture/augment-projection.md +4 -4
- package/docs/architecture/claude-bundle.md +1 -1
- package/docs/architecture/current-onboard-baseline.md +3 -3
- package/docs/architecture/multi-tool-projection.md +10 -10
- package/docs/architecture/source-projection.md +27 -27
- package/docs/architecture.md +19 -15
- package/docs/archive/CHANGELOG-pre-2.11.0.md +2 -2
- package/docs/archive/CHANGELOG-pre-2.15.0.md +3 -3
- package/docs/archive/CHANGELOG-pre-2.16.0.md +1 -1
- package/docs/archive/CHANGELOG-pre-2.2.0.md +70 -70
- package/docs/archive/CHANGELOG-pre-2.20.0.md +2 -2
- package/docs/archive/CHANGELOG-pre-2.25.0.md +15 -15
- package/docs/archive/CHANGELOG-pre-3.0.0.md +4 -4
- package/docs/archive/CHANGELOG-pre-3.1.0.md +2 -2
- package/docs/archive/CHANGELOG-pre-3.2.0.md +3 -3
- package/docs/benchmark.md +65 -0
- package/docs/benchmarks.md +16 -16
- package/docs/catalog.md +17 -15
- package/docs/contracts/CHANGELOG-conventions.md +1 -1
- package/docs/contracts/STABILITY.md +2 -2
- package/docs/contracts/adoption-signal-floor.md +110 -0
- package/docs/contracts/adr-chat-history-split.md +4 -4
- package/docs/contracts/adr-command-suggestion.md +4 -4
- package/docs/contracts/adr-gtm-context-spine.md +1 -1
- package/docs/contracts/adr-implement-ticket-runtime.md +4 -4
- package/docs/contracts/adr-install-user-type-axis.md +1 -1
- package/docs/contracts/adr-layout.md +2 -2
- package/docs/contracts/adr-product-ui-track.md +10 -10
- package/docs/contracts/adr-user-types-axis.md +3 -3
- package/docs/contracts/adr-wing4-context-spine.md +1 -1
- package/docs/contracts/agent-memory-contract.md +3 -3
- package/docs/contracts/agents-md-tech-stack.md +2 -2
- package/docs/contracts/ai-council-config.md +2 -2
- package/docs/contracts/at-rest-encryption.md +4 -0
- package/docs/contracts/audit-log-v1.md +1 -1
- package/docs/contracts/benchmark-ab-contract.md +101 -0
- package/docs/contracts/benchmark-corpus-spec.md +1 -1
- package/docs/contracts/branch-protection-policy.md +98 -0
- package/docs/contracts/ci-cost-budget.md +106 -0
- package/docs/contracts/ci-green-floor.md +141 -0
- package/docs/contracts/command-clusters.md +6 -6
- package/docs/contracts/command-surface-tiers.md +2 -2
- package/docs/contracts/command-taxonomy.md +2 -2
- package/docs/contracts/{compression-default-kill-criterion.md → condensation-default-kill-criterion.md} +29 -29
- package/docs/contracts/config-presets.md +1 -1
- package/docs/contracts/context-paths.md +3 -3
- package/docs/contracts/context-spine.md +1 -1
- package/docs/contracts/cost-summary-schema.md +12 -12
- package/docs/contracts/cross-wing-handoff.md +4 -4
- package/docs/contracts/daily-workspace.md +4 -0
- package/docs/contracts/decision-trace-v1.md +2 -2
- package/docs/contracts/discovery-manifest.md +4 -4
- package/docs/contracts/explain-modes.md +4 -0
- package/docs/contracts/file-ownership-matrix.json +3493 -3318
- package/docs/contracts/file-ownership-matrix.md +3 -3
- package/docs/contracts/frontmatter-contract.md +4 -4
- package/docs/contracts/ghostwriter-schema.md +3 -3
- package/docs/contracts/gui-wizard.md +1 -1
- package/docs/contracts/harness-expectations.md +123 -0
- package/docs/contracts/host-agent-protocol.md +4 -0
- package/docs/contracts/implement-ticket-flow.md +9 -9
- package/docs/contracts/install-scopes.md +77 -0
- package/docs/contracts/iron-law-overrides.txt +1 -1
- package/docs/contracts/kernel-membership.md +26 -26
- package/docs/contracts/linear-ai-rules-inclusion.md +1 -1
- package/docs/contracts/linter-structural-model.md +2 -2
- package/docs/contracts/load-context-budget-model.md +4 -4
- package/docs/contracts/load-context-schema.md +13 -13
- package/docs/contracts/local-analytics.md +4 -0
- package/docs/contracts/local-knowledge-ingestion.md +1 -1
- package/docs/contracts/mcp-cloud-scope.md +2 -2
- package/docs/contracts/mcp-phase-1-scope.md +3 -3
- package/docs/contracts/measurement-baseline.md +5 -5
- package/docs/contracts/mental-models.md +30 -30
- package/docs/contracts/multi-tool-projection-fidelity.md +4 -4
- package/docs/contracts/namespace.md +4 -4
- package/docs/contracts/orchestration-dsl-v1.md +7 -7
- package/docs/contracts/package-self-orientation.md +12 -12
- package/docs/contracts/persona-schema.md +6 -6
- package/docs/contracts/pilot/language-and-tone.md +1 -1
- package/docs/contracts/plain-language-surface.md +117 -0
- package/docs/contracts/profile-system.md +3 -3
- package/docs/contracts/release-pr-gating.md +103 -0
- package/docs/contracts/role-experience.md +3 -3
- package/docs/contracts/rule-classification.md +13 -13
- package/docs/contracts/rule-interactions.md +4 -4
- package/docs/contracts/rule-interactions.yml +30 -30
- package/docs/contracts/rule-priority-hierarchy.md +13 -13
- package/docs/contracts/rule-router.md +2 -2
- package/docs/contracts/safety-model.md +1 -1
- package/docs/contracts/skill-distribution-channels.md +61 -0
- package/docs/contracts/skill-domains.md +2 -2
- package/docs/contracts/smoke-contracts.md +5 -5
- package/docs/contracts/telegraph-telemetry.md +83 -0
- package/docs/contracts/trust-and-safety.md +5 -5
- package/docs/contracts/ui-stack-extension.md +7 -7
- package/docs/contracts/ui-track-flow.md +9 -9
- package/docs/contracts/user-type-schema.md +4 -4
- package/docs/contracts/workflow-packs.md +4 -4
- package/docs/contracts/workspace-documents.md +4 -0
- package/docs/customization.md +28 -8
- package/docs/decisions/ADR-001-kernel-swap-deferred.md +6 -6
- package/docs/decisions/ADR-002-kernel-bucket-overrides.md +11 -11
- package/docs/decisions/ADR-003-flat-cluster-subs-and-colon-syntax.md +2 -2
- package/docs/decisions/ADR-004-rule-governance-pruning.md +4 -4
- package/docs/decisions/ADR-005-subagent-worktrees.md +7 -7
- package/docs/decisions/ADR-011-domain-pack-readiness.md +6 -6
- package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +3 -3
- package/docs/decisions/ADR-015-discovery-manifest-contract.md +3 -3
- package/docs/decisions/ADR-017-monorepo-physical-layout.md +10 -10
- package/docs/decisions/ADR-018-trust-and-safety-layer.md +6 -6
- package/docs/decisions/ADR-019-router-json-dist-location.md +2 -2
- package/docs/decisions/ADR-020-global-only-consumer-scope.md +2 -2
- package/docs/decisions/ADR-021-deployment-shape.md +1 -1
- package/docs/decisions/ADR-022-daily-workspace-decomposition.md +1 -1
- package/docs/decisions/ADR-027-changelog-machine-vs-manual.md +2 -2
- package/docs/decisions/ADR-028-root-layout.md +7 -7
- package/docs/decisions/ADR-029-multi-workspace-deferred.md +2 -2
- package/docs/decisions/ADR-rule-kernel-and-router.md +5 -5
- package/docs/deploy/team-deployment-posture.md +20 -0
- package/docs/development.md +17 -17
- package/docs/distribution/registries.md +32 -0
- package/docs/distribution/registry-submissions.md +85 -0
- package/docs/distribution/telemetry-schema.md +1 -1
- package/docs/getting-started-by-role.md +45 -3
- package/docs/getting-started.md +2 -2
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +1 -1
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +1 -1
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/layered-settings.md +56 -2
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +2 -2
- package/docs/guidelines/agent-infra/rule-type-governance.md +1 -1
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +5 -5
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +1 -1
- package/docs/guidelines/augment-portability-patterns.md +4 -4
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/php/php-coding-patterns.md +1 -1
- package/docs/guidelines/prompt-templates.md +6 -6
- package/docs/maintainers/dev-mode.md +1 -1
- package/docs/mcp.md +1 -1
- package/docs/parity/bench.json +3 -3
- package/docs/parity/ruflo.md +2 -2
- package/docs/profiles.md +11 -11
- package/docs/quality.md +11 -11
- package/docs/safety.md +3 -3
- package/docs/setup/mcp-client-config.md +1 -1
- package/docs/setup/mcp-r2-bootstrap.md +1 -1
- package/docs/setup/mcp-server-docker.md +3 -3
- package/docs/setup/per-ide/windsurf.md +1 -1
- package/docs/skills-catalog.md +8 -7
- package/docs/troubleshooting.md +1 -1
- package/docs/walkthroughs/daily-workspace-a11y.md +87 -0
- package/llms.txt +7 -6
- package/package.json +1 -1
- package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
- package/scripts/_archive/README.md +2 -2
- package/scripts/_archive/_backfill_skill_domains.py +3 -3
- package/scripts/_archive/_bootstrap_tier_frontmatter.py +3 -3
- package/scripts/_archive/_p43_bodies.py +10 -10
- package/scripts/_archive/{_p43_compress.py → _p43_condense.py} +5 -5
- package/scripts/_archive/_p4_migrate.py +7 -7
- package/scripts/_archive/_phase2_shim_helper.py +1 -1
- package/scripts/_archive/_pilot_council_question.py +5 -5
- package/scripts/_cli/explain_last/inputs.py +1 -1
- package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
- package/scripts/_lib/agent_settings.py +195 -1
- package/scripts/_lib/agent_src.py +19 -19
- package/scripts/_lib/bench_ab_cache.py +162 -0
- package/scripts/_lib/bench_ab_scoring.py +209 -0
- package/scripts/_lib/{bench_caveman.py → bench_telegraph.py} +21 -21
- package/scripts/_lib/{bench_caveman_report.py → bench_telegraph_report.py} +21 -21
- package/scripts/_lib/claude_desktop_bundler.py +5 -5
- package/scripts/_lib/module_detection.py +223 -0
- package/scripts/_lib/scope_guard.sh +162 -0
- package/scripts/_phase4_bucket.py +3 -3
- package/scripts/_pilot_measure.py +4 -4
- package/scripts/_tmp_scan_framework_leakage.py +1 -1
- package/scripts/adoption_report.py +195 -0
- package/scripts/adoption_snapshot.py +219 -0
- package/scripts/adoption_status.py +166 -0
- package/scripts/ai-video/lib/parse-blueprint.sh +1 -1
- package/scripts/ai_council/advisors.py +5 -5
- package/scripts/ai_council/compile_corpus.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +3 -3
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_context_layer_v1_review.py +2 -2
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_inject_quiet_flag.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_v2.sh +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_verbosity.sh +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_nondestructive_inline_audit.py +3 -3
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_per_task.sh +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase6_trigger_jaccard.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase_2a_budget_rebalance.py +6 -6
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_rebalancing_audit.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +6 -6
- package/scripts/annotate_discovery.py +13 -13
- package/scripts/apply_modules_config.py +290 -0
- package/scripts/audit_adr_coverage.py +2 -2
- package/scripts/audit_auto_rules.py +2 -2
- package/scripts/audit_cloud_compatibility.py +3 -3
- package/scripts/audit_command_surface.py +9 -9
- package/scripts/audit_likelihood.py +2 -2
- package/scripts/audit_user_type_axis.py +2 -2
- package/scripts/bench_ab_cache_dispatch.py +68 -0
- package/scripts/bench_ab_clone.py +170 -0
- package/scripts/bench_ab_diff.py +227 -0
- package/scripts/bench_ab_integrity.py +143 -0
- package/scripts/bench_ab_run.py +235 -0
- package/scripts/bench_ab_task_runner.py +369 -0
- package/scripts/bench_ab_tracka_run.py +202 -0
- package/scripts/{bench_compress_memory.py → bench_condense_memory.py} +16 -16
- package/scripts/bench_run.py +33 -33
- package/scripts/bench_runner.py +2 -2
- package/scripts/bootstrap.sh +99 -0
- package/scripts/build_cloud_bundle.py +6 -6
- package/scripts/build_discovery_manifest.py +7 -7
- package/scripts/build_linear_digest.py +3 -3
- package/scripts/build_rule_trigger_matrix.py +8 -8
- package/scripts/chat_history.py +5 -5
- package/scripts/check_always_budget.py +11 -5
- package/scripts/check_augment_description_cap.py +3 -3
- package/scripts/check_cluster_patterns.py +2 -2
- package/scripts/check_command_count_messaging.py +3 -3
- package/scripts/{check_compression.py → check_condensation.py} +34 -34
- package/scripts/{check_compressed_paths.py → check_condensed_paths.py} +8 -8
- package/scripts/check_context_paths.py +7 -7
- package/scripts/check_council_layout.py +2 -2
- package/scripts/check_council_references.py +9 -9
- package/scripts/check_iron_law_prominence.py +2 -2
- package/scripts/check_kernel_rule_bundle.py +2 -2
- package/scripts/check_module_management_neutral.py +149 -0
- package/scripts/check_no_roadmap_refs.py +9 -9
- package/scripts/check_portability.py +3 -3
- package/scripts/check_public_catalog_links.py +4 -4
- package/scripts/check_references.py +7 -6
- package/scripts/check_release_pr_shape.py +112 -0
- package/scripts/check_reply_consistency.py +3 -3
- package/scripts/check_safety_floor_untouched.py +1 -1
- package/scripts/check_template_pin_drift.py +5 -5
- package/scripts/check_token_optimizer_freshness.py +3 -3
- package/scripts/ci_status.py +301 -0
- package/scripts/ci_time_ratio.py +1 -1
- package/scripts/cleanup_other_scope.sh +146 -0
- package/scripts/compile_router.py +10 -10
- package/scripts/{compress.py → condense.py} +64 -64
- package/scripts/condense.sh +18 -0
- package/scripts/{compress_memory.py → condense_memory.py} +33 -33
- package/scripts/config/presets.py +2 -2
- package/scripts/config/profiles.py +1 -1
- package/scripts/cost_by_conversation.py +3 -3
- package/scripts/cost_summary.py +7 -7
- package/scripts/count_token_optimizer_usage.sh +1 -1
- package/scripts/gen_discovery_baseline.py +5 -5
- package/scripts/generate_index.py +6 -6
- package/scripts/generate_ownership_matrix.py +10 -10
- package/scripts/generate_pack_manifests.py +1 -1
- package/scripts/ghostwriter_fixture_allowlist.txt +1 -1
- package/scripts/install +3 -3
- package/scripts/install-hooks.sh +6 -6
- package/scripts/install.py +76 -11
- package/scripts/install.sh +187 -1
- package/scripts/inventory_frontmatter.py +2 -2
- package/scripts/iron_law_sha.py +3 -3
- package/scripts/lint_agents_layout.py +14 -7
- package/scripts/lint_agents_md.py +4 -4
- package/scripts/lint_archived_skills.py +3 -3
- package/scripts/lint_artefact_frontmatter.py +2 -2
- package/scripts/lint_bench_ab.py +172 -0
- package/scripts/lint_bench_corpus.py +1 -1
- package/scripts/lint_command_tiers.py +5 -5
- package/scripts/lint_context_spine_usage.py +1 -1
- package/scripts/lint_framework_leakage.py +7 -7
- package/scripts/lint_framework_leakage_allowlist.json +144 -84
- package/scripts/lint_ghostwriter_source.py +3 -3
- package/scripts/lint_handoffs.py +1 -1
- package/scripts/lint_load_context.py +11 -11
- package/scripts/lint_media_policy_linkage.py +5 -5
- package/scripts/lint_namespace.py +1 -1
- package/scripts/lint_no_new_atomic_commands.py +2 -2
- package/scripts/lint_orchestration_dsl.py +1 -1
- package/scripts/lint_pack_boundaries.py +2 -2
- package/scripts/lint_persona_governance.py +4 -4
- package/scripts/lint_role_experiences.py +237 -0
- package/scripts/lint_rule_interactions.py +2 -2
- package/scripts/lint_rule_tiers.py +1 -1
- package/scripts/lint_trust_coherence.py +2 -2
- package/scripts/mcp_registry_submit.sh +187 -0
- package/scripts/mcp_server/tools.py +1 -1
- package/scripts/measure_frugality_savings.py +10 -10
- package/scripts/measure_patterns.py +1 -1
- package/scripts/measure_projection_bytes.py +5 -5
- package/scripts/measure_rule_budget.py +3 -3
- package/scripts/measure_skill_reduction.py +1 -1
- package/scripts/memory_lookup.py +1 -1
- package/scripts/memory_status.py +2 -2
- package/scripts/migrate_command_suggestions.py +3 -3
- package/scripts/mine_session.py +1 -1
- package/scripts/move_artefact.py +3 -3
- package/scripts/new_skill.py +2 -2
- package/scripts/pack_mcp_content.py +9 -9
- package/scripts/plan_physical_move.py +6 -6
- package/scripts/print_required_checks.py +196 -0
- package/scripts/probe_skill_registration.py +413 -0
- package/scripts/propose_modules_config.py +145 -0
- package/scripts/prototype_lint_contradictions.py +1 -1
- package/scripts/recruit_preflight.sh +152 -0
- package/scripts/refine_ticket_detect.py +3 -3
- package/scripts/release.py +20 -0
- package/scripts/render_benchmark_md.py +308 -0
- package/scripts/roadmap_progress_hook.py +1 -1
- package/scripts/run_skill_evals.py +2 -2
- package/scripts/runtime_registry.py +4 -4
- package/scripts/schemas/command.schema.json +4 -4
- package/scripts/schemas/rule.schema.json +5 -5
- package/scripts/schemas/skill.schema.json +3 -3
- package/scripts/schemas/user-type.schema.json +1 -1
- package/scripts/score_skill_selection.py +1 -1
- package/scripts/skill_collision_clusters.py +2 -2
- package/scripts/skill_linter.py +81 -81
- package/scripts/skill_overlap.py +5 -5
- package/scripts/skill_tools/audit_persona_coverage.py +2 -2
- package/scripts/skill_tools/audit_user_type_coverage.py +2 -2
- package/scripts/skill_tools/run_block_d_eval.py +1 -1
- package/scripts/skill_tools/score_skill_relevance.py +1 -1
- package/scripts/skill_tools/suggest_skill_for_task.py +1 -1
- package/scripts/skill_trigger_eval.py +3 -3
- package/scripts/smoke/kernel.sh +7 -1
- package/scripts/smoke/router.sh +5 -5
- package/scripts/smoke/skills.sh +1 -1
- package/scripts/smoke_quickstart.py +1 -1
- package/scripts/snapshot_agent_outputs.py +3 -3
- package/scripts/spotcheck_thin_root.py +1 -1
- package/scripts/{caveman_stats.py → telegraph_stats.py} +18 -18
- package/scripts/update_counts.py +1 -1
- package/scripts/validate_decision_engine.py +1 -1
- package/scripts/validate_frontmatter.py +1 -1
- package/scripts/validate_safe_paths.py +3 -3
- package/scripts/{validate_caveman_carveouts.py → validate_telegraph_carveouts.py} +7 -7
- package/scripts/verify_roadmap_closure.py +6 -6
- package/templates/consumer-settings/ONBOARDING.md +41 -0
- package/.agent-src/commands/install-via-agent.md +0 -129
- package/.agent-src/skills/compress-memory/SKILL.md +0 -131
- package/dist/ui/assets/index-D-DY1ywI.js +0 -35
- package/dist/ui/assets/index-D-DY1ywI.js.map +0 -1
- package/dist/ui/assets/index-Dqfhmg-d.css +0 -1
- package/docs/adrs/caveman/README.md +0 -9
- package/docs/contracts/caveman-telemetry.md +0 -83
- package/scripts/compress.sh +0 -18
|
@@ -5,7 +5,7 @@ stability: stable
|
|
|
5
5
|
# ADR — Context-Aware Command Suggestion
|
|
6
6
|
|
|
7
7
|
> **Status:** Decided · Phases 1–7 shipped · 2026-04-30
|
|
8
|
-
> **Rule:** [`command-suggestion`](../../.agent-src.
|
|
8
|
+
> **Rule:** [`command-suggestion`](../../.agent-src.uncondensed/rules/command-suggestion-policy.md)
|
|
9
9
|
> **Eligibility table:** [`command-suggestion-eligibility.md`](command-suggestion-eligibility.md)
|
|
10
10
|
> **Engine:** `scripts/command_suggester/`
|
|
11
11
|
> **Orthogonal to:** R1 (`adr-work-engine-rename.md`) — the suggester is a
|
|
@@ -89,7 +89,7 @@ suppression when they signal real intent.
|
|
|
89
89
|
|
|
90
90
|
## Hardening — what suggestion must never do
|
|
91
91
|
|
|
92
|
-
The rule (`.agent-src.
|
|
92
|
+
The rule (`.agent-src.uncondensed/rules/command-suggestion-policy.md`)
|
|
93
93
|
binds the engine to five non-negotiables, mirrored as goldens:
|
|
94
94
|
|
|
95
95
|
1. **No execution without user pick.** `SUGGEST. NEVER INVOKE.` is the
|
|
@@ -138,7 +138,7 @@ retirement candidates without a hard SLA.
|
|
|
138
138
|
|
|
139
139
|
## See also
|
|
140
140
|
|
|
141
|
-
- [`command-suggestion`](../../.agent-src.
|
|
141
|
+
- [`command-suggestion`](../../.agent-src.uncondensed/rules/command-suggestion-policy.md) — runtime rule
|
|
142
142
|
- [`command-suggestion-eligibility.md`](command-suggestion-eligibility.md) — locked eligibility table
|
|
143
143
|
- [`adr-prompt-driven-execution.md`](adr-prompt-driven-execution.md) — `/work` entrypoint that explicit slash invocations route to
|
|
144
|
-
- [`agent-settings`](../../.agent-src.
|
|
144
|
+
- [`agent-settings`](../../.agent-src.uncondensed/templates/agent-settings.md) — `commands.suggestion.*` reference
|
|
@@ -111,6 +111,6 @@ Three signals that this decision is wrong and the ADR needs revisiting:
|
|
|
111
111
|
— `context_spine.items.enum` extended in this ADR.
|
|
112
112
|
- `agents/roadmaps/` § Block G — the authorising roadmap (archived
|
|
113
113
|
after merge; this ADR is the durable record).
|
|
114
|
-
- [`.agent-src.
|
|
114
|
+
- [`.agent-src.uncondensed/rules/skill-quality.md`](../../.agent-src.uncondensed/rules/skill-quality.md)
|
|
115
115
|
§ Senior-Tier Required Structure — the four blocks every senior
|
|
116
116
|
skill ships independently of spine opt-in.
|
|
@@ -13,12 +13,12 @@ stability: stable
|
|
|
13
13
|
The `/implement-ticket` orchestrator ships on **Python 3.10+** (stdlib + `pyyaml`).
|
|
14
14
|
|
|
15
15
|
Bash is rejected as the runtime. It stays only where it already lives —
|
|
16
|
-
the install driver,
|
|
16
|
+
the install driver, condensation helper, and test runner — not the
|
|
17
17
|
delivery flow.
|
|
18
18
|
|
|
19
19
|
## Why this was a real question
|
|
20
20
|
|
|
21
|
-
The repo already ships a Bash install +
|
|
21
|
+
The repo already ships a Bash install + condensation toolchain. A
|
|
22
22
|
shell-native dispatcher would have reused the existing muscle memory and
|
|
23
23
|
avoided adding Python as a delivery-runtime dependency. The spike
|
|
24
24
|
existed to verify whether Bash could still carry the 8-step linear flow
|
|
@@ -85,7 +85,7 @@ Python is 3 files with shared types.
|
|
|
85
85
|
## Tradeoffs we accept
|
|
86
86
|
|
|
87
87
|
- **New hard dependency on Python 3.10+ and `pyyaml`.** Mitigated: Python 3
|
|
88
|
-
is already a build/test dependency of this repo (linters,
|
|
88
|
+
is already a build/test dependency of this repo (linters, condensation,
|
|
89
89
|
`update_counts.py`). `pyyaml` is already pinned in `pyproject.toml` /
|
|
90
90
|
`requirements-*.txt`. Zero new install surface for contributors.
|
|
91
91
|
- **We lose the "just-shell" story.** The install script stays Bash. The
|
|
@@ -100,7 +100,7 @@ Python is 3 files with shared types.
|
|
|
100
100
|
on its own evidence.
|
|
101
101
|
- Does not commit to a specific framework (click, typer, bare argparse);
|
|
102
102
|
that is chosen during Phase 1 and kept minimal.
|
|
103
|
-
- Does not move the
|
|
103
|
+
- Does not move the condensation/install scripts off Bash.
|
|
104
104
|
|
|
105
105
|
## Consequences — unblocks
|
|
106
106
|
|
|
@@ -14,7 +14,7 @@ keep-beta-until: 2026-08-13
|
|
|
14
14
|
## Decision
|
|
15
15
|
|
|
16
16
|
Install-time skill filtering uses a dedicated axis seeded under
|
|
17
|
-
`user-types/` (package root, not `.agent-src.
|
|
17
|
+
`user-types/` (package root, not `.agent-src.uncondensed/`). The
|
|
18
18
|
selection lands in the consumer's `.agent-settings.yml` under
|
|
19
19
|
`personal.user_type: <id>` via `agent-config install --user-type=<id>`.
|
|
20
20
|
Runtime skill discovery intersects each skill's
|
|
@@ -38,7 +38,7 @@ Reserved areas (bootstrap pass — step-11 Phase 4 Step 3):
|
|
|
38
38
|
| Area | Scope | Owner contract |
|
|
39
39
|
|---|---|---|
|
|
40
40
|
| `cost` | Budget ladder, hard-stop hook, cost reporting | [`cost-enforcement.md`](cost-enforcement.md) |
|
|
41
|
-
| `
|
|
41
|
+
| `telegraph` | Telegraph-speak condensation, decondensation, reversibility | [`condensation-default-kill-criterion.md`](condensation-default-kill-criterion.md) |
|
|
42
42
|
| `schema` | Frontmatter schemas, v2 rigor, lint behaviour | [`schema-versioning.md`](schema-versioning.md) (when published) |
|
|
43
43
|
| `router` | `router.json` shape, tier semantics, dispatch precedence | [`rule-router.md`](rule-router.md) |
|
|
44
44
|
| `smoke` | Per-tier smoke contracts, baseline locks | [`smoke-contracts.md`](smoke-contracts.md) |
|
|
@@ -91,7 +91,7 @@ Default mode is **warn** at the consumer surface; **fail** under `task ci`. Rati
|
|
|
91
91
|
|
|
92
92
|
## Relationship to `adr-create` skill
|
|
93
93
|
|
|
94
|
-
[`adr-create`](../../.agent-src.
|
|
94
|
+
[`adr-create`](../../.agent-src.uncondensed/skills/adr-create/SKILL.md) accepts an optional `<area>` argument (added in step-11 Phase 4 Step 4):
|
|
95
95
|
|
|
96
96
|
- No `<area>` → flat surface, `docs/decisions/`.
|
|
97
97
|
- `<area>` matches inventory → per-area surface, `docs/adrs/<area>/`.
|
|
@@ -16,9 +16,9 @@ stability: stable
|
|
|
16
16
|
R3 ships four directive sets — `backend` (R1/R2), **`ui`**, **`ui-trivial`**,
|
|
17
17
|
and **`mixed`** — dispatched at the engine boundary on
|
|
18
18
|
`state.directive_set`. The slot wiring is fixed by
|
|
19
|
-
[`directives/ui/__init__.py`](../../.agent-src.
|
|
20
|
-
[`directives/ui_trivial/__init__.py`](../../.agent-src.
|
|
21
|
-
and [`directives/mixed/__init__.py`](../../.agent-src.
|
|
19
|
+
[`directives/ui/__init__.py`](../../.agent-src.uncondensed/templates/scripts/work_engine/directives/ui/__init__.py),
|
|
20
|
+
[`directives/ui_trivial/__init__.py`](../../.agent-src.uncondensed/templates/scripts/work_engine/directives/ui_trivial/__init__.py),
|
|
21
|
+
and [`directives/mixed/__init__.py`](../../.agent-src.uncondensed/templates/scripts/work_engine/directives/mixed/__init__.py);
|
|
22
22
|
the contract for each lives in [`ui-track-flow.md`](ui-track-flow.md).
|
|
23
23
|
|
|
24
24
|
The UI set drives `audit → design → apply → review → polish → report`
|
|
@@ -26,7 +26,7 @@ with three load-bearing properties:
|
|
|
26
26
|
|
|
27
27
|
1. **Existing-UI-audit is a hard gate.** No `apply` runs without
|
|
28
28
|
`state.ui_audit` populated. The gate lives at directive level **and**
|
|
29
|
-
at always-on rule level ([`ui-audit-gate`](../../.agent-src.
|
|
29
|
+
at always-on rule level ([`ui-audit-gate`](../../.agent-src.uncondensed/rules/ui-audit-gate.md))
|
|
30
30
|
so an agent acting outside the engine cannot bypass it.
|
|
31
31
|
2. **Design brief is locked microcopy.** `apply` consumes the brief
|
|
32
32
|
verbatim — `PLACEHOLDER_PATTERNS` (`<placeholder>`, `lorem`, `todo:`,
|
|
@@ -84,10 +84,10 @@ the gate emits `@agent-directive: existing-ui-audit` and refuses to advance.
|
|
|
84
84
|
Two enforcement layers, deliberately redundant:
|
|
85
85
|
|
|
86
86
|
- **Dispatcher layer** —
|
|
87
|
-
[`directives/ui/audit.py`](../../.agent-src.
|
|
87
|
+
[`directives/ui/audit.py`](../../.agent-src.uncondensed/templates/scripts/work_engine/directives/ui/audit.py)
|
|
88
88
|
refuses to write `outcomes["refine"] = "success"` without a populated
|
|
89
89
|
audit. Purely structural; no LLM, no heuristic.
|
|
90
|
-
- **Agent layer** — [`ui-audit-gate`](../../.agent-src.
|
|
90
|
+
- **Agent layer** — [`ui-audit-gate`](../../.agent-src.uncondensed/rules/ui-audit-gate.md)
|
|
91
91
|
is an always-on rule that fires when the agent is about to write a
|
|
92
92
|
component file outside the engine (free-form edit, side conversation,
|
|
93
93
|
cloud surface). The rule encodes the same Iron Law in prose so cloud
|
|
@@ -102,7 +102,7 @@ the failure modes are different enough to justify it.
|
|
|
102
102
|
### Confidence-path resolution
|
|
103
103
|
|
|
104
104
|
Audit findings carry a confidence label and per-candidate similarity.
|
|
105
|
-
[`directives/ui/audit.py::_decide_path`](../../.agent-src.
|
|
105
|
+
[`directives/ui/audit.py::_decide_path`](../../.agent-src.uncondensed/templates/scripts/work_engine/directives/ui/audit.py)
|
|
106
106
|
resolves to one of:
|
|
107
107
|
|
|
108
108
|
- `high_confidence` — confidence `high` + ≥1 match with similarity
|
|
@@ -176,7 +176,7 @@ adjustment), the Phase-1 intent classifier writes
|
|
|
176
176
|
`directive_set = "ui-trivial"`. The slot wiring collapses to
|
|
177
177
|
`refine → ⊘ → ⊘ → ⊘ → apply → test → ⊘ → report` with
|
|
178
178
|
`MAX_FILES = 1` and `MAX_LINES_CHANGED = 5` enforced inside
|
|
179
|
-
[`directives/ui_trivial/apply.py`](../../.agent-src.
|
|
179
|
+
[`directives/ui_trivial/apply.py`](../../.agent-src.uncondensed/templates/scripts/work_engine/directives/ui_trivial/apply.py).
|
|
180
180
|
|
|
181
181
|
**Mandatory reclassification at apply time.** When a trivial edit
|
|
182
182
|
exceeds the preconditions, apply flips
|
|
@@ -193,7 +193,7 @@ preconditions don't hold.
|
|
|
193
193
|
|
|
194
194
|
## Stack detection and dispatch
|
|
195
195
|
|
|
196
|
-
[`scripts/work_engine/stack/detect.py`](../../.agent-src.
|
|
196
|
+
[`scripts/work_engine/stack/detect.py`](../../.agent-src.uncondensed/templates/scripts/work_engine/stack/detect.py)
|
|
197
197
|
reads `composer.json` and `package.json` once, applies a four-rule
|
|
198
198
|
priority table, and writes `state.stack.frontend`:
|
|
199
199
|
|
|
@@ -223,7 +223,7 @@ direct executor. R3 splits the responsibilities:
|
|
|
223
223
|
|
|
224
224
|
- **Reference (kept):** layout patterns, form / table design,
|
|
225
225
|
responsive strategy, a11y heuristics. Cited by
|
|
226
|
-
[`directives/ui/design.py`](../../.agent-src.
|
|
226
|
+
[`directives/ui/design.py`](../../.agent-src.uncondensed/templates/scripts/work_engine/directives/ui/design.py).
|
|
227
227
|
- **Executor (removed):** code-writing responsibilities migrated to
|
|
228
228
|
the stack-specific apply / review / polish skills (`flux`,
|
|
229
229
|
`livewire`, `blade-ui`, `react-shadcn-ui`, `ui-apply-vue`).
|
|
@@ -35,10 +35,10 @@ axes, one orthogonal product.
|
|
|
35
35
|
|
|
36
36
|
## Decision
|
|
37
37
|
|
|
38
|
-
Split into a parallel axis. Add `.agent-src.
|
|
38
|
+
Split into a parallel axis. Add `.agent-src.uncondensed/user-types/`
|
|
39
39
|
as a first-class directory mirroring the persona pipeline:
|
|
40
40
|
|
|
41
|
-
- Source dir: `.agent-src.
|
|
41
|
+
- Source dir: `.agent-src.uncondensed/user-types/`
|
|
42
42
|
- Schema doc: [`user-type-schema`](user-type-schema.md) — 7-section spine, ≤ 120 lines
|
|
43
43
|
- JSON schema: [`scripts/schemas/user-type.schema.json`](../../scripts/schemas/user-type.schema.json)
|
|
44
44
|
- Linter: `scripts/skill_linter.py § lint_usertype`
|
|
@@ -102,7 +102,7 @@ Markdown prose + frontmatter), completely different consumer
|
|
|
102
102
|
(`scripts/install.sh` vs. `refine-ticket`). Co-locating them would
|
|
103
103
|
force a single `kind:` discriminator on a directory whose two halves
|
|
104
104
|
do not share a schema. The separation is in different physical paths
|
|
105
|
-
(`user-types/` root vs. `.agent-src.
|
|
105
|
+
(`user-types/` root vs. `.agent-src.uncondensed/user-types/`) and
|
|
106
106
|
the vocabulary overlap is deliberate per [`adr-install-user-type-axis`](adr-install-user-type-axis.md).
|
|
107
107
|
|
|
108
108
|
**Alt-3 — Defer the axis until end-user lenses prove themselves in
|
|
@@ -121,6 +121,6 @@ re-opens the slot-sprawl risk and needs a separate ADR.
|
|
|
121
121
|
reference ADR this one composes against.
|
|
122
122
|
- [`scripts/schemas/skill.schema.json`](../../scripts/schemas/skill.schema.json)
|
|
123
123
|
— `context_spine.items.enum` extended in this ADR.
|
|
124
|
-
- [`.agent-src.
|
|
124
|
+
- [`.agent-src.uncondensed/rules/skill-quality.md`](../../.agent-src.uncondensed/rules/skill-quality.md)
|
|
125
125
|
§ Senior-Tier Required Structure — the four blocks every senior
|
|
126
126
|
skill ships independently of spine opt-in.
|
|
@@ -136,7 +136,7 @@ call. File-drop is the always-works path.
|
|
|
136
136
|
to pick the curated YAML target when a signal carries two tags
|
|
137
137
|
(e.g. `[gotcha, invariant]` → primary `gotcha` JSONL, promote target
|
|
138
138
|
resolved by the reviewer at promotion time). See
|
|
139
|
-
[`memory-consolidation`](../../.agent-src.
|
|
139
|
+
[`memory-consolidation`](../../.agent-src.uncondensed/skills/memory-consolidation/SKILL.md)
|
|
140
140
|
§ Phase 3 for the schema-routing table.
|
|
141
141
|
- `confidence: low | medium | high` — producer-supplied estimate; the
|
|
142
142
|
inline-review hook in `/memory load` ranks the top-3 by this field.
|
|
@@ -155,5 +155,5 @@ holds:
|
|
|
155
155
|
## See also
|
|
156
156
|
|
|
157
157
|
- [`memory-access guideline`](../../docs/guidelines/agent-infra/memory-access.md)
|
|
158
|
-
- [`scripts/memory_status.py`](../../.agent-src.
|
|
159
|
-
- [`scripts/memory_lookup.py`](../../.agent-src.
|
|
158
|
+
- [`scripts/memory_status.py`](../../.agent-src.uncondensed/templates/scripts/memory_status.py)
|
|
159
|
+
- [`scripts/memory_lookup.py`](../../.agent-src.uncondensed/templates/scripts/memory_lookup.py)
|
|
@@ -51,7 +51,7 @@ Mechanical enforcement: the structural-malice check in
|
|
|
51
51
|
- Shell injection in subprocess calls (string-concat shell commands
|
|
52
52
|
with user-controlled input).
|
|
53
53
|
|
|
54
|
-
See `.agent-src.
|
|
54
|
+
See `.agent-src.uncondensed/rules/skill-quality.md` § Structural
|
|
55
55
|
Malice Floor for the full rule.
|
|
56
56
|
|
|
57
57
|
## Distribution mechanics
|
|
@@ -69,7 +69,7 @@ Malice Floor for the full rule.
|
|
|
69
69
|
- [`AGENTS.md`](../../AGENTS.md) — front-door (kernel orientation only)
|
|
70
70
|
- [`docs/architecture.md`](../../docs/architecture.md) — package
|
|
71
71
|
architecture and cloud-bundle pipeline
|
|
72
|
-
- [`.agent-src.
|
|
72
|
+
- [`.agent-src.uncondensed/rules/skill-quality.md`](../../.agent-src.uncondensed/rules/skill-quality.md)
|
|
73
73
|
— Structural Malice Floor
|
|
74
74
|
- [`.agent-src/skills/markitdown/SKILL.md`](../../.agent-src/skills/markitdown/SKILL.md)
|
|
75
75
|
— markitdown skill entry point
|
|
@@ -166,7 +166,7 @@ Schema v1:
|
|
|
166
166
|
### Advisor block (Phase 6, replace-mode)
|
|
167
167
|
|
|
168
168
|
Five built-in advisor keys ship under
|
|
169
|
-
[`.agent-src.
|
|
169
|
+
[`.agent-src.uncondensed/personas/advisors/`](../../.agent-src.uncondensed/personas/advisors/):
|
|
170
170
|
`contrarian`, `first-principles`, `expansionist`, `outsider`,
|
|
171
171
|
`executor`. Each entry binds one advisor to one enabled provider. When
|
|
172
172
|
`enabled: true`, the orchestrator REPLACES that provider's plain-member
|
|
@@ -446,7 +446,7 @@ Transparency markers on every fast-path attempt:
|
|
|
446
446
|
|
|
447
447
|
The marker is mandatory; the agent never silently substitutes a
|
|
448
448
|
fast-path verdict for its own answer. See
|
|
449
|
-
[`ai-council § Lightweight-QA fast-path`](../../.agent-src.
|
|
449
|
+
[`ai-council § Lightweight-QA fast-path`](../../.agent-src.uncondensed/skills/ai-council/SKILL.md#lightweight-qa-fast-path-phase-11)
|
|
450
450
|
for the orchestration contract and session-artefact format.
|
|
451
451
|
|
|
452
452
|
### Solo-member dispatch (step-9 P8/P9 · U1 · U2 · U3)
|
|
@@ -138,6 +138,6 @@ majors.
|
|
|
138
138
|
- Per-phase JSON the producer reads: [`decision-trace-v1.md`](decision-trace-v1.md).
|
|
139
139
|
- Pattern-extraction consumer: [`extract_audit_patterns.py`](../../scripts/extract_audit_patterns.py).
|
|
140
140
|
- Skill that consumes promoted patterns:
|
|
141
|
-
[`learning-to-rule-or-skill`](../../.agent-src.
|
|
141
|
+
[`learning-to-rule-or-skill`](../../.agent-src.uncondensed/skills/learning-to-rule-or-skill/SKILL.md).
|
|
142
142
|
- Append-only JSONL precedent:
|
|
143
143
|
[`adr-chat-history-split.md`](adr-chat-history-split.md).
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Package-Impact A/B Benchmark — Contract
|
|
2
|
+
|
|
3
|
+
> Lifecycle, cache invalidation, and reader-side semantics for `docs/benchmark.md` and the underlying A/B bench reports. Companion to `docs/contracts/benchmark-report-schema.md` (which owns the per-report JSON shape this contract layers an axis onto).
|
|
4
|
+
|
|
5
|
+
## Scope
|
|
6
|
+
|
|
7
|
+
This contract covers the **variant axis** (`with` vs. `without` agent-config) that the package-impact A/B bench adds on top of the existing version-over-time bench. It does NOT redefine the underlying report schema — see `benchmark-report-schema.md` for the per-report JSON shape.
|
|
8
|
+
|
|
9
|
+
## Producer / consumer surface
|
|
10
|
+
|
|
11
|
+
| Concern | Owner |
|
|
12
|
+
|---|---|
|
|
13
|
+
| Materialising the variant clones | `scripts/bench_ab_clone.py` |
|
|
14
|
+
| Verifying the clones differ only at the agent-config surface | `scripts/bench_ab_integrity.py` |
|
|
15
|
+
| Track A (behavioural) runner | `scripts/bench_ab_tracka_run.py` |
|
|
16
|
+
| Track B (task) runner | `scripts/bench_ab_task_runner.py` |
|
|
17
|
+
| Track B scoring | `scripts/_lib/bench_ab_scoring.py` |
|
|
18
|
+
| Cache key + lookup | `scripts/_lib/bench_ab_cache.py` |
|
|
19
|
+
| Variant diff | `scripts/bench_ab_diff.py` |
|
|
20
|
+
| Rendered report | `scripts/render_benchmark_md.py` → `docs/benchmark.md` |
|
|
21
|
+
| Corpus / doc linter | `scripts/lint_bench_ab.py` |
|
|
22
|
+
| Task orchestration | `taskfiles/bench-ab.yml` (`task bench:ab*`) |
|
|
23
|
+
|
|
24
|
+
## When `docs/benchmark.md` regenerates
|
|
25
|
+
|
|
26
|
+
`docs/benchmark.md` is **derived**. It regenerates from the latest paired reports under `internal/bench/reports/ab/` whenever:
|
|
27
|
+
|
|
28
|
+
1. `task bench:ab` runs (the full pipeline ends with `bench:ab:diff` which calls the renderer).
|
|
29
|
+
2. `task bench:ab:diff` runs alone (no fresh bench, just re-render).
|
|
30
|
+
3. The renderer is invoked directly: `python3 scripts/render_benchmark_md.py`.
|
|
31
|
+
|
|
32
|
+
The renderer is deterministic: same reports → same output. It never runs a bench. If no reports exist, it writes a placeholder document — never errors out.
|
|
33
|
+
|
|
34
|
+
## Cache key + invalidation
|
|
35
|
+
|
|
36
|
+
The Phase 2 cache exists so a daily `task bench:ab` does not re-run the expensive `without` arm when nothing the model would see has changed. The cache key is a tuple:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
(corpus_hash, claude_cli_version, target_shape_hash)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
A cached `without` report is **fresh** when its recorded `cache_key` matches the current key for every component. Otherwise it is **stale** and the `--reuse-cache` path either refreshes (default in interactive mode) or reuses with a stale flag (`--non-interactive`).
|
|
43
|
+
|
|
44
|
+
Invalidation triggers:
|
|
45
|
+
|
|
46
|
+
| Trigger | Component that drifts |
|
|
47
|
+
|---|---|
|
|
48
|
+
| Edit `internal/bench/corpora/ab-tracka.yaml` or `ab-trackb.yaml` | `corpus_hash` |
|
|
49
|
+
| Upgrade the local `claude` CLI | `claude_cli_version` |
|
|
50
|
+
| Add / remove a `WITH_SURFACE` in `scripts/bench_ab_clone.py` | `target_shape_hash` |
|
|
51
|
+
| Edit any file under `internal/bench/ab/fixture/` | `target_shape_hash` |
|
|
52
|
+
|
|
53
|
+
## How a reader interprets the staleness flag
|
|
54
|
+
|
|
55
|
+
`docs/benchmark.md` carries a methodology section naming the cache key for the latest run. A reader who suspects the page is stale should:
|
|
56
|
+
|
|
57
|
+
1. Check the **Last rendered** timestamp at the bottom of the Methodology section.
|
|
58
|
+
2. Inspect `internal/bench/reports/ab/` for newer reports than what the doc reflects.
|
|
59
|
+
3. Re-run `task bench:ab:diff` to re-render from the latest reports (cheap; no bench).
|
|
60
|
+
4. Re-run `task bench:ab` for a full refresh (re-runs the `with` arm, reuses the `without` baseline if the cache is fresh).
|
|
61
|
+
|
|
62
|
+
## Modes — what the reader can trust
|
|
63
|
+
|
|
64
|
+
Track B carries an explicit `mode` in every report header:
|
|
65
|
+
|
|
66
|
+
- `dry-run` — no `claude` CLI invocation; transcripts are stubs. Both variants score 0/N by construction. This is the CI-cheap mode; **do NOT cite Track B numbers in a dry-run report as evidence of package impact**.
|
|
67
|
+
- `live` — real `claude --print` invocation per task. The numbers are real; the cost is real. This is the mode that produces evidence.
|
|
68
|
+
|
|
69
|
+
The renderer surfaces `mode` prominently in the Track B section. A `dry-run` Track B block is a plumbing-health check, not a measurement.
|
|
70
|
+
|
|
71
|
+
## Track A is always cheap, always meaningful
|
|
72
|
+
|
|
73
|
+
Track A measures **surface availability** — does the rule/skill body the prompt would activate exist in the agent's reachable context? This is the precondition for the rule-router to fire. It does not need the `claude` CLI; it is a file-grep over the materialised clone. By construction:
|
|
74
|
+
|
|
75
|
+
- `without` MUST score 0% — no agent-config surface present → no expected_target file exists.
|
|
76
|
+
- `with` should score close to 100% — every expected_target file should exist with the expected_keywords.
|
|
77
|
+
|
|
78
|
+
The integrity check `bench_ab_tracka_run.py::integrity_check` fails the run if `without` ever scores non-zero. That's the safety boundary: if `without` scores anything, the variant axis leaked and the bench is invalid.
|
|
79
|
+
|
|
80
|
+
## Acceptance criteria for a "real" run
|
|
81
|
+
|
|
82
|
+
A bench run counts as a real measurement (rather than a plumbing health check) when:
|
|
83
|
+
|
|
84
|
+
- `python3 scripts/bench_ab_integrity.py` exits 0 (the variant axis is clean).
|
|
85
|
+
- Track A runs in BOTH variants and produces `integrity_ok: true` (with scoring close to 100%, without scoring 0%).
|
|
86
|
+
- Track B runs in BOTH variants in `--mode live` (not dry-run).
|
|
87
|
+
- `python3 scripts/lint_bench_ab.py` passes.
|
|
88
|
+
- The rendered `docs/benchmark.md` carries the Headline + Track A + Track B + Methodology + History sections.
|
|
89
|
+
|
|
90
|
+
## Out of scope for this contract
|
|
91
|
+
|
|
92
|
+
- The per-report JSON schema details — see `docs/contracts/benchmark-report-schema.md`.
|
|
93
|
+
- Statistical significance / sample-size policy — `--samples N` is opt-in per run; the bench default is n=1 (daily-quick-read goal, not a research-grade study).
|
|
94
|
+
- LLM-judge scoring — explicitly deferred to a follow-up roadmap.
|
|
95
|
+
- Cross-model comparison — out of scope; the bench measures one model (whatever the local `claude` CLI points to).
|
|
96
|
+
|
|
97
|
+
## See also
|
|
98
|
+
|
|
99
|
+
- `agents/roadmaps/road-to-package-impact-benchmark.md` — the roadmap that built this surface.
|
|
100
|
+
- `internal/bench/ab/README.md` — the Shape A vs. Shape B decision and the layout.
|
|
101
|
+
- `docs/contracts/benchmark-report-schema.md` — per-report JSON shape (sibling contract).
|
|
@@ -93,5 +93,5 @@ without tripping CI.
|
|
|
93
93
|
- Runner — [`scripts/bench_runner.py`](../../scripts/bench_runner.py)
|
|
94
94
|
- Linter — `scripts/lint_bench_corpus.py` (Phase 1 Step 3)
|
|
95
95
|
- Existing non-dev corpus — [`tests/eval/corpus-non-dev.yaml`](../../tests/eval/corpus-non-dev.yaml)
|
|
96
|
-
- Language gate — [`language-and-tone`](../../.agent-src.
|
|
96
|
+
- Language gate — [`language-and-tone`](../../.agent-src.uncondensed/rules/language-and-tone.md)
|
|
97
97
|
- Report schema — `docs/contracts/benchmark-report-schema.md` (Phase 2 Step 4)
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Branch Protection Policy
|
|
2
|
+
|
|
3
|
+
> **Status:** active · **Owner:** maintainer (GitHub UI ruleset) ·
|
|
4
|
+
> **Opened:** 2026-05-26
|
|
5
|
+
>
|
|
6
|
+
> Codifies the per-PR-shape required-status-check floor. Companion to
|
|
7
|
+
> [`release-pr-gating.md`](release-pr-gating.md) (Phase A) and
|
|
8
|
+
> [`ci-cost-budget.md`](ci-cost-budget.md) (Phase C). Branch protection
|
|
9
|
+
> itself is applied by the maintainer in the GitHub Settings → Rules UI;
|
|
10
|
+
> this doc is the source of truth the UI mirrors.
|
|
11
|
+
|
|
12
|
+
## The floor
|
|
13
|
+
|
|
14
|
+
Every PR proves a floor of CI checks before it can merge. The floor differs
|
|
15
|
+
by **PR shape** — a feature PR proves more (it carries runtime / install
|
|
16
|
+
risk) than a release PR (whose diff is structurally limited to version
|
|
17
|
+
bumps). Shape is detected by the same predicates documented in
|
|
18
|
+
`release-pr-gating.md`; the workflows enforce the cut.
|
|
19
|
+
|
|
20
|
+
The optimisation is **never** subtractive: a PR whose shape can't be proved
|
|
21
|
+
falls back to the full feature-PR floor. The cut is opt-in per push, not
|
|
22
|
+
per branch name.
|
|
23
|
+
|
|
24
|
+
## Per-PR-shape required-check matrix
|
|
25
|
+
|
|
26
|
+
| Required check | Feature PR | Release PR | Docs-only PR |
|
|
27
|
+
|---|:---:|:---:|:---:|
|
|
28
|
+
| `Consistency` | ✅ | ✅ | ✅ |
|
|
29
|
+
| `Smoke Contracts` (smoke.yml) | ✅ | ✅ | ✅ |
|
|
30
|
+
| `Skill Lint` | ✅ | — | — |
|
|
31
|
+
| `Tests / install-tests (ubuntu)` | ✅ | — | — |
|
|
32
|
+
| `Tests / install-tests (macos)` | ✅ | — | — |
|
|
33
|
+
| `Tests / install-aux-tests (ubuntu)` | ✅ | — | — |
|
|
34
|
+
| `Tests / install-aux-tests (macos)` | ✅ | — | — |
|
|
35
|
+
| `Tests / python-tests (ubuntu × 3.10–3.13)` | ✅ | — | — |
|
|
36
|
+
| `Tests / python-tests (macos × 3.12)` | ✅ | — | — |
|
|
37
|
+
| `Tests / node-tests (ubuntu)` | ✅ | — | — |
|
|
38
|
+
| `Tests / node-tests (macos)` | ✅ | — | — |
|
|
39
|
+
| `Tests / windows-lockfile-export` | path-filter only | — | — |
|
|
40
|
+
| `Public Install Smoke / smoke (matrix)` | ✅ | — | — |
|
|
41
|
+
| `Release Validation / release-shape` | — | ✅ | — |
|
|
42
|
+
| `Release Validation / changelog-entry` | — | ✅ | — |
|
|
43
|
+
| `Release Validation / version-consistency` | — | ✅ | — |
|
|
44
|
+
| `Migration Dry-Run` | path-filter only | path-filter only | — |
|
|
45
|
+
| `Release Guard` (tag-trigger) | — | (post-merge tag) | — |
|
|
46
|
+
|
|
47
|
+
**Definitions:**
|
|
48
|
+
|
|
49
|
+
- **Feature PR** — head branch does not match `release/X.Y.Z` (the default).
|
|
50
|
+
- **Release PR** — head branch matches `^release/\d+\.\d+\.\d+$` AND the
|
|
51
|
+
diff stays within the version-bump allowlist (see `release-pr-gating.md`).
|
|
52
|
+
Either condition failing falls the PR back to feature-PR mode.
|
|
53
|
+
- **Docs-only PR** — diff is entirely inside `docs/**` or matches only
|
|
54
|
+
top-level Markdown (`README.md`, `CHANGELOG.md`, `CONTRIBUTING.md`,
|
|
55
|
+
`AGENTS.md`). No code, tests, workflows, or scripts. This shape is
|
|
56
|
+
detected by an opt-in linter (`task ci:required-checks`); branch
|
|
57
|
+
protection still defaults to the feature-PR floor unless the linter
|
|
58
|
+
asserts the docs-only shape.
|
|
59
|
+
|
|
60
|
+
## Failure mode — the cut never silently lifts
|
|
61
|
+
|
|
62
|
+
If a release-PR's diff exits the allowlist mid-stream (e.g. a last-minute
|
|
63
|
+
CHANGELOG fixup that also touches `scripts/release.py`):
|
|
64
|
+
|
|
65
|
+
1. `Release Validation / release-shape` exits non-zero.
|
|
66
|
+
2. The required-check set for the PR effectively flips back to the
|
|
67
|
+
feature-PR floor because:
|
|
68
|
+
- `tests.yml` / `smoke-public-install.yml` jobs carry
|
|
69
|
+
`if: !startsWith(github.head_ref, 'release/')`, so they still skip on
|
|
70
|
+
the branch name — but
|
|
71
|
+
- the maintainer is expected to either narrow the diff (move the
|
|
72
|
+
out-of-shape edit to a separate PR) or close-and-reopen the release
|
|
73
|
+
PR off a freshly-bumped branch so the heavy matrix runs.
|
|
74
|
+
3. Branch protection still blocks the merge because `release-shape` is red.
|
|
75
|
+
|
|
76
|
+
The branch name alone never bypasses the heavy matrix — the diff has to
|
|
77
|
+
prove it can't regress runtime / install paths.
|
|
78
|
+
|
|
79
|
+
## Why path-filter only for some checks
|
|
80
|
+
|
|
81
|
+
`Tests / windows-lockfile-export` and `Migration Dry-Run` are path-filtered
|
|
82
|
+
at the workflow level (not branch-protection level). They run on every PR
|
|
83
|
+
whose diff hits their declared paths and skip on every other PR. Branch
|
|
84
|
+
protection lists them as "must pass if they run" — the GitHub Rules UI
|
|
85
|
+
under "Required status checks" honours this when "Require branches to be
|
|
86
|
+
up to date before merging" is enabled and the check's most recent run
|
|
87
|
+
on the head SHA is green.
|
|
88
|
+
|
|
89
|
+
## See also
|
|
90
|
+
|
|
91
|
+
- [`release-pr-gating.md`](release-pr-gating.md) — shape predicates, cut
|
|
92
|
+
surface, kept surface, fail-closed contract.
|
|
93
|
+
- [`ci-cost-budget.md`](ci-cost-budget.md) — measured baseline durations
|
|
94
|
+
per job + quarterly review cadence (Phase C).
|
|
95
|
+
- `.github/workflows/release-validation.yml` — the three release-PR jobs.
|
|
96
|
+
- `scripts/check_release_pr_shape.py` — the shape detector.
|
|
97
|
+
- `scripts/release.py` — emits release PRs; release cadence stays driven
|
|
98
|
+
by Conventional Commits, not CI cost.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# CI Cost Budget
|
|
2
|
+
|
|
3
|
+
> **Status:** active · **Owner:** maintainer · **Opened:** 2026-05-26 ·
|
|
4
|
+
> **Review cadence:** quarterly (next: 2026-08-26)
|
|
5
|
+
>
|
|
6
|
+
> Measured durations + trigger surfaces for every PR-blocking CI job in
|
|
7
|
+
> `.github/workflows/`. Sets a per-job wall-clock budget (5 min average)
|
|
8
|
+
> beyond which the job either earns its cost in writing or gets a
|
|
9
|
+
> follow-up optimisation step. Companion to
|
|
10
|
+
> [`release-pr-gating.md`](release-pr-gating.md) and
|
|
11
|
+
> [`branch-protection-policy.md`](branch-protection-policy.md).
|
|
12
|
+
|
|
13
|
+
## Baseline (pre-optimisation, 2026-05-26)
|
|
14
|
+
|
|
15
|
+
Captured via `gh run list --branch main --limit 50 --json
|
|
16
|
+
name,createdAt,updatedAt`. Wall-clock figures are the average of the most
|
|
17
|
+
recent 50 main-branch runs.
|
|
18
|
+
|
|
19
|
+
| Workflow | Job | OS × variant | Avg duration | Trigger surface |
|
|
20
|
+
|---|---|---|--:|---|
|
|
21
|
+
| `tests.yml` | `install-tests` | 4 shards × 2 OS | 218 s | `scripts/**`, `tests/**`, `src/**`, manifest pins |
|
|
22
|
+
| `tests.yml` | `install-aux-tests` | 2 OS | 90 s | same as above |
|
|
23
|
+
| `tests.yml` | `python-tests` | 4 versions × ubuntu + 3.12 × macOS | ~210 s | same as above |
|
|
24
|
+
| `tests.yml` | `node-tests` | 2 OS | 180 s | same as above |
|
|
25
|
+
| `tests.yml` | `windows-lockfile-export` | windows-latest | 60–90 s | same as above (over-broad — see Phase C Step 1) |
|
|
26
|
+
| `smoke-public-install.yml` | `smoke` | 3 OS × 2 Node | 413 s | install paths + setup.sh + templates |
|
|
27
|
+
| `consistency.yml` | (single) | ubuntu | 27 s | always-on (PR / push) |
|
|
28
|
+
| `smoke.yml` | smoke-contracts | ubuntu | 18 s | `scripts/schemas/**` |
|
|
29
|
+
| `migration-dry-run.yml` | (single) | ubuntu | 20 s | migration-touching paths |
|
|
30
|
+
| `skill-lint.yml` | (single) | ubuntu | 64 s | `.agent-src*/**`, schemas |
|
|
31
|
+
| `release-guard.yml` | (single) | ubuntu | < 10 s | tag-trigger only |
|
|
32
|
+
|
|
33
|
+
**Critical path observations:**
|
|
34
|
+
|
|
35
|
+
- `smoke-public-install.yml` and `tests.yml` dominate non-release-PR
|
|
36
|
+
wall-clock. Both trigger on `package.json` — a release PR (which only
|
|
37
|
+
touches `package.json` + CHANGELOG + marketplace + pack manifests)
|
|
38
|
+
pulled the full matrix on every bump pre-Phase A.
|
|
39
|
+
- `tests.yml` `python-tests` ran four Python versions on Linux + 3.12 on
|
|
40
|
+
macOS on every PR touching `scripts/**`. The 3.10 / 3.11 / 3.13 legs
|
|
41
|
+
are extras: they prove the supported range but rarely surface a
|
|
42
|
+
Python-version-only regression. Moved to a path-filtered sibling
|
|
43
|
+
workflow in Phase C Step 2.
|
|
44
|
+
- `tests.yml` `windows-lockfile-export` fired on every PR touching
|
|
45
|
+
`scripts/**` even when the PR never went near `install_global` /
|
|
46
|
+
`cmd_export`. Moved to its own path-filtered workflow in Phase C
|
|
47
|
+
Step 1.
|
|
48
|
+
|
|
49
|
+
## Expected savings (post-optimisation)
|
|
50
|
+
|
|
51
|
+
The Phase A guards on `tests.yml` + `smoke-public-install.yml` cut
|
|
52
|
+
release-PR critical-path from `218 s + 413 s` (serial worst case ≈ 11
|
|
53
|
+
min) to `~30 s` (`Consistency` + `Smoke Contracts` + new `Release
|
|
54
|
+
Validation`). Phase C cuts feature-PR critical-path by removing the
|
|
55
|
+
Windows leg (60–90 s) and the 3-version Python sweep from PRs that
|
|
56
|
+
don't touch Python paths.
|
|
57
|
+
|
|
58
|
+
| Scenario | Pre | Post | Reduction |
|
|
59
|
+
|---|--:|--:|--:|
|
|
60
|
+
| Release PR (release/X.Y.Z) | ~660 s | ~60 s | –91 % |
|
|
61
|
+
| Feature PR touching scripts/** but no install_global / cmd_export | ~700 s | ~600 s | –14 % |
|
|
62
|
+
| Feature PR touching only docs/** | ~30 s (consistency) | ~30 s | unchanged |
|
|
63
|
+
| Feature PR touching Python paths only on 3.12 | ~700 s | ~700 s | unchanged (baseline still runs) |
|
|
64
|
+
|
|
65
|
+
## Per-job cost ceiling — 5-min average
|
|
66
|
+
|
|
67
|
+
Any job averaging **> 5 min wall-clock** across the most-recent 50
|
|
68
|
+
main-branch runs requires one of:
|
|
69
|
+
|
|
70
|
+
1. A documented justification in this file ("This job protects
|
|
71
|
+
property X; shrinking it would mean losing the regression Y").
|
|
72
|
+
2. A follow-up optimisation step opened in the next quarterly review.
|
|
73
|
+
3. An ADR superseding the ceiling for this specific job (e.g. integration
|
|
74
|
+
smoke that proves a real consumer-visible promise).
|
|
75
|
+
|
|
76
|
+
Current jobs above the ceiling: `smoke-public-install.yml` (413 s) —
|
|
77
|
+
ceiling violation is acknowledged. The Phase A skip on release PRs
|
|
78
|
+
mitigates it; an ADR will follow if it re-exceeds 5 min on feature PRs
|
|
79
|
+
post-Phase C.
|
|
80
|
+
|
|
81
|
+
## Quarterly review checklist
|
|
82
|
+
|
|
83
|
+
Run the first Monday of every quarter:
|
|
84
|
+
|
|
85
|
+
1. Re-capture the baseline table via `gh run list --branch main --limit
|
|
86
|
+
50 --json name,createdAt,updatedAt` + arithmetic.
|
|
87
|
+
2. Compare each row against the previous quarter; flag any > 25 %
|
|
88
|
+
regression.
|
|
89
|
+
3. For every row over the 5-min ceiling, file a follow-up step in the
|
|
90
|
+
open CI-roadmap (or in this file's history if no roadmap is
|
|
91
|
+
currently active).
|
|
92
|
+
4. Update the "Expected savings" table once optimisations land so the
|
|
93
|
+
delta is provable, not asserted.
|
|
94
|
+
5. Audit the path-filter surfaces — when a workflow keeps firing on
|
|
95
|
+
PRs that don't touch its real scope, tighten the filter.
|
|
96
|
+
|
|
97
|
+
## See also
|
|
98
|
+
|
|
99
|
+
- [`release-pr-gating.md`](release-pr-gating.md) — release-PR shape
|
|
100
|
+
predicates, cut surface, kept surface.
|
|
101
|
+
- [`branch-protection-policy.md`](branch-protection-policy.md) — required
|
|
102
|
+
status check floor per PR shape.
|
|
103
|
+
- `.github/workflows/python-version-sweep.yml` — extras Python versions
|
|
104
|
+
(3.10 · 3.11 · 3.13) on Python-path PRs.
|
|
105
|
+
- `.github/workflows/windows-lockfile-export.yml` — Windows leg gated by
|
|
106
|
+
`install_global` / `cmd_export` paths.
|