Close the P3 Audit-Depth Gaps: G4 G5 G7 - #692
Merged
Merged
Conversation
G4 splits by what a pattern can reach: a dead-path prose_lint rule ships for mentions of paths git once tracked and the tree no longer holds, and the name-shaped class stays the manual RESYNC section 4 read. G5 ships the intent-staleness advisory in spec/audit.py, a last-modified comparison at DRIFT, with the blind spot stated in the prose authorities. G7 closes accepted, recorded in STANDUP.md section 0B. The rule's first run caught docs/host-setup.md describing the deleted devcontainer definitions, fixed by re-pointing at the catalog snippets.
Contributor
There was a problem hiding this comment.
Pull request overview
This PR closes the remaining P3 audit-depth register gaps (G4, G5, G7) by adding deterministic tooling where feasible (dead-path prose lint; intent staleness advisory) and updating the governing docs/register to reflect the recorded dispositions.
Changes:
- Add a new
dead-pathprose-lint rule (enabled by default and in CI) that flags Markdown mentions of previously git-tracked paths that no longer exist, with an explicit stand-down in shallow clones. - Add an
intent-fidelity “staleness” advisory tospec/audit.pybased on last-modified comparisons between hub canonicals and downstream copies (DRIFT-only). - Update fleet docs/register and related guidance (RESYNC/AUDIT/STANDUP/host-setup) to reflect the closure and link the new mechanisms.
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| STANDUP.md | Records the G7 disposition directly in the operational-branch protection warning; adds a link reference to the register. |
| spec/fidelity-model.md | Updates the intent fidelity definition to include the new drift-only staleness advisory description. |
| spec/audit.py | Implements hub canonical last-change caching and an intent-staleness advisory check in the audit runner. |
| scripts/test_prose_lint.py | Adds TestDeadPath coverage for deletion-signature detection, shallow stand-down behavior, and repo-clean assertion. |
| scripts/prose_lint.py | Introduces the dead-path rule, adds it to defaults, wires it into scanning, and announces shallow-stand-down behavior. |
| RESYNC.md | Updates the deletion-sweep guidance to reference the new dead-path mechanized check and clarifies intent limitations/advisory. |
| docs/host-setup.md | Repoints Windows devcontainer bind-mount guidance from deleted .devcontainer/ files to catalog/snippets/devcontainer/. |
| docs/fleet-map.md | Updates mermaid flows and the gap register rows to mark G4/G5/G7 (and the stale G11 phase cell) as closed with details. |
| AUDIT.md | Documents the new intent staleness advisory as part of the mechanized deterministic subset. |
| .github/workflows/validate-task.yml | Fetches full history for CI (required for dead-path detection) and enables the dead-path check in prose linting. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Uh oh!
There was an error while loading. Please reload this page.
ptr727 added a commit
that referenced
this pull request
Aug 14, 2026
Closes out the actionable half of the fleet-map P4 roadmap item on STE structural checks. ## What - **`sentence-length` rule in `scripts/prose_lint.py`**: flags a Markdown prose sentence over 25 words, ASD-STE100's descriptive cap. Opt-in like `sentence-split` (not in `DEFAULT_RULES`, not in CI), because the rule counts 1686 over-cap sentences in the corpus at landing, so a default gate would fail whole files nobody is editing. A table row, a heading, a link definition, and a blockquote are exempt, an inline code span and a double-quoted quotation each count as one word. Eight new cases in `scripts/test_prose_lint.py`, including one pinning the opt-in status. - **Decision recording**, per the fleet-map hook that the decision lands when the first structural check ships: a `Sentence Structure` subsection in GOVERNANCE.md `Documentation Style Conventions`, the full house-style rules in the `comment-and-doc-style` skill (plugin regenerated), and a `Decision` paragraph plus P4 row edit in `docs/fleet-map.md` per the maintenance rule. - **OPERATIONS.md staleness fix**: the runbook's mirrored prose gate omitted `--check dead-path` after #692 added it to CI, and its rule counts predated the rule. Both now match CI, and the opt-in note names both unlinted rules. ## Why opt-in The corpus measures 26 percent of sentences over 20 words and 1686 over the 25-word cap, so the house style is adopted for new prose while the check stays reachable by name and by `--diff` scoping. Promotion into `DEFAULT_RULES` or CI is a separate decision, taken if and when the corpus converges. The changed lines of this PR lint clean under the new rule. ## Verification - `python3 scripts/test_prose_lint.py` (243 tests), `test_repo_gate.py`, `test_pr_review.py`, `test_build_dist.py`, `spec/audit.py --selftest`, `gh-write-guard.py --selftest`: all pass - `repo_gate.py`, `build_dist.py --check`, the CI prose gate including `dead-path`, `charset-unknown` summary (0 findings), `spec/validate.py`, `jq` sweep, `markdownlint-cli2` on the changed files: all clean - `ruff` at latest adds no new finding over develop's pre-existing nine, `mypy` passes - Line endings byte-verified, CRLF Markdown and LF Python unchanged Generated with [Claude Code](https://claude.com/claude-code)
ptr727 added a commit
that referenced
this pull request
Aug 15, 2026
…Python CI Gates (#718) Thirty-one squashes, `56f4d7d..d54862a`. 115 files, +20436/-5298. **Merge with a merge commit, never a squash, and never with `--delete-branch`.** This pull request's head is `develop` itself. ## What lands **Fleet Skills.** The `.agents/skills/` source tree, the generated `.claude-plugin/` distribution, `scripts/build_dist.py` with its `--check` gate, and `scripts/skills_install.py` with its host stamp (#676). Packaged as skills on top of the scaffold: PR review conduct and Copilot instructions upkeep (#677), comment and doc style (#678), resync-a-repo and fleet-conformance-check (#679), the per-language codestyles (#680), git commit conventions and operational vs release workflow (#681), stand up a repo (#683), and repo-worktree (#717). Coverage gaps closed in three passes (#690, #691, #692) plus the P4 sentence-length opt-in (#697). **Host setup.** The Windows host-setup tooling and its PowerShell gate (#674), the Windows bootstrap loader (#682), Docker install and upgrade on Linux and Windows with a version floor (#701, #705), a `uv` floor in `spec/host-tools.json` (#698), self-healing of a shadowing `uv`, `jq`, or `git-restore-mtime` copy (#689), node's real winget package id (#696), and a README for the Linux host-setup nuances (#710). **Python and CI.** Python tooling in CI with the script tests moved to `scripts/tests` (#704), `ruff format` adopted and gated (#709), and the PSScriptAnalyzer claim conditioned on repos that carry `.ps1` files (#686). **Conduct rules.** Triage-order and scope guardrails in pr-review-conduct (#684), `pr_review.py wait` requesting a review rather than only polling for one (#685), a tech-agnostic signed-commit verification (#708), execution rather than analogy to verify platform-specific code (#715), and a unique worktree for every task (#717). **Docs.** The fleet map and gap register with peer messaging declared (#687), mermaid flow diagrams in the kept-authority docs (#702), and the map pointed at the shipped diagrams and current tooling (#703). ## Issues this promotion closes Each landed on `develop` on its own pull request. The keyword fires only on a merge into `main`, so it sits here rather than on the feature pull requests. Closes#700Closes#707Closes#711Closes#712Closes#714Closes#688#699 stays open on purpose: #717 shipped the layout convention and the skill, and the physical migration of existing checkouts is still tracked there. ## Review record Every squash closed its own Copilot loop on its own pull request before merging to `develop`. This promotion carries no new content of its own, so its review is the merged tree as a whole. ## Consequence worth stating The `GOVERNANCE.md` and `AGENTS.md` sections these squashes changed become the canonical the moment this reaches `main`, and every carrying repository reads as drifted from that point until it resyncs. That is the ordinary consequence of a canonical moving rather than a defect. The Skills installer added here is also how a machine picks the new skills up, so a session that keeps restating a rule already packaged as a skill is the signal to run it.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes the three P3 audit-depth register rows in
docs/fleet-map.md, each per the maintainer's recorded disposition.G4: deletion sweeps miss prose
Split by what a pattern can reach. The named-path half is mechanized: a
dead-pathrule inscripts/prose_lint.pyreports a Markdown mention (backtick span, inline link target, or reference definition) of a path git once tracked and the tree no longer holds. Keying on deletion history is what scopes it: proposed files a backlog names, another repository's layout, and refs likeorigin/develophave no history here and stay silent, and manifest-declared carried paths are exempt since the hub's own instances retire to catalog snippets. The rule joins the default set and the CI prose step, the CI checkout fetches full history (fetch-depth: 0) because the rule stands down loudly in a shallow clone rather than pass blind. The name-shaped half (a description naming no path) stays the manual RESYNC section 4 read,acceptedas manual: no pattern reaches it.The rule's first tree-wide run caught a real instance:
docs/host-setup.mdstill described bind-mounts in the deleted.devcontainer/definitions, fixed here by re-pointing atcatalog/snippets/devcontainer/.G5: intent-fidelity drift is invisible
The advisory ships in
spec/audit.py: per applicable intent unit, the audit compares when the hub canonical and the repo copy each last changed, and a canonical changing later reports the copy as possibly trailing, at DRIFT and never failing. A copy content-identical to the canonical is skipped (current, and thefidelity_honesty.pypromotion candidate). No reconciliation record exists anywhere, so last-modified is the implementable proxy, and the blind spot (a copy touched without reconciling reads current) is stated in RESYNC section 5, AUDIT.md, andspec/fidelity-model.mdrather than papered over. Verified read-only against a fleet repo: carried intent files reported as trailing hub changes made weeks earlier, findings no prior check produced.G7: operational develop PR-only is prose-enforced
Closed
accepted, mirroring thespec/divergences.jsonvocabulary, recorded in STANDUP.md section 0B beside its uneven-protection warning. The allowance is the operational model's foundation per WORKFLOW.md "Branch Model", and the considered standup-time tightening (apply the release payload, swap after the closing audit) was declined: it adds a forgettable swap step and a window where the live ruleset contradicts the registry's declared model.Also retires the stale G11 phase cell (
P0->closed), which trailed its own closure, per the register's maintenance rule.Verification
scripts/test_*.pysuites pass, including the newTestDeadPath(deletion signature, shallow stand-down, manifest exemption, tree-clean assertion).prose_lint.pyfull default sweep clean withdead-pathenabled,charset-unknownclean,build_dist.py --checkcurrent.fleet-map.mdmermaid blocks parse.