Skip to main content

Checklist

The items a repository must pass to follow the Lupinum OSS standard, which items are only advice, and how the audit reports them.

A library follows the Lupinum OSS standard when every must item that applies to it passes. Must items guard security and releases. Advice items keep a repository pleasant to work in; the audit shows them as warnings, and they never decide the answer.

The audit answers with yes or no. "Open" lists the must items that block; "Warnings" lists what deserves a look, with advice marked: "Open: GH-05 (fail), NPM-01 (manual)" and "Warnings: GH-07, FILE-08 (advice)".

A repository that publishes nothing to npm, such as this one, skips the items marked library. A library without a docs/ folder skips the items marked docs: docs are optional, but a library that has them follows Write library docs.

How items are checked

  • auto: the audit checks it every time. Run the audit; record nothing.
  • manual: only the maintainer can do it, in their npm account. Record the date and a short note in fleet/libraries.json:

    json
    {
      "repository": "lupinum-dev/nuxt-tour",
      "evidence": {
        "NPM-01": "2026-10-03 — trusted publisher release.yml (environment npm, publish); 2FA required, tokens disallowed"
      }
    }

    NPM-01 is the only item with evidence. Remove it when it no longer holds.

  • agent: an agent looks at it during a review. It is advice; the audit does not report it and nothing is recorded.

Check a repository

From a lupinum-oss checkout:

bash
pnpm audit:repos OWNER/REPO           # every item, with GitHub and npm
node scripts/audit.mjs --local DIR    # file items only, before the first push

The audit lists each item with PASS, WARN or FAIL and ends with "Follows the standard: yes" or "no". An advice item can only reach WARN.

An agent that answers "does this library follow the standard?" runs the audit and reports yes or no and the open must items grouped by who acts: "I can do now", "needs the maintainer". Advice goes in one line at the end. It does not paste the checklist.

Exceptions

A repository may differ from a check only with a decision line in its internals/decisions.md that names the item and the check in parentheses and says why, for example D4 (2026-10-01): Keep upstream-drift.yml (FILE-01: upstream-drift.yml) — it catches breaking pdfkit releases weekly. The audit prints the name of every check in square brackets, for example [lean]; copy it from there. The exception covers that one check, and the other checks of the item still count. An item with only one check may be named alone, for example (GH-08).

Items marked no exception cannot be excepted, because they guard a real attack path.

Files

Checked by node scripts/audit.mjs --local DIR and by pnpm audit:repos.

IDItemLevelCheck
FILE-01The workflows are ci.yml, release.yml and preview.yml from the starter (library), or only ci.yml. Another workflow has an exception.mustauto
FILE-02ci.yml has a final job named ci with if: always() that needs every other job. CI runs lint, typecheck, test, build and the dependency audit (node scripts/audit-deps.mjs in a library, pnpm audit --audit-level=high otherwise).mustauto
FILE-03Every action is pinned to a full commit SHA. Workflows default to read-only permissions, and no job that can push, open pull requests or start workflows runs repository or dependency code. No exception.mustauto
FILE-04No npm token in a workflow or .npmrc. Publishing uses npm trusted publishing (see FILE-10). No exception.mustauto
FILE-05library: Changesets is configured and pnpm lint runs the changeset lint.mustauto
FILE-06packageManager pins pnpm 11 or later. minimumReleaseAge is at least 1440 with minimumReleaseAgeStrict: true; dangerouslyAllowAllBuilds is not set. @lupinum/* may be excluded; any other exclusion is one exact version with a removal date (warns). No exception.mustauto
FILE-07.github/renovate.json sets minimumReleaseAge. There is no dependabot.yml.adviceauto
FILE-08The repository layout, the issue and pull request templates (library), no MAINTAINING.md or governance tooling, and the tooling budget.adviceauto
FILE-09package.json has the scripts build, lint, typecheck, test, verify and (library) changeset. pnpm verify runs what CI runs.adviceauto
FILE-10library: the release machinery is the starter's. release.yml matches the starter exactly, apart from the commits actions are pinned to (no exception); this is what keeps publishing safe. scripts/release.mjs matches too, unless an exception names it. A difference in preview.yml, lint-changesets.mjs, audit-deps.mjs or (docs) agent-docs.mjs warns. Fix these files in the starter first, then copy them.mustauto

GitHub settings

Checked by pnpm audit:repos through gh api.

IDItemLevelCheck
GH-01The main ruleset requires a pull request with resolved review threads, linear history, and the check ci from GitHub Actions; it blocks force pushes and deletion and has no bypass actors. Auto-merge is off. No exception.mustauto
GH-02library: a tag ruleset on all tags blocks moving and deleting them, with no bypass actors. No exception.mustauto
GH-03Merges are squash only and branches are deleted after merge.adviceauto
GH-04The Actions token is read-only by default. library: Actions may create pull requests.mustauto
GH-05library: the npm environment has a required reviewer, administrators cannot bypass it, and only main can deploy. No exception.mustauto
GH-06Secret scanning with push protection, private vulnerability reporting, Dependabot alerts and CodeQL default setup are on. Dependabot security updates are off.mustauto
GH-07The repository has no Actions secrets.mustauto
GH-08Renovate runs: its Dependency Dashboard issue is open and was updated in the last 14 days.adviceauto

npm

library only. Checked by pnpm audit:repos against GitHub and the npm registry.

IDItemLevelCheck
NPM-01Every package has the trusted publisher release.yml with environment npm, requires two-factor authentication and disallows tokens under Publishing access.mustmanual
NPM-02The versions on latest and next carry npm provenance. Only a package's first version, published by hand, may lack it (warns).mustauto
NPM-03The newest published version of every package has its Git tag and GitHub release.mustauto
NPM-04Nothing waits too long: no Version packages pull request older than 14 days, and next is not behind latest.adviceauto

Docs

docs only: these items apply when the repository has a docs/ folder.

IDItemLevelCheck
DOC-01The docs site is built with @lupinum/ginko-docs and answers on the homepage domain from the root package.json, deployed by Vercel's Git integration.mustauto
DOC-02/llms.txt lists the pages, and the agent Markdown contains no placeholder for a live example or component.mustauto
DOC-03library: every public package exports ./agent-docs, ships it through files, and its own README has the Agent setup section.mustauto
DOC-04The sections follow Write library docs: Start and Reference, plus Guides and Help when there is content for them, in that order.adviceauto
DOC-05library: every public export, prop and option has a doc comment with its meaning and default. Every error a user can hit names the fix.adviceagent

Maintenance

Checked by pnpm audit:repos.

IDItemLevelCheck
OPS-01The repository is listed in fleet/libraries.json.mustauto
OPS-02The last ci run on main succeeded, and (library) the last completed release run on main did not fail.mustauto
OPS-03Open Dependabot alerts of high or critical severity. CI decides what blocks (Dependencies).adviceauto
OPS-04No branch other than main is older than 30 days without an open pull request.adviceauto
OPS-05No open pull request is older than 14 days without activity.adviceauto