Skip to content

Runbook

At the end you will know what CI does, how to manage secrets, how a release happens, and the day-to-day commands. Design and specs live in openspec/; coding conventions in AGENTS.md.

Workflows

Workflow Trigger Manual run
Graphify Knowledge Graph push to main (code/spec paths), weekly, manual gh workflow run graphify.yml
Build & publish (GHCR image) push to main, v* tags, PRs gh workflow run build-and-publish.yml
Release (semantic version) push to main (conventional commits), manual gh workflow run release.yml
Docs site (GitHub Pages) push to main touching docs/** or mkdocs.yml, manual gh workflow run docs.yml
gh run list --limit 5          # recent runs
gh run watch                   # follow the latest

GitHub secrets and variables from the command line

Secret values are write-only on GitHub — set them from your local .env:

# one key, value pulled from .env
gh secret set OPENAI_API_KEY -b "$(grep '^OPENAI_API_KEY=' .env | cut -d= -f2-)"

# any other key the same way
gh secret set <NAME> -b "$(grep '^<NAME>=' .env | cut -d= -f2-)"

# Actions variables (non-secret)
gh variable set OPENAI_MODEL -b "gpt-5-mini"

# inspect what's configured
gh secret list && gh variable list

Run these from the repo folder (-R senthilsweb/agent-job-matcher if not).

Releases

Versions are computed from Conventional Commits on main: fix: → patch, feat: → minor, BREAKING CHANGE: footer → major. Anything else (docs:, chore:, spec updates) releases nothing. The bot bumps backend/pyproject.toml, tags v<X.Y.Z>, creates the GitHub Release (with the generated openapi.json/openapi.yaml attached), and the tag re-publishes the Docker image with semver tags.

Docker operations

docker compose up -d api                 # backend only, on :6010
docker compose up -d                     # full demo stack, :6010–:6014
docker compose run --rm cli version      # CLI through the same image
# or raw:
docker pull ghcr.io/senthilsweb/agent-job-matcher:latest
docker run --rm --env-file .env ghcr.io/senthilsweb/agent-job-matcher:latest --help

One-time after the first publish: make the GHCR package public — GitHub → Packages → agent-job-matcher → Package settings → Change visibility.

Tests

pip install -e "backend[dev]"
pytest backend -m "not live"    # offline: scoring, guards, schemas, API — no key needed
pytest backend -m live          # real-model sweep: grounding, injection, fan-out — needs .env

Fixtures are committed real-world captures (four JD snapshots, two genuine JavaScript-shell fetch failures, one adversarial prompt-injection JD) plus a synthetic resume — reproducible after the postings close. The rubric: backend/evals/rubrics.md.

Knowledge graph, locally

pip install graphifyy==0.4.23
graphify update .                        # graphify-out/: graph.json, graph.html, GRAPH_REPORT.md
python scripts/graphify-index.py graphify-out/graph.json graphify-out/graph-index.json .
open graphify-out/graph.html             # interactive viewer

CI does the same on every push and commits the results to the repo root (graph.json, graph-index.json, graph.html, GRAPH_REPORT.md, graph-manifest.json) — never edit those by hand. Add [skip graphify] to a commit message to skip.

Next: FAQ.