Layer the Tool runtime by Area and Domain, and retire the legacy interface closure - #180
Merged
Conversation
The runner's --python argument defaulted to sys.executable, so the compiled CLI contract froze the absolute interpreter path of whichever machine generated it, and the projection could never verify as current on any other host. Default to None in the declared contract and resolve the current interpreter at dispatch time, then rebind the downstream interface and host-config projections to the corrected contract. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Owner Issue
Closes #179
Problem
The Tool layer had accumulated every responsibility in one flat
Tools/namespace. Governance control, task execution, knowledge production, and platform interfacing were interleaved with the CLI entry points that expose them, so no module had an exclusive owner, implementations were duplicated, dependency direction was unstated, legacy compatibility interfaces could not retire, and tests were organized against historical file locations rather than owned contracts.The confirmed Tool taxonomy declared Areas and Domains that had no physical counterpart on disk. This PR makes that taxonomy the physical structure.
It is intentionally one atomic change. Moving modules without moving their entry points, imports, capability registrations, interface policy, distribution boundary, catalogs, tests, and generated projections would leave the repository unable to satisfy its own boundary checks.
Changes
Physical Area/Domain layering
Every Tool module now has exactly one Area and Domain, expressed as its location on disk:
Tools/governance/standards,profile,controlTools/execution/task_runtime,planning,context_delivery,evidence,auditTools/knowledge/content,metadata,structure,renderingTools/platform/agent_interface,distribution,repository,commonTools/queue_runtime/moved under its owner asTools/execution/task_runtime/queue_runtime/.Public entry surface closed
Tools/now holds 63 registered entry points only — thin CLI commands,mcp_server.py, and the catalog generators.Contracts, registration, and boundaries realigned
operation-capabilities.yaml,scan-capabilities.yaml), agent interface policy (agent-interface-policy.yaml), module boundaries (module-boundaries.yaml), test ownership (test-ownership.yaml), and the distribution boundary (distribution-boundary.yaml) to describe the layout that actually exists.Tools/README.md, the rootREADME.md/README.zh-CN.md,ROADMAP.md/ROADMAP.zh-CN.md, the affected Cards, and the Kernel standards under K00, K02, K06, K08, K12, and K13.Test system returned to its owning layer
Tools/TEST_CATALOG.mdandTools/TOOL_CATALOG.mdattribute every tool and every test to its owning Area/Domain, so an unowned or orphaned test is detectable rather than invisible.Retired interfaces
Removed rather than kept reachable as a second authority:
Tools/queue_runtime/producer_era.pyTools/queue_runtime/__init__.pyTools/migrate_standards_state.pyTools/schemas/component-path-migrations.yamlTools/apply_task_plan.pyTools/batch_close_contract.pyTools/coverage_contract.py,Tools/coverage_delta.pyTools/audit_evidence_runtime.pyTools/module_boundary_facts.pyTools/queue_runtime/review.pyTheir tests were retired with them (
test_migrate_standards_state.py,test_reviewed_era_lifecycle.py,test_corpus_plan_bootstrap.py,test_json_flag_verdict_parity.py,test_stamp_cards_skeleton.py,test_template_fill.py). Old internal paths are not retained as aliases.The last two commits close the contract gaps this exposed: planning and terminal evidence contracts, and Runner dispatch binding to carried Tool contracts.
Generated projections
Rebuilt from their canonical owners, and failing when their source contracts drift:
Tools/compiled/cli-contract.yamlTools/compiled/mcp-tools.jsonTools/compiled/metadata-execution-contract.jsonTools/compiled/tool-catalog.jsonTools/compiled/test-catalog.jsonTools/compiled/host-configs/Validation
make checkpasses.321b530d6ccc86f1ac3d3a5a7214043594e3a929, dynamic batch close completed.closedFollow-up: host-independent runner contract (
990d817)The first CI run failed
verify check: the runner's--pythonargument defaulted tosys.executable, freezing the generating machine's absolute interpreter path intoTools/compiled/cli-contract.yaml, so the projection could never verify as current on another host.990d817declares the default asNone, resolves the current interpreter at dispatch time, and rebinds the interface and host-config projections.make checkand the full catalog run (1079/1079, 127/127) pass against the corrected contract.