Public assessmentsMethodology

How Canon assesses a repository

Canon reads a repository the way any visitor can, pins the result to the commit it read, and publishes every control it evaluated — including the ones it could not judge. This page states the whole method: the 132 controls, the score formula, the alternative mechanisms Canon accepts as evidence, and what a public reader is never able to see.

How the score is calculated

Every control ends in one of four outcomes. Only the first two are scored.

Confirmed
Canon read the evidence and the practice is in place. Counts in the numerator and the denominator.
Gap
Canon read the location and the evidence is absent. Counts in the denominator only.
Not applicable
The control does not apply to this repository — no database, no containers, no deployment. Excluded entirely.
Not assessable
The evidence needs access a public reader never has, or a read failed. Reported, never counted against the repository.
score = confirmed ÷ (confirmed + gaps) × 100
  • The denominator contains only controls that are both applicable and assessable from what Canon could read. A repository is never penalised for a setting it did not choose to hide.
  • A partially met control counts as half a confirmation.
  • Optional practices are reported but never scored — a repository that chooses not to adopt one has not failed a control. Currently optional: SC-09.
  • Each result is pinned to the commit it was assessed at, so two scores are only comparable against the commits they name.

What a public reader can and cannot see

Of the 132 controls, 76 are answerable from files and metadata anyone can read. The remaining 56 depend on settings only a repository administrator can retrieve. On these public pages those controls are marked not assessable and left out of the score — not marked as failures.

Read from public evidence

The file tree at the assessed commit, workflow definitions, community health files in the repository root, .github/ or docs/, review-routing files, and the public rulesets endpoint, which reports whether a ruleset covers the default branch and how many approvals it requires.

Requires administration access

Branch-protection detail, code and secret scanning configuration, Actions permissions, environment reviewers, and organization membership. Connecting your own repository to Canon answers these as well; a public assessment cannot.

Equivalent mechanisms

A control asks whether a practice exists, not whether it is implemented the way GitHub documents it. Canon accepts these alternatives as evidence of the same control.

The control asks forAlso accepted
CODEOWNERS routing review to named ownersPer-directory OWNERS files and Prow/TIDE review automation, including the approvers and reviewers they name
A protected default branchA repository ruleset covering the default branch, read from the public rulesets endpoint, as well as classic branch protection
A human approval gateA required-approvals count declared by a public ruleset, where no administration snapshot is available
Community health filesThe repository root, .github/, .gitlab/ and docs/, matched case-insensitively — LICENSE, LICENCE and COPYING are the same control
A pinned toolchain version.nvmrc, .node-version, .tool-versions, .python-version, runtime.txt, rust-toolchain, .ruby-version or go.mod
A named tool — linter, scanner, error trackerAny tool of the same class configured in the repository or called from a workflow; the control is the practice, not the vendor

The control list (132)

Grouped into the eight areas the heatmap and every case study use.

Governance

12 controls

Repository governance

IDControlSeverityRead from
CG-03Default branch protected by rulesetcriticalRepository administration
CG-05Pull-request requirement on default branchcriticalRepository administration
CG-01Default branch identifiedhighPublic files
CG-04Force-push restrictedhighRepository administration
CG-06Administrator bypass restrictedhighRepository administration
CG-09Tag protectionhighRepository administration
CG-02Branch strategy observablemediumPublic files
CG-07GitHub App bypass inventorymediumRepository administration
CG-08Signed commits requiredmediumRepository administration
CG-10Branch deletion protectedmediumRepository administration
CG-11Linear history or documented merge methodlowRepository administration
CG-12Visibility and ownership recordedlowPublic files

Review

26 controls

Change intake, pull requests and ownership

IDControlSeverityRead from
PR-01Required reviewscriticalRepository administration
OW-03Production approvers namedcriticalEnvironments
IN-04CODEOWNERS or review assignmenthighPublic files
PR-02CODEOWNERS reviews requiredhighRepository administration
PR-03Stale reviews dismissedhighRepository administration
PR-04Last-push approval requiredhighRepository administration
PR-10Self-merge restrictedhighRepository administration
OW-01CODEOWNERS or OWNERS filehighPublic files
OW-02Owners resolve to principalshighOrganization members
OW-04Bypass actors justifiedhighRepository administration
IN-01Work arrives through a tracked pathmediumPublic files
IN-02PR template presentmediumPublic files
IN-06Security policymediumPublic files
PR-05Conversation resolution requiredmediumRepository administration
PR-06Review history inspectablemediumRepository administration
PR-09Merge queue or serialized mergemediumRepository administration
OW-05Team review pathmediumOrganization members
OW-07On-call or incident ownermediumPublic files
OW-08Secret custodiansmediumRepository administration
IN-03Issue templates presentlowPublic files
IN-05Contributing guidelowPublic files
IN-07License declaredlowPublic files
IN-08Support or contact pathlowPublic files
PR-07Linked issue or ticketlowPublic files
PR-08Draft PR workflow documentedlowPublic files
OW-06Maintainer rosterlowPublic files

CI & tests

30 controls

CI architecture, build reproducibility, testing

IDControlSeverityRead from
CI-01Workflows existcriticalPublic files
CI-03Required checks match workflow namescriticalRepository administration
TS-01Unit test commandcriticalPublic files
TS-02Tests run in CIcriticalPublic files
CI-02PR workflow triggerhighPublic files
CI-04Workflow permissions least-privilegehighActions settings
CI-07Reusable workflows or action pinshighPublic files
CI-10Required status checks stricthighRepository administration
BL-01Lockfile presenthighPublic files
BL-04Build command definedhighPublic files
TS-05Required check includes testshighRepository administration
CI-05Actions run history readablemediumActions settings
CI-06Check runs readablemediumActions settings
CI-09Separate CI from deploymediumPublic files
CI-11Workflow not skippable by path ignore on critical filesmediumPublic files
BL-02Pinned runtimemediumPublic files
BL-03Deterministic install commandmediumPublic files
BL-06Container build definitionmediumPublic files
BL-08Provenance or attestationsmediumActions settings
TS-03Typecheck commandmediumPublic files
TS-04E2E or integration testsmediumPublic files
TS-08Contract or API testsmediumPublic files
TS-09Migration testsmediumPublic files
TS-10Preview validationmediumPublic files
CI-08Concurrency cancellationlowPublic files
CI-12Manual workflow_dispatch documentedlowPublic files
BL-05No unchecked generated artifactslowPublic files
BL-07Cache keyed and scopedlowPublic files
TS-06Flaky-test policylowPublic files
TS-07Coverage gatelowPublic files

Code quality

8 controls

Code quality

IDControlSeverityRead from
CQ-01Lint commandmediumPublic files
CQ-02Lint runs in CImediumPublic files
CQ-04Required lint checkmediumRepository administration
CQ-05Static analysis beyond lintmediumSecurity settings
CQ-08Dependency review on PRsmediumSecurity settings
CQ-03Formatter agreedlowPublic files
CQ-06Secret patterns in lintlowPublic files
CQ-07EditorConfig or language stylelowPublic files

Security

20 controls

Application security and software supply chain

IDControlSeverityRead from
AS-01Code scanning configuredhighSecurity settings
AS-02Push protection enabledhighSecurity settings
AS-03Dependabot alertshighSecurity settings
AS-04Secret scanning alertshighSecurity settings
AS-07Default workflow token read-onlyhighActions settings
AS-09Environment secrets not in repo fileshighPublic files
AS-10SAST required on default branchhighRepository administration
SC-01Dependency lockfilehighPublic files
SC-02Actions from trusted sourceshighRepository administration
SC-03Action SHA pinshighPublic files
AS-05Security policymediumPublic files
AS-08Fork PR secrets isolatedmediumActions settings
SC-04Package provenancemediumPublic files
SC-05SBOM or dependency graphmediumSecurity settings
SC-06No mutable tags for release artifactsmediumRepository administration
SC-07Artifact attestationmediumActions settings
SC-10Review of high-risk dependency changesmediumPublic files
AS-06Private vulnerability reportinglowRepository administration
SC-08Private package registry authlowPublic files
SC-09Dependabot version updatesOptional — not scoredlowPublic files

Agents & AI

8 controls

AI and agentic development

IDControlSeverityRead from
AI-03Human gate before mergecriticalRepository administration
AI-02Agent write paths constrainedhighPublic files
AI-05Prompt or tool secrets not in repohighPublic files
AI-06Agent workflow permissionshighPublic files
AI-01Agent artifacts detectedmediumPublic files
AI-04Agent identity in commitsmediumBeyond a public snapshot
AI-07Audit of agent actionsmediumActions settings
AI-08Fallback when agent failsmediumPublic files

Release & ops

22 controls

Deployment, databases and observability

IDControlSeverityRead from
DP-02Production protectioncriticalEnvironments
DP-03Production reviewers resolvedcriticalEnvironments
DB-03No unattended prod migrationcriticalEnvironments
DP-01Environments definedhighEnvironments
DP-04OIDC instead of long-lived keyshighActions settings
DP-10Environment secrets scopedhighRepository administration
DB-01Migration files existhighPublic files
DB-02Migrations reviewedhighPublic files
DP-05Deployment history readablemediumEnvironments
DP-07Preview distinct from productionmediumPublic files
DP-08Rollback pathmediumPublic files
DP-09Release workflow separatemediumPublic files
DB-04Backup or restore notemediumPublic files
DB-05Schema change testsmediumPublic files
OB-01Health check or statusmediumPublic files
OB-04On-call runbookmediumPublic files
OB-06Audit of privileged actionsmediumRepository administration
DP-06Wait timer or freeze windowlowEnvironments
DB-06Expand/contract documentedlowPublic files
OB-02Logging approach documentedlowPublic files
OB-03Error tracking referencedlowPublic files
OB-05Release annotationslowPublic files

Docs

6 controls

Documentation

IDControlSeverityRead from
DC-01README presentmediumPublic files
DC-04Threat or trust notes for agentsmediumPublic files
DC-02Architecture or system noteslowPublic files
DC-03Local development instructionslowPublic files
DC-05Changelog or release noteslowPublic files
DC-06Inspect notes capturedlowPublic files

Run this on your own repository

Connect a repository and Canon runs the same 132 controls, plus the 56 that need administration access. Your results stay private to your organization.