Skip to content

Derive what the root holds, rather than listing it in the security policy [#332] - #333

Merged
iderex merged 1 commit into
mainfrom
the-inventory-names-what-the-tree-holds-332
Sep 16, 2026
Merged

iderex merged 1 commit into
mainfrom
the-inventory-names-what-the-tree-holds-332

Conversation

@iderex

@iderex iderex commented Sep 16, 2026

Copy link
Copy Markdown
Contributor

The issue this belongs to

Closes #332

What changed

The inventory under "What this repository is" no longer lists the root file by file. It names the kinds a reporter needs - the crate, the suite, the decision records and the index that lists them, the gate-parity document, the workflows and the shell scripts they run, the templates beside them, and the register under security/ - and hands the reader the command that returns what the root itself holds.

The paragraph directly under it, which already says of itself that the inventory is a list and that a list drifts, gains the account of this instance rather than having it written over.

What failure it prevents

A failure that has already happened. The inventory named one licence while two texts stand, named neither the code of conduct nor the register under security/, and never named CONTRIBUTING.md:

git ls-tree --name-only origin/main | grep -v -E '^(src|tests|docs|\.github)$'
.editorconfig
.gitattributes
.gitignore
CODE_OF_CONDUCT.md
CONTRIBUTING.md
Cargo.lock
Cargo.toml
DCO
LICENSE-APACHE
LICENSE-MIT
NOTICE.md
README.md
SECURITY.md
rust-toolchain.toml
rustfmt.toml
security

Three of those arrived after the inventory was written, and none of the three opened it:

git log origin/main --format='%h %ad %s' --date=short -1 -S'a README, two issue templates' -- SECURITY.md
c6d3694 2026-08-26 Make the security policy read the tree it describes (#200) (#203)

git log origin/main --diff-filter=A --format='%h %ad' --date=short \
  -- LICENSE-APACHE CODE_OF_CONDUCT.md security/statements.json
89b9102 2026-09-05
a9dfdca 2026-09-04
2939128 2026-09-02

CONTRIBUTING.md is the other case and it is not drift. It was in the tree before that sentence was written and the sentence never named it, so nothing made that omission arrive; the derived line repairs it by construction.

What it cost is the purpose of the paragraph, whose own first line tells a reporter to read the tree before deciding what to look for. An item missing from it is a surface a reporter does not know is there. The register under security/ is the one that matters most for that: it is where a scanner exclusion and a dismissed finding are stated publicly rather than suppressed quietly, so a wrong entry in it is a class nothing looks at with nothing saying so, and the list gave no sign a register of that kind exists.

It was found by reading the inventory against the tree while working the board, not by anything reporting it.

Evidence

Read at the commit being pushed, d6bb826.

The two checks on this board that read this file, or the register it now names:

bash .github/doc-paths/doc-paths.sh check | tail -1
Every path these documents name resolves against the tracked set.

bash .github/doc-paths/doc-paths.sh check | grep 'named path(s)'
ok    78 document(s), 363 named path(s) resolved, 0 excused as examples

bash .github/statements/statements.sh check | tail -1
Every directive this repository excludes has a published statement saying why, and what is consequently not looked for.

The paths this change touches, against the Scope: line #332 declares:

git diff --name-only origin/main...HEAD
SECURITY.md

The means is Markdown prose in a file that is already Markdown prose, and no artefact is built here. The change edits one paragraph and adds one below it, in the form this document already uses for its earlier corrections; it adds no language, no runtime and no dependency, and the path check that already reads every name this document writes is what judges it.

What this does not cover

  • No mechanism. Nothing compares this file's description of the tree against the tree. .github/doc-paths/doc-paths.sh refuses a name a document writes that resolves to no file, which is the opposite direction: it never asks whether a file went unnamed. A derived line stops this paragraph going stale in this particular way and refuses nothing.
  • The rest of SECURITY.md. I read this paragraph and the two derivations under it against the tree, and audited the remainder of the file no further. The security policy understates the pull-request-triggered permission surface in three places #324 closed on this file earlier today on a different paragraph.
  • .editorconfig, .gitignore and rustfmt.toml. The derived command returns them and the sentence names no one of them. Whether a security policy's map owes a formatter setting and an ignore list is a judgement about what a reporter needs, and the change makes it unnecessary to take rather than taking it.
  • The past-tense correction blocks already in this file. They record what was read and when, they were right when they were written, and moving them would rewrite what happened rather than repair what is claimed.
  • No guard added, and the suite was not run. This change adds and edits no check, no test and no guard, so no bite is owed and none is shown. It touches no source, so cargo build --locked --all-targets and cargo test --locked were not run at this commit; the two check runs above are the whole of what was measured here.

Who has read it

Nobody other than the author. There is one person on this account and no second reader was available, so the evidence above stands in place of a review rather than the question being left open.

…licy [#332]

The inventory a reporter reads to decide what to look for named one licence while
two texts stand, named neither the code of conduct nor the register under
security/, and never named CONTRIBUTING.md:

    git ls-tree --name-only origin/main | grep -v -E '^(src|tests|docs|\.github)$'
    .editorconfig
    .gitattributes
    .gitignore
    CODE_OF_CONDUCT.md
    CONTRIBUTING.md
    Cargo.lock
    Cargo.toml
    DCO
    LICENSE-APACHE
    LICENSE-MIT
    NOTICE.md
    README.md
    SECURITY.md
    rust-toolchain.toml
    rustfmt.toml
    security

Three of those arrived after the inventory was written and none of the three
opened it:

    git log origin/main --format='%h %ad %s' --date=short -1 -S'a README, two issue templates' -- SECURITY.md
    c6d3694 2026-08-26 Make the security policy read the tree it describes (#200) (#203)

    git log origin/main --diff-filter=A --format='%h %ad' --date=short \
      -- LICENSE-APACHE CODE_OF_CONDUCT.md security/statements.json
    89b9102 2026-09-05
    a9dfdca 2026-09-04
    2939128 2026-09-02

CONTRIBUTING.md is the other case and it is not drift: it was here before that
sentence was written and the sentence never named it.

What it cost is the purpose of the paragraph. Its own first line tells a reporter
to read the tree before deciding what to look for, so an item missing from it is a
surface a reporter does not know is there. The register under security/ is the one
that matters: it is where a scanner exclusion and a dismissed finding are stated
publicly rather than suppressed quietly, so a wrong entry in it is a class nothing
looks at with nothing saying so, and the list gave no sign a register of that kind
exists. The licence half is smaller and clearer - README.md and the notice both say
two texts stand and either suffices, and this file said the licence.

So the file-by-file tail is derived rather than extended. The kinds a reporter
needs are kept and named: the crate, the suite, the decision records and the
index, the gate-parity document, the workflows and the shell scripts they run, the
templates, and the register. What the root itself holds is handed to the reader as
the command above, which is what the two paragraphs under "What somebody could
actually report" already do for the workflows and the shell scripts, and what the
paragraph directly under the inventory already did for the count.

That paragraph is why this is not a second enumeration. It says of itself that the
inventory is a list, that a list drifts, and that this is what happened. It
drifted three more times in the eleven days after it landed, so the account of
this instance is added under it rather than replacing what is there.

It was found by reading the inventory against the tree while working the board,
not by anything reporting it.

    bash .github/doc-paths/doc-paths.sh check | tail -1
    Every path these documents name resolves against the tracked set.

    bash .github/statements/statements.sh check | tail -1
    Every directive this repository excludes has a published statement saying why, and what is consequently not looked for.

What this does not prevent: nothing compares this file's description of the tree
against the tree. The path check refuses a name with no file, which is the
opposite direction, and it never asks whether a file went unnamed.

Closes #332

Signed-off-by: Nils Lehnen <30603423+iderex@users.noreply.github.com>
@iderex
iderex merged commit 77d33c8 into main Sep 16, 2026
28 checks passed
@iderex
iderex deleted the the-inventory-names-what-the-tree-holds-332 branch September 16, 2026 17:02
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.

The security policy's inventory names one licence, and omits the code of conduct and the scanner-statement register

1 participant