EPIC B: CI + Test Reliability (Week 1-2) — Phase 1: Metadata #37

Closed
opened 2026-05-28 01:03:02 +00:00 by Mark · 6 comments
Owner

Phase 1: Metadata

  • Type: epic
  • Priority: high
  • Area: quality

Decomposed from nodedesk#2

## Phase 1: Metadata - Type: epic - Priority: high - Area: quality --- _Decomposed from [nodedesk#2](https://forgejo.tail018ac4.ts.net/Mark/nodedesk/issues/2)_
Author
Owner

⏸ Needs Decision

Blocking factors:

  • Didn't meet auto-approve criteria — scope=medium, risk=low, spec=aligned

Scope: medium Risk: low Spec: aligned Type: enhancement
Summary: Phase 1 of CI + Test Reliability epic establishing the foundational CI pipeline metadata (Forgejo Actions workflow, test categorization, reporting config) for a project that has zero existing CI infrastructure.
Suggestion: Create .forgejo/workflows/ci.yml with lint → build → test:e2e stages. Wire up vitest as a test:unit script in package.json. Add test metadata/tagging to Playwright spec files (e.g. @fast, @smoke, @critical tags) for selective CI execution. Configure CI-only env via secrets or .env.ci template. Mock/stub S3 and Stripe for CI to keep the pipeline self-contained with just Postgres.
Rationale: No CI exists today — no workflow files, no action config, nothing in .forgejo/ or .github/. The 11 e2e tests can only run locally with Docker. Phase 1 (Metadata) logically means laying the CI foundation: workflow YAML, test tags for organized runs, and reporter config. Medium scope because it touches multiple config files (workflow YAML, vitest config, playwright config, env templates, potentially a CI docker-compose override) but no application logic changes. Low risk since it's purely additive infrastructure — broken CI doesn't break the app. Aligned with project spec (build/lint/test scripts already exist, just need automation). Enhancement type — infrastructure quality-of-life, not a feature or bug fix.

Action: Review each blocking factor above. Remove blocked:needs-decision label to route back to triage.

## ⏸ Needs Decision **Blocking factors:** - **Didn't meet auto-approve criteria** — scope=medium, risk=low, spec=aligned --- **Scope:** medium **Risk:** low **Spec:** aligned **Type:** enhancement **Summary:** Phase 1 of CI + Test Reliability epic establishing the foundational CI pipeline metadata (Forgejo Actions workflow, test categorization, reporting config) for a project that has zero existing CI infrastructure. **Suggestion:** Create .forgejo/workflows/ci.yml with lint → build → test:e2e stages. Wire up vitest as a test:unit script in package.json. Add test metadata/tagging to Playwright spec files (e.g. @fast, @smoke, @critical tags) for selective CI execution. Configure CI-only env via secrets or .env.ci template. Mock/stub S3 and Stripe for CI to keep the pipeline self-contained with just Postgres. **Rationale:** No CI exists today — no workflow files, no action config, nothing in .forgejo/ or .github/. The 11 e2e tests can only run locally with Docker. Phase 1 (Metadata) logically means laying the CI foundation: workflow YAML, test tags for organized runs, and reporter config. Medium scope because it touches multiple config files (workflow YAML, vitest config, playwright config, env templates, potentially a CI docker-compose override) but no application logic changes. Low risk since it's purely additive infrastructure — broken CI doesn't break the app. Aligned with project spec (build/lint/test scripts already exist, just need automation). Enhancement type — infrastructure quality-of-life, not a feature or bug fix. **Action:** Review each blocking factor above. Remove `blocked:needs-decision` label to route back to triage.
Author
Owner

GSD VERIFY phase found no changes after implementation.
Worker output: ]11;?\API call failed after 3 retries: HTTP 404: 404 page not found

GSD VERIFY phase found no changes after implementation. Worker output: ]11;?\API call failed after 3 retries: HTTP 404: 404 page not found
Mark closed this issue 2026-08-04 04:34:58 +00:00
Author
Owner

Reopened by kanban QA (task t_4321e76a, 2026-08-04): false-positive closure from the 2026-08-04T04:34:51Z–04:34:58Z reconciliation sweep.

Verification:

  • #37 closed at 2026-08-04T04:34:58Z inside the documented sweep window (7s).
  • Three commits cited by the previous QA verdict DO exist on origin/ci/quality-gates-matrix:
    • 311567a ci(#37): add test metadata and reporting config
    • b8b8a4e test(#37): ci smoke runs on its own port and owns Next lifecycle
    • 69ab45d docs(testing): test suite reliability audit — inventory, flakiness history, P0/P1/P2 gaps (#37)
  • BUT: none of the three commits is merged to origin/main (verified via git merge-base --is-ancestor). All three live on the open, unmerged PR #45 (head=ci/quality-gates-matrix, base=main, created 2026-07-31, last updated 2026-08-04T09:02:10Z).
  • PR #45's title is "ci(#38): matrix quality-gate workflow ..." — its headline is #38, not #37; the three #37 commits are riding along transitively.
  • Issue body still contains only the original Phase 1 metadata placeholder ("Type: epic, Priority: high, Area: quality"). Nothing substantive has been delivered into origin/main for this Phase 1 placeholder.

Pattern: this matches the documented failure mode "work cited via PR but not merged — same recovery: reopen, post evidence, block." The closure reasoning implicitly relies on a PR being merged; the PR is open.

Action requested: review whether to merge PR #45 (which transitively delivers the #37 commits) or re-scope the #37 closure against the actual main HEAD. Closing this issue on the basis of unmerged PR work is the same false-positive class as Mark/nodedesk#38 (reopened 2026-08-04T09:01:13Z).

Reopened by kanban QA (task t_4321e76a, 2026-08-04): false-positive closure from the 2026-08-04T04:34:51Z–04:34:58Z reconciliation sweep. Verification: - #37 closed at 2026-08-04T04:34:58Z inside the documented sweep window (7s). - Three commits cited by the previous QA verdict DO exist on `origin/ci/quality-gates-matrix`: - 311567a ci(#37): add test metadata and reporting config - b8b8a4e test(#37): ci smoke runs on its own port and owns Next lifecycle - 69ab45d docs(testing): test suite reliability audit — inventory, flakiness history, P0/P1/P2 gaps (#37) - BUT: none of the three commits is merged to `origin/main` (verified via `git merge-base --is-ancestor`). All three live on the open, unmerged PR #45 (head=ci/quality-gates-matrix, base=main, created 2026-07-31, last updated 2026-08-04T09:02:10Z). - PR #45's title is "ci(#38): matrix quality-gate workflow ..." — its headline is #38, not #37; the three #37 commits are riding along transitively. - Issue body still contains only the original Phase 1 metadata placeholder ("Type: epic, Priority: high, Area: quality"). Nothing substantive has been delivered into `origin/main` for this Phase 1 placeholder. Pattern: this matches the documented failure mode "work cited via PR but not merged — same recovery: reopen, post evidence, block." The closure reasoning implicitly relies on a PR being merged; the PR is open. Action requested: review whether to merge PR #45 (which transitively delivers the #37 commits) or re-scope the #37 closure against the actual main HEAD. Closing this issue on the basis of unmerged PR work is the same false-positive class as Mark/nodedesk#38 (reopened 2026-08-04T09:01:13Z).
Mark reopened this issue 2026-08-04 10:52:53 +00:00
Author
Owner

Reopened by kanban QA (task t_3277dadc, 2026-08-04T15:26Z): second false-positive closure by reconciliation sweep at 2026-08-04T14:30:25Z.

This is the SAME false-positive class as the 2026-08-04T04:34:58Z closure that QA card t_4321e76a already reopened at 10:52:53Z (comment id 50067). The next reconciliation sweep re-closed the issue without the commits ever reaching origin/main.

Verification (2026-08-04T15:25Z, fresh):

  • origin/main HEAD = 3e553e5. Three #37 commits (311567a, b8b8a4e, 69ab45d) confirmed NOT in main's history (git merge-base --is-ancestor returns false for all three). They live on origin/ci/quality-gates-matrix.
  • PR #45 state: open, merged=false, merge_commit_sha=null, updated 2026-08-04T15:14:02Z. Nothing has merged since the 10:52Z reopen.
  • origin/main .forgejo/workflows/ci.yml still has the broken YAML bug t_6707c0dd reported (typecheck step at column 0). Confirms "CI workflow merged: FAIL" verifier finding still stands.
  • origin/main package.json still has no vitest in devDependencies. Confirms "Coverage threshold enforced: FAIL" still stands.
  • 30 days of merge history on origin/main: zero merges.

Recovery: reopened Mark/nodedesk#37. The proper resolution is either (a) merge PR #45 (which transitively delivers the #37 commits), then re-close #37 against the actual merged state; or (b) re-scope the #37 Phase 1 placeholder against origin/main HEAD and acknowledge the work is still un-implemented.

The followup fixup kanban task t_acd2414c ("EPIC B Phase 1 fixup: merge CI + audit + coverage + quarantine to main (#37)") is blocked because all worker attempts have crashed; that is the right place for the implementation to land.

Reopened by kanban QA (task t_3277dadc, 2026-08-04T15:26Z): second false-positive closure by reconciliation sweep at 2026-08-04T14:30:25Z. This is the SAME false-positive class as the 2026-08-04T04:34:58Z closure that QA card t_4321e76a already reopened at 10:52:53Z (comment id 50067). The next reconciliation sweep re-closed the issue without the commits ever reaching origin/main. Verification (2026-08-04T15:25Z, fresh): - origin/main HEAD = 3e553e5. Three #37 commits (311567a, b8b8a4e, 69ab45d) confirmed NOT in main's history (git merge-base --is-ancestor returns false for all three). They live on origin/ci/quality-gates-matrix. - PR #45 state: open, merged=false, merge_commit_sha=null, updated 2026-08-04T15:14:02Z. Nothing has merged since the 10:52Z reopen. - origin/main .forgejo/workflows/ci.yml still has the broken YAML bug t_6707c0dd reported (typecheck step at column 0). Confirms "CI workflow merged: FAIL" verifier finding still stands. - origin/main package.json still has no vitest in devDependencies. Confirms "Coverage threshold enforced: FAIL" still stands. - 30 days of merge history on origin/main: zero merges. Recovery: reopened Mark/nodedesk#37. The proper resolution is either (a) merge PR #45 (which transitively delivers the #37 commits), then re-close #37 against the actual merged state; or (b) re-scope the #37 Phase 1 placeholder against origin/main HEAD and acknowledge the work is still un-implemented. The followup fixup kanban task t_acd2414c ("EPIC B Phase 1 fixup: merge CI + audit + coverage + quarantine to main (#37)") is blocked because all worker attempts have crashed; that is the right place for the implementation to land.
Author
Owner

Reopened by kanban QA (t_20cfb982, third false-positive closure by reconciliation sweep):

Verification (2026-08-04):

  • Issue #37 closed at 2026-08-04T15:26Z — third identical false-positive closure.
  • PR #45 (open, mergeable) on branch ci/quality-gates-matrix contains the three #37 commits:
    • 311567a ci(#37): add test metadata and reporting config
    • b8b8a4e test(#37): ci smoke runs on its own port and owns Next lifecycle
    • 69ab45d docs(testing): test suite reliability audit
  • PR #45 ci.yml (139 lines) has proper job structure: lint, typecheck, unit-test matrix, build — all properly indented.
  • PR #45 has NOT been merged to origin/main (HEAD 3e553e5).
  • Fix status: PR exists and is mergeable; needs human review + merge.

Reopening to prevent the sweep from re-closing.

Reopened by kanban QA (t_20cfb982, third false-positive closure by reconciliation sweep): Verification (2026-08-04): - Issue #37 closed at 2026-08-04T15:26Z — third identical false-positive closure. - PR #45 (open, mergeable) on branch `ci/quality-gates-matrix` contains the three #37 commits: - 311567a ci(#37): add test metadata and reporting config - b8b8a4e test(#37): ci smoke runs on its own port and owns Next lifecycle - 69ab45d docs(testing): test suite reliability audit - PR #45 ci.yml (139 lines) has proper job structure: lint, typecheck, unit-test matrix, build — all properly indented. - PR #45 has NOT been merged to origin/main (HEAD 3e553e5). - Fix status: PR exists and is mergeable; needs human review + merge. Reopening to prevent the sweep from re-closing.
Mark closed this issue 2026-08-07 15:28:32 +00:00
Author
Owner

Verification complete (kanban fixup card t_acd2414c, 2026-08-10). All Phase 1 acceptance criteria are now met on main.

Deliverables merged:

  • PR #45 (ci/quality-gates-matrix) merged 2026-08-07, merge commit 18a1c16: matrix CI workflow (lint/typecheck/unit/integration/coverage/build), vitest unit test step with junit artifact upload, @vitest/coverage-v8 + lcov/cobertura reporting with threshold gate (ci(#50) 296f812), per-job timeouts (ci(#47) 6040525).
  • docs/testing/audit.md on main (69ab45d, #37): test inventory, flakiness history, P0/P1/P2 gap analysis.
  • Flaky-test quarantine on main: @quarantine tag + --grep-invert exclusion (aff9b9e, #49); worklog-timer.spec.ts quarantined (b299743, #53); attachments.spec.ts quarantined then fixed by wiring NoteAttachments (9cc0c75, #51); settings.spec.ts quarantined then root-caused and un-quarantined (646635e/52c51df, #52).
  • Sub-issues with root-cause hypotheses: #49 (quarantine plan), #51 (attachments stale assertion), #52 (settings signup->dashboard 500), #53 (worklog-timer fixed sleeps). All closed.
  • CI YAML on main parses cleanly; successful runs 5150 and 5172 on the merged workflow.

Status: issue closed 2026-08-07T15:28:32Z.

Verification complete (kanban fixup card t_acd2414c, 2026-08-10). All Phase 1 acceptance criteria are now met on main. Deliverables merged: - PR #45 (ci/quality-gates-matrix) merged 2026-08-07, merge commit 18a1c16: matrix CI workflow (lint/typecheck/unit/integration/coverage/build), vitest unit test step with junit artifact upload, @vitest/coverage-v8 + lcov/cobertura reporting with threshold gate (ci(#50) 296f812), per-job timeouts (ci(#47) 6040525). - docs/testing/audit.md on main (69ab45d, #37): test inventory, flakiness history, P0/P1/P2 gap analysis. - Flaky-test quarantine on main: @quarantine tag + --grep-invert exclusion (aff9b9e, #49); worklog-timer.spec.ts quarantined (b299743, #53); attachments.spec.ts quarantined then fixed by wiring NoteAttachments (9cc0c75, #51); settings.spec.ts quarantined then root-caused and un-quarantined (646635e/52c51df, #52). - Sub-issues with root-cause hypotheses: #49 (quarantine plan), #51 (attachments stale assertion), #52 (settings signup->dashboard 500), #53 (worklog-timer fixed sleeps). All closed. - CI YAML on main parses cleanly; successful runs 5150 and 5172 on the merged workflow. Status: issue closed 2026-08-07T15:28:32Z.
Sign in to join this conversation.
No description provided.