@metasession.co/devaudit-cli 0.3.12 → 0.3.14

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.
Files changed (67) hide show
  1. package/dist/index.js +53 -4
  2. package/dist/index.js.map +1 -1
  3. package/package.json +2 -2
  4. package/scripts/upload-evidence.sh +55 -1
  5. package/sdlc/files/_common/0-project-setup.md +10 -4
  6. package/sdlc/files/_common/Periodic_Security_Review_Schedule.md +5 -5
  7. package/sdlc/files/_common/README_TEMPLATE.md +8 -8
  8. package/sdlc/files/_common/Test_Architecture.md +15 -15
  9. package/sdlc/files/_common/Test_Plan_TEMPLATE.md +13 -13
  10. package/sdlc/files/_common/Test_Policy.md +2 -2
  11. package/sdlc/files/_common/Test_Strategy.md +10 -10
  12. package/sdlc/files/_common/governance/ai-disclosure.md.template +3 -3
  13. package/sdlc/files/_common/governance/dpia.md.template +3 -3
  14. package/sdlc/files/_common/governance/incident-report.md.template +3 -3
  15. package/sdlc/files/_common/governance/nil-incident-report.md.template +1 -1
  16. package/sdlc/files/_common/governance/periodic-review.md.template +3 -3
  17. package/sdlc/files/_common/governance/risk-register.md.template +1 -1
  18. package/sdlc/files/_common/governance/ropa.md.template +2 -2
  19. package/sdlc/files/_common/joining-an-existing-project.md +4 -4
  20. package/sdlc/files/_common/scripts/check-host-deployment.sh +107 -0
  21. package/sdlc/files/_common/scripts/check-host-deployment.test.sh +119 -0
  22. package/sdlc/files/_common/scripts/check-release-pr-scope.sh +95 -0
  23. package/sdlc/files/_common/scripts/check-release-pr-scope.test.sh +137 -0
  24. package/sdlc/files/_common/scripts/close-out-release.sh +175 -54
  25. package/sdlc/files/_common/scripts/close-out-release.test.sh +90 -0
  26. package/sdlc/files/_common/scripts/extract-release-metadata.sh +27 -0
  27. package/sdlc/files/_common/scripts/extract-release-metadata.test.sh +13 -1
  28. package/sdlc/files/_common/scripts/generate-bundled-changes.sh +311 -64
  29. package/sdlc/files/_common/scripts/generate-bundled-changes.test.sh +133 -82
  30. package/sdlc/files/_common/scripts/generate-housekeeping-release-ticket.sh +18 -9
  31. package/sdlc/files/_common/scripts/generate-housekeeping-release-ticket.test.sh +66 -0
  32. package/sdlc/files/_common/scripts/generate-security-summary.sh +14 -5
  33. package/sdlc/files/_common/scripts/generate-security-summary.test.sh +57 -0
  34. package/sdlc/files/_common/scripts/prepare-release-pr.sh +44 -4
  35. package/sdlc/files/_common/scripts/render-test-cycles.sh +227 -0
  36. package/sdlc/files/_common/scripts/render-test-cycles.test.sh +107 -0
  37. package/sdlc/files/_common/scripts/report-release-check.sh +86 -0
  38. package/sdlc/files/_common/scripts/report-release-check.test.sh +97 -0
  39. package/sdlc/files/_common/scripts/report-test-cycle.sh +344 -0
  40. package/sdlc/files/_common/scripts/submit-bundle-manifest.sh +100 -0
  41. package/sdlc/files/_common/scripts/submit-bundle-manifest.test.sh +138 -0
  42. package/sdlc/files/_common/scripts/upload-evidence.sh +24 -0
  43. package/sdlc/files/_common/scripts/validate-compliance-artifacts.sh +16 -0
  44. package/sdlc/files/_common/scripts/validate-compliance-artifacts.test.sh +14 -0
  45. package/sdlc/files/_common/scripts/validate-test-summary.test.sh +4 -4
  46. package/sdlc/files/_common/skills/adr-author/SKILL.md +2 -2
  47. package/sdlc/files/_common/skills/e2e-test-engineer/SKILL.md +2 -2
  48. package/sdlc/files/_common/skills/e2e-test-engineer/references/bootstrap.md +5 -5
  49. package/sdlc/files/_common/skills/governance-doc-author/references/incident-classification.md +1 -1
  50. package/sdlc/files/_common/skills/requirements-aligner/SKILL.md +4 -4
  51. package/sdlc/files/_common/skills/sdlc-implementer/SKILL.md +21 -2
  52. package/sdlc/files/_common/skills/sdlc-implementer/references/change-request-loop.md +1 -1
  53. package/sdlc/files/_common/skills/sdlc-implementer/references/compliance-constraints.md +7 -14
  54. package/sdlc/files/ci/ci.yml.template +119 -28
  55. package/sdlc/files/ci/close-out-release.yml.template +7 -4
  56. package/sdlc/files/ci/compliance-evidence.yml.template +230 -20
  57. package/sdlc/files/ci/feature-e2e.yml.template +84 -1
  58. package/sdlc/files/ci/post-deploy-prod.yml.template +189 -6
  59. package/sdlc/files/ci/python/ci.yml.template +60 -12
  60. package/sdlc/files/ci/quality-gates-provenance.yml.template +123 -28
  61. package/sdlc/package.json +1 -1
  62. package/sdlc/src/bin/devaudit-sdlc.js +44 -2
  63. package/sdlc/src/blueprints/1-plan-requirement.raw.md +6 -1
  64. package/sdlc/src/blueprints/2-implement-and-test.raw.md +1 -1
  65. package/sdlc/src/blueprints/3-compile-evidence.raw.md +34 -20
  66. package/sdlc/src/blueprints/4-submit-for-review.raw.md +2 -2
  67. package/sdlc/src/blueprints/5-deploy-main.raw.md +2 -2
@@ -16,6 +16,15 @@ const DEFAULT_FLAKY_PATTERNS = [
16
16
  'flaky',
17
17
  'retry',
18
18
  ];
19
+ const DEFAULT_INTEGRATION_BRANCH = 'develop';
20
+ const DEFAULT_RELEASE_BRANCH = 'main';
21
+ const REQUIRED_RELEASE_CHECKS = [
22
+ 'Quality Gates',
23
+ 'Release Scope Integrity',
24
+ 'Compliance Validation',
25
+ 'DevAudit Release Approval',
26
+ 'E2E Regression Suite',
27
+ ];
19
28
  const RELEASE_APPROVAL_STATUSES = new Set([
20
29
  'uat_approved',
21
30
  'release_approved',
@@ -84,6 +93,11 @@ function isReleaseGateCheck(check) {
84
93
  return haystack.includes('release approval') || haystack.includes('uat approval');
85
94
  }
86
95
 
96
+ function isReleasePromotionPr(pr, options) {
97
+ return normalizeState(pr.baseRefName) === normalizeState(options.releaseBranch || DEFAULT_RELEASE_BRANCH)
98
+ && normalizeState(pr.headRefName) === normalizeState(options.integrationBranch || DEFAULT_INTEGRATION_BRANCH);
99
+ }
100
+
87
101
  function isFlakyCheck(check, patterns) {
88
102
  const haystack = `${check.name || ''} ${check.workflow || ''}`.toLowerCase();
89
103
  return patterns.some(pattern => haystack.includes(pattern));
@@ -313,6 +327,14 @@ function classifyPrStatus(pr, checks, portalStatus, watch, options) {
313
327
  const failingChecks = checks.filter(check => isFailingState(check.state || check.bucket));
314
328
  const pendingChecks = checks.filter(check => isPendingState(check.state || check.bucket));
315
329
  const releaseGate = checks.find(isReleaseGateCheck) || null;
330
+ const isReleasePr = isReleasePromotionPr(pr || {}, options);
331
+ const releaseChecks = isReleasePr
332
+ ? checks.filter(check => REQUIRED_RELEASE_CHECKS.includes(String(check.name || '')))
333
+ : [];
334
+ const missingReleaseChecks = isReleasePr
335
+ ? REQUIRED_RELEASE_CHECKS.filter(required => !releaseChecks.some(check => String(check.name || '') === required))
336
+ : [];
337
+ const pendingReleaseChecks = releaseChecks.filter(check => isPendingState(check.state || check.bucket));
316
338
 
317
339
  if (normalizeState(pr.state) !== 'open') {
318
340
  return {
@@ -362,6 +384,22 @@ function classifyPrStatus(pr, checks, portalStatus, watch, options) {
362
384
  };
363
385
  }
364
386
 
387
+ if (isReleasePr && missingReleaseChecks.length > 0) {
388
+ return {
389
+ kind: 'waiting',
390
+ exitCode: 2,
391
+ summary: `PR #${watch.prNumber} is still waiting for required release checks to report: ${missingReleaseChecks.join(', ')}.`,
392
+ };
393
+ }
394
+
395
+ if (isReleasePr && pendingReleaseChecks.length > 0) {
396
+ return {
397
+ kind: 'waiting',
398
+ exitCode: 2,
399
+ summary: `PR #${watch.prNumber} still has required release checks running: ${pendingReleaseChecks.map(formatCheckName).join(', ')}.`,
400
+ };
401
+ }
402
+
365
403
  for (const check of failingChecks) {
366
404
  if (!isReleaseGateCheck(check) && isFlakyCheck(check, options.flakyPatterns || DEFAULT_FLAKY_PATTERNS)) {
367
405
  const runId = extractRunId(check.link);
@@ -405,7 +443,9 @@ function classifyPrStatus(pr, checks, portalStatus, watch, options) {
405
443
  return {
406
444
  kind: 'ready',
407
445
  exitCode: 0,
408
- summary: `PR #${watch.prNumber} is approved and all observed checks are green. Ready for merge.`,
446
+ summary: isReleasePr
447
+ ? `PR #${watch.prNumber} is approved and all required release checks reached terminal success. Ready for merge.`
448
+ : `PR #${watch.prNumber} is approved and all observed checks are green. Ready for merge.`,
409
449
  };
410
450
  }
411
451
 
@@ -454,6 +494,8 @@ async function watchPullRequest() {
454
494
 
455
495
  const options = {
456
496
  flakyPatterns: flakyPatterns.length > 0 ? flakyPatterns : DEFAULT_FLAKY_PATTERNS,
497
+ integrationBranch: getOption('integration-branch') || DEFAULT_INTEGRATION_BRANCH,
498
+ releaseBranch: getOption('release-branch') || DEFAULT_RELEASE_BRANCH,
457
499
  };
458
500
 
459
501
  let pollsRemaining = once ? 1 : maxPolls;
@@ -463,7 +505,7 @@ async function watchPullRequest() {
463
505
  let pr;
464
506
  let checks;
465
507
  try {
466
- pr = runGhJson(['pr', 'view', String(prNumber), '--repo', repo, '--json', 'state,isDraft,reviewDecision']);
508
+ pr = runGhJson(['pr', 'view', String(prNumber), '--repo', repo, '--json', 'state,isDraft,reviewDecision,baseRefName,headRefName']);
467
509
  checks = runGhJson(['pr', 'checks', String(prNumber), '--repo', repo, '--json', 'name,state,link,workflow,bucket']) || [];
468
510
  if (!Array.isArray(checks)) checks = [];
469
511
  } catch (error) {
@@ -70,6 +70,11 @@ Open `compliance/RTM.md`, Part B. The issue provides full context; the RTM is a
70
70
  | REQ-XXX | #NNN | [LOW/MEDIUM/HIGH] | compliance/evidence/REQ-XXX/ | DRAFT | -- | -- |
71
71
  ```
72
72
 
73
+ If any RTM cell content needs literal pipe characters, escape them as `\|`
74
+ rather than writing bare `|`. This matters for regex or enum examples inside
75
+ status/notes text because markdownlint otherwise misreads the row as having
76
+ extra columns.
77
+
73
78
  The auditor reads one row and follows the links: Issue for context and rationale, evidence directory for test artifacts, PR for code changes.
74
79
 
75
80
  ### Step 5: Create Evidence Directory
@@ -379,7 +384,7 @@ cat > compliance/evidence/REQ-XXX/test-plan.md << 'EOF'
379
384
 
380
385
  ## Functional Test Mapping
381
386
  | Acceptance Criterion | Test File | Test Name |
382
- |---------------------|-----------|-----------|
387
+ | --------------------- | ----------- | ----------- |
383
388
  | [From test-scope.md] | [spec file] | [test name] |
384
389
 
385
390
  ## Non-Functional Tests (MEDIUM/HIGH)
@@ -246,7 +246,7 @@ For LOW-risk docs/tooling/script-only changes or environments without the requir
246
246
  #### Exit Criteria
247
247
 
248
248
  | Gate | Threshold |
249
- |---|---|
249
+ | --- | --- |
250
250
  | TypeScript | 0 errors |
251
251
  | SAST (high/critical) | 0 findings |
252
252
  | Dependencies (high/critical) | 0 vulnerabilities |
@@ -36,7 +36,7 @@ If you are an AI agent reading this file, you are strictly prohibited from manua
36
36
  **Markdown stays in git. Binary and JSON evidence goes to DevAudit.**
37
37
 
38
38
  | Artifact | Store in | Why |
39
- |----------|----------|-----|
39
+ | ---------- | ---------- | ----- |
40
40
  | `compliance/RTM.md` | Git | Source of truth, version history, PR-reviewable |
41
41
  | `compliance/evidence/REQ-XXX/test-scope.md` | Git | Planning artifact, reviewed in PRs |
42
42
  | `compliance/evidence/REQ-XXX/implementation-plan.md` | Git | Design decisions artifact (MEDIUM/HIGH risk), reviewed in PRs |
@@ -60,7 +60,7 @@ CI uploads are scoped to a **release record** in DevAudit, keyed by `(project, v
60
60
  The templated workflows derive the release version from the **latest commit on the branch** via `scripts/derive-release-version.sh`:
61
61
 
62
62
  | Commit shape | Release version |
63
- |---|---|
63
+ | --- | --- |
64
64
  | Subject `[REQ-037] feat(...)` | `REQ-037` |
65
65
  | Subject `feat(...)` + body `Ref: REQ-037` | `REQ-037` |
66
66
  | Subject contains multiple tags (e.g. `[REQ-037][REQ-038]`) | First match wins → `REQ-037` |
@@ -75,7 +75,7 @@ If you need a separate release container for a sub-piece of work — e.g. carvin
75
75
  A release is classified by its version pattern. **Most of this doc walks the tracked path** (a REQ-XXX-tagged release for a single requirement). For develop pushes that don't carry a REQ tag — typically `docs:`, `chore:`, `ci:`, `build:`, `test:`, `compliance:`, `revert:` — the version-deriver falls back to a bare date and the release is **housekeeping**.
76
76
 
77
77
  | Shape | Version pattern | Triggered by | Per-REQ ceremony |
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
  | **Housekeeping** | `v2026.06.04` (bare date, optionally `.N`) | A push containing only REQ-exempt commit types | **No** per-REQ artefacts; the portal auto-skips test-scope, test-plan, implementation-plan, and test-execution-summary completeness checks |
81
81
 
@@ -84,7 +84,7 @@ A release is classified by its version pattern. **Most of this doc walks the tra
84
84
  Housekeeping releases **skip** the per-requirement evidence (no REQ → no `compliance/evidence/REQ-XXX/` folder) but **still produce two release-scoped artefacts**:
85
85
 
86
86
  | Artefact | Tracked path | Housekeeping path | Auto-generated by CI? |
87
- |---|---|---|---|
87
+ | --- | --- | --- | --- |
88
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
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
90
 
@@ -168,7 +168,7 @@ Records the design-time decisions before listing run results — what was tested
168
168
  ## Gate Results
169
169
 
170
170
  | Gate | Result | Details |
171
- |------|--------|---------|
171
+ | ------ | -------- | --------- |
172
172
  | TypeScript | PASS | 0 errors |
173
173
  | SAST | PASS | [N] findings ([N] baseline) |
174
174
  | Dependency Audit | PASS | [N] unaccepted high/critical |
@@ -180,7 +180,7 @@ Records the design-time decisions before listing run results — what was tested
180
180
  Required when E2E gate result is `SKIPPED`. Optional when no accepted skips exist.
181
181
 
182
182
  | Spec | Test | REQ/AC | Classification | Resolution attempted | Approved by | Rationale |
183
- |------|------|--------|---------------|---------------------|-------------|----------|
183
+ | ------ | ------ | -------- | --------------- | --------------------- | ------------- | ---------- |
184
184
  | e2e/foo.spec.ts | "AC3: bar dialog" | REQ-XXX/AC3 | intentional_non_applicability | N/A — API-only change | [operator] | API-only change, no UI surface |
185
185
 
186
186
  Rules:
@@ -191,11 +191,25 @@ Rules:
191
191
 
192
192
  ## Test Cycles
193
193
 
194
- | Cycle | CI Run | Gate Status | E2E Result | Coverage | Date |
195
- |-------|--------|-------------|------------|----------|------|
196
- | #1 | [run_id] | [PASS/FAIL] | [N/N] | [N%] | [YYYY-MM-DD] |
194
+ Prefer the first-class release-journey / cycle API when the portal exposes it. Generate the table from the API response rather than inferring cycles from uploaded files:
197
195
 
198
- **Final assessment:** [All cycles passed / N cycles failed — see incidents]
196
+ ```bash
197
+ # Example:
198
+ curl -s -H "Authorization: Bearer ${DEVAUDIT_API_KEY}" \
199
+ "${DEVAUDIT_BASE_URL%/}/api/projects/<slug>/releases/REQ-XXX/journey" \
200
+ > /tmp/release-journey.json
201
+ bash scripts/render-test-cycles.sh /tmp/release-journey.json
202
+ ```
203
+
204
+ The helper renders a first-class table when `.cycles[]` is present, and falls back to legacy `testCycleId` grouping when the portal has not yet rolled out cycle records.
205
+
206
+ | Source Release | SDLC Stage | Cycle | Kind | Outcome | Workflow / Run | Related Evidence | Incident / Remediation | Date |
207
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- |
208
+ | REQ-XXX | 2 implement_test | #1 | quality_gate | passed | [Quality Gates](https://github.com/example/repo/actions/runs/123) (run 123, attempt 1) | quality-gates.json | None | 2026-07-16 11:03:00 |
209
+ | REQ-XXX | 2 implement_test | #2 | e2e | passed | [E2E Regression](https://github.com/example/repo/actions/runs/124) (run 124, attempt 2) | e2e-results.json, screenshots.zip | Incident #501 fixed in PR #507 | 2026-07-16 11:19:00 |
210
+ | REQ-089 | 4 uat_review | #1 | uat | passed | [UAT Review](https://devaudit.example/releases/REQ-089) | uat-checklist.md | None | 2026-07-16 12:02:00 |
211
+
212
+ **Final assessment:** [First-class cycle records show all stage cycles passed / N cycles failed — see incidents]
199
213
 
200
214
  ## Bundled Release Context
201
215
 
@@ -224,13 +238,13 @@ Required when `compliance/pending-releases/BUNDLED-CHANGES-REQ-XXX.md` exists fo
224
238
  ## Test Plan Coverage
225
239
 
226
240
  | Acceptance Criterion | Status | Test |
227
- |---------------------|--------|------|
241
+ | --------------------- | -------- | ------ |
228
242
  | [From test-plan.md] | PASS | `[spec-file]::[test-name]` |
229
243
 
230
244
  ## Evidence Locations
231
245
 
232
246
  | Evidence | Location |
233
- |----------|----------|
247
+ | ---------- | ---------- |
234
248
  | E2E results | DevAudit: [project]/REQ-XXX/e2e-results.json |
235
249
  | SAST results | DevAudit: [project]/REQ-XXX/sast-results.json |
236
250
  | Dependency audit | DevAudit: [project]/REQ-XXX/dependency-audit.json |
@@ -359,7 +373,7 @@ No incidents or defects were discovered during the test cycle for release `<vers
359
373
  ## Sign-off
360
374
 
361
375
  | Role | Name | Date |
362
- |---|---|---|
376
+ | --- | --- | --- |
363
377
  | Test lead | REPLACE — assign | REPLACE |
364
378
  | Engineering lead | REPLACE — assign | REPLACE |
365
379
  EOF
@@ -480,7 +494,7 @@ The test-scope artefact carries an **SRS-ID cross-reference table** so each test
480
494
  ## SRS coverage
481
495
 
482
496
  | Test (file) | AC | SRS item |
483
- |---|---|---|
497
+ | --- | --- | --- |
484
498
  | e2e/admin-order-flow.spec.ts | AC1 | REQ-ORDER-005 |
485
499
  | services/order-service.test.ts | AC2 | REQ-INV-010 |
486
500
  | e2e/incident-dashboard.spec.ts | AC9 | REQ-OPS-001 |
@@ -538,7 +552,7 @@ Required when `compliance/pending-releases/BUNDLED-CHANGES-REQ-XXX.md` exists or
538
552
  ## AI Contributors
539
553
 
540
554
  | Tool | Version | Session | Commits | Date Range |
541
- |------|---------|---------|---------|------------|
555
+ | ------ | --------- | --------- | --------- | ------------ |
542
556
  | [tool / none] | [version] | [session id] | [N] | [YYYY-MM-DD to YYYY-MM-DD] |
543
557
 
544
558
  **Handoffs:** [None / list — see `ai-agent-handoff.md` if applicable]
@@ -557,13 +571,13 @@ Required when `compliance/pending-releases/BUNDLED-CHANGES-REQ-XXX.md` exists or
557
571
 
558
572
  ## Test Evidence
559
573
  | Test Type | Count | Passed | Failed | Evidence Location |
560
- |-----------|-------|--------|--------|-------------------|
574
+ | ----------- | ------- | -------- | -------- | ------------------- |
561
575
  | E2E (Playwright) | [N] | [N] | 0 | DevAudit portal: [PROJECT_SLUG]/REQ-XXX |
562
576
  | Unit | [N] | [N] | 0 | DevAudit portal: [PROJECT_SLUG]/REQ-XXX |
563
577
 
564
578
  ## Security Evidence
565
579
  | Check | Result | Evidence Location |
566
- |-------|--------|-------------------|
580
+ | ------- | -------- | ------------------- |
567
581
  | SAST | 0 high/critical | DevAudit portal: [PROJECT_SLUG]/REQ-XXX |
568
582
  | Dependency Audit | 0 high/critical | DevAudit portal: [PROJECT_SLUG]/REQ-XXX |
569
583
  | Access Control | [PASS/N/A] | Git: `compliance/evidence/REQ-XXX/security-summary.md` |
@@ -584,7 +598,7 @@ Required when `compliance/pending-releases/BUNDLED-CHANGES-REQ-XXX.md` exists or
584
598
  ## Post-Deploy Actions
585
599
 
586
600
  | Type | Script / Command | Target | Required | Notes |
587
- |------|-----------------|--------|----------|-------|
601
+ | ------ | ----------------- | -------- | ---------- | ------- |
588
602
  | — | None | — | — | No post-deploy actions required |
589
603
 
590
604
  <!-- Replace the "None" row above with actual actions if this release requires them:
@@ -612,7 +626,7 @@ Required when `compliance/pending-releases/BUNDLED-CHANGES-REQ-XXX.md` exists or
612
626
 
613
627
  ## Audit Trail
614
628
  | Date | Action | Actor | Notes |
615
- |------|--------|-------|-------|
629
+ | ------ | -------- | ------- | ------- |
616
630
  | [date] | Requirement created | [who] | Risk: [level] |
617
631
  | [date] | Implementation completed | [who] | [details] |
618
632
  | [date] | AI code reviewed | [reviewer] | [files] |
@@ -794,7 +808,7 @@ The script:
794
808
  Required environment variables for the scripted path:
795
809
 
796
810
  | Var | What it is | Where to set |
797
- |---|---|---|
811
+ | --- | --- | --- |
798
812
  | `DEVAUDIT_USER_TOKEN` | Personal Access Token (`mctok_…`) attributed to the running user | Issue at `/settings/tokens`; store as a repo secret for CI or `.env` for local |
799
813
  | `DEVAUDIT_API_KEY` | Project-scoped API key (existing) | Already set for evidence uploads |
800
814
  | `DEVAUDIT_BASE_URL` | DevAudit URL | Resolved by CI templates; locally read from `sdlc-config.json devaudit.base_url` |
@@ -121,7 +121,7 @@ gh pr create --base main --head develop --title "type: description" --body "$(ca
121
121
  ## Test Results (Local — Comprehensive)
122
122
 
123
123
  | Gate | Result | Details |
124
- |------|--------|---------|
124
+ | ------ | -------- | --------- |
125
125
  | E2E Tests | [N]/[N] passed | Spec files: [list spec files that ran] |
126
126
  | TypeScript | 0 errors | `npx tsc --noEmit` |
127
127
  | SAST | 0 high/critical | [N] rules scanned, [N] files |
@@ -148,7 +148,7 @@ CI runs automatically on this PR. The following gates must pass before merge:
148
148
 
149
149
  ### Where to Find Test Results
150
150
  | Source | Location | What It Shows |
151
- |--------|----------|---------------|
151
+ | -------- | ---------- | --------------- |
152
152
  | **CI status** | Green/red icons on PR commits | Pass/fail for each gate (independent, tamper-resistant) |
153
153
  | **CI E2E comment** | PR comments (automated) | E2E pass/fail with commit SHA |
154
154
  | **DevAudit evidence** | [View evidence on DevAudit](https://[DevAudit-URL]/projects/[PROJECT_SLUG]/requirements/REQ-XXX) | Playwright report, SAST results, dependency audit |
@@ -88,7 +88,7 @@ If the release ticket says "No post-deploy actions required", skip to Step 4.
88
88
  Production verification is **read-only and non-destructive**. It confirms the deployment succeeded and the application is accessible. It does NOT exercise application logic.
89
89
 
90
90
  | Allowed (read-only) | NOT allowed (destructive) |
91
- |---------------------|--------------------------|
91
+ | --------------------- | -------------------------- |
92
92
  | Health checks (HTTP GET) | E2E tests (Playwright) |
93
93
  | Public endpoint status codes | Database operations |
94
94
  | Security header inspection | API mutations (POST/PUT/DELETE) |
@@ -226,7 +226,7 @@ git checkout develop
226
226
  If the project uses separate UAT and Production environments:
227
227
 
228
228
  | Environment | Branch | Auto-deploy | Purpose |
229
- |-------------|--------|-------------|---------|
229
+ | ------------- | -------- | ------------- | --------- |
230
230
  | UAT | `develop` | Yes | Pre-PR verification — CI evidence uploaded to DevAudit, reviewed and approved before PR |
231
231
  | Production | `main` | Yes | Live deployment after PR approval — post-deploy evidence captured and uploaded to DevAudit |
232
232