@metasession.co/devaudit-cli 0.3.18 → 0.3.20

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 (36) hide show
  1. package/dist/index.js +35 -34
  2. package/dist/index.js.map +1 -1
  3. package/package.json +2 -2
  4. package/scripts/upload-evidence.sh +23 -19
  5. package/sdlc/files/_common/governance/incident-report.md.template +6 -1
  6. package/sdlc/files/_common/governance/nil-incident-report.md.template +5 -2
  7. package/sdlc/files/_common/scripts/check-release-pr-scope.sh +8 -1
  8. package/sdlc/files/_common/scripts/check-release-pr-scope.test.sh +58 -10
  9. package/sdlc/files/_common/scripts/check-self-hosted-runner.sh +103 -0
  10. package/sdlc/files/_common/scripts/check-self-hosted-runner.test.sh +74 -0
  11. package/sdlc/files/_common/scripts/record-uat-execution.sh +195 -0
  12. package/sdlc/files/_common/scripts/record-uat-execution.test.sh +144 -0
  13. package/sdlc/files/_common/scripts/render-test-executions.sh +146 -0
  14. package/sdlc/files/_common/scripts/{render-test-cycles.test.sh → render-test-executions.test.sh} +12 -18
  15. package/sdlc/files/_common/scripts/{report-test-cycle.sh → report-test-execution.sh} +66 -74
  16. package/sdlc/files/_common/scripts/report-test-execution.test.sh +177 -0
  17. package/sdlc/files/_common/scripts/submit-for-uat-review.sh +21 -0
  18. package/sdlc/files/_common/scripts/upload-evidence.sh +23 -19
  19. package/sdlc/files/_common/scripts/validate-commits.sh +6 -4
  20. package/sdlc/files/_common/scripts/validate-commits.test.sh +15 -0
  21. package/sdlc/files/_common/skills/e2e-test-engineer/SKILL.md +9 -7
  22. package/sdlc/files/_common/skills/e2e-test-engineer/references/e2e-regression-3-tier.yml +4 -1
  23. package/sdlc/files/_common/skills/sdlc-implementer/SKILL.md +16 -14
  24. package/sdlc/files/ci/ci.yml.template +54 -44
  25. package/sdlc/files/ci/compliance-evidence.yml.template +135 -46
  26. package/sdlc/files/ci/feature-e2e.yml.template +58 -18
  27. package/sdlc/files/ci/incident-export.yml.template +18 -4
  28. package/sdlc/files/ci/post-deploy-prod.yml.template +33 -30
  29. package/sdlc/files/ci/python/ci.yml.template +14 -14
  30. package/sdlc/files/ci/quality-gates-provenance.yml.template +3 -0
  31. package/sdlc/package.json +1 -1
  32. package/sdlc/src/blueprints/3-compile-evidence.raw.md +10 -10
  33. package/sdlc/src/blueprints/4-submit-for-review.raw.md +1 -1
  34. package/sdlc/src/blueprints/5-deploy-main.raw.md +1 -1
  35. package/sdlc/src/blueprints/implementing-an-sdlc-issue.raw.md +3 -3
  36. package/sdlc/files/_common/scripts/render-test-cycles.sh +0 -227
@@ -145,6 +145,11 @@ jobs:
145
145
  ISSUE_LABELS: ${{ toJSON(github.event.issue.labels.*.name) }}
146
146
  run: |
147
147
  mkdir -p compliance/governance
148
+ SOURCE_RELEASE=$(printf '%s\n' "$ISSUE_BODY" | grep -oE 'REQ-[0-9]+|v[0-9]{4}\.[0-9]{2}\.[0-9]{2}([.][0-9]+)?' | head -1 || true)
149
+ if [ -z "$SOURCE_RELEASE" ]; then
150
+ echo "::error::Baseline-only incident export requires the issue body to reference its owning REQ-XXX or housekeeping release. Reopen or route through Path B with human frontmatter review."
151
+ exit 1
152
+ fi
148
153
  ISSUE_JSON=$(gh issue view "$ISSUE_NUMBER" \
149
154
  --json title,body,labels,author,createdAt,closedAt,comments,url,assignees,number,state)
150
155
 
@@ -235,6 +240,11 @@ jobs:
235
240
  "---",
236
241
  ("title: " + (.title | @json)),
237
242
  ("incident_id: \"INC-" + (.createdAt[:10] | gsub("-";"")) + "-" + (.number|tostring) + "\""),
243
+ "incident_kind: \"incident\"",
244
+ ("source_release: \"'"${SOURCE_RELEASE}"'\""),
245
+ ("source_issue: \"" + (.number|tostring) + "\""),
246
+ ("source_issue_url: " + (.url | @json)),
247
+ ("semantic_id: \"INC-" + (.createdAt[:10] | gsub("-";"")) + "-" + (.number|tostring) + "\""),
238
248
  ("severity: \"'"${SEVERITY}"'\""),
239
249
  ("detected_at: " + (.createdAt | @json)),
240
250
  ("resolved_at: " + (.closedAt | @json)),
@@ -242,8 +252,6 @@ jobs:
242
252
  ("reported_to_supervisory_authority: \"n/a\""),
243
253
  ("notification_window_72h: \"n/a\""),
244
254
  ("last_reviewed_at: " + (.closedAt[:10] | @json)),
245
- ("source_issue: " + (.url | @json)),
246
- ("source_issue_number: " + (.number|tostring)),
247
255
  "---",
248
256
  "",
249
257
  "> ℹ️ Auto-exported by Incident Export workflow on issue close (Path A — baseline-only).",
@@ -349,8 +357,11 @@ jobs:
349
357
  ISSUE_NUMBER: ${{ github.event.issue.number }}
350
358
  OUT: ${{ steps.paths.outputs.out }}
351
359
  SEVERITY: ${{ steps.route.outputs.severity }}
360
+ ISSUE_BODY: ${{ github.event.issue.body }}
352
361
  run: |
353
362
  mkdir -p compliance/governance
363
+ SOURCE_RELEASE=$(printf '%s\n' "$ISSUE_BODY" | grep -oE 'REQ-[0-9]+|v[0-9]{4}\.[0-9]{2}\.[0-9]{2}([.][0-9]+)?' | head -1 || true)
364
+ [ -n "$SOURCE_RELEASE" ] || SOURCE_RELEASE="REPLACE — owning REQ-XXX or vYYYY.MM.DD.N"
354
365
  ISSUE_JSON=$(gh issue view "$ISSUE_NUMBER" \
355
366
  --json title,body,labels,author,createdAt,closedAt,comments,url,assignees,number,state)
356
367
  {
@@ -358,6 +369,11 @@ jobs:
358
369
  "---",
359
370
  ("title: " + (.title | @json)),
360
371
  ("incident_id: \"INC-" + (.createdAt[:10] | gsub("-";"")) + "-" + (.number|tostring) + "\""),
372
+ "incident_kind: \"incident\"",
373
+ ("source_release: \"'"${SOURCE_RELEASE}"'\""),
374
+ ("source_issue: \"" + (.number|tostring) + "\""),
375
+ ("source_issue_url: " + (.url | @json)),
376
+ ("semantic_id: \"INC-" + (.createdAt[:10] | gsub("-";"")) + "-" + (.number|tostring) + "\""),
361
377
  ("severity: \"REPLACE — low | medium | high | critical\""),
362
378
  ("detected_at: " + (.createdAt | @json)),
363
379
  ("resolved_at: " + (.closedAt | @json)),
@@ -365,8 +381,6 @@ jobs:
365
381
  ("reported_to_supervisory_authority: \"REPLACE — true | false | n/a\""),
366
382
  ("notification_window_72h: \"REPLACE — within | outside | n/a\""),
367
383
  ("last_reviewed_at: " + (.closedAt[:10] | @json)),
368
- ("source_issue: " + (.url | @json)),
369
- ("source_issue_number: " + (.number|tostring)),
370
384
  "---",
371
385
  "",
372
386
  "> ℹ️ Auto-exported by Incident Export workflow on issue close.",
@@ -38,7 +38,10 @@ jobs:
38
38
  if: >-
39
39
  github.event_name == 'workflow_dispatch' ||
40
40
  (github.event.deployment_status.state == 'success' &&
41
- (github.event.deployment.environment == 'production' || github.event.deployment.environment == 'prod'))
41
+ (github.event.deployment.environment == 'production' ||
42
+ github.event.deployment.environment == 'prod' ||
43
+ endsWith(github.event.deployment.environment, '/ production') ||
44
+ endsWith(github.event.deployment.environment, '/production')))
42
45
  runs-on: {{RUNNER}}
43
46
  permissions:
44
47
  contents: read
@@ -144,17 +147,17 @@ jobs:
144
147
  echo "In-scope releases to promote: ${REQS}"
145
148
  echo "REQS=${REQS}" >> "$GITHUB_ENV"
146
149
 
147
- - name: Start production deployment cycles
150
+ - name: Start production deployment executions
148
151
  run: |
149
- chmod +x scripts/report-test-cycle.sh 2>/dev/null || true
152
+ chmod +x scripts/report-test-execution.sh 2>/dev/null || true
150
153
  for PREFIX in ${REQS}; do
151
154
  RESP=$(curl -fsS -H "Authorization: Bearer ${DEVAUDIT_API_KEY}" \
152
155
  "${BASE}/api/ci/releases/resolve?projectSlug=${PROJECT_SLUG}&versionPrefix=${PREFIX}")
153
156
  VERSION=$(echo "$RESP" | jq -r '.latest.version // empty')
154
157
  [ -n "$VERSION" ] || VERSION="$PREFIX"
155
- bash scripts/report-test-cycle.sh start \
158
+ bash scripts/report-test-execution.sh start \
156
159
  --project-slug "$PROJECT_SLUG" --release "$VERSION" \
157
- --sdlc-stage 5 --environment production --cycle-kind deployment \
160
+ --sdlc-stage 5 --environment production --suite-kind deployment \
158
161
  --provider github_actions --external-run-id "$CI_RUN" \
159
162
  --external-run-attempt "${{ github.run_attempt }}" --external-job-id "host-deployment" \
160
163
  --idempotency-key "github:${{ github.repository }}:post-deploy-prod.deployment:${CI_RUN}:${{ github.run_attempt }}:5:${VERSION}" \
@@ -213,7 +216,7 @@ jobs:
213
216
  fi
214
217
  exit "$SCRIPT_EXIT"
215
218
 
216
- - name: Complete production deployment cycles
219
+ - name: Complete production deployment executions
217
220
  if: always() && env.BASE != ''
218
221
  run: |
219
222
  HOST_VERIFICATION="${{ steps.host_deployment.outputs.verification || 'not_run' }}"
@@ -231,15 +234,15 @@ jobs:
231
234
  OUTCOME=failed
232
235
  CHECK_STATUS=failed
233
236
  fi
234
- chmod +x scripts/report-test-cycle.sh scripts/report-release-check.sh 2>/dev/null || true
237
+ chmod +x scripts/report-test-execution.sh scripts/report-release-check.sh 2>/dev/null || true
235
238
  for PREFIX in ${REQS}; do
236
239
  RESP=$(curl -fsS -H "Authorization: Bearer ${DEVAUDIT_API_KEY}" \
237
240
  "${BASE}/api/ci/releases/resolve?projectSlug=${PROJECT_SLUG}&versionPrefix=${PREFIX}")
238
241
  VERSION=$(echo "$RESP" | jq -r '.latest.version // empty')
239
242
  [ -n "$VERSION" ] || VERSION="$PREFIX"
240
- bash scripts/report-test-cycle.sh complete \
243
+ bash scripts/report-test-execution.sh complete \
241
244
  --project-slug "$PROJECT_SLUG" --release "$VERSION" \
242
- --sdlc-stage 5 --environment production --cycle-kind deployment \
245
+ --sdlc-stage 5 --environment production --suite-kind deployment \
243
246
  --provider github_actions --external-run-id "$CI_RUN" \
244
247
  --external-run-attempt "${{ github.run_attempt }}" --external-job-id "host-deployment" \
245
248
  --idempotency-key "github:${{ github.repository }}:post-deploy-prod.deployment:${CI_RUN}:${{ github.run_attempt }}:5:${VERSION}" \
@@ -269,18 +272,18 @@ jobs:
269
272
  exit 1
270
273
  fi
271
274
 
272
- - name: Start production smoke cycles
275
+ - name: Start production smoke executions
273
276
  if: steps.production_probe.outputs.verification == 'production_health_success' && steps.host_deployment.outputs.verification == 'success'
274
277
  run: |
275
- chmod +x scripts/report-test-cycle.sh 2>/dev/null || true
278
+ chmod +x scripts/report-test-execution.sh 2>/dev/null || true
276
279
  for PREFIX in ${REQS}; do
277
280
  RESP=$(curl -fsS -H "Authorization: Bearer ${DEVAUDIT_API_KEY}" \
278
281
  "${BASE}/api/ci/releases/resolve?projectSlug=${PROJECT_SLUG}&versionPrefix=${PREFIX}")
279
282
  VERSION=$(echo "$RESP" | jq -r '.latest.version // empty')
280
283
  [ -n "$VERSION" ] || VERSION="$PREFIX"
281
- bash scripts/report-test-cycle.sh start \
284
+ bash scripts/report-test-execution.sh start \
282
285
  --project-slug "$PROJECT_SLUG" --release "$VERSION" \
283
- --sdlc-stage 5 --environment production --cycle-kind smoke \
286
+ --sdlc-stage 5 --environment production --suite-kind smoke \
284
287
  --provider github_actions --external-run-id "$CI_RUN" \
285
288
  --external-run-attempt "${{ github.run_attempt }}" --external-job-id "production-smoke" \
286
289
  --idempotency-key "github:${{ github.repository }}:post-deploy-prod.smoke:${CI_RUN}:${{ github.run_attempt }}:5:${VERSION}" \
@@ -314,7 +317,7 @@ jobs:
314
317
  }
315
318
  RESULTS_EOF
316
319
 
317
- - name: Complete production smoke cycles
320
+ - name: Complete production smoke executions
318
321
  if: always() && env.BASE != '' && steps.host_deployment.outcome == 'success'
319
322
  run: |
320
323
  case "${{ steps.production_smoke.outcome }}" in
@@ -323,15 +326,15 @@ jobs:
323
326
  skipped) OUTCOME=skipped; CHECK_STATUS=skipped ;;
324
327
  *) OUTCOME=failed; CHECK_STATUS=failed ;;
325
328
  esac
326
- chmod +x scripts/report-test-cycle.sh scripts/report-release-check.sh 2>/dev/null || true
329
+ chmod +x scripts/report-test-execution.sh scripts/report-release-check.sh 2>/dev/null || true
327
330
  for PREFIX in ${REQS}; do
328
331
  RESP=$(curl -fsS -H "Authorization: Bearer ${DEVAUDIT_API_KEY}" \
329
332
  "${BASE}/api/ci/releases/resolve?projectSlug=${PROJECT_SLUG}&versionPrefix=${PREFIX}")
330
333
  VERSION=$(echo "$RESP" | jq -r '.latest.version // empty')
331
334
  [ -n "$VERSION" ] || VERSION="$PREFIX"
332
- bash scripts/report-test-cycle.sh complete \
335
+ bash scripts/report-test-execution.sh complete \
333
336
  --project-slug "$PROJECT_SLUG" --release "$VERSION" \
334
- --sdlc-stage 5 --environment production --cycle-kind smoke \
337
+ --sdlc-stage 5 --environment production --suite-kind smoke \
335
338
  --provider github_actions --external-run-id "$CI_RUN" \
336
339
  --external-run-attempt "${{ github.run_attempt }}" --external-job-id "production-smoke" \
337
340
  --idempotency-key "github:${{ github.repository }}:post-deploy-prod.smoke:${CI_RUN}:${{ github.run_attempt }}:5:${VERSION}" \
@@ -365,8 +368,8 @@ jobs:
365
368
  # incident-export.yml fires on close → incident_report evidence
366
369
  # lands on the portal → ISO29119.3.5.4 + SOC2.CC7.2 flip to COVERED.
367
370
  #
368
- # testCycleId (CI run ID) cross-references #209 so the incident
369
- # report traces back to the specific test cycle that detected
371
+ # testExecutionId (CI run ID) cross-references #209 so the incident
372
+ # report traces back to the specific test execution that detected
370
373
  # the production failure.
371
374
  #
372
375
  # Ensure the incident label exists (idempotent).
@@ -385,7 +388,7 @@ jobs:
385
388
 
386
389
  **Production URL:** ${PROD_URL}
387
390
  **Git SHA:** ${GIT_SHA}
388
- **testCycleId:** ${CI_RUN}
391
+ **testExecutionId:** ${CI_RUN}
389
392
  **Workflow run:** ${WORKFLOW_URL}
390
393
  **Date:** ${DATE}
391
394
 
@@ -429,7 +432,7 @@ jobs:
429
432
  - name: Promote in-scope releases (evidence + status)
430
433
  if: steps.production_smoke.outcome == 'success'
431
434
  run: |
432
- chmod +x scripts/upload-evidence.sh scripts/report-test-cycle.sh scripts/report-release-check.sh 2>/dev/null || true
435
+ chmod +x scripts/upload-evidence.sh scripts/report-test-execution.sh scripts/report-release-check.sh 2>/dev/null || true
433
436
  PROMOTED=0
434
437
  EVIDENCE_FAILURES=0
435
438
  for PREFIX in ${REQS}; do
@@ -440,14 +443,14 @@ jobs:
440
443
  [ -z "$VERSION" ] && VERSION="${PREFIX}"
441
444
  RELEASE_ID=$(echo "$RESP" | jq -r '.latest.id // empty')
442
445
  REQ_FAILURES=0
443
- LINEAGE_FLAGS=(--test-cycle "${CI_RUN}")
444
- CYCLE_OUT="$(mktemp)"
445
- bash scripts/report-test-cycle.sh start \
446
+ LINEAGE_FLAGS=(--test-execution "${CI_RUN}")
447
+ EXECUTION_OUT="$(mktemp)"
448
+ bash scripts/report-test-execution.sh start \
446
449
  --project-slug "${PROJECT_SLUG}" \
447
450
  --release "${VERSION}" \
448
451
  --sdlc-stage 5 \
449
452
  --environment production \
450
- --cycle-kind smoke \
453
+ --suite-kind smoke \
451
454
  --provider github_actions \
452
455
  --external-run-id "${CI_RUN}" \
453
456
  --external-run-attempt "${{ github.run_attempt }}" \
@@ -457,11 +460,11 @@ jobs:
457
460
  --branch main \
458
461
  --workflow-name "Post-Deploy Production" \
459
462
  --workflow-url "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
460
- --output-file "$CYCLE_OUT"
461
- . "$CYCLE_OUT"
462
- rm -f "$CYCLE_OUT"
463
- if [ "${cycle_supported:-false}" = "true" ] && [ -n "${cycle_record_id:-}" ]; then
464
- LINEAGE_FLAGS+=(--evidence-scope cycle --test-cycle-record-id "${cycle_record_id}")
463
+ --output-file "$EXECUTION_OUT"
464
+ . "$EXECUTION_OUT"
465
+ rm -f "$EXECUTION_OUT"
466
+ if [ "${execution_supported:-false}" = "true" ] && [ -n "${execution_record_id:-}" ]; then
467
+ LINEAGE_FLAGS+=(--evidence-scope execution --test-execution-record-id "${execution_record_id}")
465
468
  fi
466
469
  # Production smoke evidence (whole-app health) attached to this release.
467
470
  if [ -f prod-smoke-results.json ]; then
@@ -357,19 +357,19 @@ jobs:
357
357
  - name: Generate and upload gate evidence
358
358
  if: env.DEVAUDIT_BASE_URL != ''
359
359
  run: |
360
- chmod +x scripts/upload-evidence.sh scripts/report-test-cycle.sh 2>/dev/null || true
360
+ chmod +x scripts/upload-evidence.sh scripts/report-test-execution.sh 2>/dev/null || true
361
361
  FLAGS="--git-sha ${{ github.sha }} --ci-run-id ${{ github.run_id }} --branch ${{ github.ref_name }}"
362
362
  FLAGS="${FLAGS} --release ${{ needs.register-release.outputs.version }} --create-release-if-missing"
363
363
  FLAGS="${FLAGS} --environment uat"
364
364
  FLAGS="${FLAGS} --sdlc-stage 2"
365
- PRIMARY_LINEAGE_FLAGS=(--test-cycle "${{ github.run_id }}")
366
- CYCLE_OUT="$(mktemp)"
367
- bash scripts/report-test-cycle.sh start \
365
+ PRIMARY_LINEAGE_FLAGS=(--test-execution "${{ github.run_id }}")
366
+ EXECUTION_OUT="$(mktemp)"
367
+ bash scripts/report-test-execution.sh start \
368
368
  --project-slug {{PROJECT_SLUG}} \
369
369
  --release "${{ needs.register-release.outputs.version }}" \
370
370
  --sdlc-stage 2 \
371
371
  --environment uat \
372
- --cycle-kind quality_gate \
372
+ --suite-kind quality_gate \
373
373
  --provider github_actions \
374
374
  --external-run-id "${{ github.run_id }}" \
375
375
  --external-run-attempt "${{ github.run_attempt }}" \
@@ -378,11 +378,11 @@ jobs:
378
378
  --branch "${{ github.ref_name }}" \
379
379
  --workflow-name "Quality Gates" \
380
380
  --workflow-url "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
381
- --output-file "$CYCLE_OUT"
382
- . "$CYCLE_OUT"
383
- rm -f "$CYCLE_OUT"
384
- if [ "${cycle_supported:-false}" = "true" ] && [ -n "${cycle_record_id:-}" ]; then
385
- PRIMARY_LINEAGE_FLAGS+=(--evidence-scope cycle --test-cycle-record-id "${cycle_record_id}")
381
+ --output-file "$EXECUTION_OUT"
382
+ . "$EXECUTION_OUT"
383
+ rm -f "$EXECUTION_OUT"
384
+ if [ "${execution_supported:-false}" = "true" ] && [ -n "${execution_record_id:-}" ]; then
385
+ PRIMARY_LINEAGE_FLAGS+=(--evidence-scope execution --test-execution-record-id "${execution_record_id}")
386
386
  fi
387
387
 
388
388
  UPLOAD_FAILURES=0
@@ -546,7 +546,7 @@ jobs:
546
546
  exit 1
547
547
  fi
548
548
 
549
- - name: Complete primary quality-gate cycle
549
+ - name: Complete primary quality-gate execution
550
550
  if: always() && env.DEVAUDIT_BASE_URL != ''
551
551
  run: |
552
552
  case "${{ job.status }}" in
@@ -554,13 +554,13 @@ jobs:
554
554
  cancelled) OUTCOME=cancelled ;;
555
555
  *) OUTCOME=failed ;;
556
556
  esac
557
- chmod +x scripts/report-test-cycle.sh 2>/dev/null || true
558
- bash scripts/report-test-cycle.sh complete \
557
+ chmod +x scripts/report-test-execution.sh 2>/dev/null || true
558
+ bash scripts/report-test-execution.sh complete \
559
559
  --project-slug {{PROJECT_SLUG}} \
560
560
  --release "${{ needs.register-release.outputs.version }}" \
561
561
  --sdlc-stage 2 \
562
562
  --environment uat \
563
- --cycle-kind quality_gate \
563
+ --suite-kind quality_gate \
564
564
  --provider github_actions \
565
565
  --external-run-id "${{ github.run_id }}" \
566
566
  --external-run-attempt "${{ github.run_attempt }}" \
@@ -42,6 +42,9 @@ jobs:
42
42
  PR_TITLE: ${{ github.event.pull_request.title }}
43
43
  PR_BODY: ${{ github.event.pull_request.body }}
44
44
  HEAD_REF: ${{ github.event.pull_request.head.ref }}
45
+ BASE_REF: ${{ github.event.pull_request.base.ref }}
46
+ INTEGRATION_BRANCH: {{INTEGRATION_BRANCH}}
47
+ RELEASE_BRANCH: {{RELEASE_BRANCH}}
45
48
  run: |
46
49
  chmod +x scripts/check-release-pr-scope.sh 2>/dev/null || true
47
50
  bash scripts/check-release-pr-scope.sh
package/sdlc/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metasession.co/devaudit-sdlc",
3
- "version": "0.3.18",
3
+ "version": "0.3.20",
4
4
  "description": "DevAudit SDLC CLI Engine — cross-agent terminal-driven SDLC orchestrator.",
5
5
  "bin": {
6
6
  "devaudit-sdlc": "./src/bin/devaudit-sdlc.js"
@@ -82,7 +82,7 @@ A release is classified by version shape and release mode. **Most of this doc wa
82
82
 
83
83
  ### Housekeeping outcomes
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
+ 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 executions.
86
86
 
87
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.
88
88
 
@@ -173,27 +173,27 @@ Rules:
173
173
  - `environment_gap` and `precondition_gap` skips must be resolved before listing — if they appear here, the gate is not truly `SKIPPED` with operator approval.
174
174
  - A skipped test never proves an acceptance criterion.
175
175
 
176
- ## Test Cycles
176
+ ## Test Executions
177
177
 
178
- 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:
178
+ Prefer the first-class release-journey / execution API when the portal exposes it. Generate the table from the API response rather than inferring executions from uploaded files:
179
179
 
180
180
  ```bash
181
181
  # Example:
182
182
  curl -s -H "Authorization: Bearer ${DEVAUDIT_API_KEY}" \
183
183
  "${DEVAUDIT_BASE_URL%/}/api/projects/<slug>/releases/REQ-XXX/journey" \
184
184
  > /tmp/release-journey.json
185
- bash scripts/render-test-cycles.sh /tmp/release-journey.json
185
+ bash scripts/render-test-executions.sh /tmp/release-journey.json
186
186
  ```
187
187
 
188
- 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.
188
+ The helper renders a first-class table when `.testExecutions[]` is present. It must not infer executions from legacy artifact grouping.
189
189
 
190
- | Source Release | SDLC Stage | Cycle | Kind | Outcome | Workflow / Run | Related Evidence | Incident / Remediation | Date |
190
+ | Source Release | SDLC Stage | Execution | Kind | Outcome | Workflow / Run | Related Evidence | Incident / Remediation | Date |
191
191
  | --- | --- | --- | --- | --- | --- | --- | --- | --- |
192
192
  | 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 |
193
193
  | 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 |
194
194
  | 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 |
195
195
 
196
- **Final assessment:** [First-class cycle records show all stage cycles passed / N cycles failed — see incidents]
196
+ **Final assessment:** [First-class test execution records show all stage executions passed / N executions failed — see incidents]
197
197
 
198
198
  ## Bundled Release Context
199
199
 
@@ -338,12 +338,12 @@ status: "nil"
338
338
 
339
339
  ## Attestation
340
340
 
341
- No incidents or defects were discovered during the test cycle for release `<version>`.
341
+ No incidents or defects were discovered during the test execution for release `<version>`.
342
342
 
343
343
  ## Scope
344
344
 
345
345
  - **Release:** <version>
346
- - **Test cycle:** <description>
346
+ - **Test execution:** <description>
347
347
  - **Test cases executed:** <count>
348
348
  - **Test cases passed:** <count>
349
349
  - **Test cases failed:** 0
@@ -352,7 +352,7 @@ No incidents or defects were discovered during the test cycle for release `<vers
352
352
 
353
353
  ## Framework attribution
354
354
 
355
- - [x] `ISO29119.3.5.4` (Test incident report — nil report for this release cycle)
355
+ - [x] `ISO29119.3.5.4` (Test incident report — nil report for this release execution)
356
356
 
357
357
  ## Sign-off
358
358
 
@@ -179,7 +179,7 @@ CI runs automatically on this PR. The following gates must pass before merge:
179
179
  - [ ] Implementation plan present and matches implementation (MEDIUM/HIGH risk)
180
180
  - [ ] Release ticket created
181
181
  - [ ] Test evidence saved
182
- - [ ] Test execution summary includes Test Cycles section (all CI runs for this release listed)
182
+ - [ ] Test execution summary includes Test Executions section (all CI runs for this release listed)
183
183
  - [ ] Security evidence saved
184
184
  - [ ] AI use documented
185
185
 
@@ -151,7 +151,7 @@ The backend stores both with reviewer identity, SHA, and timestamp. This satisfi
151
151
 
152
152
  1. Wait for `post-deploy-prod.yml` to complete successfully **and** for its host-deployment check to confirm terminal success for the merged SHA.
153
153
  2. Open the release in DevAudit: `https://[DEVAUDIT_BASE_URL]/projects/[PROJECT_SLUG]/releases/[releaseId]`.
154
- 3. Review the production deployment and smoke cycle records, their evidence, and any post-deploy actions logged in the release ticket. Do not approve while either cycle or the host deployment remains queued/in progress.
154
+ 3. Review the production deployment and smoke test execution records, their evidence, and any post-deploy actions logged in the release ticket. Do not approve while either execution or the host deployment remains queued/in progress.
155
155
  4. Click **Approve Production** — status transitions to `prod_approved`.
156
156
  5. Click **Mark as Released** — status transitions to `released`. This dispatches the automated close-out flow.
157
157
 
@@ -67,7 +67,7 @@ The [`sdlc-implementer`](#skills-inventory) skill is the **default way to implem
67
67
  > Implement issue #N under the SDLC.
68
68
  ```
69
69
 
70
- It **triages first** (Phase 0): it reads the issue + labels, classifies the change-type against the [change-workflows](https://github.com/metasession-dev/DevAudit-Installer/blob/main/docs/change-workflows.md) taxonomy, announces a **Workflow Decision** (which path, which gates, which approvals, what's skipped), and routes — only a tracked change continues into the full cycle; housekeeping / trivial / doc-only is announced and handed off to its lighter path. So pointing the skill at an issue no longer defaults to maximum ceremony — it decides the path at pickup.
70
+ It **triages first** (Phase 0): it reads the issue + labels, classifies the change-type against the [change-workflows](https://github.com/metasession-dev/DevAudit-Installer/blob/main/docs/change-workflows.md) taxonomy, announces a **Workflow Decision** (which path, which gates, which approvals, what's skipped), and routes — only a tracked change continues into the full execution; housekeeping / trivial / doc-only is announced and handed off to its lighter path. So pointing the skill at an issue no longer defaults to maximum ceremony — it decides the path at pickup.
71
71
 
72
72
  For a tracked change it then runs Phases 1–4 unattended (with a plan-approval pause for HIGH/CRITICAL risk, or always-on via `--require-plan-approval`): classify risk, assign the next `REQ-XXX`, write the implementation plan, update `RTM.md`, implement, delegate all end-to-end / visual test work to [`e2e-test-engineer`](#skills-inventory), run the gates, compile evidence, open the PR, and submit for UAT review on the portal. It then **halts** at the UAT gate. After a reviewer approves on the portal:
73
73
 
@@ -77,9 +77,9 @@ For a tracked change it then runs Phases 1–4 unattended (with a plan-approval
77
77
 
78
78
  It runs Phase 5: merge, monitor post-deploy, confirm production smoke evidence, advance the release. If changes are requested at UAT instead of approval, it addresses them and re-submits for UAT re-review. It **refuses** issues that decompose into multiple requirements (split them first).
79
79
 
80
- **Where it routes (the Phase-0 decision):** the skill now makes this call at pickup rather than you discovering mid-PR that you over- (or under-) ceremonied. It still **drives each path to completion** — these are the paths it takes *instead of* the full tracked cycle, not points where it abandons you:
80
+ **Where it routes (the Phase-0 decision):** the skill now makes this call at pickup rather than you discovering mid-PR that you over- (or under-) ceremonied. It still **drives each path to completion** — these are the paths it takes *instead of* the full tracked execution, not points where it abandons you:
81
81
 
82
- - **Trivial / housekeeping changes** → the skill drives the lightweight escape hatch (above) to merge: branch → all gates locally → `chore:`/`docs:`/`ci:` PR → review → merge. No requirement, no tracked cycle, but it guides every step. Docs, formatting, dependency bumps, CI tweaks (`docs:` / `chore:` / `ci:` …) don't need a requirement. (Note: `feat` / `fix` / `refactor` / `perf` commits **do** require a `[REQ-XXX]` / `Ref: REQ-XXX` and are rejected by commitlint + `validate-commits.sh` without one.)
82
+ - **Trivial / housekeeping changes** → the skill drives the lightweight escape hatch (above) to merge: branch → all gates locally → `chore:`/`docs:`/`ci:` PR → review → merge. No requirement, no tracked execution, but it guides every step. Docs, formatting, dependency bumps, CI tweaks (`docs:` / `chore:` / `ci:` …) don't need a requirement. (Note: `feat` / `fix` / `refactor` / `perf` commits **do** require a `[REQ-XXX]` / `Ref: REQ-XXX` and are rejected by commitlint + `validate-commits.sh` without one.)
83
83
  - **Compliance-doc-only** → the skill drives a docs push against an **existing** `REQ-XXX` through to merge; no new requirement, no quality gates.
84
84
  - **Stage-1 planning in isolation, or e2e test work alone** → run the manual walkthrough / invoke `e2e-test-engineer` directly.
85
85
  - **Cross-issue refactors** spanning multiple `REQ-XXX` scopes → out of the one-issue contract; the skill refuses and asks you to split.