OPS62 — CI: fail-fast estrutural por job único sequencial (X1) #75

Merged
fsolla merged 3 commits from OPS62-ci-cancelar-jobs-irmaos-quando-um-job-falha-fail-fast- into main 2026-08-18 23:26:14 +00:00
Owner

Closes #59

O que muda

ci-pr.yml e ci.yml deixam de ter jobs irmãos: 1 job único checks sequencial (guards → lint → format → typecheck → knip → cycles → unit → int → build → e2e). Step vermelho interrompe o job → run falha → slot do runner liberado imediatamente. Fail-fast estrutural: sem API de cancel (o Forgejo 9.0.3 não tem), sem watchdog, sem upgrade do Forgejo no homeserver.

  • Skips do ci-scope.mjs viram o step id: scope (outputs → if: nos steps pesados).
  • e2e: 1 processo com PLAYWRIGHT_WORKERS=4 (substitui 2 shards × 2 workers).
  • 2 services Postgres por run (int / build+e2e) com portas host derivadas do run_id — o job único segura as duas portas pelo run inteiro e runs concorrentes colidiriam em portas fixas.
  • Contexto CI (PR) / checks preservado (job id checks — contrato do automerger waitForChecks/branch protection, OPS61).
  • deploy (OPS53) segue gated em needs: [checks].
  • Plumbing morto removido: e2eShardConfig + output e2e_shards do classifier.
  • /simplify 3 reviewers aplicados (P1: set -euo pipefail no scope — crash com outputs vazios silenciaria skips; portas por run. P2: pins ancorados em chaves YAML, pin do wiring id: scope/if: e2e_mode == 'full', comentário morto do sharding no playwright.config.ts/TESTING.md). Débito anotado: timeout do waitForChecks (30 min) × job (50 min).

Decisão

A intenção previa watchdog + upgrade do Forgejo 16 (API de cancel). Gate de execução (humano): X1 — job único sequencial, que elimina a dependência de infra (upgrade de produção no homeserver) com o mesmo aceite de produto: run vermelho termina no ato, sem esperar o fim dos demais, logs preservados, suíte verificada idêntica (só o envelope muda).

Impl: docs/plans/ops62-ci-fail-fast-forgejo-impl.md (a intenção fica como histórico do gate). Changelog: docs/changelog/2026-08-18-ops62.md.

Validação ao vivo

O ci-pr deste PR já é o envelope novo: o run verde prova a suíte inteira no job único; medição de parede registrada no run. Sem migration/access/Consent/UI.

Closes #59 ## O que muda `ci-pr.yml` e `ci.yml` deixam de ter jobs irmãos: **1 job único `checks` sequencial** (guards → lint → format → typecheck → knip → cycles → unit → int → build → e2e). Step vermelho interrompe o job → run falha → slot do runner liberado imediatamente. **Fail-fast estrutural**: sem API de cancel (o Forgejo 9.0.3 não tem), sem watchdog, sem upgrade do Forgejo no homeserver. - Skips do `ci-scope.mjs` viram o step `id: scope` (outputs → `if:` nos steps pesados). - e2e: 1 processo com `PLAYWRIGHT_WORKERS=4` (substitui 2 shards × 2 workers). - 2 services Postgres por run (int / build+e2e) com **portas host derivadas do `run_id`** — o job único segura as duas portas pelo run inteiro e runs concorrentes colidiriam em portas fixas. - Contexto `CI (PR) / checks` preservado (job id `checks` — contrato do automerger `waitForChecks`/branch protection, OPS61). - `deploy` (OPS53) segue gated em `needs: [checks]`. - Plumbing morto removido: `e2eShardConfig` + output `e2e_shards` do classifier. - `/simplify` 3 reviewers aplicados (P1: `set -euo pipefail` no scope — crash com outputs vazios silenciaria skips; portas por run. P2: pins ancorados em chaves YAML, pin do wiring `id: scope`/`if: e2e_mode == 'full'`, comentário morto do sharding no `playwright.config.ts`/`TESTING.md`). Débito anotado: timeout do `waitForChecks` (30 min) × job (50 min). ## Decisão A intenção previa watchdog + upgrade do Forgejo 16 (API de cancel). **Gate de execução (humano): X1 — job único sequencial**, que elimina a dependência de infra (upgrade de produção no homeserver) com o mesmo aceite de produto: run vermelho termina no ato, sem esperar o fim dos demais, logs preservados, suíte verificada idêntica (só o envelope muda). Impl: `docs/plans/ops62-ci-fail-fast-forgejo-impl.md` (a intenção fica como histórico do gate). Changelog: `docs/changelog/2026-08-18-ops62.md`. ## Validação ao vivo O ci-pr deste PR **já é o envelope novo**: o run verde prova a suíte inteira no job único; medição de parede registrada no run. Sem migration/access/Consent/UI.
fsolla added 1 commit 2026-08-18 22:02:46 +00:00
chore(OPS62): CI fail-fast estrutural — job único checks sequencial (X1)
Some checks failed
CI (PR) / checks (pull_request) Failing after 1s
PR Ready + auto-merge / ready-automerge (pull_request) Failing after 13s
e5cd4b95b1
ci-pr.yml e ci.yml deixam de ter jobs irmãos: 1 job 'checks' com steps em
série (guards → lint → format → typecheck → knip → cycles → unit → int →
build → e2e). Step vermelho interrompe o job, o run falha e o slot é
liberado — sem API de cancel (Forgejo 9.0.3 não tem), sem watchdog, sem
upgrade do Forgejo. Skips do ci-scope.mjs viram step id 'scope'; e2e em 1
processo com PLAYWRIGHT_WORKERS=4 (substitui 2 shards × 2 workers); 2
services Postgres por run com portas host derivadas do run_id (runs
concorrentes não colidem); contexto 'CI (PR) / checks' preservado (job id
checks — contrato do automerger OPS61); deploy OPS53 gated em needs checks.
Plumbing morto removido (e2eShardConfig/e2e_shards). Docs: AGENT-OPS,
TESTING.md, changelog. Impl: docs/plans/ops62-ci-fail-fast-forgejo-impl.md
(a intenção watchdog+upgrade fica como histórico do gate).
fsolla added 1 commit 2026-08-18 22:28:34 +00:00
fix(OPS62): services por nome na rede do job — Forgejo 9 não expande expressões em ports
Some checks failed
PR Ready + auto-merge / ready-automerge (pull_request) Failing after 14s
CI (PR) / checks (pull_request) Successful in 9m28s
1a2b1169a8
Achado ao vivo (run 730): a expressão ${{ 5433 + (github.run_id % 100) }} no
ports do service não é avaliada pelo Forgejo 9 — o literal ia ao runner e o
job falhava em 1s. E portas fixas colidiriam entre runs concorrentes (o job
único segura os services pelo run inteiro). Correção: services sem publish
host, alcançados por nome na rede do job (postgres-int/postgres-build:5432)
— solução canônica do Actions, mata a colisão de raiz. Guards fail-closed
(LOCAL_HOSTS + assertTestDatabase) admitem os nomes dos services (hosts
internos do runner; hosts remotos continuam rejeitados); pins novos em
localHosts.unit.spec.ts e ciSkipInvariants (sem ports:, URLs por nome).
fsolla force-pushed OPS62-ci-cancelar-jobs-irmaos-quando-um-job-falha-fail-fast- from 1a2b1169a8 to 659f25f076 2026-08-18 22:56:41 +00:00 Compare
fsolla added 1 commit 2026-08-18 23:08:51 +00:00
style: prettier no AGENT-OPS pós-resolução de conflito do rebase
All checks were successful
CI (PR) / checks (pull_request) Successful in 7m32s
PR Ready + auto-merge / ready-automerge (pull_request) Successful in 7m47s
Agent pool supervisor / tick (pull_request) Successful in 28s
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 12s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
1606c31281
fsolla merged commit a6c8ece2f5 into main 2026-08-18 23:26:14 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: fsolla/teqo#75
No description provided.