Installed-product decision: one disjoint-root, evidence-local projection
Status: concrete workshop recommendation for the successor installation ADR and the I1/I2/I3/V1 implementation program. This file is not system authority.
Decision date: 2026-08-27
Measured tree: tracked files at
bade480fed0694ef9a688d85d5542ebd847a6e59. Untracked files and the operator's
uncommitted work were excluded from size and graph measurements. Contradiction
counts remain those reproduced at 6660bd2a in the
witness baseline.
Goal
Define the product installed into a host project so its topology, paths, ownership, validation, and upgrade behavior can be implemented as one contract. The result must preserve a host project's independent KB, install a locally useful Commonplace library, and avoid treating one KB as a special subtree of another.
Vocabulary
This design needs three system-wide compounds. Their hyphenated forms identify the technical meanings; the corresponding ordinary words keep their ordinary English meanings.
kb-root— the concrete directory that bounds one independently operated KB in one materialized tree. Type resolution, collection participation, tag membership, and root-relative paths stop at this boundary. Declaredkb-roots in one product are pairwise disjoint: no root is an ancestor of another.install-projection— the deterministic source-to-installed transform that chooses files, rewrites projection-sensitive paths, and records the result.installed-product— the complete materialized result placed in a host project: the host scaffold, the projected Commonplace library, runtime projections, and installer state.
namespace remains ordinary local terminology when useful. It is not a new
system-wide kind. This decision does not use it to explain the product
topology. knowledge root, logical root, and shared-types root are also not
introduced as technical terms.
Recommendation
Ship one default hybrid evidence-local edition. Do not add an edition flag yet.
The edition contains:
- every tracked artifact in the Commonplace methodology core:
kb/notes/,kb/reference/, andkb/instructions/; - the Commonplace root's global and collection-local type contracts;
- a read-only framework evidence collection containing the least set of tracked source analyses needed to close source-to-source links reachable from the methodology core; and
- user collection heads, operating directories, the control-plane template, selected host-root type replicas, and promoted skill projections required to operate a host KB.
Materialize the installed Commonplace library at
commonplace-library/kb/. Keep the host KB at kb/. These are sibling,
pairwise-disjoint kb-roots. The source checkout still has one Commonplace
kb-root, at kb/; the install projection changes its physical location.
The existing reader install at commonplace/kb/ remains the full-corpus
vendoring option. That path is deliberately not reused for the curated
installed library. A project may therefore carry the installed product and an
explicit reader checkout without a path collision.
Raw captures under kb/sources/.snapshots/ never enter the package. Do not
ship the whole kb/agent-memory-systems/ or kb/agentic-systems/ review
corpora, articles, this repository's reports, tasks, log, or workshops. Links
that need those first-party artifacts become immutable
source-revision-pinned publication links. A link that needs an original
external source becomes that source's canonical URL. The projection must
distinguish those meanings; it must not replace Commonplace analysis with the
evidence that analysis interpreted.
Concrete topology
The same Commonplace KB has one identity and different physical paths in two projections:
| Projection | kb-root identity |
Physical directory | Role |
|---|---|---|---|
| Commonplace source checkout | commonplace-kb |
kb/ |
Canonical framework KB and authoring source |
| Initialized host project | host-kb |
kb/ |
Independently operated, user-owned host KB |
| Initialized host project | commonplace-kb |
commonplace-library/kb/ |
Read-only projection of the Commonplace library |
| Optional reader checkout | explicitly selected reader target | commonplace/kb/ |
Full Commonplace repository vendored for reading; not automatically joined to host operations |
commonplace-library/ is the installed product container. It is not a
kb-root; its kb/ child is. Runtime skill directories are projection
surfaces, not KB roots.
The invariant is structural:
Declared
kb-roots are pairwise disjoint. Nokb-rootis an ancestor of another.
Consumers must not recover this invariant by scanning for nested roots and subtracting them from an outer root. An explicit cross-root navigation action may union separately resolved results. It does not transfer collection participation, tag marks, type scope, or ownership between roots.
Root discovery
Root discovery is explicit rather than recursive:
- a Commonplace source checkout uses its declared source root,
kb/; - an initialized project always has the host root
kb/and reads the installed Commonplace root from installer state; - a caller may explicitly select a reader checkout or another declared target; its mere presence below the project does not join it to host operations;
- startup and validation reject overlapping declared roots before traversing collections.
Within each selected root, collection discovery remains recursive and
contract-based: a directory containing COLLECTION.md is a collection. This
keeps user-created collections visible without adding them to package
configuration. A product-wide operation first selects declared roots, then
discovers collections independently inside each root.
Type identity and resolution
Each KB owns its type contracts:
- the source Commonplace root owns
kb/types/; - the installed Commonplace root owns
commonplace-library/kb/types/; - the host root owns
kb/types/; - framework type contracts required by host-root operations are explicit
commonplace-replicafiles in the host root, while user additions remainuser-owned.
A kb/... type pointer is relative to the artifact's owning kb-root, not to
the project or repository root. Its canonical identity therefore includes the
root identity and the root-relative path. The text kb/types/note.md in two
different roots does not silently name one shared file.
Collection-local pointers remain file-relative. Schema references and other root-relative paths obey the same boundary. A type resolver may not fall through from one root to another. If a host operation needs a framework type, the manifest must project that file into the host root and record its ownership; shared physical placement is not an implicit dependency mechanism.
Type collections remain real collections. They are non-participating or tag-prohibited because of their artifact role, not because they sit outside a KB root.
Cross-root links
The installed Commonplace library must be closed without depending on the host
root. A host artifact may author an explicit physical link into
commonplace-library/kb/, and a product-level navigation command may show
results from both roots. Those are cross-root references or unions, not shared
membership.
Projection-sensitive library links are rewritten relative to the installed Commonplace root. Omitted first-party targets are externalized according to the bundle policy below. No consumer may interpret a relative link, type pointer, or tag mark by silently searching another root.
Evidence
The current installed cut is neither closed nor declared once
The live scaffold manifest projects three library trees: notes, reference, and instructions. It also projects shared and operational types. The wheel and sdist repeat their own source-tree lists in pyproject.toml, so the manifest does not yet own package membership. The init implementation copies source bytes directly and preserves every differing existing target. It has no root metadata, link projection, prior-version baseline, or terminal upgrade transition.
At the workshop baseline, a pristine install had 532 missing-link warnings
across 181 files and one projection-specific type failure. The missing edges
included 335 edges into kb/sources/, 101 into
kb/agent-memory-systems/, and 31 into kb/agentic-systems/. The normal
validation procedure skipped all three nested library collections. These are
I2 and V1 witnesses, not merely stale documentation.
Current size and graph measurements
A fresh wheel built from the measured tree into /tmp was 2,248,337 bytes. It
contained 761 entries and 5,348,641 uncompressed bytes. Its shipped KB core and
support inputs account for 656 tracked files and 4,682,389 raw bytes.
The table below uses git ls-files membership. "Deflated" is a comparative
payload estimate, not an exact future wheel size.
| Candidate proxy | Tracked files | Raw bytes | Deflated bytes | Meaning |
|---|---|---|---|---|
| Curated operational hard floor | 130 | 612,421 | 246,382 | Current instructions plus type support, without the theory and reference dependencies needed for a useful edition |
| Thin current core | 656 | 4,682,389 | 1,867,513 | Current three library collections plus type support |
| Recommended hybrid | 835 | 6,606,412 | 2,632,303 | Thin core plus the measured source-analysis closure and source collection heads |
| Self-contained durable-corpus proxy | 1,174 | 12,004,929 | 4,520,848 | Core plus all tracked sources, agent-memory reviews, agentic-system analyses, and articles; operational residue and raw snapshots excluded |
The hybrid proxy would put a wheel near 3.0 MB if code and metadata stayed at their current size. The self-contained proxy would put it near 4.9 MB. Size is not, by itself, a reason to reject self-containment.
From the current core, direct local links reached 129 tracked source files (1,442,330 bytes), 37 agent-memory-system files (860,140 bytes), and five agentic-system files (75,175 bytes). Literal transitive closure also pulled in workshops, logs, tasks, reports, source code, and scripts. It is therefore not a product boundary.
The narrower source-only fixed point is coherent. At the measured commit it contained 177 files and 1,916,068 raw bytes (761,215 deflated bytes). These counts are observations, not constants. The compiler recomputes the set and the product test compares declared inputs with output.
Option disposition
Self-contained methodology library
Technically affordable and strongest offline, but it makes every comparative review part of the installed upgrade surface without closing links to all implementation and historical witnesses. Keep full-corpus vendoring as the reader product.
Thin publication
Matches the current advertised bundle, but externalizes 335 source-evidence edges and removes modest, useful evidence from local search. Keep it only as a future response to demonstrated redistribution or package-size constraints.
Curated operational edition
Potentially much smaller, but no declared workload set identifies which methodology artifacts promoted procedures need. Reconsider it only as a separately evaluated edition with workload fixtures and a navigation contract.
Hybrid evidence-local edition
Selected. It retains the complete methodology and the bounded source-analysis closure while externalizing larger descriptive review collections.
Exact bundle rule
Let C be every tracked file under kb/notes/, kb/reference/, and
kb/instructions/, plus Commonplace type and operational support files
declared by the manifest.
Let E0 be every eligible tracked source-analysis artifact under
kb/sources/ targeted by a local Markdown link from a Markdown artifact in
C. A snapshot is never eligible. Let E be the least fixed point containing
E0 and every eligible source-analysis artifact targeted from an artifact
already in E.
The projected Commonplace root contains:
- the framework collection files in
C; - the evidence files in
E; - a projection-specific
sources/COLLECTION.mdand generatedsources/README.md; - collection-local evidence types under
sources/types/; and - the root-local global type collection under
types/.
The source-side sources contract is not copied verbatim: it governs a writable
collection with local snapshots, while the projected evidence collection is
read-only. Edges from E to omitted first-party material become immutable
Commonplace publication links. Edges back into C remain local.
Ownership vocabulary
Ownership is per target file. The hyphenated values below have formal meaning
only in a declared ownership field:
| Value | Examples | Upgrade rule |
|---|---|---|
commonplace-managed |
Files in commonplace-library/kb/ |
Replace when unchanged from the recorded base; preserve and report local forks |
commonplace-replica |
.agents/skills/cp-skill-*/, .claude/skills/cp-skill-*/, and selected host-root type replicas |
Same hash-aware transition, but never authority |
user-seed |
Initial user collection contracts and landings; AGENTS.md.template; generic work and sources heads |
Create once, then transfer authority to the user; never recreate a deliberate deletion automatically |
user-owned |
User artifacts, added collections and types, logs, reports, workshops, and tasks | Never overwrite, delete, or claim provenance |
installer-state |
commonplace-library/.installed-product.json |
Replace atomically only after successful reconciliation; invalid or missing state makes automatic replacement fail closed |
These values replace the broader framework-managed, framework-replica, and
seeded-user labels considered earlier. The scoped names reduce accidental
collision with ordinary uses of “framework” and “seed.”
Manifest and projection policy
Extend ScaffoldManifest rather than create a parallel topology inventory.
Do not put topology, artifact role, ownership, and materialization into one
kind enum. They are independent axes. Manifest entries or derived product
records must express, as applicable:
- stable source identity and target path;
- owning
kb-root, or an explicit statement that the target is outside a KB; - collection discovery or contract-template responsibility;
- ownership value and writability;
- source, generated-template, or replica materialization;
- projection transform and dependency policy; and
- upgrade policy.
The exact Python fields remain an implementation choice. The manifest owns the seed topology and edition inputs. A build step emits the exact per-file installed-product manifest. Packaging, init, tests, and documentation consume or parity-check that output instead of repeating tree lists.
Compile the product as one non-identity projection:
- resolve Markdown links and
type:pointers at canonical source locations; - classify each target as included-local, omitted-first-party, original-external-source, or prohibited/unresolved;
- map included targets into the projected root and recompute relative URLs;
- apply immutable URL dispositions to omitted first-party targets;
- retain an original URL only when the edge actually cites that source; and
- fail when no legal disposition exists.
Use the existing fenced-code-safe relocation tokenizer and relative-link formatter. Editable-source and wheel builds run the same compiler and produce byte-identical product trees for the same inputs and revision. The compiler output, not a source-tree copy, is the release target. V1 validates each declared root and collection; the packaged-product test raises missing-link warnings to release failures.
Terminal upgrade policy
Persist commonplace-library/.installed-product.json with the edition,
package version, source revision, projection-format version, declared roots,
and one record per owned target. Managed and replica records include source
identity, target path, ownership, last accepted base hash, and desired hash.
Build and validate the complete desired tree before touching the project. Then apply these transitions:
| Current state | Ordinary upgrade action |
|---|---|
| New managed target is absent | Create it and record the new base hash |
| Desired target already exists without ownership state | Preserve and report an ownership conflict |
| Current bytes equal the recorded base | Replace atomically and advance the base |
| Current bytes equal the new desired bytes | Adopt the desired bytes as the new base without rewriting |
| Current bytes differ from base and desired | Preserve, report a local fork, retain the old base, and record the new desired hash |
| Recorded managed target is absent | Preserve the deletion and report a missing fork; restore only through explicit repair |
| Upstream removed a clean managed target | Report it as obsolete; remove only through explicit prune |
| Upstream removed a modified managed target | Preserve it as an obsolete fork; refuse ordinary prune |
user-seed or user-owned target changed or disappeared |
Do not overwrite or recreate it |
Ordinary upgrade never deletes a file. Pruning is a separate deliberate mode that resolves and prints exact targets before mutation.
Legacy nested-layout migration
Existing initialized projects may contain the old projected tree at
kb/commonplace/. I1 must treat that as a layout migration, not as evidence
that nested KB roots remain supported:
- recognize only files that match a known legacy projection or a recorded prior base;
- compile and validate the desired
commonplace-library/kb/tree first; - install or reconcile the new tree through the ownership transition;
- preserve unknown and locally edited legacy files as explicit forks;
- report clean legacy paths as obsolete; and
- remove them only through a deliberate prune after the new product is valid.
The migration must not recursively delete kb/commonplace/ or infer ownership
from its path. Preserve-only reruns may remain an interim limitation, but they
do not close I1.
Consequences for the open plans
- I3 supplies the
kb-rootdeclaration, pairwise-disjoint guard, root-local type semantics, and contract-based collection discovery. - V1 selects explicit roots, then recursively validates every collection and uncovered type surface in each one.
- I2 compiles the hybrid edition
into
commonplace-library/kb/and dispositions every dependency. - I1 implements ownership-aware transition
and the legacy
kb/commonplace/migration. - T1 consumes
kb-rootisolation; it no longer needs an outer-root exclusion for an embedded library.
The consumer impact ledger, successor ADR draft, and implementation packets carry this recommendation into reviewable future changes. None of these workshop documents activates the new topology.