@metasession.co/devaudit-cli 0.3.15 → 0.3.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/sdlc/files/_common/Test_Policy.md +2 -2
- package/sdlc/files/_common/Test_Strategy.md +4 -4
- package/sdlc/files/_common/skills/e2e-test-engineer/SKILL.md +9 -2
- package/sdlc/files/_common/skills/e2e-test-engineer/references/e2e-regression-3-tier.yml +4 -6
- package/sdlc/files/_common/skills/sdlc-implementer/SKILL.md +3 -3
- package/sdlc/files/_common/workflows/devaudit-update-install.md +4 -4
- package/sdlc/files/ci/ci.yml.template +23 -0
- package/sdlc/package.json +1 -1
- package/sdlc/src/blueprints/3-compile-evidence.raw.md +8 -24
- package/sdlc/src/blueprints/implementing-an-sdlc-issue.raw.md +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metasession.co/devaudit-cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.17",
|
|
4
4
|
"description": "DevAudit CLI — installs, syncs, and operates the Metasession SDLC across consumer projects.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@clack/prompts": "^0.8.2",
|
|
36
|
-
"@metasession.co/devaudit-plugin-sdk": "^0.3.
|
|
36
|
+
"@metasession.co/devaudit-plugin-sdk": "^0.3.17",
|
|
37
37
|
"ajv": "^8.20.0",
|
|
38
38
|
"commander": "^12.1.0",
|
|
39
39
|
"consola": "^3.2.3",
|
|
@@ -155,8 +155,8 @@ AI involvement in Medium or High categories raises risk by one level. The Test S
|
|
|
155
155
|
The MoSCoW prioritisation of acceptance criteria maps onto three E2E gates, each enforced at a different point in the workflow:
|
|
156
156
|
|
|
157
157
|
- **Must-tier ACs in the smoke subset** must pass on every push to the integration branch. Blocking — a red smoke gate stops the integration hop.
|
|
158
|
-
- **Must-tier ACs in the critical subset** must pass on every PR to the release branch. Blocking — a red critical gate stops
|
|
159
|
-
- **Should/Could-tier ACs (full regression)**
|
|
158
|
+
- **Must-tier ACs in the critical subset** must pass on every consumer-enabled PR to the release branch. Blocking — a red critical gate stops that release.
|
|
159
|
+
- **Should/Could-tier ACs (full regression)** are not pre-merge blocking. The consumer chooses a post-merge, scheduled, or manual-dispatch safety net and must triage any recorded failure within working hours.
|
|
160
160
|
|
|
161
161
|
Operator override on a hotfix issue (accept-with-rationale) is logged on the issue itself + carried in the next release's `test-execution-summary.md` design record (devaudit#50). The framework does not permit silently shipping a failing test — every red regression spec ends as either fixed, reverted, or accepted-with-recorded-rationale.
|
|
162
162
|
|
|
@@ -45,14 +45,14 @@ Full E2E regression on every PR is expensive — a 30+ minute wait per release-P
|
|
|
45
45
|
| Tier | Location | When it runs | Wall-clock target | Audit role |
|
|
46
46
|
| --- | --- | --- | --- | --- |
|
|
47
47
|
| **smoke** | `e2e/smoke/*.spec.ts` | every push to `$INTEGRATION_BRANCH` (via `ci.yml`) | ~3–5 min | fast feedback on every change |
|
|
48
|
-
| **critical** | `e2e/smoke/` + `e2e/critical/*.spec.ts` | PR-to-`$RELEASE_BRANCH`
|
|
49
|
-
| **regression** | all `e2e/**/*.spec.ts` |
|
|
48
|
+
| **critical** | `e2e/smoke/` + `e2e/critical/*.spec.ts` | PR-to-`$RELEASE_BRANCH` when the consumer enables `e2e-regression.yml` | ~10–15 min | release-readiness Must gate |
|
|
49
|
+
| **regression** | all `e2e/**/*.spec.ts` | `workflow_dispatch` and any consumer-configured post-merge or scheduled run | ~35 min (or your project's full pack) | full audit trail + drift catch |
|
|
50
50
|
|
|
51
51
|
The mapping to MoSCoW: **Must-priority SRS items live in `e2e/smoke/` (fast feedback) and `e2e/critical/` (release gate); Should/Could items live in `e2e/` and are covered by the regression tier.** The classifier is the developer authoring the spec — see `skills/e2e-test-engineer/SKILL.md` Phase 3 for the decision tree.
|
|
52
52
|
|
|
53
|
-
**Cost philosophy.** Smoke protects every push from breaking the headline flow. Critical protects every release from a Must-tier regression. Full regression protects the audit trail
|
|
53
|
+
**Cost philosophy.** Smoke protects every push from breaking the headline flow. Critical protects every release from a Must-tier regression. Full regression protects the audit trail and catches drift when the consumer elects to run it. We accept that a Should/Could-tier regression can sit outside the PR gate; the consumer chooses whether its safety net is post-merge, scheduled, or manual dispatch. The framework does not impose a daily/nightly run.
|
|
54
54
|
|
|
55
|
-
**Post-merge safety net.**
|
|
55
|
+
**Post-merge safety net.** When a consumer enables a post-merge regression run, `e2e-regression.yml` may file a `bug, priority:high` issue tagging the merge commit and failing specs. The operator triages within working hours — hotfix forward, revert the commit, or accept-with-rationale if the failure is environmental. No automated revert: flakes and UAT-data drift require human judgment.
|
|
56
56
|
|
|
57
57
|
**Reference workflow.** A copy-pasteable `e2e-regression.yml` shape lives at `skills/e2e-test-engineer/references/e2e-regression-3-tier.yml`. Adoption is opt-in per consumer (the framework doesn't currently sync this workflow; consumers own their own `e2e-regression.yml`).
|
|
58
58
|
|
|
@@ -139,7 +139,7 @@ When designing each scenario, also pick the tier it'll live in. Three tiers map
|
|
|
139
139
|
| --- | --- | --- |
|
|
140
140
|
| **smoke** | `e2e/smoke/*.spec.ts` | Cross-cutting sanity that proves the app is up: login, basic nav, one canonical CRUD per main domain. Runs on every push to the integration branch. Keep small — total smoke wall-clock target is ~3–5 min. |
|
|
141
141
|
| **critical** | `e2e/critical/*.spec.ts` | Must-priority SRS item that breaks a headline flow if it regresses. Examples: payment authorisation, order completion, admin permission editing, RBAC enforcement on financial surfaces. Runs on PR-to-release-branch. Total critical wall-clock target ~10–15 min (includes smoke). |
|
|
142
|
-
| **regression** | `e2e/<area>/*.spec.ts` | Should/Could-priority SRS item, edge cases, less-load-bearing flows. Runs
|
|
142
|
+
| **regression** | `e2e/<area>/*.spec.ts` | Should/Could-priority SRS item, edge cases, less-load-bearing flows. Runs by dispatch and any consumer-configured post-merge or scheduled cadence. Total full pack can be 30+ min; that is the point of the tier. |
|
|
143
143
|
|
|
144
144
|
Decision tree, applied per scenario:
|
|
145
145
|
|
|
@@ -229,6 +229,12 @@ Before running the suite (Phase 6), verify that the evidence traceability wiring
|
|
|
229
229
|
|
|
230
230
|
Also verify the import is present: `import { tagTest } from './helpers/test-tags'` (or the correct relative path from the spec's location to `e2e/helpers/test-tags.ts`).
|
|
231
231
|
|
|
232
|
+
4. **Check release and cycle provenance.** Before handing the work back to `sdlc-implementer`, identify the tracked `REQ-XXX`, the source branch SHA, and the expected SDLC stage/cycle for the run. The CI evidence upload must retain those values so the portal can show the result in the correct numbered cycle for the release that produced it.
|
|
233
|
+
- A passing local run is not portal evidence by itself. Report it as local verification and let the configured CI workflow upload the resulting report and screenshots.
|
|
234
|
+
- For a bundled release, evidence remains attributed to its originating REQ and cycle. The absorbing release may reference that source release through bundle lineage, but must not relabel the source E2E run as newly produced by the absorbing REQ.
|
|
235
|
+
- Confirm the CI invocation has an unambiguous release context (`REQ-XXX` or the documented standalone-housekeeping declaration). A bare-date integration housekeeping run is historical CI only; it must not create an approval-ready E2E evidence set.
|
|
236
|
+
- If the project workflow cannot provide this context, halt and report a workflow-contract gap. Do not claim that screenshots or E2E results will appear correctly on the portal.
|
|
237
|
+
|
|
232
238
|
**If any check fails:**
|
|
233
239
|
|
|
234
240
|
Halt and report the gap to the user:
|
|
@@ -241,7 +247,7 @@ Halt and report the gap to the user:
|
|
|
241
247
|
|
|
242
248
|
Do **not** proceed to Phase 6 until all gaps are resolved. The user may choose to skip an AC (e.g. API-only, transport-only) — that's valid, but it must be an explicit decision recorded in the test-execution-summary, not an omission.
|
|
243
249
|
|
|
244
|
-
**Write the evidence-wiring sentinel (devaudit-installer#226).** After all Phase 5½ checks pass (all `@requirement`, `evidenceShot()`,
|
|
250
|
+
**Write the evidence-wiring sentinel (devaudit-installer#226).** After all Phase 5½ checks pass (all `@requirement`, `evidenceShot()`, `tagTest()`, and release/cycle provenance checks verified), write a `.e2e-evidence-wired` sentinel file in the repo root so the pre-push hook and `sdlc-implementer` Phase 2 step 5b can verify evidence wiring was validated:
|
|
245
251
|
|
|
246
252
|
```bash
|
|
247
253
|
echo "WIRED $(date -u +%Y-%m-%dT%H:%M:%SZ) REQ-XXX" > .e2e-evidence-wired
|
|
@@ -442,6 +448,7 @@ Wrap up with a summary the user can drop into the PR or ticket:
|
|
|
442
448
|
- Defects filed — count, with links.
|
|
443
449
|
- Requirements gap reports — count, with details (devaudit-installer#212 Gap 4). These are ACs classified as "impossible to test" or "missing AC" — returned to `sdlc-implementer` for the requirements gap flow, not filed as defects.
|
|
444
450
|
- Missed requirements — count, with links.
|
|
451
|
+
- **Release provenance** — originating `REQ-XXX`, local run result, expected CI workflow/run, and expected portal stage/cycle. For bundled work, state the source REQ explicitly and that the absorbing release will reference it through lineage rather than overwrite its attribution.
|
|
445
452
|
|
|
446
453
|
**Then feed the test-design record (devaudit#50).** The Stage 3 `test-execution-summary.md` (generated per `3-compile-evidence.md` Step 1a) carries a `## Test design` section at the top. Before Stage 3 finalises the file, populate that section with the design-time decisions this skill made, so the SDLC has a recorded trace that scope was *decided*, not implicit:
|
|
447
454
|
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
#
|
|
3
3
|
# Copy this into your consumer-owned .github/workflows/e2e-regression.yml
|
|
4
4
|
# to adopt the 3-tier model: smoke (every develop push, fast) / critical
|
|
5
|
-
# (PR
|
|
6
|
-
#
|
|
5
|
+
# (consumer-enabled release PR, ~10-15 min target) / regression (post-merge
|
|
6
|
+
# or scheduled only when the consumer opts in, plus dispatch).
|
|
7
7
|
#
|
|
8
8
|
# The framework does NOT sync this file automatically — your consumer
|
|
9
9
|
# owns its e2e-regression.yml. Apply the patterns below to your own
|
|
@@ -25,8 +25,6 @@ on:
|
|
|
25
25
|
branches: [main] # critical-tier gate before merge
|
|
26
26
|
push:
|
|
27
27
|
branches: [main] # full regression after merge; auto-issues on failure
|
|
28
|
-
schedule:
|
|
29
|
-
- cron: '0 2 * * *' # nightly full regression
|
|
30
28
|
workflow_dispatch:
|
|
31
29
|
inputs:
|
|
32
30
|
specs:
|
|
@@ -62,8 +60,8 @@ jobs:
|
|
|
62
60
|
run: npx playwright install --with-deps chromium
|
|
63
61
|
|
|
64
62
|
# Decide which Playwright project to run based on the trigger.
|
|
65
|
-
# PR-to-main uses critical with smoke fall-back;
|
|
66
|
-
#
|
|
63
|
+
# PR-to-main uses critical with smoke fall-back; a consumer-enabled
|
|
64
|
+
# post-merge push runs the full regression project; workflow_dispatch
|
|
67
65
|
# accepts an optional spec filter.
|
|
68
66
|
- name: Determine E2E project + spec selector
|
|
69
67
|
id: select
|
|
@@ -307,7 +307,7 @@ _Test fix surfaced by suite drift_
|
|
|
307
307
|
> - **Requirement:** none
|
|
308
308
|
> - **Risk:** LOW
|
|
309
309
|
> - **Path:** Lightweight (gates → PR review → merge)
|
|
310
|
-
> - **Gates/evidence:** quality-gates smoke (default CI Gate 4); no full regression on PR (
|
|
310
|
+
> - **Gates/evidence:** quality-gates smoke (default CI Gate 4); no full regression on PR (use `workflow_dispatch` while iterating; any post-merge or scheduled regression is consumer-configured)
|
|
311
311
|
> - **Your approvals:** PR review only
|
|
312
312
|
> - **Skipped:** RTM, evidence pack, UAT four-eyes, Production approval
|
|
313
313
|
|
|
@@ -663,8 +663,8 @@ Reached only on the **tracked** route from Phase 0 (the issue is already fetched
|
|
|
663
663
|
**When an external gate hangs or fails for unrelated reasons.** A required gate may fail for reasons outside the change's scope — flaky infra, an unrelated regression test that hangs at hour-plus runtime with no log activity, a known-failing suite. When this happens:
|
|
664
664
|
|
|
665
665
|
1. **Verify it's actually unrelated.** Read the failure (or the lack of one). If it's the change's fault, fix it; this section does not apply.
|
|
666
|
-
2. **Document the rationale on the PR.** A sticky comment naming: which gate, what the failure was, why it's unrelated to the change, what
|
|
667
|
-
3. **Cancel-and-admin-merge is allowed** when **all three** hold: (a) ≥3 other required gates are green, (b) the change has no scope-overlap with the failing gate (e.g. service-layer fix vs hung UI e2e, or an `E2E: N/A by scope` test-plan), and (c) a fallback verification exists (
|
|
666
|
+
2. **Document the rationale on the PR.** A sticky comment naming: which gate, what the failure was, why it's unrelated to the change, and what concrete fallback verification is available (for example, a consumer-configured regression run or post-deploy verification).
|
|
667
|
+
3. **Cancel-and-admin-merge is allowed** when **all three** hold: (a) ≥3 other required gates are green, (b) the change has no scope-overlap with the failing gate (e.g. service-layer fix vs hung UI e2e, or an `E2E: N/A by scope` test-plan), and (c) a concrete fallback verification exists (a consumer-configured regression run, manual dispatch, or post-deploy smoke). If any of the three fail, hold the merge and surface the blocker to the operator.
|
|
668
668
|
4. **Record the decision in the release ticket.** The release ticket's `## Verification` section must mention the cancelled gate by run-ID and the fallback that justifies bypassing it. Auditors look here first.
|
|
669
669
|
|
|
670
670
|
**When the cancel-and-admin-merge conditions are NOT met.** If only one or two of the three conditions hold, the skill cannot bypass the gate. Escalation path:
|
|
@@ -137,20 +137,20 @@ Key files to expect:
|
|
|
137
137
|
|
|
138
138
|
### 5. Hand off to the sdlc-implementer skill
|
|
139
139
|
|
|
140
|
-
The changes are staged in the working tree. The remaining steps — invoking the SDLC engine for the sentinel, running local gates, creating a feature branch, committing, pushing, opening a PR, monitoring CI, and
|
|
140
|
+
The changes are staged in the working tree. The remaining steps — invoking the SDLC engine for the sentinel, running local gates, creating a feature branch, committing, pushing, opening a PR, monitoring CI, and recording the correct housekeeping release meaning — are all owned by the **sdlc-implementer** skill that was synced into `.claude/skills/` by the install/update.
|
|
141
141
|
|
|
142
142
|
Invoke the sdlc-implementer skill and tell it:
|
|
143
143
|
|
|
144
|
-
> **Housekeeping change.** The working tree has uncommitted changes from `devaudit install` (or `devaudit update`). Commit type is `chore:`, no `REQ-XXX`. Use the SDLC lightweight path: invoke the SDLC engine for the sentinel, run local gates, create a `chore/sync-devaudit-sdlc-{version}` branch, commit, push, open a PR targeting `develop`,
|
|
144
|
+
> **Housekeeping change.** The working tree has uncommitted changes from `devaudit install` (or `devaudit update`). Commit type is `chore:`, no `REQ-XXX`. Use the SDLC lightweight path: invoke the SDLC engine for the sentinel, run local gates, create a `chore/sync-devaudit-sdlc-{version}` branch, commit, push, open a PR targeting `develop`, wait for terminal-green checks on the current PR SHA, then guide merge. This is normal integration housekeeping: it has PR review only, creates no tracked approval release, and is absorbed into the next tracked REQ through bundled-change lineage. A standalone housekeeping release is allowed only when the `sdlc-implementer` standalone-exception contract is explicitly satisfied.
|
|
145
145
|
|
|
146
146
|
The skill will:
|
|
147
147
|
1. Invoke `node SDLC/bin/devaudit-sdlc.js --phase=issue --view` to write the `.sdlc-implementer-invoked` sentinel
|
|
148
148
|
2. Run local gates (lint, tsc, test)
|
|
149
149
|
3. Create a `chore/` branch, commit, and push
|
|
150
150
|
4. Open a PR targeting `develop`
|
|
151
|
-
5. Monitor CI checks
|
|
151
|
+
5. Monitor CI checks and wait for terminal green on the current PR SHA
|
|
152
152
|
6. Guide review → merge
|
|
153
|
-
7.
|
|
153
|
+
7. Record the merge as integration history to be bundled into the next tracked REQ, unless the explicit standalone-housekeeping exception was used
|
|
154
154
|
|
|
155
155
|
**Do not** manually run these steps yourself — the skill owns the SDLC ceremony and stays in sync with the framework's evolution. If the skill is not available (e.g. the AI agent doesn't support skills), fall back to the manual steps documented in `SDLC/0-project-setup.md` and the sdlc-implementer skill definition at `.claude/skills/sdlc-implementer/SKILL.md`.
|
|
156
156
|
|
|
@@ -696,6 +696,29 @@ jobs:
|
|
|
696
696
|
done
|
|
697
697
|
fi
|
|
698
698
|
|
|
699
|
+
# GitHub rejects a single run scalar above its 21,000-character
|
|
700
|
+
# expression-template limit. Persist the first half's upload result
|
|
701
|
+
# so the screenshot/evidence-completeness half can continue and
|
|
702
|
+
# report one combined failure below. DevAudit-Installer#423.
|
|
703
|
+
echo "$UPLOAD_FAILURES" > ci-evidence/gate-upload-failures.txt
|
|
704
|
+
|
|
705
|
+
- name: Upload screenshot evidence and verify completeness
|
|
706
|
+
# The preceding evidence uploads are intentionally best-effort so this
|
|
707
|
+
# second half can still report every missing screenshot/evidence gap.
|
|
708
|
+
if: always() && env.DEVAUDIT_BASE_URL != ''
|
|
709
|
+
run: |
|
|
710
|
+
chmod +x scripts/upload-evidence.sh 2>/dev/null || true
|
|
711
|
+
FLAGS="--git-sha ${{ github.sha }} --ci-run-id ${{ github.run_id }} --branch ${{ github.ref_name }}"
|
|
712
|
+
FLAGS="${FLAGS} --release ${{ needs.register-release.outputs.version }} --create-release-if-missing"
|
|
713
|
+
FLAGS="${FLAGS} --environment uat --sdlc-stage 2"
|
|
714
|
+
UPLOAD_FAILURES=0
|
|
715
|
+
if [ -f ci-evidence/gate-upload-failures.txt ]; then
|
|
716
|
+
PREVIOUS_UPLOAD_FAILURES=$(cat ci-evidence/gate-upload-failures.txt)
|
|
717
|
+
if [[ "$PREVIOUS_UPLOAD_FAILURES" =~ ^[0-9]+$ ]]; then
|
|
718
|
+
UPLOAD_FAILURES="$PREVIOUS_UPLOAD_FAILURES"
|
|
719
|
+
fi
|
|
720
|
+
fi
|
|
721
|
+
|
|
699
722
|
# Upload per-AC e2e evidence screenshots, scoped to each in-scope
|
|
700
723
|
# requirement so they render under "Evidence by requirement" in the
|
|
701
724
|
# portal. These are the per-assertion `evidenceShot(page, REQ, 'ACn-…')`
|
package/sdlc/package.json
CHANGED
|
@@ -70,37 +70,21 @@ Both `ci.yml` and `compliance-evidence.yml` call the same helper, so a feature s
|
|
|
70
70
|
|
|
71
71
|
If you need a separate release container for a sub-piece of work — e.g. carving REQ-038 out of an in-flight feature — give it its own REQ-ID and tag the commits accordingly.
|
|
72
72
|
|
|
73
|
-
##
|
|
73
|
+
## Release modes
|
|
74
74
|
|
|
75
|
-
A release is classified by
|
|
75
|
+
A release is classified by version shape and release mode. **Most of this doc walks the tracked path** (a REQ-XXX-tagged release for a single requirement). For develop pushes without a REQ tag — typically `docs:`, `chore:`, `ci:`, `build:`, `test:`, `compliance:`, `revert:` — the version deriver falls back to a bare date.
|
|
76
76
|
|
|
77
|
-
|
|
|
77
|
+
| Mode | Version pattern | Triggered by | Outcome |
|
|
78
78
|
| --- | --- | --- | --- |
|
|
79
79
|
| **Tracked** | `REQ-037`, `REQ-046-FIX`, etc. | A `feat`/`fix`/`refactor`/`perf` commit (REQ tag required by commitlint) | Yes — full Steps 1-9 |
|
|
80
|
-
| **
|
|
80
|
+
| **Integration housekeeping** | `v2026.06.04` (bare date, optionally `.N`) | A normal REQ-exempt change | Terminal-green reviewed integration history; no tracked approval ceremony |
|
|
81
|
+
| **Standalone housekeeping** | `v2026.06.04` (bare date, optionally `.N`) | An explicitly declared exception | Distinct release only after its validated declaration, reason, and production verification |
|
|
81
82
|
|
|
82
|
-
### Housekeeping
|
|
83
|
+
### Housekeeping outcomes
|
|
83
84
|
|
|
84
|
-
|
|
85
|
+
Normal housekeeping skips the per-requirement evidence and approval path. Run the relevant gates, obtain terminal-green PR review, and merge to `develop`; the bare-date portal row is integration history. When a tracked release later absorbs the work, its bundled-change manifest preserves the source title, evidence ownership, stage, and cycles.
|
|
85
86
|
|
|
86
|
-
|
|
87
|
-
| --- | --- | --- | --- |
|
|
88
|
-
| Release ticket | `compliance/pending-releases/RELEASE-TICKET-REQ-XXX.md` (Step 8) | `compliance/pending-releases/RELEASE-TICKET-<version>.md` (e.g. `RELEASE-TICKET-v2026.06.04.md`) | **Yes** — `generate-housekeeping-release-ticket.sh` runs after `derive-release-version.sh` and emits a stub the operator reviews + signs off |
|
|
89
|
-
| Security summary | `compliance/evidence/REQ-XXX/security-summary.md` (Step 4) | `compliance/security-summary-<version>.md` at the compliance root (release-scoped, not REQ-scoped) | **Yes** — `generate-security-summary.sh` scrapes the SAST + dep-audit gate JSON and emits a stub with an operator sign-off block |
|
|
90
|
-
|
|
91
|
-
**Filename conventions are enforced.** Release tickets must match `RELEASE-TICKET-REQ-XXX.md` or `RELEASE-TICKET-vYYYY.MM.DD.md` exactly. Security summaries must be named `security-summary.md` exactly. The CI upload pipeline (`compliance-evidence.yml`) routes per-REQ artifacts by basename to specific `evidence_type` values — unrecognized filenames are skipped with a warning (DevAudit-Installer#205). The `validate-compliance-artifacts.sh` PR-time check also warns on unrecognized filenames in `compliance/evidence/REQ-XXX/`. The version-suffixed conventions above are recommended for **searchability + audit trail** when a project has many housekeeping releases stacked up — they keep the artefacts distinct per release without needing folder scoping.
|
|
92
|
-
|
|
93
|
-
**What housekeeping operators do, end to end:**
|
|
94
|
-
|
|
95
|
-
1. Push the `docs:` / `chore:` / `ci:` commits to develop. CI runs the four gates as usual.
|
|
96
|
-
2. CI's `compliance-evidence.yml` workflow auto-opens a PR (`chore/housekeeping-release-<version>`) containing the two stubs.
|
|
97
|
-
3. Review the stubs — confirm the commit-summary list in the release ticket is sensible, confirm the SAST + dep-audit summary reads correctly, fill in the operator sign-off block on each.
|
|
98
|
-
4. Merge that PR. The next CI run picks up the artefacts and the portal's release-completeness checklist flips both items to ✓.
|
|
99
|
-
5. Submit for UAT review on the portal. The approval flow is identical to the tracked path — same four-eyes rules (per project risk tier), same `draft → uat_review → uat_approved → prod_review → prod_approved → released` state machine.
|
|
100
|
-
|
|
101
|
-
**No auto-approval.** Housekeeping releases still require operator action to advance through the gates. The CI-generated stubs replace the operator's authoring effort, not the operator's review.
|
|
102
|
-
|
|
103
|
-
> **Versions of the framework before 2026-06 produced housekeeping stubs by hand.** Older release records may have `security-summary.md` under a REQ-XXX-shaped folder or no release ticket at all — leave those in DRAFT for the audit trail; backfilling isn't required.
|
|
87
|
+
Use standalone housekeeping only when the change cannot reasonably wait for that tracked release. Follow `docs/release-playbooks/housekeeping-release.md`: add the validated `STANDALONE-HOUSEKEEPING-vYYYY.MM.DD.json` declaration, document why promotion is necessary, pass the required checks, and verify production. There is no automatic release-ticket or security-summary stub PR for either housekeeping outcome.
|
|
104
88
|
|
|
105
89
|
## Steps
|
|
106
90
|
|
|
@@ -55,7 +55,7 @@ A worked end-to-end example for a zero-risk change (a typo, a dependency bump, a
|
|
|
55
55
|
3. **Commit with a housekeeping type.** `docs:` / `chore:` / `ci:` / `build:` / `test:` / `revert:` are **exempt** from the `[REQ-XXX]` rule — e.g. `git commit -m "docs: fix typo in README"`. A `feat` / `fix` / `refactor` / `perf` subject without a `[REQ-XXX]` or `Ref: REQ-XXX` is **rejected** by commitlint and `validate-commits.sh` — if that fires, you picked the wrong type and the change isn't trivial.
|
|
56
56
|
4. **Run the gates locally — not optional.** `npx tsc --noEmit`, lint, and the test suite must pass before you push. Trivial ≠ unverified.
|
|
57
57
|
5. **Push and open a PR.** CI runs the same quality gates. `compliance-validation.yml` finds no `REQ-XXX` and **skips** artifact validation; no release ticket, no RTM row, no evidence pack is required.
|
|
58
|
-
6. **Merge
|
|
58
|
+
6. **Merge only after terminal-green CI** and reviewer approval. A housekeeping push may create a bare-date portal row, but it is integration history, not a UAT/production approval release. It needs no release ticket, security-summary stub, per-REQ evidence pack, or portal sign-off. The next tracked REQ records absorbed work through bundled-change lineage. Use standalone housekeeping only through the explicit declaration and production-verification path in the release playbook.
|
|
59
59
|
|
|
60
60
|
If at any step it stops feeling trivial — it changes behaviour, touches auth/payments/data, or an auditor would ask about it — switch to a tracked change and run `sdlc-implementer`. When unsure, it's not trivial.
|
|
61
61
|
|