Dentolize · Jira/Confluence QA Pipeline Walkthrough
On this pageTermsData model — the contractsWhere each thing livesRelated workflows (context, not changed by this PR)See also

Glossary & Data Model

Terms, and the "data model" of this feature — which, since it's a CI workflow, means the contracts between the workflow, the off-repo agent, GitHub, and Atlassian.

Terms

Phase — one of prepare, test, retest, fix. The single dispatch input action (.github/workflows/sandbox-qa.yml:33-42). Replaces the old review/plan/test/fix/full-auto actions.

QA gate — a deliberate pause between phases where a human edits the Jira epic or comments on tickets, and the next phase treats those edits/comments as the plan/instructions. See The Human QA Gates.

Sandbox — the per-branch live copy of Dentolize at https://<branch>.sandbox.anastawfik.com, deployed by sandbox.yml. The environment the test/retest phases drive with Playwright.

Rich seedSEED_MODE=rich: the sandbox is populated with a demo clinic (patients, invoices, insurance, payments) and a roster of role-based logins, so test cases have realistic data. From sandbox-info.env.

Roster — the seeded users (owner, doctor1/2, receptionist1, accountant1, hrmanager1), all sharing one password. A Story's role/preconditions decide which one the agent logs in as.

Epic — the Jira epic [PR #N Quality Review] in the QA project; the QA team's workspace. Holds one Story per test case.

Story — a Jira ticket for one test case: role, preconditions, repro steps, expected result. PASS → Done; FAIL → In Progress + failed label.

Bug ticket — a Jira ticket the test phase files for a confirmed problem that wasn't covered by any Story.

Confluence page[PR #N] <title> — Quality Review in the Docs space: the readable review plus a "living" results table.

[skip ci] — the marker on fix commits that prevents sandbox.yml from auto-redeploying; the fix phase redeploys the sandbox itself (single-slot runner). Header :19-26.

Foreground run — the agent runs inline in the job (no --detach), so job success means results are published. Contrast sandbox.yml:66, which detaches the docs agent.

Homelab runner — the self-hosted GitHub Actions runner (runs-on: [self-hosted, homelab, dentolize], :55) where these jobs and the sandbox CLI execute.

Data model — the contracts

This feature has no database. Its "schema" is a set of I/O contracts.

Contract A — dispatch input (GitHub → workflow)

action ∈ { prepare, test, retest, fix }   # default: prepare

.github/workflows/sandbox-qa.yml:33-42.

Contract B — agent outputs (sandbox-qa → workflow)

The binary writes KEY=VALUE lines to $GITHUB_OUTPUT (:64). Consumed keys:

KeyTypeConsumed atMeaning
QA_STATE_DIRpath:67, :117, :121Agent working dir; gates both post-steps; artifact source
QA_SLUGstring:120Filesystem-safe branch slug for the artifact name
JIRA_EPIC_URLurl:76, :95Optional link in the PR comment
CONFLUENCE_URLurl:77, :96Optional link in the PR comment
QA_SUMMARYpath:78-80, :101File whose contents append to the PR comment

Every key is null-guarded; the workflow degrades gracefully if any are absent.

Contract C — PR summary comment (workflow → GitHub)

Idempotent upsert keyed by the hidden marker <!-- sandbox-qa-report --> (:88, :104-114). Exactly one such comment per PR, rewritten each phase. Body shape at :88-102.

Contract D — the QA workspace (agent → Atlassian)

The epic, Stories, Bug tickets, transitions, screenshots, and Confluence page. Not implemented in this repo — produced by qa-agent/atlassian-qa.py and /opt/homelab/sandbox/bin/sandbox-qa. The workflow only links to the epic/page via Contract B. See the honesty notes in Workflow Internals.

Where each thing lives

ThingLocationIn this repo?
Dispatch + comment + artifact glue.github/workflows/sandbox-qa.yml✅ Yes (the whole diff)
Sandbox deploy/teardown.github/workflows/sandbox.yml✅ Yes (unchanged)
Sandbox ops (reseed, redeploy, update-docs).github/workflows/sandbox-ops.yml✅ Yes (unchanged)
The QA agent runner/opt/homelab/sandbox/bin/sandbox-qa❌ No — homelab
Jira/Confluence integrationqa-agent/atlassian-qa.py❌ No — homelab
The sandbox CLI/opt/homelab/sandbox/bin/sandbox❌ No — homelab
  • sandbox.yml — deploys a sandbox on PR open/sync, destroys on close; also kicks off the detached branch-docs agent on PR open (sandbox.yml:58-66).
  • sandbox-ops.yml — manual reseed, reset-data, redeploy, destroy, update-docs on a branch's sandbox.

See also