@event4u/agent-config 3.3.0 → 4.2.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 +216 -3
- package/CONTRIBUTING.md +31 -12
- package/README.md +21 -12
- 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/atomic.js +92 -0
- package/dist/install/atomic.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 +358 -0
- package/dist/server/routes/install.js.map +1 -0
- package/dist/server/routes/wizard.js +468 -32
- 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 +5 -3
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/ui/assets/index-BDAhhpDV.js +40 -0
- package/dist/ui/assets/index-BDAhhpDV.js.map +1 -0
- package/dist/ui/assets/index-BXZILUxe.css +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 +110 -97
- 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 +3 -3
- 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/connector-setup.md +2 -2
- package/docs/deploy/policy-cookbook.md +2 -2
- 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 +273 -45
- 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 +152 -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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""build_linear_digest.py — build the Linear AI rules digest.
|
|
3
3
|
|
|
4
4
|
Concatenates a curated set of cloud-safe rules from
|
|
5
|
-
`.agent-src.
|
|
5
|
+
`.agent-src.uncondensed/rules/` into three Markdown files under
|
|
6
6
|
`dist/linear/`:
|
|
7
7
|
|
|
8
8
|
workspace.md — universal coding posture (18 rules)
|
|
@@ -42,7 +42,7 @@ from dataclasses import dataclass, field
|
|
|
42
42
|
from pathlib import Path
|
|
43
43
|
|
|
44
44
|
ROOT = Path(__file__).resolve().parent.parent
|
|
45
|
-
#
|
|
45
|
+
# Condensed source is the shipped form — denser, sharper section
|
|
46
46
|
# structure; better fit for a guidance field than the verbose authoring
|
|
47
47
|
# layer. The inclusion list at docs/contracts/linear-ai-rules-inclusion.md
|
|
48
48
|
# remains the human-readable spec.
|
|
@@ -165,7 +165,7 @@ def render_digest(layer: str, entries: list[RuleEntry]) -> tuple[str, dict]:
|
|
|
165
165
|
parts.append(f"# event4u/agent-config — Linear AI {layer.title()} Digest\n")
|
|
166
166
|
parts.append(
|
|
167
167
|
"> Auto-generated by `scripts/build_linear_digest.py` from "
|
|
168
|
-
"`.agent-src/rules/` (
|
|
168
|
+
"`.agent-src/rules/` (condensed source) plus the inclusion list "
|
|
169
169
|
"at `docs/contracts/linear-ai-rules-inclusion.md`. Do not edit "
|
|
170
170
|
"this file by hand — re-run `task build-linear-digest` to "
|
|
171
171
|
"regenerate.\n"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""Build agents/settings/contexts/rule-trigger-matrix.md.
|
|
3
3
|
|
|
4
|
-
Emits a single matrix mapping every rule in `.agent-src.
|
|
4
|
+
Emits a single matrix mapping every rule in `.agent-src.uncondensed/rules/`
|
|
5
5
|
to its trigger event, observability, enforcement surface, hook-cost
|
|
6
6
|
estimate, and Tier classification. Sourced from the Phase 1 inventory of
|
|
7
7
|
`road-to-rule-hardening.md` plus `road-to-context-layer-maturity.md`
|
|
@@ -18,9 +18,9 @@ from pathlib import Path
|
|
|
18
18
|
import yaml
|
|
19
19
|
|
|
20
20
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
21
|
-
SRC_RULES = REPO_ROOT / ".agent-src.
|
|
21
|
+
SRC_RULES = REPO_ROOT / ".agent-src.uncondensed" / "rules"
|
|
22
22
|
COMP_RULES = REPO_ROOT / ".agent-src" / "rules"
|
|
23
|
-
SRC_PREFIX = ".agent-src.
|
|
23
|
+
SRC_PREFIX = ".agent-src.uncondensed/"
|
|
24
24
|
COMP_PREFIX = ".agent-src/"
|
|
25
25
|
OUT = REPO_ROOT / "agents" / "contexts" / "rule-trigger-matrix.md"
|
|
26
26
|
|
|
@@ -80,7 +80,7 @@ add("roadmap-progress-sync.md", "file-edit on agents/roadmaps/**", "hook",
|
|
|
80
80
|
add("context-hygiene.md", "turn counter / tool-loop / topic shift", "hook",
|
|
81
81
|
"state", "medium", "1",
|
|
82
82
|
notes="Per-turn counter + tool-call repetition detector. Cross-platform persistence is the cost driver.")
|
|
83
|
-
add("size-enforcement.md", "file save on .agent-src.
|
|
83
|
+
add("size-enforcement.md", "file save on .agent-src.uncondensed/{skills,rules,commands}/**",
|
|
84
84
|
"mechanical-already", "tool-call", "NA-mechanical", "mechanical-already",
|
|
85
85
|
notes="Enforced by skill_linter.py + check_always_budget.py")
|
|
86
86
|
add("no-roadmap-references.md", "file save on stable artifacts", "mechanical-already",
|
|
@@ -127,7 +127,7 @@ add("cli-output-handling.md", "tool-call (verbose CLI)", "hook", "tool-call",
|
|
|
127
127
|
"low", "2a", notes="Pre-tool-call marker on git/test/lint invocations")
|
|
128
128
|
add("artifact-drafting-protocol.md", "skill/rule create or major rewrite",
|
|
129
129
|
"hook", "output", "medium", "2a",
|
|
130
|
-
notes="Marker on file-create in .agent-src.
|
|
130
|
+
notes="Marker on file-create in .agent-src.uncondensed/{skills,rules,commands}/")
|
|
131
131
|
add("missing-tool-handling.md", "tool failure (command not found)", "hook",
|
|
132
132
|
"output", "low", "2a", notes="Post-tool-failure marker — strong fit")
|
|
133
133
|
add("token-efficiency.md", "every reply / verbose-tool invocation", "hook",
|
|
@@ -144,7 +144,7 @@ add("downstream-changes.md", "post-edit (callsite check)", "hook",
|
|
|
144
144
|
add("ui-audit-gate.md", "pre-edit on UI files (settings.state.ui_audit empty)",
|
|
145
145
|
"settings", "tool-call", "medium", "2b",
|
|
146
146
|
notes="Block edit until state.ui_audit populated")
|
|
147
|
-
add("preservation-guard.md", "skill/rule merge or
|
|
147
|
+
add("preservation-guard.md", "skill/rule merge or condense", "hook",
|
|
148
148
|
"tool-call", "medium", "2b",
|
|
149
149
|
notes="Pre-merge structured check — diff-shape verifiable")
|
|
150
150
|
add("minimal-safe-diff.md", "every diff", "hook", "tool-call",
|
|
@@ -258,7 +258,7 @@ def emit():
|
|
|
258
258
|
lines.append("| Column | Meaning |")
|
|
259
259
|
lines.append("|---|---|")
|
|
260
260
|
lines.append("| `type` | Frontmatter `type` (`always` / `auto`) |")
|
|
261
|
-
lines.append("| `raw` |
|
|
261
|
+
lines.append("| `raw` | Condensed rule size in chars (`.agent-src/rules/<name>`) |")
|
|
262
262
|
lines.append("| `ext` | Extended size under Model (b): raw + transitive `load_context` |")
|
|
263
263
|
lines.append("| `trigger` | Observable event that should activate the rule |")
|
|
264
264
|
lines.append("| `obs` | Where the trigger is observable: `hook` (platform hook), `settings` (`.agent-settings.yml` state), `agent-only` (in-head), `mechanical-already` (precedent — already enforced by a script) |")
|
|
@@ -295,7 +295,7 @@ def emit():
|
|
|
295
295
|
lines.append("## `load_context:` chains (CL Phase 1 inventory)")
|
|
296
296
|
lines.append("")
|
|
297
297
|
lines.append("Rules that load at least one context, with `rule → context → depth → chars`.")
|
|
298
|
-
lines.append("Chars are measured on the
|
|
298
|
+
lines.append("Chars are measured on the condensed context file (Model (b) literal).")
|
|
299
299
|
lines.append("")
|
|
300
300
|
lines.append("| Rule | Context | Depth | Chars |")
|
|
301
301
|
lines.append("|---|---|---:|---:|")
|
package/scripts/chat_history.py
CHANGED
|
@@ -47,7 +47,7 @@ DEFAULT_SETTINGS_FILE = ".agent-settings.yml"
|
|
|
47
47
|
SCHEMA_VERSION = 4
|
|
48
48
|
DEFAULT_MAX_SESSIONS = 5
|
|
49
49
|
VALID_FREQS = {"per_turn", "per_phase", "per_tool"}
|
|
50
|
-
VALID_OVERFLOW = {"rotate", "
|
|
50
|
+
VALID_OVERFLOW = {"rotate", "condense"}
|
|
51
51
|
|
|
52
52
|
# Replay-mode signal — when set, every write to the on-disk transcript
|
|
53
53
|
# is a no-op. Honoured per `docs/contracts/hook-architecture-v1.md`
|
|
@@ -905,7 +905,7 @@ def overflow_handle(max_kb: int, mode: str = "rotate", *,
|
|
|
905
905
|
"""Enforce max_kb. Returns {'action', 'kept', 'dropped'}.
|
|
906
906
|
|
|
907
907
|
Rotate: drop oldest entries (keep header) until file ≤ max_kb.
|
|
908
|
-
|
|
908
|
+
Condense: mark oldest 50% as stale and leave a `needs_condense`
|
|
909
909
|
marker entry for the agent to rewrite on next turn.
|
|
910
910
|
"""
|
|
911
911
|
if mode not in VALID_OVERFLOW:
|
|
@@ -934,12 +934,12 @@ def overflow_handle(max_kb: int, mode: str = "rotate", *,
|
|
|
934
934
|
_atomic_write_text(p, header_line + "".join(kept))
|
|
935
935
|
return {"action": "rotate", "kept": len(kept), "dropped": dropped}
|
|
936
936
|
marker = {
|
|
937
|
-
"t": "
|
|
937
|
+
"t": "needs_condense",
|
|
938
938
|
"ts": _now(),
|
|
939
|
-
"reason": f"file exceeded {max_kb} KB,
|
|
939
|
+
"reason": f"file exceeded {max_kb} KB, condense-mode requested",
|
|
940
940
|
}
|
|
941
941
|
append(marker, path=p)
|
|
942
|
-
return {"action": "
|
|
942
|
+
return {"action": "condense_marked", "kept": len(entries), "dropped": 0}
|
|
943
943
|
|
|
944
944
|
|
|
945
945
|
def hook_append(event: str, *,
|
|
@@ -32,7 +32,7 @@ import yaml
|
|
|
32
32
|
|
|
33
33
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
34
34
|
RULES_DIR = REPO_ROOT / ".agent-src" / "rules"
|
|
35
|
-
SRC_PREFIX = ".agent-src.
|
|
35
|
+
SRC_PREFIX = ".agent-src.uncondensed/"
|
|
36
36
|
COMP_PREFIX = ".agent-src/"
|
|
37
37
|
|
|
38
38
|
TOTAL_CAP = 49_000
|
|
@@ -49,7 +49,7 @@ CONCENTRATION_TOP3_PCT = 0.30
|
|
|
49
49
|
|
|
50
50
|
# Transitional concentration allowlist — non-safety-floor rules whose
|
|
51
51
|
# extended share exceeds CONCENTRATION_SINGLE_PCT after the kernel-trim
|
|
52
|
-
# refactor (commit 4e771da `refactor(kernel):
|
|
52
|
+
# refactor (commit 4e771da `refactor(kernel): condense 8 kernel rules
|
|
53
53
|
# per P2.2 playbook + lock kernel`). Trimming safety-floor rules shrank
|
|
54
54
|
# the denominator, mechanically lifting non-floor rules' percentage
|
|
55
55
|
# share even though their absolute size did not grow. Each entry pins
|
|
@@ -70,7 +70,13 @@ KNOWN_CONCENTRATION_BREACHES: dict[str, int] = {
|
|
|
70
70
|
# scope-control-allowlisted + non-destructive-allowlisted) clears the
|
|
71
71
|
# 30 % cap; the entry below pins the measured ceiling. Future trim
|
|
72
72
|
# work drops this back to None (default 30 %).
|
|
73
|
-
|
|
73
|
+
# Bumped 10_900 → 11_300 in v4.0.0: branch-drift commits (`d30d441e`,
|
|
74
|
+
# `d824408c`) raised the non-safety-floor top-3 sum
|
|
75
|
+
# (language-and-tone + no-cheap-questions + ask-when-uncertain) past
|
|
76
|
+
# the prior lock. Same rationale as the kernel-budget breach bump in
|
|
77
|
+
# `scripts/smoke/kernel.sh`: shrinkage belongs in a separate kernel-
|
|
78
|
+
# rule-edit PR per `scope-control § Kernel-rule edits` slow-rollout.
|
|
79
|
+
KNOWN_TOP3_CONCENTRATION_CEILING: int | None = 11_300
|
|
74
80
|
|
|
75
81
|
# Q3=A locked safety-floor rules — out of scope for slimming and for the
|
|
76
82
|
# concentration check. Their size is intentional (Iron Laws + obligation
|
|
@@ -175,7 +181,7 @@ def _load_context_paths(path: Path) -> list[str]:
|
|
|
175
181
|
return out
|
|
176
182
|
|
|
177
183
|
|
|
178
|
-
def
|
|
184
|
+
def _src_to_condensed(entry: str) -> Path:
|
|
179
185
|
if entry.startswith(SRC_PREFIX):
|
|
180
186
|
return REPO_ROOT / (COMP_PREFIX + entry[len(SRC_PREFIX):])
|
|
181
187
|
return REPO_ROOT / entry
|
|
@@ -189,7 +195,7 @@ def _walk_contexts(rule: Path) -> tuple[set[Path], list[tuple[str, str]]]:
|
|
|
189
195
|
while stack:
|
|
190
196
|
node, depth, chain = stack.pop()
|
|
191
197
|
for entry in _load_context_paths(node):
|
|
192
|
-
comp =
|
|
198
|
+
comp = _src_to_condensed(entry)
|
|
193
199
|
new_chain = f"{chain} → {entry}"
|
|
194
200
|
if depth + 1 > MAX_DEPTH:
|
|
195
201
|
violations.append((rule.name, new_chain))
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""Auto-rule description-length CI gate (Phase 1.3 of
|
|
3
3
|
road-to-augment-limit-fit).
|
|
4
4
|
|
|
5
|
-
For every `type: auto` rule under `.agent-src.
|
|
5
|
+
For every `type: auto` rule under `.agent-src.uncondensed/rules/`,
|
|
6
6
|
fail CI when the frontmatter `description:` exceeds DESC_CAP chars.
|
|
7
7
|
|
|
8
8
|
Why: Augment injects each auto-rule's description into the
|
|
@@ -10,7 +10,7 @@ workspace-guidelines registry stub. Empirical 2026-05-08 budget
|
|
|
10
10
|
analysis showed this channel consuming 25 % of the 49,512-char
|
|
11
11
|
ceiling. Capping descriptions guards future drift.
|
|
12
12
|
|
|
13
|
-
Source of truth: `.agent-src.
|
|
13
|
+
Source of truth: `.agent-src.uncondensed/rules/`. The condensed
|
|
14
14
|
projection is regenerated; the source dictates what ships.
|
|
15
15
|
|
|
16
16
|
Exit codes: 0 = pass, 1 = at least one rule over cap.
|
|
@@ -23,7 +23,7 @@ import sys
|
|
|
23
23
|
from pathlib import Path
|
|
24
24
|
|
|
25
25
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
26
|
-
RULES_DIR = REPO_ROOT / ".agent-src.
|
|
26
|
+
RULES_DIR = REPO_ROOT / ".agent-src.uncondensed" / "rules"
|
|
27
27
|
DESC_CAP = 150
|
|
28
28
|
|
|
29
29
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""Cluster-pattern compliance check.
|
|
3
3
|
|
|
4
4
|
Compares each cluster dispatcher under
|
|
5
|
-
`.agent-src.
|
|
5
|
+
`.agent-src.uncondensed/commands/<cluster>.md` against the Phase 1
|
|
6
6
|
reference patterns (`fix.md`, `optimize.md`, `feature.md`).
|
|
7
7
|
|
|
8
8
|
Required structure:
|
|
@@ -49,7 +49,7 @@ def _resolve_command(cluster: str) -> Path:
|
|
|
49
49
|
hit = resolve_logical(rel)
|
|
50
50
|
if hit is not None:
|
|
51
51
|
return hit
|
|
52
|
-
return ROOT / ".agent-src.
|
|
52
|
+
return ROOT / ".agent-src.uncondensed" / rel
|
|
53
53
|
|
|
54
54
|
REQUIRED_SECTIONS = ["## Sub-commands", "## Dispatch", "## Rules"]
|
|
55
55
|
TABLE_HEADER_RE = re.compile(
|
|
@@ -6,11 +6,11 @@ Public surfaces (README.md, AGENTS.md, docs/getting-started.md) advertise
|
|
|
6
6
|
the size of the command catalog. PR #34 collapses atomic commands into
|
|
7
7
|
clusters via deprecation shims — the externally meaningful number is the
|
|
8
8
|
**active** command count (non-shim files), not the raw file count. This
|
|
9
|
-
gate sources canonical counts from `.agent-src.
|
|
9
|
+
gate sources canonical counts from `.agent-src.uncondensed/commands/`
|
|
10
10
|
frontmatter and fails when any documented number drifts from those.
|
|
11
11
|
|
|
12
12
|
Canonical counts:
|
|
13
|
-
total = number of *.md files under .agent-src.
|
|
13
|
+
total = number of *.md files under .agent-src.uncondensed/commands/
|
|
14
14
|
shims = files whose frontmatter declares `superseded_by:`
|
|
15
15
|
active = total - shims
|
|
16
16
|
|
|
@@ -56,7 +56,7 @@ def _command_files() -> list[Path]:
|
|
|
56
56
|
"""Every command ``*.md`` file across all source roots (legacy + packages/*).
|
|
57
57
|
|
|
58
58
|
Multi-root aware per ADR-017: post-move the commands live under
|
|
59
|
-
``packages/<pack>/.agent-src.
|
|
59
|
+
``packages/<pack>/.agent-src.uncondensed/commands/``, and the
|
|
60
60
|
canonical count is the union across packs (deduped by logical path).
|
|
61
61
|
"""
|
|
62
62
|
seen: dict[str, Path] = {}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""
|
|
3
|
-
|
|
3
|
+
Condensation quality checker for agent-config packages.
|
|
4
4
|
|
|
5
|
-
Compares .agent-src.
|
|
6
|
-
Checks that
|
|
7
|
-
- All headings from source present in
|
|
5
|
+
Compares .agent-src.uncondensed/ source files with their .agent-src/ condensed versions.
|
|
6
|
+
Checks that condensation preserved structural integrity:
|
|
7
|
+
- All headings from source present in condensed
|
|
8
8
|
- All code blocks preserved exactly
|
|
9
9
|
- YAML frontmatter identical
|
|
10
10
|
- Word count reduction within healthy range (10-60%)
|
|
@@ -25,17 +25,17 @@ from pathlib import Path
|
|
|
25
25
|
from typing import List, Literal
|
|
26
26
|
|
|
27
27
|
# Import the rewriter so frontmatter comparison can normalise the source
|
|
28
|
-
# side through the same path transformations the
|
|
28
|
+
# side through the same path transformations the condenseor applies. Without
|
|
29
29
|
# this, every `load_context:` logical name (e.g. `contexts/foo.md`) and every
|
|
30
30
|
# `../../docs/...` body link looks like a frontmatter / body mismatch even
|
|
31
31
|
# though the rewriter is doing exactly what road-to-path-fixes.md P2/P3
|
|
32
32
|
# specified.
|
|
33
33
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
34
|
-
from
|
|
34
|
+
from condense import _rewrite_paths # noqa: E402
|
|
35
35
|
|
|
36
36
|
Severity = Literal["error", "warning", "info"]
|
|
37
37
|
|
|
38
|
-
SOURCE_DIR = Path(".agent-src.
|
|
38
|
+
SOURCE_DIR = Path(".agent-src.uncondensed")
|
|
39
39
|
TARGET_DIR = Path(".agent-src")
|
|
40
40
|
|
|
41
41
|
|
|
@@ -83,8 +83,8 @@ def count_iron_law_structure(body: str) -> dict:
|
|
|
83
83
|
"""Count structural units in an Iron Law body.
|
|
84
84
|
|
|
85
85
|
Returns counts of paragraphs (blank-line-separated prose blocks),
|
|
86
|
-
list items (bullet + numbered), and fenced code blocks.
|
|
87
|
-
|
|
86
|
+
list items (bullet + numbered), and fenced code blocks. Telegraph
|
|
87
|
+
condensation may shorten word count freely; what must NOT change is
|
|
88
88
|
the count of these structural units. Each represents a passage of
|
|
89
89
|
the law that the source decided to keep.
|
|
90
90
|
|
|
@@ -168,45 +168,45 @@ def extract_iron_law_sections(text: str) -> list[tuple[str, int, str]]:
|
|
|
168
168
|
return sections
|
|
169
169
|
|
|
170
170
|
|
|
171
|
-
def check_pair(rel_path: str, source: str,
|
|
172
|
-
"""Compare source and
|
|
171
|
+
def check_pair(rel_path: str, source: str, condensed: str) -> List[Issue]:
|
|
172
|
+
"""Compare source and condensed versions of a file."""
|
|
173
173
|
issues: List[Issue] = []
|
|
174
174
|
|
|
175
175
|
# Frontmatter check
|
|
176
176
|
src_fm = extract_frontmatter(source)
|
|
177
|
-
cmp_fm = extract_frontmatter(
|
|
177
|
+
cmp_fm = extract_frontmatter(condensed)
|
|
178
178
|
if src_fm and src_fm != cmp_fm:
|
|
179
179
|
issues.append(Issue(rel_path, "frontmatter_mismatch", "error",
|
|
180
|
-
"YAML frontmatter differs between source and
|
|
180
|
+
"YAML frontmatter differs between source and condensed"))
|
|
181
181
|
|
|
182
|
-
# Heading preservation — check H1 and H2 headings (H3+ may be merged during
|
|
182
|
+
# Heading preservation — check H1 and H2 headings (H3+ may be merged during condensation)
|
|
183
183
|
src_headings = extract_headings(source)
|
|
184
|
-
cmp_headings = extract_headings(
|
|
184
|
+
cmp_headings = extract_headings(condensed)
|
|
185
185
|
for h in src_headings:
|
|
186
186
|
# Only check H1 and H2 (## level) — H3+ subheadings may be merged
|
|
187
187
|
if h.startswith("# ") or (h.startswith("## ") and not h.startswith("### ")):
|
|
188
188
|
if h not in cmp_headings:
|
|
189
189
|
issues.append(Issue(rel_path, "missing_heading", "warning",
|
|
190
|
-
f"H1/H2 heading lost during
|
|
190
|
+
f"H1/H2 heading lost during condensation: {h}"))
|
|
191
191
|
# Also flag if comment lines inside code blocks are being treated as headings
|
|
192
192
|
# Filter out false positives from code blocks
|
|
193
193
|
|
|
194
194
|
# Code block preservation
|
|
195
195
|
src_blocks = extract_code_blocks(source)
|
|
196
|
-
cmp_blocks = extract_code_blocks(
|
|
196
|
+
cmp_blocks = extract_code_blocks(condensed)
|
|
197
197
|
if len(src_blocks) > len(cmp_blocks):
|
|
198
198
|
issues.append(Issue(rel_path, "lost_code_blocks", "error",
|
|
199
|
-
f"Code blocks lost: source has {len(src_blocks)},
|
|
199
|
+
f"Code blocks lost: source has {len(src_blocks)}, condensed has {len(cmp_blocks)}"))
|
|
200
200
|
for i, block in enumerate(src_blocks):
|
|
201
201
|
if i < len(cmp_blocks) and block.strip() != cmp_blocks[i].strip():
|
|
202
202
|
# Only flag if content actually changed (not just whitespace)
|
|
203
203
|
if block.replace(" ", "").replace("\n", "") != cmp_blocks[i].replace(" ", "").replace("\n", ""):
|
|
204
204
|
issues.append(Issue(rel_path, "modified_code_block", "error",
|
|
205
|
-
f"Code block {i+1} content changed during
|
|
205
|
+
f"Code block {i+1} content changed during condensation"))
|
|
206
206
|
|
|
207
207
|
# Iron Law preservation — non-negotiable behavioral rules, see preservation-guard
|
|
208
208
|
src_laws = extract_iron_law_sections(source)
|
|
209
|
-
cmp_laws = extract_iron_law_sections(
|
|
209
|
+
cmp_laws = extract_iron_law_sections(condensed)
|
|
210
210
|
cmp_law_map = {h: (lvl, body) for h, lvl, body in cmp_laws}
|
|
211
211
|
# Build a level-agnostic lookup so we can detect heading-level downgrades
|
|
212
212
|
# (`## Iron Law` → `### Iron Law`).
|
|
@@ -225,11 +225,11 @@ def check_pair(rel_path: str, source: str, compressed: str) -> List[Issue]:
|
|
|
225
225
|
f"({src_heading.strip()})"))
|
|
226
226
|
continue
|
|
227
227
|
issues.append(Issue(rel_path, "iron_law_missing", "error",
|
|
228
|
-
f"Iron Law section removed during
|
|
228
|
+
f"Iron Law section removed during condensation: "
|
|
229
229
|
f"{src_heading.strip()}"))
|
|
230
230
|
continue
|
|
231
231
|
# Section exists at correct level — check structural-unit survival.
|
|
232
|
-
#
|
|
232
|
+
# Telegraph condensation is fine (drop articles, terse phrasing); what
|
|
233
233
|
# must NOT change is the count of paragraphs, list items, and code
|
|
234
234
|
# blocks. Each is a passage the source kept on purpose.
|
|
235
235
|
_, cmp_body = cmp_law_map[src_heading]
|
|
@@ -246,23 +246,23 @@ def check_pair(rel_path: str, source: str, compressed: str) -> List[Issue]:
|
|
|
246
246
|
|
|
247
247
|
# Word count ratio
|
|
248
248
|
src_words = len(source.split())
|
|
249
|
-
cmp_words = len(
|
|
249
|
+
cmp_words = len(condensed.split())
|
|
250
250
|
if src_words > 0:
|
|
251
251
|
reduction = (1 - cmp_words / src_words) * 100
|
|
252
252
|
if reduction > 60:
|
|
253
253
|
issues.append(Issue(rel_path, "excessive_reduction", "warning",
|
|
254
|
-
f"
|
|
254
|
+
f"Condensation reduced {reduction:.0f}% — possible content loss "
|
|
255
255
|
f"({src_words} → {cmp_words} words)"))
|
|
256
256
|
elif reduction < 5 and src_words > 100:
|
|
257
257
|
issues.append(Issue(rel_path, "minimal_reduction", "info",
|
|
258
|
-
f"
|
|
258
|
+
f"Condensation only reduced {reduction:.0f}% "
|
|
259
259
|
f"({src_words} → {cmp_words} words)"))
|
|
260
260
|
|
|
261
261
|
return issues
|
|
262
262
|
|
|
263
263
|
|
|
264
264
|
def scan_all(root: Path) -> List[Issue]:
|
|
265
|
-
"""Scan all .md file pairs for
|
|
265
|
+
"""Scan all .md file pairs for condensation quality issues."""
|
|
266
266
|
issues: List[Issue] = []
|
|
267
267
|
source_dir = root / SOURCE_DIR
|
|
268
268
|
target_dir = root / TARGET_DIR
|
|
@@ -277,7 +277,7 @@ def scan_all(root: Path) -> List[Issue]:
|
|
|
277
277
|
if not target_file.exists():
|
|
278
278
|
continue # sync-check handles missing files
|
|
279
279
|
|
|
280
|
-
# Skip commands — they are copied verbatim, not
|
|
280
|
+
# Skip commands — they are copied verbatim, not condensed
|
|
281
281
|
rel_str = str(rel)
|
|
282
282
|
if rel_str.startswith("commands/"):
|
|
283
283
|
continue
|
|
@@ -286,7 +286,7 @@ def scan_all(root: Path) -> List[Issue]:
|
|
|
286
286
|
target_text = target_file.read_text(encoding="utf-8")
|
|
287
287
|
# Normalise source through the path rewriter (idempotent) so logical
|
|
288
288
|
# `load_context:` names and `../../docs/...` body links match the
|
|
289
|
-
# depth-aware form the
|
|
289
|
+
# depth-aware form the condenseor produced. Condensation word-count
|
|
290
290
|
# checks downstream are unaffected because rewriting only edits
|
|
291
291
|
# frontmatter list values and link targets, not prose tokens.
|
|
292
292
|
source_text = _rewrite_paths(source_text, rel_str)
|
|
@@ -297,9 +297,9 @@ def scan_all(root: Path) -> List[Issue]:
|
|
|
297
297
|
|
|
298
298
|
def format_text(issues: List[Issue]) -> str:
|
|
299
299
|
if not issues:
|
|
300
|
-
return "✅
|
|
300
|
+
return "✅ Condensation quality check passed."
|
|
301
301
|
icons = {"error": "🔴", "warning": "🟡", "info": "ℹ️"}
|
|
302
|
-
lines = [f"Found {len(issues)}
|
|
302
|
+
lines = [f"Found {len(issues)} condensation quality issue(s):\n"]
|
|
303
303
|
for i in issues:
|
|
304
304
|
lines.append(f" {icons[i.severity]} [{i.check}] {i.file}: {i.message}")
|
|
305
305
|
errors = sum(1 for i in issues if i.severity == "error")
|
|
@@ -309,7 +309,7 @@ def format_text(issues: List[Issue]) -> str:
|
|
|
309
309
|
|
|
310
310
|
|
|
311
311
|
def scan_summary(root: Path) -> str:
|
|
312
|
-
"""Generate per-category
|
|
312
|
+
"""Generate per-category condensation summary stats."""
|
|
313
313
|
source_dir = root / SOURCE_DIR
|
|
314
314
|
target_dir = root / TARGET_DIR
|
|
315
315
|
if not source_dir.exists() or not target_dir.exists():
|
|
@@ -327,7 +327,7 @@ def scan_summary(root: Path) -> str:
|
|
|
327
327
|
cat = parts[0] if len(parts) > 1 else "root"
|
|
328
328
|
categories.setdefault(cat, []).append((src_words, cmp_words))
|
|
329
329
|
|
|
330
|
-
lines = ["Category | Files | Avg Source | Avg
|
|
330
|
+
lines = ["Category | Files | Avg Source | Avg Condensed | Avg Reduction",
|
|
331
331
|
"--- | --- | --- | --- | ---"]
|
|
332
332
|
total_src = total_cmp = total_files = 0
|
|
333
333
|
for cat in sorted(categories):
|
|
@@ -346,9 +346,9 @@ def scan_summary(root: Path) -> str:
|
|
|
346
346
|
|
|
347
347
|
|
|
348
348
|
def main() -> int:
|
|
349
|
-
parser = argparse.ArgumentParser(description="Check
|
|
349
|
+
parser = argparse.ArgumentParser(description="Check condensation quality")
|
|
350
350
|
parser.add_argument("--format", choices=["text", "json"], default="text")
|
|
351
|
-
parser.add_argument("--summary", action="store_true", help="Show per-category
|
|
351
|
+
parser.add_argument("--summary", action="store_true", help="Show per-category condensation stats")
|
|
352
352
|
parser.add_argument("--root", type=Path, default=Path("."))
|
|
353
353
|
args = parser.parse_args()
|
|
354
354
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Validate
|
|
2
|
+
"""Validate condensed-output paths in `.agent-src/rules/*.md`.
|
|
3
3
|
|
|
4
|
-
Runs after `scripts/
|
|
5
|
-
rewriter in `
|
|
4
|
+
Runs after `scripts/condense.py` projects sources to `.agent-src/`. The
|
|
5
|
+
rewriter in `condense.py` is the load-bearing primitive (road-to-path-fixes
|
|
6
6
|
P1.2); this script is the post-condition gate (P5.1) — every `load_context:`
|
|
7
7
|
entry in `.agent-src/rules/*.md` must resolve relative to the rule file's
|
|
8
8
|
directory to an existing file, and forbidden substrings must not survive
|
|
9
9
|
the rewrite (unless declared in `validator_ignore`).
|
|
10
10
|
|
|
11
11
|
Forbidden substrings (load_context + body):
|
|
12
|
-
- `.agent-src.
|
|
12
|
+
- `.agent-src.uncondensed/` unless declared in validator_ignore
|
|
13
13
|
- `../../docs/` body-link two-up form (rewriter
|
|
14
14
|
collapses to single-up)
|
|
15
15
|
- `../../agents/` same shape, different root
|
|
@@ -25,7 +25,7 @@ Body-link checks (Council Decision 2, 2026-05-06):
|
|
|
25
25
|
`validator_ignore:` frontmatter primitive:
|
|
26
26
|
- Per-rule allowlist for rules that *describe* a forbidden substring as
|
|
27
27
|
their subject matter (e.g. `augment-source-of-truth` documents the
|
|
28
|
-
`.agent-src.
|
|
28
|
+
`.agent-src.uncondensed/` boundary). Each entry: `{type, pattern,
|
|
29
29
|
reason}`. The validator emits an audit line per matched ignore so
|
|
30
30
|
drift cannot hide.
|
|
31
31
|
|
|
@@ -46,7 +46,7 @@ ROOT = Path(__file__).resolve().parent.parent
|
|
|
46
46
|
RULES_DIR = ROOT / ".agent-src" / "rules"
|
|
47
47
|
|
|
48
48
|
FORBIDDEN_SUBSTRINGS = (
|
|
49
|
-
".agent-src.
|
|
49
|
+
".agent-src.uncondensed/",
|
|
50
50
|
"../../docs/",
|
|
51
51
|
"../../agents/",
|
|
52
52
|
)
|
|
@@ -189,7 +189,7 @@ def _check_body(rule_file: Path, body: str, viols: list[Violation],
|
|
|
189
189
|
|
|
190
190
|
def main() -> int:
|
|
191
191
|
if not RULES_DIR.is_dir():
|
|
192
|
-
print(f"❌ {RULES_DIR} not found — run
|
|
192
|
+
print(f"❌ {RULES_DIR} not found — run condensation first", file=sys.stderr)
|
|
193
193
|
return 3
|
|
194
194
|
viols: list[Violation] = []
|
|
195
195
|
audited: list[tuple[str, IgnoreEntry]] = []
|
|
@@ -213,7 +213,7 @@ def main() -> int:
|
|
|
213
213
|
return 1
|
|
214
214
|
rule_count = len(list(RULES_DIR.glob('*.md')))
|
|
215
215
|
if not QUIET:
|
|
216
|
-
print(f"✅
|
|
216
|
+
print(f"✅ condensed-path check clean ({rule_count} rules, {len(audited)} ignore(s) audited)")
|
|
217
217
|
return 0
|
|
218
218
|
|
|
219
219
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""Context-file path & orphan checker.
|
|
3
3
|
|
|
4
|
-
Validates that every `*.md` under `.agent-src.
|
|
4
|
+
Validates that every `*.md` under `.agent-src.uncondensed/contexts/`:
|
|
5
5
|
|
|
6
6
|
1. Lives in a locked sub-tree (or is one of six grandfathered root files).
|
|
7
7
|
2. Does not collide on basename with another context file in another sub-tree.
|
|
@@ -22,7 +22,7 @@ from dataclasses import asdict, dataclass
|
|
|
22
22
|
from pathlib import Path
|
|
23
23
|
|
|
24
24
|
ROOT = Path(__file__).resolve().parent.parent
|
|
25
|
-
CONTEXTS_ROOT = ROOT / ".agent-src.
|
|
25
|
+
CONTEXTS_ROOT = ROOT / ".agent-src.uncondensed" / "contexts"
|
|
26
26
|
|
|
27
27
|
# Sub-trees that may contain context files. Update in lock-step with
|
|
28
28
|
# docs/contracts/context-paths.md whenever a roadmap revision adds one.
|
|
@@ -56,10 +56,10 @@ GRANDFATHERED_ROOT_FILES = frozenset({
|
|
|
56
56
|
# Without this scan dir, every newly-introduced context would orphan
|
|
57
57
|
# until the consuming artefact lands, blocking phase-by-phase commits.
|
|
58
58
|
REFERENCE_SCAN_DIRS = (
|
|
59
|
-
".agent-src.
|
|
60
|
-
".agent-src.
|
|
61
|
-
".agent-src.
|
|
62
|
-
".agent-src.
|
|
59
|
+
".agent-src.uncondensed/rules",
|
|
60
|
+
".agent-src.uncondensed/skills",
|
|
61
|
+
".agent-src.uncondensed/commands",
|
|
62
|
+
".agent-src.uncondensed/contexts",
|
|
63
63
|
"agents/roadmaps",
|
|
64
64
|
)
|
|
65
65
|
|
|
@@ -139,7 +139,7 @@ def _build_reference_corpus(root: Path) -> str:
|
|
|
139
139
|
def _check_orphans(contexts: list[Path], corpus: str, root: Path) -> list[Violation]:
|
|
140
140
|
out: list[Violation] = []
|
|
141
141
|
for ctx in contexts:
|
|
142
|
-
rel_src = str(ctx.relative_to(root)) # .agent-src.
|
|
142
|
+
rel_src = str(ctx.relative_to(root)) # .agent-src.uncondensed/contexts/...
|
|
143
143
|
rel_short = rel_src.split("contexts/", 1)[-1] # judges/persona-voice-rubric.md
|
|
144
144
|
candidates = (rel_src, f"contexts/{rel_short}", rel_short)
|
|
145
145
|
# Exclude self-references: drop this file's own content from the
|
|
@@ -22,7 +22,7 @@ audit's evidence trail. `agents/runtime/` is exempt too — the
|
|
|
22
22
|
canonical council dirs live at `agents/runtime/council/{questions,
|
|
23
23
|
responses,sessions}/` and the whole `runtime/` tree is gitignored.
|
|
24
24
|
|
|
25
|
-
Failure modes are enforced by `.agent-src.
|
|
25
|
+
Failure modes are enforced by `.agent-src.uncondensed/skills/ai-council/SKILL.md`
|
|
26
26
|
§ "Output path convention".
|
|
27
27
|
|
|
28
28
|
Exit codes:
|
|
@@ -112,7 +112,7 @@ def main() -> int:
|
|
|
112
112
|
for f in findings:
|
|
113
113
|
print(f" - {f}")
|
|
114
114
|
print(
|
|
115
|
-
"\nRule: .agent-src.
|
|
115
|
+
"\nRule: .agent-src.uncondensed/skills/ai-council/SKILL.md "
|
|
116
116
|
'§ "Output path convention"'
|
|
117
117
|
)
|
|
118
118
|
return 1
|
|
@@ -53,8 +53,8 @@ PATTERN = re.compile(
|
|
|
53
53
|
# Only these durable surfaces are scanned. Archive, analysis, and the
|
|
54
54
|
# council dirs themselves are excluded by design.
|
|
55
55
|
#
|
|
56
|
-
# Source roots (legacy `.agent-src.
|
|
57
|
-
# `packages/*/.agent-src.
|
|
56
|
+
# Source roots (legacy `.agent-src.uncondensed/` and every
|
|
57
|
+
# `packages/*/.agent-src.uncondensed/`) are discovered at runtime via
|
|
58
58
|
# `artefact_roots()` so the linter follows the monorepo physical layout.
|
|
59
59
|
FIXED_SCAN_ROOTS = (
|
|
60
60
|
"agents/roadmaps",
|
|
@@ -92,12 +92,12 @@ ALLOWLIST_PREFIXES: tuple[str, ...] = (
|
|
|
92
92
|
# the SKIP_DIRS contract in scripts/check_references.py).
|
|
93
93
|
"agents/evidence/analysis/",
|
|
94
94
|
# The rule itself documents forbidden vs. allowed forms.
|
|
95
|
-
".agent-src.
|
|
95
|
+
".agent-src.uncondensed/rules/no-roadmap-references.md",
|
|
96
96
|
# ai-council skill documents the output-path schema.
|
|
97
|
-
".agent-src.
|
|
97
|
+
".agent-src.uncondensed/skills/ai-council/",
|
|
98
98
|
# Council commands document the output-path schema.
|
|
99
|
-
".agent-src.
|
|
100
|
-
".agent-src.
|
|
99
|
+
".agent-src.uncondensed/commands/council/",
|
|
100
|
+
".agent-src.uncondensed/commands/council.md",
|
|
101
101
|
)
|
|
102
102
|
# Top-level files that are also exempt (e.g. CHANGELOG with historical entries).
|
|
103
103
|
ALLOWLIST_FILES: frozenset[str] = frozenset({
|
|
@@ -136,8 +136,8 @@ def _is_allowlisted(rel: str) -> bool:
|
|
|
136
136
|
"""Match a repo-relative POSIX path against the allowlist.
|
|
137
137
|
|
|
138
138
|
Allowlist prefixes are written against the legacy
|
|
139
|
-
``.agent-src.
|
|
140
|
-
``packages/*/.agent-src.
|
|
139
|
+
``.agent-src.uncondensed/`` layout. A physical hit under
|
|
140
|
+
``packages/*/.agent-src.uncondensed/`` is normalised to the same
|
|
141
141
|
logical path before matching so entries keep covering relocated files.
|
|
142
142
|
"""
|
|
143
143
|
if rel in ALLOWLIST_FILES:
|
|
@@ -152,7 +152,7 @@ def _is_allowlisted(rel: str) -> bool:
|
|
|
152
152
|
return False
|
|
153
153
|
|
|
154
154
|
|
|
155
|
-
_LEGACY_PREFIX_STR = ".agent-src.
|
|
155
|
+
_LEGACY_PREFIX_STR = ".agent-src.uncondensed/"
|
|
156
156
|
|
|
157
157
|
|
|
158
158
|
def _is_structurally_allowed(source_rel: str, target_capture: str) -> bool:
|
|
@@ -107,8 +107,8 @@ def main() -> int:
|
|
|
107
107
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
108
108
|
parser.add_argument(
|
|
109
109
|
"paths", nargs="*",
|
|
110
|
-
default=[".agent-src.
|
|
111
|
-
help="Files or directories to scan (default: .agent-src.
|
|
110
|
+
default=[".agent-src.uncondensed/rules"],
|
|
111
|
+
help="Files or directories to scan (default: .agent-src.uncondensed/rules)",
|
|
112
112
|
)
|
|
113
113
|
parser.add_argument("--format", choices=["text", "json"], default="text")
|
|
114
114
|
parser.add_argument("--quiet", action="store_true", help="Only print on failure")
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""check_kernel_rule_bundle — Phase 4.2 of road-to-always-budget-relief.
|
|
3
3
|
|
|
4
4
|
Fails when a single PR (or commit range) modifies more than one
|
|
5
|
-
kernel rule under `.agent-src.
|
|
5
|
+
kernel rule under `.agent-src.uncondensed/rules/`. Override via the
|
|
6
6
|
PR label `bundled-always-rules-acknowledged`.
|
|
7
7
|
|
|
8
8
|
Kernel set is the locked 9-rule list in
|
|
@@ -43,7 +43,7 @@ KERNEL_RULES = frozenset({
|
|
|
43
43
|
"verify-before-complete.md",
|
|
44
44
|
})
|
|
45
45
|
|
|
46
|
-
KERNEL_DIR = ".agent-src.
|
|
46
|
+
KERNEL_DIR = ".agent-src.uncondensed/rules"
|
|
47
47
|
DEFAULT_LABEL = "bundled-always-rules-acknowledged"
|
|
48
48
|
|
|
49
49
|
|