Execution-channel inventory
Status
Rebaselined 2026-09-25 at 5a178374, after ADR 064 (commands as a user-level uv tool) and ADR 086 (library served from the installed package). The first lexical baseline was taken on 2026-07-28; both columns are kept below. This rebaseline adds a first semantic classification of the non-promoted instruction files. The promoted skills are classified in the E1 rebaseline and are not repeated here.
The scan covers AGENTS.md, AGENTS.md.template, AGENTS.md.reader-fragment, INSTALL.md, and all Markdown under kb/instructions/. Canonical files are counted. The .claude/skills/ and .agents/skills/ symlink projections are excluded to avoid double counting.
Baseline
| Signal | 2026-07-28 | 2026-09-25 | Meaning and limitation |
|---|---|---|---|
Markdown files under kb/instructions/ |
83 | 120 | Full canonical instruction collection, including type/readme/support files |
| Shell-language fences, column 0 | 66 | 69 | The July regex. It misses fences indented under list items. |
| Shell-language fences, any indentation | — | 89 in 28 files | Use this count from now on. INSTALL.md also puts install commands in text fences, which neither count catches. |
Scoped files mentioning commonplace-* |
27 | 42 | 39 instruction files plus the three root files |
Scoped files mentioning rg |
14 | 14 | 11 instruction files plus the three root files |
Promoted and router SKILL.md files mentioning commonplace-* |
6 | 8 of 11 | Not connect, write-multistage (its references/promotion.md does), or the router cp-skill-library |
Promoted and router SKILL.md files mentioning rg |
4 | 2 | write, connect |
The structural conclusion from July is stronger now: 31 of the 42 files that mention commands are not promoted SKILL.md files. A solution scoped to promoted skills leaves most of the command surface untouched.
Tool census
File counts are lexical and case-sensitive unless marked. The "nature" column comes from reading the hits.
| Tool or family | 2026-07-28 | 2026-09-25 | Nature now |
|---|---|---|---|
commonplace-* |
27 | 42 | See the command surface below |
rg |
14 | 14 | Standalone calls in most files; pipelines in maintain-curated-indexes, retire-artifact, cp-skill-connect |
find |
13 | 18 | All prose. No instruction runs find. |
| Git | 11 | 12 | Executable in AGENTS.md commit rules, INSTALL.md reader install, retire-artifact, ingest-paper-with-code, analyse-agentic-system, stage-an-article-package, refresh-a-proposal-current-state, analyse-agent-memory |
| uv | 4 | 9 | Tool install in INSTALL.md, health check, snapshot-web; uv run pytest / uv run python in repo-internal procedures |
| pytest | 4 | 3 | All through uv run |
python3 |
4 | 3 | Executable in retire-artifact (python3 -c inside a pipe) and stage-an-article-package (python3 scripts/…) |
python |
1 | 3 | All uv run python … |
| direnv | 3 | 0 | Removed with ADR 064. .envrc survives only as legacy residue (see below). |
xargs |
2 | 2 | xargs -r in maintain-curated-indexes and cp-skill-connect |
wc |
2 | 3 | fix-review-warnings-sweep, cp-skill-snapshot-web, evaluate-scenarios |
sort |
2 | 1 | maintain-curated-indexes |
sed |
1 | 3 | maintain-curated-indexes pipeline; cp-skill-health-check prints .envrc |
| curl | 1 | 3 | Executable only in cp-skill-snapshot-web |
| awk | — | 1 | cp-skill-snapshot-web |
| ruff | — | 1 | AGENTS.md, through uv run |
| Roughdraft | 1 | 2 | roughdraft-review (repo-local skill) |
| qmd, mkdocs, sqlite3, jq, gh, flock | — | 0 | Absent from the surface |
| grep, tr, uniq, mktemp, date, printf, basename, dirname | — | — | Present in executable fences: maintain-curated-indexes, fix-descriptions, cp-skill-snapshot-web, cp-skill-revise-autoreason, cp-skill-validate, retire-artifact |
The July Codex/Claude runner counts (3 / 10) cannot be reproduced because the July method was not recorded.
No executable /tmp or $TMPDIR path appears on the surface. The only temporary directory is mktemp -d kb/reports/cache/… in snapshot-web.
Commonplace command surface
All 17 command names found on the surface are declared in [project.scripts]: validate, init, relocate-note, relocate-directory, warn-selector, review-target-selector, create-review-jobs, finalize-review-job, ack-review, guard-full-pass-report, agentic-analysis-handoff, agentic-analysis-publication, freshness-status, freshness-retire, github-snapshot, x-snapshot, and source (only in AGENTS.md.template).
Four commonplace-… strings are not commands: commonplace-doctrine and commonplace-store (file names), commonplace-relocate-* (the command family), and commonplace-freshness-retire/1 (a JSON schema id). The July false positives are gone.
Eight declared entry points are never mentioned on the surface: ack-trivial-note-changes, freshness-ack, store-healthcheck, promotion-candidates, review-job-list, resolve-criteria, status, verify-quotes. That is a documentation question, not a channel one.
Non-promoted instruction files
Every non-promoted instruction file that mentions commonplace-*, contains a shell fence, or carries inline executable commands. E means the agent is told to run commands; P means prose or illustration only. Repo-internal means the procedure assumes the Commonplace source checkout (scripts/, src/, tests/, properdocs.yml, related-systems/) and does not run in an initialized project.
Shell-dependent (load-bearing constructs beyond one argv call)
| File | Kind | Constructs in executable position |
|---|---|---|
retire-artifact.md |
E | rg … \| rg -i …; variable assignment; python3 -c program inside a pipe; while IFS= read -r … ; do printf … ; done loop feeding commonplace-freshness-retire --input -; also edits properdocs.yml |
maintain-curated-indexes.md |
E | rg \| grep -o \| tr \| tr \| sed \| sort \| uniq -c \| sort -rn; rg -l \| xargs -r rg; unquoted glob kb/notes/*.md; line continuations |
fix-warnings/fix-descriptions.md |
E | commonplace-validate notes 2>/dev/null \| grep "description:" |
fix-warnings/fix-review-warnings-sweep.md |
E | commonplace-warn-selector --json \| wc -l |
run-review-batches.md |
E | selector \| commonplace-create-review-jobs --input - |
run-full-improvement-pass-on-note.md |
E | selector \| commonplace-create-review-jobs --input - |
review-triage.md |
E | selector … > {ack-manifest} |
migrate-semantics-preserving-gate-changes.md |
E | selector … > {ack-manifest} |
stage-an-article-package.md |
E; repo-internal | python3 scripts/… > kb/work/staging/{slug}/inventory.md |
refresh-agent-memory-review-taxonomy.md |
E; repo-internal | uv run python - <path> <<'PY' … PY heredoc importing package internals |
synthesize-agent-memory-landscape/SKILL.md (repo-local) |
E; repo-internal | uv run python scripts/… |
evaluate-scenarios/SKILL.md (repo-local) |
E; repo-internal | unquoted glob tests/scenarios/*.md; wc -c < {path} |
Two patterns recur. The selector-to-jobs pipe (… | commonplace-create-review-jobs --input -) and the selector-to-file redirect (… > manifest) are one command feeding another. PowerShell supports both, but its > writes UTF-16 by default in Windows PowerShell 5.1, which a JSON reader may reject. Letting the consuming command read from the producing command, or giving the producer an --output path, would remove the shell from both. retire-artifact and maintain-curated-indexes are the only instructions with real POSIX programs; they are the non-promoted counterparts of E1's validate and connect items.
Shell-neutral (single argv calls; tool prerequisites only)
analyse-agent-memory.md (validate, git show), asd-ste100-inspired-rewrite.md, change-a-contract-that-several-consumers-read.md (repo-internal commonplace-init --root probe), draft-ingest-report.md, extract-adopted-part-of-a-proposal.md, FIX-SYSTEM.md, fix-warnings/fix-review-warnings.md, publish-an-article.md (partly repo-internal), refresh-a-proposal-current-state.md (git log --since), resolve-full-pass-disposition.md, revise-note.md, re-ingest.md (rg), simplification-passes/place-external-systems.md, simplification-passes/revise-an-article-or-note.md, ingest-paper-with-code.md (Git clone/fetch/merge in related-systems/), cp-skill-write-multistage/references/promotion.md, and the repo-local skills analyse-agentic-system, scan-agentic-system-transfer, roughdraft-review (external GUI/CLI).
Prose only
COLLECTION.md, README.md, write-instruction.md, review-gates/semantic/grounding-alignment.md, example-onboard-second-brain.md.
Library paths that break in an initialized project (ADR 086)
In an initialized project the library is at <library root>/…, and the project's own kb/instructions/, kb/notes/ and kb/reference/ hold only the project's own files. Relative Markdown links inside the library still work, because the installed tree mirrors kb/. The files below instead name a library file by a workspace-root path in prose or code spans. In a project that path finds nothing, or finds a project file of the same name.
This is a library-reachability defect rather than a shell one, but it has the same effect: the instruction works in the source checkout and fails silently elsewhere.
| Kind of path | Files (line numbers) |
|---|---|
kb/instructions/… |
FIX-SYSTEM.md (17, 60, 73, 83, 89); fix-warnings/fix-review-warnings.md (31, 55); fix-warnings/fix-review-warnings-sweep.md (38, 64); run-compression-bundle-on-note.md (10, 21–26, 61); compression-bundle/README.md (3); run-full-improvement-pass-on-note.md (8); simplification-passes/revise-an-article-or-note.md (71) |
kb/types/… |
maintain-curated-indexes.md (10, 61); analyse-agent-memory.md (23) |
kb/reference/… |
evaluate-log-entry-for-note-creation.md (32) |
| Ambiguous (project's collection or the library's) | review-gates/semantic/grounding-alignment.md (26–27); extract-adopted-part-of-a-proposal.md (22); refresh-a-proposal-current-state.md (19) |
Repo-internal and repo-local files with the same pattern are not listed; they only run in the source checkout. cp-skill-health-check (192) and cp-skill-ground (63–64) use such paths only in branches guarded for the source checkout, which is correct.
Fixed on 2026-09-25: the unambiguous paths became relative links from each instruction's own location, as ADR 086 did for promoted skills. Two worker-packet templates now ask for the absolute path resolved from the instruction's directory instead. The three ambiguous cases were left as they are, read as naming the project's own collections.
Legacy .venv / .envrc references
No instruction tells an agent to run commands through a project venv. What remains:
AGENTS.md.template:151andAGENTS.md:214prohibit prepending project-venv paths. Operative and correct.INSTALL.md:302and:312diagnose a venv shadowing the uv tool and describe removing the old two-line.envrc. Troubleshooting for migrated projects.cp-skill-health-check/SKILL.md:168–169detect residue. Line 168 runssed -n '1,80p' .envrc, which prints up to 80 lines of the file into the agent transcript. An.envrcmay hold secrets; the probe procedure forbids reading it for that reason. The health check needs only to know whether the file matches the old two-line signature, which can be tested without printing it. Fixed on 2026-09-25: the check now compares the file with the old template and prints only a classification, with a paired PowerShell form (see E1 item 5).
Inventory record
Each executable locus should receive one record with these fields:
| Field | Purpose |
|---|---|
locus_id |
Stable identifier derived from canonical path plus heading/role |
artifact_path |
Canonical source, not a generated projection |
consumer |
Agent, operator, hook, subprocess, or generated worker |
instruction_excerpt |
Minimal literal command or procedure under analysis |
tool_ids |
Every external executable or runtime facility required |
shell_constructs |
Pipes, redirects, command substitution, environment assignment, globbing, conditionals, quoting |
path_assumptions |
Separator, executable suffix, current directory, project-root discovery, library root versus workspace path |
availability_class |
Required prerequisite, package-owned, runtime-bundled, optional accelerator, or replaceable detail |
install_owner |
Commonplace install, project install, runtime, OS, or operator |
verification |
Exact bare-name/session probe and expected result |
fallback |
Explicit alternative or “none”; distinguish loud from silent degradation |
channels_verified |
Dated runtime/OS/shell observations with versions |
candidate_solutions |
References into the solution catalogue, without selecting one prematurely |
Every proposed probe also needs an implementability record before it enters the shared procedure:
| Field | Purpose |
|---|---|
target_environment |
Source checkout, initialized project, legacy copied-library project, reader/vendor install, package-only, remote/restricted, or other |
prerequisites |
Required shell facility, resolved executable, local fixture, readable path, write scope, launch action, or second prepared environment |
prerequisite_probe |
Observation that establishes each prerequisite without assuming the conclusion |
safe_when_absent |
Exact not run result when a prerequisite is missing or unknown |
mutation_scope |
Expected state changes; landscape probes should be read-only except for explicitly bounded process-local state |
layout_independence |
Whether the probe works outside this source checkout and how its targets are discovered |
No check joins the cross-environment procedure merely because it is useful in this repository. It must either be executable through facilities already known to exist in the target environment or be guarded by a preceding capability observation.
Runtime capability matrix schema
For every execution system, record:
- operating system and filesystem/path model;
- shell used for ordinary tool calls and for hooks;
- whether separate tool calls share a process, current directory, aliases, functions, and exported environment;
- how a runtime launched from a shell inherits environment, and whether a restart picks up a changed user
PATH; - whether desktop/IDE surfaces reuse a long-lived process across projects;
- session-start, resume, compact, and directory-change hooks;
- whether hooks can persist environment into later tool calls;
- project-local environment configuration and whether it can prepend to inherited
PATH; - whether the file-read tool and a shell process can read the library root outside the workspace;
- worktree creation/setup behavior;
- executable suffix and command lookup rules;
- bundled tools, with version and whether bundling is a documented contract;
- sandbox filesystem, network, process, and home/cache constraints.
Round 1 procedure feedback
This section records how the probe evolved from v3 to v6 under the project-venv model. Corrections 1, 7 and 8 and the direnv contrast describe a mechanism ADR 064 retired; the rest still apply to v7.
The retained Round 1 reports—Codex source checkout, Codex initialized project with an unallowed .envrc, and Claude Code source checkout—established ten corrections to the breadth probe:
- Record exact project-venv
PATHmembership separately fromVIRTUAL_ENV. The report observed project-venv command resolution withVIRTUAL_ENVunset; that is compatible with a stable baselinePATHsupplied independently to each fresh tool call. - Treat PID equality as inconclusive. Fresh isolated processes can reuse the same small PID, while the deliberately mutated environment variable and shell function directly test shell-state persistence.
- Scope Git status to one established fixture. Whole-worktree cleanliness is unrelated to command-channel capability and can produce large, privacy-sensitive, or distracting output.
- Treat the unchanged working directory as call context, not a persistence test. Round 1 does not mutate it, so only the deliberately mutated environment variable and function answer the same-shell question.
- Make every ordinary block self-contained. Once fresh-call behavior is a live possibility, a later block cannot reuse a shell variable assigned during layout discovery.
- Record baseline-provider evidence without dumping it. Marker values and
.envrccontents are unnecessary and may contain secrets. - Do not equate
.envrcor direnv-marker presence with authorization or loading. The initialized-project report had both while its.venv/binwas absent fromPATHand the bare Commonplace command failed. A conditional, redacteddirenv statuscheck must distinguish the workspace file being found, allowed, and loaded from state inherited from another directory. - Treat failed direnv authorization as decisive when the expected venv directory is absent from
PATH.Loaded RC pathmay still name the current file; that label alone does not show its exports were applied. - Record command kind without dumping definitions. Claude Code supplied
findas a runtime function shim, demonstrating that name resolution is not executable identity; alias targets and function bodies are unnecessary and potentially sensitive in a breadth report. - Keep shell-mutation persistence separate from launcher inheritance. Fresh tool shells rule out activating once inside a tool call, but an environment established before launching the runtime may still be inherited as the baseline of every fresh child; that requires a separate launch comparison.
These changes define procedure ID execution-channel-round1-v4-2026-07-28. The retained v4 reports supersede and replace their v3 runs.
V4 confirmation
The retained Claude Code v6 report reproduces the earlier v4 environment while classifying the runtime-supplied find name as a function without disclosing its definition. The Codex initialized-project v4 repeat reproduced command-discovery failure and correctly concluded that an unallowed .envrc had not prepared the environment despite a matching Loaded RC path label.
Together they form an allowed/unallowed direnv contrast:
| Environment | .envrc found |
allowed | loaded path names workspace | project venv on PATH |
bare Commonplace command |
|---|---|---|---|---|---|
| Claude Code source checkout | yes | yes | yes | yes | succeeds |
| Codex initialized project | yes | no | yes | no | fails |
This confirms v4's observation rules. Causal attribution remains weaker than the observed state: the positive report is consistent with direnv preparation but does not isolate hook execution from launcher inheritance. For solution comparison, directory-aware environment management is therefore catalogued separately from runtime-native project configuration.
V5 disclosure hardening
Reviewing the probe as a payload sent to collaborators exposed a retention risk independent of its final report rules: raw direnv status enters the tool transcript before an agent can summarize it, carrying allow hashes, watch metadata, and local paths. Procedure v5 captures that output inside the shell process and emits only workspace-match, authorization, and loaded-identity classifications.
V5 also makes disclosure review a completion condition. Reports normalize workspace/home/temp prefixes, inspect the final payload for credential and configuration material, withhold evidence that cannot be safely redacted, and append an explicit attestation. The review itself is tool-independent; an already available scanner may supplement it but cannot become a new prerequisite.
V6 persistence-output correction
The superseded Claude Code v5 run identified an internal inconsistency: the step-7 census used kind-only discovery, but the published POSIX persistence blocks still used type commonplace_shell_probe_function, which prints the function definition before the final disclosure review can remove it. The reporter safely substituted type -t, but that is Bash-specific and would make nominally comparable runs differ from the instruction.
Procedure v6 removes resolver output from the persistence test entirely. Call A invokes the controlled function and records its literal result; call B runs command -v with output discarded and records only a presence boolean. The persistence evidence is unchanged, works in a POSIX shell, and cannot retain the definition.
The retained Claude Code and Codex v6 reports both execute the published blocks without deviation, retain only the controlled result and presence boolean, and pass the disclosure review. Their option-4 wording about .envrc is provisional report interpretation: until a runtime-native project configuration mechanism is observed, directory-aware direnv evidence belongs to option 16.
V7 rebaseline (2026-09-25)
Procedure v7 follows ADR 064 and ADR 086. It drops the project-venv PATH signals and the direnv status check, and records .venv and .envrc as presence-only residue. It adds .commonplace/library.md and the legacy kb/commonplace/ copy to layout classification, a library-reachability step (read the routing file, the library root, and one skill stub), command authority against uv tool dir --bin, commonplace-init --check, and <UV_TOOLS>/<UV_TOOL_BIN> normalization. v6 reports stay valid for tool-call persistence, discovery and bare-name results.
Repeatable sweeps
The workshop should turn these exploratory searches into a checked script only after the inventory record stabilizes. Until then, retain the commands as investigation aids:
rg -l '\bcommonplace-[a-z0-9-]+' AGENTS.md AGENTS.md.template INSTALL.md kb/instructions --glob '*.md'
rg -l '(^|[^[:alnum:]_-])rg([^[:alnum:]_-]|$)' AGENTS.md AGENTS.md.template INSTALL.md kb/instructions --glob '*.md'
rg -n '^\s*```(bash|sh|powershell|batch|cmd|console|shell)' AGENTS.md AGENTS.md.template INSTALL.md kb/instructions --glob '*.md'
The eventual sweep must parse fenced blocks and declared command positions rather than relying only on regex. It must also inspect files linked as required execution references and reconcile commonplace-* names against the package entry-point registry.
Next inventory passes
- Classify every locus in the 12 shell-dependent non-promoted files with the inventory record above, and decide for each whether a package operation (catalogue option 9) or an
--output/stdin change on an existing command removes the shell. - Fix or route the ADR 086 path hazards listed above; confirm the three ambiguous cases.
- Trace required links from every canonical instruction so command-bearing references enter the graph.
- Verify the
rgcontract per runtime: installation source, version, command lookup, regex/flag compatibility, and sandbox behavior. - Repeat for Git, then for workflow-specific tools (curl, awk, Roughdraft).
- Extend the sweep to
textfences and inline code spans that carry commands, which the fence count misses.