Skip to content

feat(catalog): model GitHub Code Quality as its own billing tier - #49

Merged
rldyourmnd merged 3 commits into
mainfrom
feat/code-quality-tier
Jul 31, 2026
Merged

feat(catalog): model GitHub Code Quality as its own billing tier#49
rldyourmnd merged 3 commits into
mainfrom
feat/code-quality-tier

Conversation

@rldyourmnd

Copy link
Copy Markdown
Contributor

Summary

GitHub Code Quality existed in this repo only as the product-fact
github-code-quality-transition — priced in the ledger, absent from the
capability catalog and from every tier doc. This models it properly: catalog
entry github-code-quality plus a tier doc, docs/16-code-quality.md.

It is deliberately not folded into the public tier. Re-verification against
the billing docs on 2026-08-01 established that repository visibility does not
gate the licence: a public repo is billed the same per-active-committer rate as
a private one, and being public only removes the Actions-minutes component.
That contradicted docs/01-public-oss-free.md, which promised the "entire
security and supply-chain suite for free" — false for anyone who enabled Code
Quality on a public repo.

Two further facts are recorded because they invert the usual cost-control
instinct: committers are counted once per organization (so a "few paid
repos, many free repos" split saves nothing unless the committer sets differ),
and the licence is independent of Code Security / Secret Protection.

The capability carries workflow: null / example: null — the honest shape,
not a gap: Code Quality has no Action, no workflow_call entrypoint, and no
REST or GraphQL API, so enablement is UI-only and cannot be pinned by SHA,
asserted, or drift-checked from CI. The merge gate (ruleset rule "Require code
quality results", severity threshold, check CodeQL - Code Quality) is
documented as a UI procedure and not encoded in .github/rulesets/,
because those specs are shaped for POST /repos/{owner}/{repo}/rulesets and
this rule's type identifier is undocumented.

Type of change

  • New reusable workflow / capability
  • Fix to an existing workflow
  • Pinned tool/action version bump
  • Hardening / security posture improvement
  • Docs only

Threat-model note (required for workflow / permission changes)

N/A — docs only. No workflow file, token scope, egress path, or action
reference is touched; git diff --name-only covers AGENTS.md, README.md,
CHANGELOG.md, catalog/, and docs/ only.

Permissions diff (required for workflow / permission changes)

N/A — docs only. No job permissions: block changes.

Checklist

  • All third-party actions pinned to a full 40-char commit SHA with a
    # vX.Y.Z version comment (no tags/branches). — unchanged; pinned-actions OK
  • Least-privilege permissions (top-level {}, per-job minimal scopes). — unchanged; permissions OK
  • concurrency and timeout-minutes present on new/changed workflows/jobs. — no workflows changed
  • persist-credentials: false on all read-only actions/checkout steps. — unchanged
  • No ${{ inputs.* }} / ${{ github.event.* }} interpolated inside run:. — unchanged
  • Paid public/GHAS actions absent from private-free/cross-tier files. — unchanged; harden-runner-contract OK
  • actionlint passes locally. — not run: binary not installed in this environment. No workflow YAML changed, so it has nothing new to lint; workflow-contracts and actionlint-contract both pass in validate_all.py.
  • zizmor --pedantic passes locally. — not run: binary not installed in this environment. Same rationale: .github/workflows/ is byte-identical to main.
  • README capability table and docs/ / catalog/ updated.
  • CHANGELOG.md updated under [Unreleased].
  • Commits are signed (-S) and signed off (-s, DCO); Conventional Commit
    messages. — DCO sign-off and Conventional Commit: yes. Cryptographic -S signature: NO — no signing key is configured in this environment. The required_signatures rule on main will reject this as-is; the maintainer must re-sign (git commit --amend -S) before merge.

Tier impact

  • Public (free OSS suite) — corrects a false "everything is free" claim
  • Private free tier (zero-cost only) — Code Quality added to the excluded-because-paid table
  • Private paid tier (GHAS / harden-runner features) — records that GHAS does not include this licence

Verification

python3 scripts/validate_all.py18/18 OK (pinned-actions, tool-pinning,
permissions, workflow-contracts, harden-runner-contract, release-supply-chain,
monorepo-routing, benchmark-contract, actionlint-contract, examples, docs-links,
merge-group, rulesets, catalog, product-facts, runtime-coverage, skills,
generated-docs). docs/generated/* regenerated via scripts/generate_docs.py.

Code Quality existed only as the product-fact github-code-quality-transition:
priced in the ledger, absent from the capability catalog and every tier doc.

Re-verification against the billing docs on 2026-08-01 established that
repository visibility does not gate the licence — a public repository is
billed the same per-active-committer rate as a private one, and being public
only removes the Actions-minutes component. That contradicted the
docs/01-public-oss-free.md promise of the entire suite for free.

The three-tier model sorts by visibility and plan; this product obeys
neither, so it is documented as an orthogonal fourth tier and excluded from
both free tiers, which name their free maintainability substitutes instead.

Also records that committers are counted once per organization (so a
few-paid-repos split saves nothing unless committer sets differ) and that the
licence is independent of Code Security and Secret Protection.

The capability carries workflow: null and example: null because Code Quality
has no Action, no workflow_call entrypoint, and no REST or GraphQL API:
enablement is UI-only and cannot be pinned, asserted, or drift-checked from
CI. The merge gate is documented as a UI procedure for the same reason.

Signed-off-by: rldyourmnd <danil@nddev.it.com>
The tier docs reasoned from GitHub's price list, so a private NDDev repo was
configured as if it were on the free plan while the organization already paid
for Enterprise Cloud, Code Security, Secret Protection, and Code Quality.

Concrete loss this closes: 02-private-free routes private releases to
release-supply-chain-free.yml because Artifact Attestations require Enterprise
Cloud on private repos. This estate has Enterprise Cloud, so all 26 private
repositories were emitting slsa_build_level: null and discarding provenance
that was already bought.

Records that these products bill per active committer counted once per
organization, so with one committer the estate pays the same whether one
repository or fifty are enabled.

States absences too: Copilot Autofix unavailable (zero seats assigned), and
sha_pinning_required is false at both org and enterprise -- flagged rather than
recommended, since enabling it org-wide would break tag-pinned repositories.

Signed-off-by: rldyourmnd <danil@nddev.it.com>
…plit

Push protection was disabled across the estate as a velocity trade-off, so the
tier doc no longer claims it. States the consequence plainly: detection is now
after the fact, and a secret-scanning alert means an already-leaked credential.

Also records why code scanning is enabled per repository rather than by the
configuration: attachment is atomic, so forcing default setup where an active
CodeQL advanced setup exists fails the whole attachment and takes secret
scanning with it. Coverage is 50/50 -- 30 default setup, 20 own workflow.

Signed-off-by: rldyourmnd <danil@nddev.it.com>
@rldyourmnd
rldyourmnd merged commit 33bf27f into main Jul 31, 2026
10 checks passed
@rldyourmnd
rldyourmnd deleted the feat/code-quality-tier branch July 31, 2026 23:56
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