OPS65 — CI do main em janela de 30 min + matar o agent-pool #80

Merged
fsolla merged 1 commit from OPS65-ci-do-main-em-janela-de-30-min-matar-o-agent-pool-work into main 2026-08-19 00:42:46 +00:00
Owner

Closes #64

OPS65: CI do main em janela fixa de 30 min + agent-pool morto. Fundido com a estrutura X1 do OPS62 (job único checks sequencial).

  • ci.yml: on: push removido → schedule */30 + workflow_dispatch.
  • Job gate (runs-on host, main-only, sem pnpm): lê a revision do container rodando no homeserver (docker inspect → label org.opencontainers.image.revision — o compose pode mentir após rollback falho), diffa git diff --name-only <rev> HEAD e classifica "mudança de produção" pelo .dockerignore (fonte da verdade do artefato — docs/, .agents/, .env* viram skip; scripts/, tests/, .forgejo/, AGENTS.md contam como produção, conservador). Deployed == HEAD → suite + deploy skipped, run verde; estado desconhecido → suite roda (verde); gate incapaz de classificar → run vermelho (nunca blackout silencioso).
  • Deploy duplo-gated (needs: [checks, gate] + if: needs.checks.result == 'success' && needs.gate.outputs.production == 'true') — nunca deploy às cegas nem com suite vermelha.
  • deploy-homeserver.sh: guard "already deployed" idempotente (revision do container já no SHA → skip verde, sem rebuild).
  • agent-pool.yml removido (tick */10 custava 144 pnpm install/dia); scripts/skills do pool dormentes (AGENT-OPS e skills marcados).
  • Testes: dockerignoreMatch + ciClassifyProduction unit (matcher contra o .dockerignore real, fail-open, dispatch, caminho git com repo scratch, exit codes); pins ciSkipInvariants/deployScript; HIGH_RISK_EXACT += classificador.
  • Docs: runbook docs/ops/teqo-1313-deploy.md (janela/gate/verificação ao vivo/falhas), AGENTS.md, AGENT-OPS.md (tabela X1 fundida), changelog OPS65.
  • Impl plan: docs/plans/ops65-ci-main-janela-30min-e-matar-pool-impl.md (aprovado na sessão); intenção marcada entregue.

Nota: a classificação segue a direção explícita do plano (.dockerignore como fonte da verdade) — o exemplo do aceite "só docs/scripts/skills/AGENTS → skip" não vale literalmente, pois scripts//tests/.forgejo/AGENTS.md estão no build context (COPY . .) e contam como produção (conservador, falha fechado).

Hardening pós-/simplify (3 reviewers): revision do container como verdade (rollback-falho), gate vermelho em erro de classificação, ref guard github.ref == 'refs/heads/main', setup-node explícito no host, invocação única do classificador, docs do pool marcados dormentes.

Closes #64 OPS65: CI do main em janela fixa de 30 min + agent-pool morto. Fundido com a estrutura X1 do OPS62 (job único `checks` sequencial). - `ci.yml`: `on: push` removido → `schedule */30` + `workflow_dispatch`. - Job `gate` (runs-on `host`, main-only, sem pnpm): lê a **revision do container rodando** no homeserver (`docker inspect` → label `org.opencontainers.image.revision` — o compose pode mentir após rollback falho), diffa `git diff --name-only <rev> HEAD` e classifica "mudança de produção" pelo `.dockerignore` (fonte da verdade do artefato — `docs/`, `.agents/`, `.env*` viram skip; `scripts/`, `tests/`, `.forgejo/`, `AGENTS.md` contam como produção, conservador). Deployed == HEAD → suite + deploy skipped, run verde; estado desconhecido → suite roda (verde); **gate incapaz de classificar → run vermelho** (nunca blackout silencioso). - Deploy duplo-gated (`needs: [checks, gate]` + `if: needs.checks.result == 'success' && needs.gate.outputs.production == 'true'`) — nunca deploy às cegas nem com suite vermelha. - `deploy-homeserver.sh`: guard "already deployed" idempotente (revision do container já no SHA → skip verde, sem rebuild). - `agent-pool.yml` removido (tick `*/10` custava 144 `pnpm install`/dia); scripts/skills do pool dormentes (AGENT-OPS e skills marcados). - Testes: `dockerignoreMatch` + `ciClassifyProduction` unit (matcher contra o `.dockerignore` real, fail-open, dispatch, caminho git com repo scratch, exit codes); pins `ciSkipInvariants`/`deployScript`; `HIGH_RISK_EXACT` += classificador. - Docs: runbook `docs/ops/teqo-1313-deploy.md` (janela/gate/verificação ao vivo/falhas), `AGENTS.md`, `AGENT-OPS.md` (tabela X1 fundida), changelog OPS65. - Impl plan: `docs/plans/ops65-ci-main-janela-30min-e-matar-pool-impl.md` (aprovado na sessão); intenção marcada entregue. Nota: a classificação segue a direção explícita do plano (`.dockerignore` como fonte da verdade) — o exemplo do aceite "só docs/scripts/skills/AGENTS → skip" não vale literalmente, pois `scripts/`/`tests`/`.forgejo`/`AGENTS.md` estão no build context (`COPY . .`) e contam como produção (conservador, falha fechado). Hardening pós-/simplify (3 reviewers): revision do container como verdade (rollback-falho), gate vermelho em erro de classificação, ref guard `github.ref == 'refs/heads/main'`, setup-node explícito no host, invocação única do classificador, docs do pool marcados dormentes.
fsolla added 2 commits 2026-08-18 23:11:08 +00:00
- ci.yml: on push removido; schedule */30 + workflow_dispatch
- job check (host, sem pnpm): SHA deployado via ssh + diff + classificador
  .dockerignore (scripts/ci-classify-production.mjs, lib/dockerignore.mjs)
- suite fail-open no gate; deploy duplo-gated (checks + production)
- deploy-homeserver.sh: guard 'already deployed' (idempotente)
- agent-pool.yml removido; pool dormente
- specs: dockerignoreMatch, ciClassifyProduction, pins ciSkipInvariants/deployScript
- docs: runbook, AGENTS.md, AGENT-OPS.md, changelog
docs(OPS65): status entregue no plano de intenção
Some checks failed
CI (PR) / scope (pull_request) Successful in 33s
CI (PR) / lint (pull_request) Successful in 42s
CI (PR) / format (pull_request) Successful in 56s
CI (PR) / docs-guards (pull_request) Successful in 7s
CI (PR) / plans-only-closes (pull_request) Successful in 7s
CI (PR) / typecheck (pull_request) Successful in 32s
CI (PR) / knip (pull_request) Successful in 33s
CI (PR) / cycles (pull_request) Successful in 33s
CI (PR) / unit (pull_request) Successful in 1m7s
CI (PR) / int (pull_request) Failing after 1s
CI (PR) / build (pull_request) Has been skipped
CI (PR) / e2e (1) (pull_request) Failing after 1s
CI (PR) / e2e (2) (pull_request) Failing after 1s
CI (PR) / checks (pull_request) Failing after 1s
PR Ready + auto-merge / ready-automerge (pull_request) Failing after 37m59s
7a02149e1b
fsolla added 1 commit 2026-08-18 23:35:06 +00:00
ops(OPS65): hardening pós-review do gate — revision do container como verdade + gate vermelho em erro de classificação
Some checks failed
PR Ready + auto-merge / ready-automerge (pull_request) Failing after 1s
CI (PR) / scope (pull_request) Failing after 1s
CI (PR) / lint (pull_request) Failing after 1s
CI (PR) / format (pull_request) Failing after 1s
CI (PR) / docs-guards (pull_request) Failing after 1s
CI (PR) / plans-only-closes (pull_request) Failing after 1s
CI (PR) / typecheck (pull_request) Has been skipped
CI (PR) / build (pull_request) Has been skipped
CI (PR) / e2e (1) (pull_request) Has been skipped
CI (PR) / knip (pull_request) Has been skipped
CI (PR) / cycles (pull_request) Has been skipped
CI (PR) / unit (pull_request) Has been skipped
CI (PR) / int (pull_request) Has been skipped
CI (PR) / e2e (2) (pull_request) Has been skipped
CI (PR) / checks (pull_request) Failing after 2s
23c4c7b093
- gate lê label org.opencontainers.image.revision do container rodando
  (compose pode mentir após rollback falho); desconhecido → fail-open verde;
  incapaz de classificar → exit 1 (run vermelho, nunca blackout silencioso)
- gate main-only (github.ref) + setup-node explícito; deploy guard usa a
  mesma revision (idempotência à prova de rollback-falho)
- docs: runbook (verificação ao vivo, falhas novas), AGENT-OPS (pool dormente),
  skills engineering-audit/model-selection, changelog; impl plan atualizado
fsolla force-pushed OPS65-ci-do-main-em-janela-de-30-min-matar-o-agent-pool-work from 23c4c7b093 to 11fe9298d3 2026-08-18 23:49:54 +00:00 Compare
fsolla force-pushed OPS65-ci-do-main-em-janela-de-30-min-matar-o-agent-pool-work from 11fe9298d3 to 9504c7ccf6 2026-08-19 00:10:28 +00:00 Compare
fsolla merged commit 9504c7ccf6 into main 2026-08-19 00:42:46 +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#80
No description provided.