Skip to content

feat: ask whether a library item is private, and fold consult and ingest into the library page - #921

Merged
27 commits merged into
mainfrom
feat/verb-split-6-library-asks
Oct 11, 2026
Merged

27 commits merged into
mainfrom
feat/verb-split-6-library-asks

Conversation

@REPPL

@REPPL REPPL commented Oct 11, 2026

Copy link
Copy Markdown
Collaborator

Step 6 of spc-2610100613109045: the library asks whether an item is private, and the consult and ingest pages fold into the library page.

Stacked on #920 (step 5) and the steps below it. Until those merge, this diff shows their commits too.

  • The question: abcd library add with neither --private nor --public asks one drawn question at a terminal, naming both answers and what each means. It asks only when stdin, stdout and stderr are all terminals. Off a terminal it refuses with exit 2, names both flags and writes nothing. "Decide later" and Ctrl-C write nothing too. The question shows neither the key nor the title. An item is never recorded as public unless the person chose public.
  • The old flag: --confidential is gone, with no alias. The stored confidential/ folder and the custom.confidential field keep their names.
  • The page: commands/library.md tells the host to ask through its question tool unless the person already said, then to pass the answer as the flag. It now carries the consult and ingest workflows, step by step. commands/consult.md and commands/ingest.md are deleted, and abcd consult and abcd ingest get notes naming /abcd:library. The page says plainly that library add registers a document and library ingest registers nothing.
  • The brief: chapters 13 and 14 are folded into 07-library.md. The host-delegated paragraphs are rewritten, and every brief line naming /abcd:consult or /abcd:ingest is repointed. The release-gate manifest is rehashed. Four brief-review flags on the deleted ingest chapter were removed with it.

New tests, each watched fail first:

  • TestLibraryAddAsksTheClassAtATerminal, TestLibraryAddRefusesWithoutAClassOffATerminal, TestLibraryAddPrivateIsNotAsked, TestLibraryAddPublicIsNotAsked and TestConfidentialFlagIsUnknown;
  • the page test;
  • TestRetiredConsultAndIngestTokensNameTheLibrary and TestLibraryPageCarriesTheConsultAndIngestWork.

A security review tried every path to a public filing nobody chose. These included both flags, a config or environment default, the question's default option, end of input, a loose answer, --meta, and an old --confidential reader. None reaches one, and no confidential string leaks.

Refs: itd-2610090831227812
Refs: iss-2610110233253365

Assisted-by: Claude:claude-opus-5-5

REPPL added 23 commits October 11, 2026 02:28
abcd launch --dry-run now renders the cut the next launch ship would
make beside its bundle report: the derived version, the deciding
impact, the records, the guard and findings verdicts, in text under its
own line and in --json under a new cut key (cut_error when it cannot be
read). It is the same deterministic emit and render the changelog verb
used, with no prose and no agent. A refused cut is reported and changes
nothing about the dry run's exit.

The changelog verb goes with no alias (adr-40). abcd changelog is an
unknown command whose note names abcd launch --dry-run. Its placement,
sentence, parity note and DOGFOODING recall entry go with it, and its
tests move onto the preview: the tree-digest check, the refused cut
still exiting 0, the JSON, the page set, the uncommitted-records
refusal and the subdirectory read.

The dry run now reads the checkout root wherever it is run, as the cut
always has. Before, from a subdirectory it read the subdirectory as a
repository that declares no artefact kind and refused before reaching
the cut, which would have lost the subdirectory read the changelog verb
had. The dry run's own targeted lines are dropped when the cut is read,
because the cut lists the same intents and says which ones it moves.

The pages, the composer agent, the brief and the principle that named
the verb now name the preview. The launch chapter no longer says the
preview always exits 0 (a peer finding): a --baseline that names no
release tag exits 2, and an undeclared kind or a missing payload is
refused.

Step 3 of spc-2610100613109045.

Assisted-by: Claude:claude-opus-5-5
Refs: itd-2610090831227812

Assisted-by: Claude:claude-opus-5-5
…is-repo

prepare-this-repo folds into the ahoy page's install section in the next
commit, so its name leaves the two strings that send a reader to it.

The implement loop's brief refusal for a base with no AGENTS.md now names
/abcd:ahoy install, the plugin command whose preparation merges the
conventions into AGENTS.md. It names the plugin command, not the bare
binary call, because a default `abcd ahoy install` writes no AGENTS.md.
The repo lint's warning for docs/ with no .abcd/docs-lint.json now says
to run abcd ahoy install, the binary step that seeds that file.

Step 4 of spc-2610100613109045.

Assisted-by: Claude:claude-opus-5-5
The product thinker's placement of 2026-10-09 folds prepare-this-repo
into ahoy install (itd-2610090831227812, decision 6 of its spec). The
fold is page-only: the binary and its refusals do not change.

commands/ahoy.md's install section now carries the whole preparation
workflow around the binary call it already made: the ownership refusal,
the authority ordering, orient, audit, adopt, the working-conventions
block, the downstream rule and the definition of done. The account of
what the binary install does follows under its own heading. A
repository already prepared goes straight to the binary half.
commands/prepare-this-repo.md is deleted with no alias (adr-40).

prepare-this-repo leaves pagesWithNoVerb and record-lint's
host_delegated list. `abcd prepare-this-repo`, never a verb, is still an
unknown command; it moves to retiredTokens, whose note names
/abcd:ahoy install. The onboarding, tool-conventions-file, persona and
hooks-arming tests now read commands/ahoy.md; a new page test holds
each phase to the install section and the old page absent.

The brief folds 15-prepare-this-repo.md into a section of 01-ahoy.md,
drops register row 15 and the index entry, and repoints the host-
delegated paragraphs, 08-skills.md, 04-naming.md's exemption list,
16-lint.md (whose opening named the page as live), 08-abcd.md,
14-ingest.md and 19-identity.md. The release-gate manifest drops the
chapter and the page, with its checker count, prompt hash and the
receipt example rehashed. The two review flags on the deleted chapter
are removed: the sentences they named left with it. README and
commands/lint.md name /abcd:ahoy install. The bootstrap test that
refuses an unrunnable `ahoy install` in README no longer counts the
slash command, which the host runs and whose page resolves the binary
through the plugin root before PATH.

Step 4 of spc-2610100613109045.

Assisted-by: Claude:claude-opus-5-5
Two peer findings on 01-ahoy.md, folded in with step 4's change to that
chapter.

The chapter called `status` a plugin-page alias for the bare form. It is
not: commands/ahoy.md hands every word to the binary, which refuses
`status` like any other word it does not register, so `abcd ahoy status`
is an unknown command on both surfaces.

The user-scope tree, declared the one inventory, left out files the
shipped code reads or writes under the home folder: oracle-routing.json,
interviews/, cache-attestation and statusline.json, which the symlink
rule in 03-configuration.md already lists, and backups/, where the
status-line change keeps its copies of the harness settings file.

Step 4 of spc-2610100613109045.

Assisted-by: Claude:claude-opus-5-5
Step 3 repointed the composer's preview source at the launch preview's cut
without the prompt_version bump and agents changelog entry record-lint's
agent_contract rule requires. It also adds changelog to the brief's list
of names retired with no alias.

Refs: itd-2610090831227812

Assisted-by: Claude:claude-opus-5-5
…4-ahoy-install-conventions

# Conflicts:
#	.abcd/development/brief/04-surfaces/08-abcd.md
…kers

The shortcut straight to the binary's half keyed on the working-conventions
markers, which only the host-run preparation writes, so a repository
adopted through the binary install alone, abcd's own checkout among them,
would have been walked through the whole preparation again. The page now
starts from the detection pass: a managed repository goes to the binary's
half unless the person asks to prepare it, and an unmanaged one starts at
Phase 0. The brief's mirror sentence follows, and the spec's line on the
loop hint now says /abcd:ahoy install, matching what shipped.

Refs: itd-2610090831227812

Assisted-by: Claude:claude-opus-5-5
The product thinker's placement of 2026-10-09 merges the sources
commands into one person's command named library (itd-2610090831227812,
P4). This step carries the memory and source sub-trees; consult and
ingest fold into the library page in the next step.

abcd library is one top-level verb under Records (decision 1) carrying
both sub-trees, and every sub-verb keeps its name (decision 7): init,
add, declassify, ledger, sync-banlist and cite-check act on the sources
corpus, ingest, ask and lint on the checkout's memory store. The two
stores and their core packages stay unconnected (decision 10). Bare
library renders both stores, an unreadable one as a line naming what
would create it, and refuses only when neither reads (decision 8), so
bare library inside a checkout with no corpus renders where bare source
exited 3.

abcd memory and abcd source are unknown commands with no alias
(adr-40); retiredTokens names library for each. The guard's
abcd-source-ledger-flip entry matches library ledger --flip, so an agent
still cannot flip a citation line. Both pre-commit hook copies run
library sync-banlist. The corpus and memory strings a reader acts on,
the provenance a new memory page records, the sentence and example
manifests, the DOGFOODING recall list and the help table name library.

commands/library.md replaces memory.md and source.md; consult.md and
ingest.md are repointed at library, and guard.md, banlist.md and
update.md's network list name it. The brief folds 04-surfaces/07-memory.md
and 33-source.md into 07-library.md, with one register row, and the
index, help table, bare-invocation paragraph, product chapters, naming
exemptions and internals chapters follow. The release-gate manifest
swaps the two chapters for the one, rehashed with its receipt example.
The shipped itd-36's two links to the folded chapter point at
07-library.md so they resolve. The snapshot, CLI reference and chapter
appendix are regenerated.

Step 5 of spc-2610100613109045.

Assisted-by: Claude:claude-opus-5-5
A pre-commit guard committed before the sources verbs became library
runs `source sync-banlist --refresh`. A binary without that verb makes
the hook skip the refresh with one stderr line, so the confidential-name
block silently stops being refreshed (spc-2610100613109045, decision 13).

ahoy now reports an abcd-owned hook naming the old verb as the gap
banlist.hook_retired_verb, and ahoy install rewrites that spelling in
place, leaving every other line, the maintainer's own included. A hook
without abcd's marker is never edited.

Step 5 of spc-2610100613109045.

Assisted-by: Claude:claude-opus-5-5
Refs: iss-2610110233253365

Assisted-by: Claude:claude-opus-5-5
…lings

The hand-written region of a surface chapter states no sub-verb and no
flag, which live only in the generated appendix
(TestSurfaceChapterProseStatesNoShape). The folded library chapter named
both in its new paragraphs; they now describe the verbs in words.

Assisted-by: Claude:claude-opus-5-5
The flip refusal named only the library spelling, so an agent could flip
a citation line through any binary older than the library verb, which
still answers `abcd source ledger --flip` and is often reachable (the
plugin root's copy, an older build). A second entry refuses the retired
spelling with the same reason, watched fail first. The guard page names
both. The per-byte work bar grows with the registry, as its comment
says; the new entry takes the hostile shape to about 24.7, so the bar
moves from 24 to 28, still far below the hundred a dropped bound costs.

Refs: itd-2610090831227812

Assisted-by: Claude:claude-opus-5-5
abcd library add given neither --private nor --public now asks one
question at a terminal, naming both answers and what each means, and
proceeds with the answer; off a terminal (a pipe, CI, a host's shell) it
refuses with exit 2 naming the flags, and deciding later writes nothing.
The question is drawn by the same door the setup interview uses, and its
words and the answer-to-class resolution live in internal/core/source.

--private replaces --confidential, which goes with no alias under adr-40
and is refused as any unknown flag on a corpus verb is. The stored
folder confidential/ and the custom.confidential field keep their names.
The library page tells the agent to ask the person through the host's
question tool unless they already said, and to pass the answer as the
flag (spc-2610100613109045 step 6, A13, decision 9).

Assisted-by: Claude:claude-opus-5-5
The judgement halves of /abcd:consult and /abcd:ingest now live on
commands/library.md: searching the corpus, the hard rule's identifying
paraphrase layer, reading a document first, deciding its class and key,
the quality check and the close-out, and the fuller ledger guidance. Both
pages are deleted (itd-2610090831227812, P4), so every page but the board
backs a verb: pagesWithNoVerb holds the board alone and record-lint's
host_delegated list is empty.

The page says plainly that library add registers a document and that
library ingest registers nothing, distilling into memory pages instead,
and its memory section is retitled to match (iss-2610110233253365). abcd
consult and abcd ingest stay unknown commands with no alias (adr-40);
their retiredTokens notes name /abcd:library, and the ingest note names
library add as the registrar.

The brief folds 13-consult.md and 14-ingest.md into 07-library.md's new
consulting-and-registering section and its acceptance list, drops their
register rows and index entries, and rewrites the host-delegated and No
skills paragraphs of 04-surfaces/README.md and 05-internals/08-skills.md,
whose payload and page-to-verb claims now match the tree. Every other
brief line naming either page as live (01-ahoy.md, 20-banlist.md,
03-configuration.md, the ledger glossary entry) points at the library,
as do the script-first principle and the draft itd-2609292108089653. The
release-gate manifest drops the two chapters and names, rehashed with its
receipt example, and the four brief-review flags against 14-ingest.md go
with the chapter.

Step 6 of spc-2610100613109045.

Assisted-by: Claude:claude-opus-5-5
Refs: iss-2610110233253365
@REPPL
REPPL removed this pull request from the merge queue due to a manual request Oct 11, 2026
@REPPL
REPPL enabled auto-merge October 11, 2026 12:47
@REPPL
REPPL added this pull request to the merge queue Oct 11, 2026
@REPPL
REPPL removed this pull request from the merge queue due to a manual request Oct 11, 2026
@REPPL
REPPL added this pull request to the merge queue Oct 11, 2026
@REPPL
REPPL removed this pull request from the merge queue due to a manual request Oct 11, 2026
@github-merge-queue github-merge-queue Bot closed this pull request by merging all changes into main in 4700d60 Oct 11, 2026
@REPPL
REPPL deleted the feat/verb-split-6-library-asks branch October 13, 2026 04:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant