Functional Ownership Map (demoted — narrative only)
⚠️ Not authoritative. This document is a historical narrative of how functional ownership was once modelled (mission
functional-ownership-map-01KPDY72, 2026-04). Its machine-readable companion05_ownership_manifest.yamland that manifest's schema gate (tests/architecture/test_ownership_manifest_schema.py) were deleted by missionpost-convergence-governance-01M1TMPH(2026-09-06): the manifest had drifted from reality (it named the deletedsrc/doctrine/,src/specify_cli/sync/,src/specify_cli/saas/trees and the never-createdsrc/lifecycle//src/orchestrator/targets), and its schema gate pinned that stale vocabulary — so correcting the manifest reddened the gate. Rather than perpetuate a self-declared authority that contradicted the code, both were removed.
The canonical modularity SSOT is the enforced pair
Module boundaries and inventory are owned by two enforced sources that agree with each
other and with the code CI actually ships. Treat every other module map (this file, the C4
landscape/implementation-mapping docs, the AGENTS.md package lists) as a derived view that
must cite them:
| Concern | Canonical source | Enforced by |
|---|---|---|
| Module inventory (which top-level packages ship) | pyproject.toml [tool.hatch.build.targets.wheel].packages |
tests/architectural/test_pyproject_shape.py |
| Import direction (the layer chain) | tests/architectural/conftest.py landscape fixture + tests/architectural/test_layer_rules.py |
test_layer_rules.py (pytestarch LayerRule + TestLayerCoverage meta-tests + the mission_runtime and runtime outbound ledgers) |
| Retired-subsystem negative boundary | pyproject.toml [tool.ruff.lint.flake8-tidy-imports.banned-api] (TID251) |
tests/architectural/test_no_retired_subsystems.py |
The enforced layer chain is:
kernel <- charter <- {glossary, runtime, mission_runtime} <- specify_cli
charter.offering holds the doctrine code the former top-level src/doctrine/ package was
relocated into (Convergence #3881); the src/doctrine.py deprecation shim was removed (#805).
Direction (2026-10-12):
charteris slated to leave this in-tree layer chain and become an external contract package in its own repository, consumed throughcharter.offering.apilikespec-kitty-events/spec-kitty-tracker(ADR2026-10-12-2; precondition #645, now GA-gating). The enforced pair stays the authority; this note changes no gate.Superseded (2026-10-19):
charterstays in this in-tree layer chain. The Python charter stays in core until it is retired and nothing Python moves tospec-kitty-charter; offering reads cut over to thespec-kitty-charterservice throughcharter.offering.api(spec-kitty-charterADR-0008 and ADR-0010, which supersede ADR2026-10-12-2; ADR2026-10-16-1, Amendment 2026-10-19).
Hosted client packages were removed
The former zeitgeist_client/ and saas_client/ packages were removed from open-core (#6164; the code is preserved in spec-kitty/event-router). See ADR
2026-09-06-1-convergence-retirement-and-client-repo-inversion
and the precedent ADR
2026-04-25-1-shared-package-boundary.
Historical note
The original slice model (cli_shell, charter_governance, doctrine,
runtime_mission_execution, glossary, lifecycle_status, orchestrator_sync_tracker_saas,
migration_versioning) framed an extraction roadmap (missions #612–#615). Only glossary
(→ src/glossary/) and part of runtime (→ src/runtime/next/) were extracted; the
src/lifecycle/ and src/orchestrator/ targets were never created, and the sync/saas slice
was retired outright by the Convergence. Consult git history for the pre-2026-09-06 slice
detail; do not treat it as a current statement of ownership.