Skip to content

Verify Action

Static verification of acceptance criteria against the codebase. Greps for keywords from each unchecked AC and classifies it as likely realized, not_started, or unknown. No Claude spend, no token needed.

uses: canonhq/canon/actions/verify@v1

Inputs

NameRequiredDefaultDescription
sectionno""Filter to a single section ID (e.g. 2-oauth)
fail-onnoneverThreshold: error (any not_started), warning (any not_started or unknown), or never (informational)
python-versionno3.12
canon-versionno>=1.0.0,<2.0.0

Outputs

NameDescription
totalTotal unchecked ACs evaluated
likely-countACs with code evidence
not-started-countACs with no detectable evidence
unknown-countACs whose status couldn't be determined
report-pathAbsolute path to the JSON verify report on the runner

Example

yaml
name: Verify ACs
on:
  pull_request:
    branches: [main]

jobs:
  verify:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: canonhq/canon/actions/verify@v1
        with:
          fail-on: never

What it does

For every unchecked AC in every spec, canon verify:

  1. Extracts keywords from the AC text (filters stop-words, limits to 5)
  2. greps for each keyword in src/ and frontend/src/
  3. Marks the AC as:
    • likely if any keyword matches
    • not_started if no keywords match
    • unknown if no useful keywords could be extracted

This is a fast heuristic, not a guarantee. For high-confidence evaluation use canon audit once it ships.

Step summary

The action emits a Canon Verify summary with a count table and a per-AC breakdown showing status, source spec (file:line), section title, and AC text — so reviewers can jump straight to the spec location for any AC that didn't auto-detect.

Pitfalls

  • Heuristic-grade: AC text must contain words distinctive enough for grep. ACs phrased as pure prose (e.g. "the system handles errors gracefully") will reliably mark unknown.
  • Default fail-on: never: by design — verify is informational unless you opt in. Set fail-on: error if you want strict gating.
  • Doesn't see 'use cache' or other framework-specific symbols: the keyword extractor strips most punctuation. If your codebase relies on directives, write ACs that name function or class names.

AI-native enterprise documentation platform.