Skip to content

Commit 6b8b6ad

Browse files
authored
Merge pull request #17 from szTheory/merge/docs-maintaining-into-main
Merge docs/maintaining-actions-runbook into main
2 parents 18015cc + 5c2cd72 commit 6b8b6ad

270 files changed

Lines changed: 18756 additions & 859 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.formatter.exs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
[
22
import_deps: [:ecto, :phoenix],
3-
inputs: ["*.{ex,exs}", "{config,lib,test}/**/*.{ex,exs}"],
3+
inputs: [
4+
"*.{ex,exs}",
5+
"{config,lib}/**/*.{ex,exs}",
6+
# Do not use a blanket `test/**` — `test/example/_build` and `deps` contain
7+
# non-Elixir *.ex copies of install templates that break `mix format`.
8+
"test/{sigra,support,mix,fixtures}/**/*.{ex,exs}",
9+
"test/*.{ex,exs}",
10+
"test/example/{lib,config,test,priv}/**/*.{ex,exs}",
11+
"test/example/mix.exs"
12+
],
413
export: [locals_without_parens: []]
514
]

.github/workflows/ci.yml

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,15 @@ jobs:
3636
- name: Detect installer-related changes (PRs only)
3737
id: detect
3838
shell: bash
39+
# Phase 51: include GA-adjacent lib surfaces (MFA/OAuth/account/passkeys) — see MAINTAINING.md §Installer golden CI contract.
3940
run: |
4041
set -euo pipefail
4142
if [ "${{ github.event_name }}" != "pull_request" ]; then
4243
echo "run=true" >> "$GITHUB_OUTPUT"
4344
exit 0
4445
fi
4546
git fetch origin "${{ github.base_ref }}" --depth=1
46-
if git diff --name-only "origin/${{ github.base_ref }}...HEAD" | grep -qE '^priv/templates/sigra\.install/|^lib/sigra/install/'; then
47+
if git diff --name-only "origin/${{ github.base_ref }}...HEAD" | grep -qE '^priv/templates/sigra\.install/|^lib/sigra/install/|^lib/sigra/mfa(\.ex|/)|^lib/sigra/oauth(\.ex|/)|^lib/sigra/account(\.ex|/)|^lib/sigra/passkeys(\.ex|/)'; then
4748
echo "run=true" >> "$GITHUB_OUTPUT"
4849
else
4950
echo "run=false" >> "$GITHUB_OUTPUT"
@@ -52,6 +53,72 @@ jobs:
5253
if: steps.detect.outputs.run == 'true'
5354
run: bash scripts/ci/installer-milestone-audit.sh
5455

56+
install_golden_contract:
57+
name: Install golden + idempotency contract (subprocess harness)
58+
runs-on: ubuntu-latest
59+
services:
60+
postgres:
61+
image: postgres:15
62+
env:
63+
POSTGRES_PASSWORD: postgres
64+
POSTGRES_DB: sigra_test
65+
ports: ['5432:5432']
66+
options: >-
67+
--health-cmd pg_isready --health-interval 10s
68+
--health-timeout 5s --health-retries 5
69+
steps:
70+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
71+
with:
72+
fetch-depth: 0
73+
- name: Detect installer-related changes (PRs only)
74+
id: detect
75+
shell: bash
76+
# Phase 51: include GA-adjacent lib surfaces (MFA/OAuth/account/passkeys) — see MAINTAINING.md §Installer golden CI contract.
77+
run: |
78+
set -euo pipefail
79+
if [ "${{ github.event_name }}" != "pull_request" ]; then
80+
echo "run=true" >> "$GITHUB_OUTPUT"
81+
exit 0
82+
fi
83+
git fetch origin "${{ github.base_ref }}" --depth=1
84+
if git diff --name-only "origin/${{ github.base_ref }}...HEAD" | grep -qE '^priv/templates/sigra\.install/|^lib/sigra/install/|^lib/sigra/mfa(\.ex|/)|^lib/sigra/oauth(\.ex|/)|^lib/sigra/account(\.ex|/)|^lib/sigra/passkeys(\.ex|/)'; then
85+
echo "run=true" >> "$GITHUB_OUTPUT"
86+
else
87+
echo "run=false" >> "$GITHUB_OUTPUT"
88+
fi
89+
- uses: erlef/setup-beam@fc68ffb90438ef2936bbb3251622353b3dcb2f93 # v1.24.0
90+
if: steps.detect.outputs.run == 'true'
91+
with:
92+
version-file: .tool-versions
93+
version-type: strict
94+
- name: Cache library deps
95+
if: steps.detect.outputs.run == 'true'
96+
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
97+
with:
98+
path: |
99+
deps
100+
_build
101+
key: ${{ runner.os }}-library-${{ hashFiles('mix.lock') }}
102+
- name: Install Hex + Rebar
103+
if: steps.detect.outputs.run == 'true'
104+
run: |
105+
mix local.hex --force
106+
mix local.rebar --force
107+
- name: Install phx_new archive
108+
if: steps.detect.outputs.run == 'true'
109+
run: mix archive.install --force hex phx_new
110+
- name: Fetch library deps
111+
if: steps.detect.outputs.run == 'true'
112+
run: mix deps.get
113+
- name: Run install golden + idempotency tests
114+
if: steps.detect.outputs.run == 'true'
115+
env:
116+
MIX_ENV: test
117+
PGUSER: postgres
118+
PGPASSWORD: postgres
119+
PGHOST: localhost
120+
run: mix test test/sigra/install/golden_diff_test.exs test/sigra/install/idempotency_test.exs
121+
55122
library_tests:
56123
name: Library tests
57124
runs-on: ubuntu-latest

.planning/MILESTONES.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,70 @@
159159
- [v1.3 Milestone Audit](milestones/v1.3-MILESTONE-AUDIT.md)
160160

161161
---
162+
163+
## v1.4 GA readiness & audit trail completeness (Shipped: 2026-04-22)
164+
165+
**Scope:** 12 phases (41–52), 38 plans.
166+
167+
**What shipped:** **SEED-001** closure with **TOTP-gated backup-code rotation** (`Sigra.MFA.regenerate_backup_codes/4`), example and install parity, and regression tests; a canonical **GA matrix** (`.planning/v1.4-GA-UAT.md`) with **Executed / Waived / Blocked** rows, dated evidence under `.planning/uat-evidence/v1.4/`, and machine substitutes where explicitly waived. **SEED-002** continuation: **AUD-04** inventory plus prioritized **`log_safe/3` → `Ecto.Multi`** conversions across **Auth**, **MFA**, **Account/API**, and **OAuth/ops** batches with **audit-aware** tests; formal **43/44/45 `*-VERIFICATION.md`** merge gates (**47–49**) including **`mix ci.audit_45`** and refreshed **Phase 9 C-1** matrices. **Phase 50** documented **Nyquist policy for 41–44** in **`MAINTAINING.md`**, **`mix ci.install_golden`**, and **`install_golden_contract`**. **Phase 51** widened CI path detection for installer-golden jobs and locked **GA waiver ↔ install-golden attestation** cross-links in contract tests. **Phase 52** aligned ROADMAP presentation (implementation vs verification phases) and added milestone-honesty contract coverage.
168+
169+
### Key accomplishments
170+
171+
1. **Phase 41 — GA-01 product fact** — Library backup-code rotation with optional audit on the same `Ecto.Multi`, generator/example wiring, and automated rotation regression.
172+
2. **Phases 42 + 46 — defensible GA posture** — Matrix scaffold plus gap closure so **GA-02..GA-05** are not “silent Pending” at close.
173+
3. **Phases 43–45 + 47–49 — audit atomicity + honest verification** — Inventory-driven batches, merge-gated verification docs, and **AUD-04..AUD-08** traceability reconciled with implementation reality.
174+
4. **Phase 50 — Nyquist + expensive CI as policy** — Explicit batch posture for **41–44** and documented **install golden** / CI truth on `main`.
175+
5. **Phase 51 — CI merge coupling** — Path filters and structural tests so **`install_golden_contract`** stays coupled to relevant PRs and waived GA rows point at attestations.
176+
6. **Phase 52 — planning honesty** — ROADMAP reader clarity for **44/45 vs 48/49** and contract tests guarding milestone narrative drift.
177+
178+
### Stats
179+
180+
- **Requirements:** 10/10 GA + AUD IDs in archived `milestones/v1.4-REQUIREMENTS.md` (mix of **Complete** and **Waived** with documented substitutes).
181+
- **Milestone audit:** early **`gaps_found`** snapshot preserved under `milestones/v1.4-MILESTONE-AUDIT.md` with an archive note; gaps were closed by phases **46–52** before ship.
182+
- **Pre-close `audit-open`:** all artifact types clear (2026-04-22).
183+
- **Timeline:** 2026-04-20 → 2026-04-22 (execution on disk + verification closure).
184+
185+
### Tech debt carried forward
186+
187+
- **Nyquist `nyquist_compliant: false` on 41–44** remains intentional unless policy elevates it (`MAINTAINING.md`).
188+
- **Explicitly deferred `log_safe/3` rows** under **AUD-08** must stay listed with reopen triggers (see post-close **C-1** matrices).
189+
- **`gsd-sdk query milestone.complete`** did not complete archival in this environment; maintainers used the same manual archive path as v1.3.
190+
191+
**Archive:**
192+
193+
- [v1.4 Roadmap](milestones/v1.4-ROADMAP.md)
194+
- [v1.4 Requirements](milestones/v1.4-REQUIREMENTS.md)
195+
- [v1.4 Milestone Audit](milestones/v1.4-MILESTONE-AUDIT.md)
196+
197+
---
198+
199+
## v1.5 Public release narrative & community readiness (Shipped: 2026-04-22)
200+
201+
**Scope:** 4 phases (53–56), 5 plans.
202+
203+
**What shipped:** **PUB-01**`mix.exs` / Hex description and `package[:links]` aligned with shipped **v1.0–v1.4** capabilities and optional deps. **PUB-02**`CHANGELOG.md` milestone glossary, roadmap traceability for **v1.2–v1.4**, ordered **0.1.0** sections, and Keep a Changelog compare links. **DOC-01** / **DOC-02** — README **Production readiness & GA evidence** block, new **`SECURITY.md`**, **`docs/ga-evidence.md`**, ExDoc extras, and clean `mix docs --warnings-as-errors`. **MAINT-01****First public launch** checklist in **`MAINTAINING.md`** with owners, tag-scoped `.planning` evidence URLs, and explicitly optional comms rows where **v1.4** waivers apply.
204+
205+
### Key accomplishments
206+
207+
1. **Phase 53 — honest Hex surface** — Core vs optional integrations reflected in public package metadata without dead claims.
208+
2. **Phase 54 — changelog as narrative spine** — Planning milestones and SemVer releases are distinguishable; traceability blocks link roadmap archives and compare URLs.
209+
3. **Phase 55 — OSS entry to GA evidence** — README and ExDoc give a short path to **Executed / Waived** language and **v1.4** artifacts.
210+
4. **Phase 56 — shippable announcement runbook** — Maintainer checklist orders **tag → Hex → announce → monitor** with pointers to **install golden** and **v1.4-GA-UAT** evidence.
211+
212+
### Stats
213+
214+
- **Requirements:** 5/5 Complete in archived [`milestones/v1.5-REQUIREMENTS.md`](milestones/v1.5-REQUIREMENTS.md).
215+
- **Milestone audit:** none filed for v1.5; closure used requirements traceability + phase summaries.
216+
- **Pre-close `audit-open`:** all artifact types clear (2026-04-22).
217+
- **Timeline:** 2026-04-22 (single-day milestone execution on disk).
218+
219+
### Tech debt carried forward
220+
221+
- **`gsd-sdk query milestone.complete`** returned `version required for phases archive`; archival followed the same manual path as **v1.3** / **v1.4**.
222+
223+
**Archive:**
224+
225+
- [v1.5 Roadmap](milestones/v1.5-ROADMAP.md)
226+
- [v1.5 Requirements](milestones/v1.5-REQUIREMENTS.md)
227+
228+
---

0 commit comments

Comments
 (0)