docs(domain): glossary + ADR for cancelling superseded CI runs #10
No reviewers
Labels
No labels
needs-info
needs-triage
ready-for-agent
ready-for-human
wontfix
needs-info
needs-triage
ready-for-agent
ready-for-human
review/merge-ready
review/needs-fix
review/needs-human
review/needs-review
wayfinder:grilling
wayfinder:map
wayfinder:prototype
wayfinder:research
wayfinder:task
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
olympus/infra-tracker!10
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "docs/testing-domain-model"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Starts the repository's domain model from the vocabulary the closed wayfinder tickets already share, and records the one decision that reverses a locked preference. Docs only — nothing executable changes.
The ADR records a decision taken while resolving INFRATRACK-7 (the workflow's decision-level shape): a superseding push now cancels the in-progress run rather than stacking.
Evidence
Before: the map's Notes carried a standing preference, "CI runs are not cancelled on a superseding push; they stack", contradicted by the INFRATRACK-7 resolution.
After: the map Notes is struck through and amended, and
docs/adr/0001-cancel-superseded-ci-runs.mdstates the reversal, the rejected alternatives (stack / queue-behind), and the consequence (a cancelled run may strand its throwaway Guest — Forgejo v15 skipsif: always()on manual cancel).Before: no
GLOSSARY.md, nodocs/adr/.After:
GLOSSARY.mddefines the terms the tickets use — Guest, Service, Edge, Prod, Target, Suite, Converge, Assert, Idempotence, Seam, Inventory, Per-run identity, Ephemeral environment, Static checks — each with what it is and the words to avoid.No executable behaviour changes;
git diff main...docs/testing-domain-modelis 2 files, 104 insertions, 0 deletions. (No test run is meaningful for a docs-only diff.)Merge Danger
Door: two-way — revert the commit, or drop the two files;
mainis untouched until merge.Blast Radius: none to running infrastructure; this is documentation. The one thing to review is that the ADR's consequence — a cancelled run can strand its Guest with no automatic cleanup — is stated the way you want it recorded, since that is the standing trade-off you accepted on INFRATRACK-7.
Code review — two axes (Standards / Spec)
Fixed point
main(8ccc327) →44462e5. Diff: 2 files added, 104 insertions, 0 deletions. Spec source: INFRATRACK-7 resolution (with the INFRATRACK-2 map Notes as context). Both axes agree the PR is the right slice and faithfully captures the core decision.Standards — documented repo standards + smell baseline
GLOSSARY.md — implementation details leak (hard).
domain-modeling/SKILL.md: the glossary must be "totally devoid of implementation details… a glossary and nothing else", andGLOSSARY-FORMAT.mdrestricts terms to those "specific to this project's context." Several definitions state what it's built from, not the meaning: Guest ("unprivileged Debian 13 LXC… Proxmox cluster"), Service ("binary, config, systemd unit, PostgreSQL"), Edge ("Nginx Proxy Manager… proxy host"), Inventory ("ansible_connection,ansible_host"), Per-run identity ("The vmid, hostname and address"), Static checks ("fmt,validate").General programming concepts (hard).
GLOSSARY-FORMAT.md: "General programming concepts… don't belong." Idempotence (textbook CS), Static checks (tooling), Seam (Feathers' legacy-code term), Inventory (generic Ansible) fail the uniqueness test.Rule/decision content smuggled in (hard). Prod ("state is never touched by a test run"), Apply gate ("attention gate, not an authorisation boundary"), Seam ("Nothing else branches on the Target"), Suite ("parameterised only by its Inventory") state behaviour/guarantees, not identity.
Avoid coverage: all 15 terms carry one — compliant. Structure (judgement):
## Testingsits as a peer of## Languagerather than a subheading under it. Verb terms Converge/Assert defined by behaviour, straining "what it IS, not what it does".ADR 0001 — fails its own bar (hard).
ADR-FORMAT.mdrequires hard to reverse to offer an ADR; the ADR concedes "a one-line reversal if the lost signal proves worse," so criterion 1 is unmet by its own text. "Status: accepted" is a bare line, but the format lists Status as frontmatter. Opening paragraph runs ~5 sentences vs the "1-3 sentences" template. Considered Options / Consequences are justified (both non-obvious).Baseline smells (judgement). Duplicated Code: GLOSSARY's context line duplicates README's opening (single-source-of-truth). Deviating name: title "Infra Tracker" vs repo
infra-tracker. Negation-as-instruction recurs ("no containerisation", "Never Prod", "never the test", "not an authorisation boundary").Spec — fidelity to INFRATRACK-7
Wrong / divergent
if: always()on a manual cancel". Spec is unqualified: "a cancel kills the job mid-run and (known v15 bug) skipsif: always(), so a cancelled run may strand its LXC". Since the point ofcancel-in-progress: trueis that superseding pushes cancel runs, the scoped claim is stronger than the source and could mislead the flip-to-revisit decision._Avoid_: verify — reserved for the external WAN check (make verify), but the spec's assert step isverify.yml. The glossary reserves the pipeline's own name for the assert step.Missing / partial
workflow_dispatch(and the "naming the two dropsreopened" nuance): spec "plusworkflow_dispatchas the manual re-run lever".Scope creep — ADR's "Considered:" section isn't in the ticket; standard ADR form, harmless.
Coverage: clean — all fifteen named terms defined, none missing, no speculative vocabulary. Flag match exact: "
cancel-in-progress: truewith nogroup".Recommendation: do not merge yet — one small fix first.
This is a docs-only, two-way-door PR with no blast radius, so this is not a hold on safety — it's a hold on accuracy of a durable decision record. The ADR is the artifact people will read to understand a deliberate reversal, and the one line that could genuinely mislead is the "on a manual cancel" narrowing: it implies superseded-push cancels (the whole reason the flag exists) are safe when INFRATRACK-7 records the risk against any cancel. That is a one-sentence edit.
Suggested before merge:
workflow_dispatchto the trigger, and the "no reaper (Q6 withdrawn)" provenance.make verifynaming tension; make Idempotence the 2nd/3rd-converge claim.After (1) — ideally (2) — this is a merge for me; the glossary tidy can be a follow-up. Nothing executable changes, so
mainis untouched until merge.Addressed in
ac4279a. Per item:Must-fix
ADR "on a manual cancel" narrowing — you're right, and it was a substantive error.
cancel-in-progress: trueis a cancel, so the very case the flag exists for is the one I'd implied was safe. Confirmed against Forgejo's own docs and the v15 bug:always()"executes even when cancelled", and the v15 defect is that a cancelled workflow skips it anyway — so the strand risk attaches to any cancel, manual or superseding. Reworded to "on a cancelled workflow … for any cancel, not only a manual one", and the why we flipped clause now spells out "multiple throwaway Guests never coexist" (your missing-outcome point).Should-fix
workflow_dispatchand the "drops the defaultreopened" nuance.verify.ymlis the Assert play, and Avoid warns offverify(which collides with bothverify.ymlandmake verify) rather than reserving the name.Nice-to-have (taken, not deferred)
The glossary violations were breaches of the repo's own documented standard (
domain-modeling), so I fixed them in this PR rather than leave them:ansible_connection, vmid, tool lists).## Testingis now a### Testingsubheading under## Language; layer terms grouped under### Layers.infra-tracker, not "Infra Tracker").Deliberately kept (with reasons — push back if you disagree): Seam and Inventory stay, because this project uses "Seam" in its own decided sense (the one local/CI variation point — INFRATRACK-3/6) and Inventory names that carrier; they're project jargon, not the generic terms. Static checks stays too — "the floor" is the project's named concept (INFRATRACK-7), and the general-concept rule I read as targeting incidental vocabulary like "timeout", not named decisions.
Not changed: the ADR is one-way to the decision it records, but I left the "reverses a preference" framing as-is since that's the honest shape and you flagged the criterion, not the framing. One question back: if a one-line-flag reversal genuinely fails the ADR bar, the alternative home for it is a line in the map's Notes (already amended) — do you want the file dropped entirely, or kept as a pointer?
Re-review — two axes (Standards / Spec) @
ac4279aFixed point
main(8ccc327) →ac4279a(was44462e5). Diff: 2 files, 98 insertions, 0 deletions. Spec source: INFRATRACK-7 resolution. Re-ran against the current HEAD after comment #725.Spec — findings 1–6 all cleared
verify.ymlas the Assert play vsmake verify.workflow_dispatchand the "drops the defaultreopened" nuance.Residual (minor):
workflow_dispatchbut drops why it is the lever — spec: "this instance has no run-delete/log API, so a UI re-run is the only clean repeat." Partial.No material scope creep. Spec verdict: faithful.
Standards — improved, three residuals
Landed: H1 now
# infra-tracker;## Languagewith### Layers/### Testingsubheadings; per-term_Avoid_intact.verify.yml/make verify), Static checks ("fmt,validate, and the plan-only tests"), Service ("installed natively"). Same classac4279aset out to remove.### Layersbut is a process convention, not a layer.GLOSSARY-MAP.mdto resolve either.Deliberate keeps — accepted
Seam, Inventory, Static checks "floor" are project jargon with an INFRATRACK-3/6/7 provenance; the general-concept rule targets incidental vocabulary. No objection.
Recommendation: merge.
The must-fix that held the first round (#725 item 1) is properly fixed, and the Spec axis is now clean. What remains is glossary polish (verb-phrase definitions; the residual implementation clauses; Apply gate clustering) and the ADR-bar question you already own — none of it a safety, correctness, or reversibility concern on a docs-only, two-way-door change. Nothing executable changes;
mainis untouched until merge.Optional, non-blocking: fold the glossary tidy + the ADR-bar decision into a follow-up rather than another round here.