Skip to content

fix(advisories): a Maven-only project is not ready; the Brief names what it did not check (W5a) - #987

Merged
runyourempire merged 2 commits into
mainfrom
fix/w5a-not-covered
Oct 18, 2026
Merged

runyourempire merged 2 commits into
mainfrom
fix/w5a-not-covered

Conversation

@runyourempire

Copy link
Copy Markdown
Collaborator

What

These are the two W5a follow-ups to #974 (E4, not-covered), as agreed with recovery-lead.

1. A Maven-only project is no longer "ready"

osv::sync::auditable_ecosystems, which only readiness calls, now counts an ecosystem only when at least one auditable row carries an installed version.

  • Why: the manifest scanner registers pom.xml and build.gradle dependencies with no version, and fix(advisories): unversioned matches are never grounded; uncovered ecosystems say so (audit A2/E4) #974 never matches a versionless dependency. Those rows still made "Maven" a required ecosystem, its sync succeeded, and readiness said Ready for a project in which nothing was checked.
  • Maven-only: it now reads NoInventory, and fix(advisories): unversioned matches are never grounded; uncovered ecosystems say so (audit A2/E4) #974's not_covered names its pom.xml.
  • npm + Maven: Ready for npm, with the Maven files named, not counted as covered.
  • Unchanged:
    • The scanner keeps those rows for ACE context: detected tech, detected_projects and the context inventory.
    • The sync and the matcher are untouched (auditable_packages_by_ecosystem).
  • Live DB (read-only): all 593 project_dependencies rows (manifest-sourced) have no version, and all 5,013 versioned rows are lockfile-backed npm/Rust in user_dependencies. The operator's own readiness does not change.

2. The Brief names what it did not check

BriefFacts carries #974's not-covered report, which is used three ways:

  • Deterministic brief: the all-clear becomes "Nothing new touches the code 4DA checked today." It is followed by "Not checked: N dependency files 4DA does not read installed versions from: spring-petclinic/pom.xml (Maven), …". Up to three files are named, then "and N more". Unreadable lockfiles get their own sentence with the reason. The line is shown whenever any file was not covered, not only beside an all-clear.
  • Narrated brief: honest_without_lockfiles rewrites the model's "Nothing new touches your code" the same way and appends the line. Running it twice changes nothing.
  • Prompt: it starts with "NOT EVERYTHING WAS CHECKED: …". It tells the model the facts are authoritative for the files read only, and that any all-clear must say "the code 4DA checked". The old line claimed the facts were "authoritative and complete for security and upgrades".

Checks

  • cargo clippy --locked -- -D warnings: clean.
  • osv::, brief, briefing, digest, morning_ and evidence::: 789 passed.
  • New tests:
    • a Maven-only project gives NoInventory with its pom.xml named;
    • npm + Maven gives Ready for npm with the Maven files named;
    • the scoped all-clear plus the not-checked line;
    • "and N more" and unreadable lockfiles;
    • a narrated all-clear is rewritten idempotently;
    • the prompt says not everything was checked;
    • with everything read, the brief is unchanged.
  • Data verified by DB query (above). A visual check of the Brief text is pending the next operator-app run; I did not start the app.

🤖 Generated with Claude Code

https://claude.ai/code/session_015KSXWNneouUjTiVV3Rc3FH

runyourempire and others added 2 commits October 18, 2026 22:27
… what it did not check (W5a, follow-ups to #974)

- Readiness counts an ecosystem only when an auditable row carries an
  installed version. The manifest scanner registers pom.xml / build.gradle
  dependencies with no version, a versionless dependency is never matched
  (#974), and those rows made "Maven" a required ecosystem: its sync
  succeeded and readiness said Ready for a project nothing was checked in.
  Now a Maven-only project reads NoInventory with its pom.xml named, and an
  npm + Maven machine reads Ready for npm with the Maven files named. The
  scanner keeps those rows for ACE context; the sync is unchanged. (Live
  DB: every versioned row is lockfile-backed npm/Rust, so the operator's
  readiness does not change.)
- BriefFacts carries #974's not-covered report. The deterministic brief's
  all-clear reads "Nothing new touches the code 4DA checked today." and a
  "Not checked: ..." line names the files 4DA does not read and the
  lockfiles it could not read (three named, then "and N more"). A narrated
  brief's all-clear is rewritten the same way (idempotent), and the prompt
  tells the model the facts are complete only for the files read.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015KSXWNneouUjTiVV3Rc3FH
…every branch; NoInventory says no installed versions were read; cold start is not "nothing to check"

- B1: honest_without_lockfiles and the prompt's advisory-gap branch name
  the not-covered files too. A Maven-only project is NoInventory, so it
  took the gap branch and the narrated brief never named its pom.xml.
- B2: NoInventory now says what it means: 4DA read no installed versions
  (a manifest without a lockfile, or a format it does not read such as
  Maven or Gradle). "No ecosystem it can check" was false: OSV covers
  Maven, and a package.json with no lockfile is npm. Rust and all 13
  locales (preemption.advisories.uncovered.*, firstRun.advisory.uncovered).
- S3: cold start. Before the first lockfile walk reports, every manifest
  row is versionless; readiness reads NotStarted / Syncing, not
  NoInventory (auditable_coverage tells "not read yet" from "nothing
  checkable").
- S4: the brief reuse fingerprint carries the not-covered and unreadable
  counts.
- S5: scoping the all-clear replaces the phrase, so bullets and second
  sentences survive.
- name_list helper for the two named lists.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015KSXWNneouUjTiVV3Rc3FH
@runyourempire
runyourempire added this pull request to the merge queue Oct 18, 2026
Merged via the queue into main with commit c88feb2 Oct 18, 2026
25 checks passed
@runyourempire
runyourempire deleted the fix/w5a-not-covered branch October 18, 2026 13:04
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