System contract consistency workshop
Opened: 2026-07-29
Last full recheck: 2026-08-27
Audited commit: 6660bd2ad0d53938551ac283f60463f3c3d91b8e
Last plan refresh: 2026-08-27 (full rebaseline, disjoint-root installation program, and T1 transfer)
State: seven findings remain open; C1 and F1 were resolved on 2026-08-19, and S1 was resolved on 2026-08-23. Plans and outcomes are recorded in the plan index. T1 remains an open finding here, but its design and implementation have transferred to the dedicated tag-contract convergence workshop.
Scope: current Commonplace contracts outside the linking and lineage domains
Current verdict
Seven of the ten confirmed contradictions remain open. C1 closed by documenting the omitted executable and enforcing exact catalogue parity. F1 closed by withdrawing a generic freshness command that had no legal target. S1 closed when ADR 072 moved durable genre authority to the tracked ingest and restored whole-file immutability for local snapshots. Several witnesses changed without closing their findings:
- E1: the health check gained one PowerShell-paired step and dropped obsolete activation instructions, but several promoted procedures are still POSIX-only;
- V1: the promoted skill's one-level glob now sees five of eight installed collection contracts and still omits all three nested shipped collections;
- I3: installed sources gained a contract and the generated control plane stopped denying that types is a collection, but installed work remains contractless and discovery still excludes the global type collection;
The install-integrity result is now 532 missing-link warnings across 181 files: 518 in the three shipped library collections and 14 in shared global types. Installed reference also has one projection-specific type failure. The advertised full-validation procedure still skips all three shipped collections, so it can report completion without examining this broken surface. The generated counts, stale-witness dispositions, and reproduction boundary are recorded in the 2026-08-27 witness ledger.
The workshop resolution now selects a different future shape from the current
witnesses: host kb/ and projected commonplace-library/kb/ are disjoint
kb-roots, while commonplace/kb/ stays reserved for the optional full reader
checkout. The decision, consumer
impact ledger, successor ADR
draft, and implementation
packets are design inputs only;
none changes the current installed contract.
The recurring mechanisms remain:
- an exception or migration landed in its primary schema or decision record but not in every consumer;
- a scope word such as “all,” “every,” or “supported” is broader than the mechanism that enforces it;
- a command or workflow was exposed before its accepted input domain existed;
- a non-identity install projection is tested as a copier rather than operated as the product a user receives.
Standard used
A confirmed contradiction needs two current, operative witnesses that cannot both be followed over the same declared scope. An advertised command with an empty legal input domain also qualifies. A missing future feature, an explicitly historical statement, or an unimplemented proposal does not.
Priorities mean:
- P0 — a fresh install or completion signal is unsound;
- P1 — a current supported workflow, trusted mark, or system-definition contract can direct incompatible actions;
- P2 — a narrower current reference or authoring surface teaches a rejected or invalid shape.
Findings at a glance
| ID | Priority | Current contradiction | Immediate consequence | Plan |
|---|---|---|---|---|
| I1 | P0 | Accepted ADR 021 promises four shipped collections, a marker, and marker-backed refresh; init ships three, writes no marker, and preserves every differing file | Package upgrades cannot update existing project-local library or skill copies as promised | Shipping and upgrade |
| I2 | P0 | Source-valid local paths are copied through a topology change without shipping or translating their targets | A pristine install has 532 missing-link warnings and one type failure | Install projection integrity |
| V1 | P0 | The promoted skill's all procedure uses kb/*/COLLECTION.md, while installed library collections are nested below kb/commonplace/ |
The normal completion path skips the shipped library | Validate all |
| I3 | P1 | Generated routing treats installed work as a collection without a contract, while discovery and conformance exclude contract-bearing kb/types/ |
Read-before-write is impossible for installed workshop writes and a real collection remains outside collection consumers | Installed topology |
| S1 | P1 | Resolved 2026-08-23: the tracked ingest owns durable genre; a local snapshot's optional genre is provisional and its bytes remain immutable after capture |
ADR 072 removes the mutation exception and aligns the collection, types, and ingest write boundary | Completed outcome |
| T1 | P1 | Tag coverage is stated and routed beyond one collection but generated and checked within one collection | A validated mark can falsely license a reader to skip the exact membership query that would expose omissions | Transferred owner and closure tracker |
| E1 | P1 | Native Windows is supported, but promoted skills retain unpaired POSIX-only commands | Selected recovery and authoring procedures are non-operative on a declared channel | Windows execution |
| F1 | P1 | Resolved 2026-08-19: the unsupported generic accept entry point, transition, schema, and current-facing claims were withdrawn | ADR 065 requires a concrete non-review target before the surface can return | Completed outcome |
| M1 | P2 | One accepted representation migration retains live guidance; four independent packets are now resolved and guarded | Agents can still follow the retired Areas/Topics grouping contract until tag adoption supplies its replacement | Migration residue |
| C1 | P2 | Resolved 2026-08-19: the current 22 console scripts have 22 unique command-reference sections | An exact set-parity test prevents one-sided catalogue changes without freezing the count | Completed outcome |
I1 — Shipping and upgrade contracts disagree
Accepted ADR 021
still specifies four library collections, including agent-memory-systems, a
kb/commonplace/.commonplace marker, and marker-backed replacement of a clean
shipped tree. The scaffold manifest
ships only notes, reference, and instructions. Init writes no marker and
preserves every differing existing target because it has no prior-version
baseline.
Most current surfaces already describe that implementation. ADR 014 sets missing-files-only, non-destructive behavior and explicitly rejects automatic synchronization. ADR 037 requires manual diff-and-merge for projected skills, and INSTALL.md says reruns acquire new scaffold files rather than replace existing ones. ADR 021 remains the marker-backed replacement witness. Architecture's former “re-sync” wording is now stale and no longer a current witness.
Preserve-only reruns are the honest current and possible interim contract, but
they are not a credible terminal upgrade design for hundreds of
Commonplace-owned files. The selected plan installs a new disjoint library at
commonplace-library/kb/, records prior hashes so upgrades can replace
unchanged Commonplace files, preserves local forks and user-owned paths, and
reports both upstream removals and clean legacy kb/commonplace/ paths for
deliberate pruning. T1 supplies migration inputs; it does not build a parallel
upgrade mechanism.
I2 — The install projection breaks the library graph
The source notes, reference, instructions, and shared types validate without
missing-link warnings. Copying selected content under kb/commonplace/ while
keeping shared types at kb/types/ and omitting dependency collections breaks
otherwise valid paths:
| Installed surface | Files with broken links | Broken links | Failures |
|---|---|---|---|
kb/commonplace/notes |
146 | 462 | 0 |
kb/commonplace/reference |
30 | 55 | 1 |
kb/commonplace/instructions |
1 | 1 | 0 |
kb/types |
4 | 14 | 0 |
| Total | 181 | 532 | 1 |
Resolved against their intended source targets, the 532 broken edges divide as follows:
| Intended target class | Broken edges |
|---|---|
kb/sources/ |
335 |
kb/agent-memory-systems/ |
101 |
kb/types/ |
34 |
kb/agentic-systems/ |
31 |
kb/notes/ |
9 |
kb/reference/ |
5 |
src/ |
5 |
kb/articles/, kb/reports/ |
6 |
AGENTS.md, kb/tasks/ |
4 |
kb/log.md |
1 |
kb/work/ |
1 |
The sole failure is the installed copy of the tag semantic contract
proposal:
its repository-relative collection-local type pointer remains under absent
top-level kb/reference/types/ instead of projecting under
kb/commonplace/reference/types/. Shared type contracts exhibit the inverse
depth change when they link back into notes or reference.
The resolution plan treats init as a build projection with an explicit
source-to-installed map, an explicit disposition for omitted dependencies, one
code-safe link rewriter, and a strict packaged-wheel acceptance test. The
installed-product decision compares
the self-contained, thin, curated, and hybrid options and recommends one hybrid
evidence-local edition: complete methodology, a fixed-point closure of tracked
source analyses, and immutable publication links for omitted review corpora
and other first-party material. It also selects pairwise-disjoint host and
Commonplace kb-roots, root-local types, five scoped per-file ownership
values, one compiler, and hash-aware upgrades. Source kb/ projects to
commonplace-library/kb/; host kb/ remains independent. A successor
installation ADR becomes authoritative only with its operativity path. Wheel
and editable-source installation must invoke the same compiler-like
projection.
Reproduction
From the Commonplace source root:
audit_root=$(mktemp -d /tmp/commonplace-contract-audit-XXXXXX)
commonplace-init --root "$audit_root" --name audit
cd "$audit_root"
commonplace-validate kb/commonplace/notes
commonplace-validate kb/commonplace/reference
commonplace-validate kb/commonplace/instructions
commonplace-validate kb/types
These counts were reproduced at the audited commit on 2026-08-27. Missing links are warnings, so exit status alone cannot establish product integrity. The reference collection exits nonzero for the projection-specific type pointer.
V1 — “Validate all” still means one depth
commands.md no longer publishes its former
hardcoded collection list. The promoted validation
skill remains the operative
all procedure and loops over kb/*/COLLECTION.md. A pristine install now
contains eight COLLECTION.md files; the glob sees five and misses all three
nested shipped collections.
project_paths.py already has a
recursive collection_dirs(), but no all procedure consumes it. It also
filters out any path containing types, so it returns seven of the eight install
collections, and in the source checkout it can include the deliberately ignored
kb/work/dialectical-sample fixture. The full-validation enumerator therefore
must select each declared kb-root, include its type collection, prune
.commonplace-validation-ignore, carry root-aware paths rather than basenames,
continue after failures, and own one aggregate result.
Collection discovery is not the whole current types target: support type
specs under paths such as kb/reports/types/ and kb/tasks/types/ may have no
enclosing collection. all must cover those exactly once after collection
runs. V1 should expose a stable Python aggregate result before rendering text,
with optional JSON as a secondary interface. It must also run the existing
direct-child-of-kb/ landing check once, without silently imposing that landing
rule on nested library collections.
I3 — Installed routing and material topology disagree
kb/types/COLLECTION.md correctly explains that
kb/types/ is both global in reach and a collection by contract. The generated
AGENTS.md.template now defines collections by a
local contract and no longer contains the former “not a collection” witness.
collection_dirs() still excludes kb/types/, so material contract and
runtime discovery continue to disagree.
collection_conformance.py
also excludes every contract under a types path even though accepted ADR
060
places kb/types/ inside collection-conformance review.
The template routes kb/sources/ and kb/work/ as writable collections and
requires their contract to be read before writing. The scaffold now installs a
sources contract and landing. It still creates only the work directory, so a
workshop write can hard-fail on a pristine install.
The selected topology makes host sources and work genuine scaffolded user
collections and makes types root-local. Source Commonplace uses kb/; an
initialized project has disjoint host kb/ and projected
commonplace-library/kb/ roots. Extend the existing ScaffoldManifest with
orthogonal root, ownership, collection/template, materialization, and upgrade
data instead of creating a second topology inventory or a catch-all kind
enum. Runtime collection discovery still follows concrete COLLECTION.md
files inside each selected root so user-created collections remain visible.
S1 — Snapshot immutability contradiction is resolved
ADR 072
supersedes ADR 045's placement and mutation exception. The tracked ingest owns
durable genre; a local snapshot may retain a provisional capture-time value,
but ingestion writes its closer-reading judgment only to the report. Because
the ingest checksum covers every snapshot byte, the snapshot now remains
whole-file immutable after capture.
The sources collection, snapshot type, ingest-report type, and cp-skill-ingest now agree on the same boundary: snapshotting may create the ignored reading copy; ingestion writes only the tracked report and verifies that the reading copy's checksum did not change. The installed source template now projects this resolved contract; I3 retains only its manifest and routing parity obligation.
T1 — Tag completeness claims have incompatible scopes
The tag-readme type and current routing still use
unqualified “every note” language across collection-facing surfaces, while
generation and validation index one collection. The concrete witness remains
trace-learning-techniques-in-related-systems.md:
it carries learning-theory but none of the six children declared by
learning-theory-README.md. Validation
passes because it checks only notes. Under the proposed participating set, the
live reference proposal omitted by the complete artifact-analysis head is a
second witness.
No local wording repair can close this finding. It requires a semantic model,
kb-root ownership, exact membership resolution, consumer convergence,
published projection behavior, and a breaking corpus migration. Those design
and implementation responsibilities have therefore transferred to the
tag-contract convergence workshop.
The two reference proposals remain unadopted inputs, not authority.
This parent workshop retains only the audit finding, its witnesses, installed-product dependencies I1/I2/I3/V1, and the handoff and closure tracker. T1 closes here when the owner workshop's adoption tests show that every exact-membership consumer uses the same projection-relative set and the original witnesses no longer contradict the implemented contract. The later agent navigation experiment is follow-up, not a closure gate unless an adopted decision makes a retrieval-performance claim.
E1 — Native Windows support and promoted procedures disagree
Native Windows and PowerShell remain supported, and the manifest now promotes
ten skills. cp-skill-health-check
improved its uv-tool step and removed the old direnv, bash -c, and active
.venv/bin instructions. Its layout, projection, and legacy-residue checks
still use unpaired Bash constructs such as test, &&, ||, and sed.
cp-skill-connect still uses the
GNU-sensitive xargs -r guard, while
cp-skill-validate still embeds a
Bash if/for program.
The execution-channel
workshop remains the owner, but
its runtime evidence remains Linux-only. Its 2026-08-27 promoted-skill
audit
now derives the selected set from MANIFEST.promoted_skills, uses the current
user-level uv-tool model, and classifies every executable locus. The plan
retains Windows, uses V1's package-owned target dispatcher, moves connect's
deterministic tag/path enumeration behind T1's resolver, pairs only true
preflight checks, consolidates byte-level and orchestration work behind shared
package/runtime operations, and adds native-Windows CI and runtime evidence.
F1 — Generic freshness acceptance is withdrawn
Resolved 2026-08-19. ADR
065
amends accepted ADR
052:
v1 has only review-pair targets, so review finalization owns baseline creation
and replacement. Generic initial acceptance may return only with an adopted
non-review target and its complete registration contract.
The package entry point, CLI module, unreachable transition, empty target-kind set, rejection-only tests, JSON schema, and current-facing documentation were removed together. Status, acknowledgement, retirement, capture finalization, and the generic tables remain. The C1 parity test now observes 22 published commands and 22 unique command sections, so a one-sided reintroduction fails.
The dated freshness-module review and historical artifact-freshness implementation documents retain the old command only as explicitly marked evidence. The active collection-freshness proposal describes initial registration as future work rather than claiming that a generic command ships.
M1 — One representation migration retains live residue
Only Areas/Topics remains active. Global note status and path-valued types closed on 2026-08-27; text promotion and the snapshot pointer closed on 2026-08-19:
| State | Current contract | Guidance disposition |
|---|---|---|
| Resolved | ADR 044, note-base.schema.yaml, and note.schema.yaml remove global note status |
Current guidance now teaches the actual shared fields and no maturity ladder. A parsed-frontmatter guard confines status to declared ADR and article lifecycle values; a scoped guidance check rejects retired current wording. |
| Open | ADR 004 replaces areas and Topics footers |
areas-exist-because-useful-operations-require-reading-notes-together.md teaches the retired mechanism as current |
| Resolved | collections-and-types.md and the resolver require path-valued type: |
Current examples use resolvable paths. A parsed scan validates every visible active artifact's frontmatter and the inventoried executable examples; only ADR 012 retains the pre-path enum as dated history. |
| Resolved | snapshot.schema.yaml requires type: kb/sources/types/snapshot.md |
snapshot.md now gives the same path-valued default. A schema-derived parity test covers the type spec, collection Types menu, and snapshot skill; existing emitter tests cover X and GitHub captures. |
| Resolved | note-base.schema.yaml requires description and type, while convert writes type: kb/types/note.md and never grants verification |
The text contract, root and reference guides, and five conceptual notes now require complete note frontmatter in their text-promotion passages. A schema-derived check covers the authoritative text contract and converter template; a scoped regression scan rejects retired shortcuts in all eight current consumers. |
The migration plan and manifest records all four completed packets and their guards. The Areas/Topics packet still must distinguish explicit history from current instructions and add a narrow guard for the retired executable form after the tag-contract outcome supplies its replacement.
C1 — Command-catalogue parity is resolved
The scripts table in pyproject.toml publishes 22
commonplace-* entry points, and commands.md now
has 22 unique matching command sections. The quote-verification section
documents its targets, --show-matches, result classes, and exit behavior.
test_command_catalogue_integrity.py parses both live surfaces, rejects duplicate command headings, and asserts exact set equality without fixing the expected count. F1's later removal changed both sets together, so catalogue parity remained intact without changing the guard.
Root causes
1. The installed form is not an acceptance-test target
Init tests prove selected files were copied. They do not operate the generated KB as a consumer would. A non-identity projection needs product tests over its output, including warnings, rather than only unit tests over its copier.
2. Decisions and migrations lack consumer manifests
ADRs 004, 021, 044, and 045 changed concepts with many readers. Primary implementations moved while navigation, examples, skills, or installed projections retained the old contract. Naming one operativity path did not inventory independent consumer classes, generated forms, or installed migrations; the workshop-wide contract-change gate addresses that process gap.
3. Scope is prose reimplemented as traversal
“Every tagged note,” “all collections,” and “supported on Windows” are scope claims. Validator, glob, site hook, and promoted procedure each select their own set rather than consuming a shared declaration. T1 also showed that an exact membership shortcut and a task-level discovery stop are different permissions; using “search” for both hides the boundary the mark actually checks.
4. Presence is mistaken for capability
A console entry point, help page, copied skill, or installed contract proves presence, not that any legal invocation or supported execution channel works.
Implementation order
- Rebaseline at a named commit — complete for this cycle. The witness
ledger classifies open, partial, stale, new, and count-only changes at
6660bd2a. - Workshop architecture — complete. The decision packet selects the
hybrid evidence-local edition, disjoint host and Commonplace
kb-roots, root-local types, scoped ownership values, projection policy, and terminal upgrade policy. The impact ledger, successor ADR draft, and packet sequence make the choice reviewable without activating it. - Implement the dormant I3 foundation plus V1. Extend
ScaffoldManifestenough to expose explicit roots, reject overlap, make path/type identity root-aware, keep collection discovery contract-based, and land the recursive structured validation suite. V1 may truthfully report current product failures; that makes it I2's acceptance harness. - Implement I2. Build one compiler-like projection for wheel and editable sources, disposition every dependency edge, and test the actual fresh install through V1.
- Activate fresh installs, then finish I1. Route the compiled Commonplace
library to
commonplace-library/kb/, update generated surfaces and promote the successor ADR, then migrate legacykb/commonplace/through ownership-aware reconciliation. Preserve-only may be an explicitly temporary release constraint, not the terminal architecture. - Continue E1; independent M1 packets are complete. Implement the manifest-derived promoted-skill audit's dispositions and gather native Windows evidence. Global-note-status and path-valued-type cleanup closed on 2026-08-27; Areas/Topics still waits for tags.
- Consume the tag owner outcome. The tag-contract workshop implements its semantic/resolver, consumer, and migration phases against the settled installed-product boundary. This workshop then rechecks T1's original witnesses.
- Finish Areas/Topics and the process guard. Promote the contract-change implementation gate, record outcomes, and delete this workshop.
Workshop-wide durable outcome
Closing the individual contradictions is insufficient if a later cross-cutting contract change again inventories only one consumer. The contract-change gate plan must promote a small implementation/review instruction covering:
- authoritative declaration and declared scope;
- current operative consumer classes;
- generated and projected forms;
- fresh-install consequence and existing-install migration;
- acceptance test and drift guard;
- explicitly historical retained witnesses.
This is a review aid, not a general semantic-contradiction detector and not an ADR file inventory. The disjoint-root impact ledger is its first workshop application; one independent application and durable promotion remain open.
Exclusions and non-findings
- Linking vocabulary, direction, grammar, and enforcement remain in the linking workshop; lineage carrier and invalidation conflicts remain in the lineage ledger.
kb/work/dialectical-sample/COLLECTION.mdis beneath a tracked validation ignore marker. It is not a live nested-collection defect, but collection enumeration must prune it.- Deferred collection freshness, generic lineage storage, semantic-link validation, and similar missing consumers remain design gaps until live contracts choose incompatible behavior.
- Historical ADR context is not current authority. ADR 021 remains included because it is accepted and its Decision and Consequences still make present-tense guarantees.
- The freshness module review's remaining implementation findings are outside this contract workshop. Its generic-accept finding is resolved here; its dated reproduction remains historical evidence.
Closure condition
This workshop closes only after every plan's acceptance criteria are satisfied in durable system artifacts or the finding is explicitly transferred to a named owner with those criteria, the contract-change gate is promoted, and all transferred findings are rechecked against their original witnesses. The workshop must then be deleted so it does not become a second authority surface.
Complete file listing (generated at build time)