docs(plans): the git probe's security contract, ahead of the code (DRC-4274) - #238
Conversation
…C-4274) DEC-3 (DRC-4122) puts the SECURITY.md amendment before any code, as DEC-1's and DEC-2's were. Drafting the section here keeps SECURITY.md describing only shipped behaviour: a standalone SECURITY.md PR would leave the file documenting a probe that does not exist for the whole window between the two merges, and releases here are cut from main by tag. Carries the intro-amendment section the quota precedent used. Scope's violation sentence enumerates file reads, harness-store writes and network destinations; this probe is subprocess execution, so without naming the sentence that changes the promoted section would land under a clause that does not reach it. DRC-4037 promotes the section into SECURITY.md unchanged and deletes this file. Signed-off-by: Jared Scott <jared.scott@variable.team>
The tone standard in the sync-docs skill bans em dashes in docs/plans/*.md, and both promotion precedents carry zero. Shape only: no fact added, removed or reworded. Signed-off-by: Jared Scott <jared.scott@variable.team>
Pre-PR review of the diff in the worktree. Four corrections: - The cadence bound said "session-ended edge" in prose. DRC-4037 has to hook an identifier, so the contract names `session_ended`. - The harness list behind the null rationale is dropped. The count and the reason carry the contract; six names would go stale in a SECURITY.md the moment an adapter lands. - "separates this read" contradicted the sentence establishing the mechanism as execution rather than a read. - The cwd rule sits later in SECURITY.md than this section will, so "already" claimed an order that will not hold. Signed-off-by: Jared Scott <jared.scott@variable.team>
The prior wording said six of ten harnesses can never emit `session_ended`. Literally true and misleading: only two mappings in event_hook.py produce `session_ended` (lines 82 and 200), CODEX_EVENTS carries no SessionEnd, codex-hooks.json registers none, and agy_hook.py emits only store_changed. Eight rows can never be probed, not four. A bare corrected count would go stale the moment an adapter gains SessionEnd, and this section is promoted into SECURITY.md unchanged, so state the property instead: the probe fires on `session_ended`, most harnesses do not emit it today, those rows carry `null`. Signed-off-by: Jared Scott <jared.scott@variable.team>
|
Correction round 1, head The removed wording ("Six of the ten harnesses have no event adapter and can never emit A corrected count would go stale the first time an adapter gains Verification on the new head: One stale figure in the body above, left deliberately: the surface line says 103 lines added. The reflow of that paragraph makes it 102. The correction was scoped to the one sentence and the body was out of scope for it. |
Implements DRC-4274 — Git probe groundwork · SECURITY.md scope section for the end-of-session git probe
Documentation only. One new file,
docs/plans/git-probe-security-scope.md, holding theSECURITY.mdsection for the end-of-session git probe verbatim, ahead of the code that implements it.DEC-3 (DRC-4122) puts the security amendment before any code, as DEC-1's and DEC-2's were. That shape keeps
SECURITY.mddescribing only shipped behaviour at every commit: a standaloneSECURITY.mdPR would leave the file documenting a probe that does not exist for the whole window between the two merges, and releases here are cut frommainby tag, so that window is real rather than theoretical. Both precedents were traced by commit at both ends — the plan doc added in its own PR (7134a01in #71,5ede7d1in #143), then promoted and deleted ina98bc64and3e92d12. DRC-4037 promotes this section intoSECURITY.mdunchanged and deletes the file.The section bounds the probe to exactly
git -c core.fsmonitor= --no-optional-locks status --porcelain, records that the mechanism is subprocess execution rather than a file open with both flags load-bearing, publishes{dirty: bool | None, changed: int | None}withnullmeaning not probed andchangedcounting porcelain entries rather than files, states what is never read, bounds the cadence tosession_ended, and specifies--no-gitreaching the daemon respawn path.It also carries an intro-amendment section, which the issue did not originally ask for.
Scope's violation sentence enumerates file reads, harness-store writes and network destinations; this probe is subprocess execution, so without naming the two sentences that change, the promoted section would land under a clause that does not reach it. The quota precedent handled exactly this the same way.Verification
Prose-only diff, so the documented short path in
AGENTS.md§ Pre-PR Checks applies:validate_plugins.pyis the check that matters. That was derived rather than assumed — the CIchangesjob builds its deny-list by grepping double-quoted"docs/*.md"literals out of the test tree, that list has exactly one entry today (docs/plans/event-driven-session-observation.md), and a file that does not yet exist cannot be in it. Expectcode=false, the five measurable jobsskipped, andvalidateplusversion-guardgreen.python3 scripts/validate_plugins.py— exit 0.docs/plans/git-probe-security-scope.mdin both; restoring the file returned exit 0.docs/plans/is reached through(ROOT / "docs").rglob("*.md")atscripts/validate_plugins.py:1209, a recursive glob rather than a path literal, which is why grepping the script for "plans" finds nothing.git diff $(git merge-base origin/main HEAD)..HEAD -- '*plugin.json' '*marketplace.json' '*gemini-extension.json' | grep -E '^[+-].*"version"'returns nothing.python3 scripts/bump_version.py --currentreports0.18.0.code=false.sync-docsinvoked. It was not a no-op: the tone standard bans em dashes indocs/plans/*.mdand both promotion precedents carry zero, while the first draft had four. Fixed in1e4114a, shape only.AGENTS.md's doc map already coversdocs/plans/*.mdas a glob, so no new row is owed. Thedocs-synced-throughmarker is deliberately left alone: sibling worktrees are live and that marker is stamped once frommainafter the merges.9d9059f): the cadence bound said "session-ended edge" in prose where DRC-4037 needs thesession_endedidentifier; a six-harness name list was dropped because it would go stale inside a verbatim-promotedSECURITY.md; "separates this read" contradicted the sentence establishing the mechanism as execution; and "already" claimed a document order that will not hold, since thecwdrule sits later inSECURITY.mdthan this section will.No test is written, and that is deliberate rather than an omission. AC1's falsifier is
scripts/validate_plugins.py, a shipped check demonstrated above failing on this file's own injected defects. A test that grepped this document for its own sentences would assert only that the file contains what we put in it.The full unittest suite was deliberately not run. It measures nothing a prose-only change can affect, and several sibling worktrees are live —
AGENTS.md§ Parallel Work records that concurrent suites here manufacture failures intest_http_api,test_page,test_lifecycleandtest_quotathat read as regressions.🤖 Generated with Claude Code