Skip to content

chore(ci): delete duplicated and dead checks, one sdlc workflow, accurate badges - #454

Open
rita-aga wants to merge 5 commits into
mainfrom
claude/arn-453-ci-cleanup
Open

chore(ci): delete duplicated and dead checks, one sdlc workflow, accurate badges#454
rita-aga wants to merge 5 commits into
mainfrom
claude/arn-453-ci-cleanup

Conversation

@rita-aga

@rita-aga rita-aga commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

CI and the local hooks carried checks that were duplicated, dead, or inaccurate: the pre-push hook re-ran four gates CI already runs (20+ min per push, flaky on ARN-440); a nightly cron duplicated what every main push runs; badges.yml was failing on an expired gist token and produced badges the README never showed while the README's own badges were hardcoded; the verification-contract job validated a report about hook installation on the CI runner; bench compile ran on every main push (~16 min); the SDLC gates were four workflow files.

This PR deletes the pre-push hook, the nightly cron, badges.yml (plus its var and secret on the repo), and the verification-contract job; replaces the README badges with shields.io dynamic-TOML reads of Cargo.toml on main; moves bench compile to bench.yml (weekly + dispatch); and folds the four gate workflows into one sdlc.yml with the same four job names, so branch protection is unchanged. Canonical copy landed in stack (08cebb3, d8f8733), together with the scripts that re-run gates by workflow name.

Panel round 1 also surfaced a real CI gap this PR now closes: three DST test binaries were in no matrix cell and the Tests job skipped every test named dst_*, so the deleted pre-push hook had been the only thing running them. Matrix cells now select binaries by exclusion.

Decisions & Tradeoffs

Decision: Delete the badges workflow and make the README badges dynamic instead of repairing the gist pipeline.
Came up because: badges.yml failed on an expired gist token, and the README never displayed the three badges it generated; its own Rust/version badges were hardcoded (Rita: badges must be accurate).
Options: (a) rotate the token, keep gist badges the README ignores; (b) delete the workflow, switch the README to shields.io dynamic-TOML badges reading Cargo.toml.
Chose (b) over (a) because: accuracy by construction with zero moving parts (no workflow, no secret, no drift); dropped the test-count and crate-count badges as vanity metrics.
Where: README.md badge block; badges.yml removed; BADGE_GIST_ID var + GIST_SECRET deleted.

Decision: Delete the verification-contract CI job rather than adapt it to the missing pre-push hook.
Came up because: removing the pre-push hook broke the job's expectations; auditing it showed it validates a self-report of hook installation on the CI runner.
Options: (a) adapt the checks; (b) delete the job, keep the scripts as a local harness self-report.
Chose (b) over (a) because: the job carried no signal about temper's code — it tested the installer.
Where: ci.yml; docs/HARNESS.md contract section.

Decision: Bench compile moves to a separate weekly+dispatch workflow instead of a schedule inside ci.yml.
Came up because: the nightly schedule is being removed; a weekly schedule inside ci.yml would run every job weekly and need if-gates on all of them.
Options: (a) weekly schedule in ci.yml with if-gates; (b) manual-only; (c) its own small workflow.
Chose (c) over (a)/(b) because: distinct trigger = distinct file (same reasoning as decision-intake); manual-only rots silently.
Where: .github/workflows/bench.yml.

Decision: Consolidate the four gate workflows into one file with four jobs; workflow-level concurrency per PR.
Came up because: Rita's ruling; four files each cloning stack.
Options: (a) one job with four steps (one clone); (b) one workflow, four jobs.
Chose (b) over (a) because: branch protection requires four separate check contexts; (a) would collapse them to one. Runtime is unchanged (each job is its own runner); the win is one file to read and vendor. Re-run scripts that referenced sdlc-review / sdlc-verification by workflow name now target the combined workflow (a rerun re-executes all four gates — acceptable, they are cheap).
Where: stack gates/sdlc.yml (canonical), temper .github/workflows/sdlc.yml; stack proof/post-proof-record.sh, gates/sdlc-decision-intake.yml.

Decision: DST matrix cells select binaries by exclusion (binary(/^dst_/) and not ...) instead of listing them; the Tests job excludes the dst_ binaries instead of test names containing dst_.
Came up because: review (codex) found three dst_ integration binaries (entity_key_index, entity_vector_index, genesis_install_rollback) that no matrix cell ran while the Tests job skipped every test named dst_*; the deleted pre-push hook's full cargo test --workspace had been the only place they ran. The name filter also dropped lib unit tests with dst_ in their name.
Options: (a) add the three binaries to the core cell; (b) define cells by exclusion so an unlisted binary cannot exist.
Chose (b) over (a) because: (a) fixes three instances and leaves the next new dst_ binary uncovered again.
Where: .github/workflows/ci.yml Tests step and dst-matrix-setup.

Decision: Only the review job keeps a concurrency group; the workflow-level group was removed.
Came up because: review (fable) noted the four singles had no shared group; a shared cancel-in-progress let an edited event cancel a proof render mid-Vercel-deploy.
Options: (a) shared group without cancel; (b) job-level group on review only, as before.
Chose (b) over (a) because: it is the previous behavior exactly; the other three jobs are seconds long and idempotent.
Where: sdlc.yml review job (temper and stack).

Decision: Stale pre-push wrappers are removed by both the installer and the pre-commit hook itself.
Came up because: review (codex, fable) - a checkout that ran the old installer has .git/hooks/pre-push exec'ing a script this PR deletes, so its next push fails with exit 127. Reproduced locally.
Options: (a) tell people to re-run setup-hooks.sh; (b) installer removes it; (c) also self-heal from the tracked pre-commit hook, which every such checkout already runs.
Chose (c) over (a)/(b) because: it needs no human step; the commit that precedes the push removes the wrapper.
Where: scripts/setup-hooks.sh, .claude/hooks/pre-commit.sh.

Decision: The Tests job's exclusion is scoped to temper-server (not (package(temper-server) and binary(/^dst_/))) instead of making the core matrix cell workspace-wide.
Came up because: round 2 (codex) - the matrix only runs temper-server, so a dst_ binary in another crate would have been excluded by the Tests job and run nowhere.
Options: (a) core cell --workspace (compiles every crate's tests in that cell too); (b) scope the Tests-job exclusion to the package the matrix covers.
Chose (b) over (a) because: complete coverage in both directions at no extra compile; other crates' dst_ binaries run in the Tests job like any other test.
Where: .github/workflows/ci.yml Tests step.

Decision: Matrix exclusions are anchored regexes (/^dst_platform_boot$/), and the generator's -E expressions are JSON-escaped double quotes inside the single-quoted SUITES string.
Came up because: round 2 - fable found the single-quote nesting was a bash syntax error (CI's matrix setup failed on 1afb3a9; I had pushed a run: block without executing it), and the bare binary(dst_platform_boot) exclusion was a substring match.
Options: none for the syntax error; for the match, bare vs anchored.
Chose anchored because: a future dst_platform_boot_replay binary would otherwise be silently dropped from platform-consistency.
Where: ci.yml dst-matrix-setup. The generator step is now executed locally before push, and a workflows-lint CI job (actionlint) makes the class of error un-mergeable.

Decision: Add an actionlint job to CI.
Came up because: the quoting bug above; actionlint catches it (verified against the broken head), and I had run it only before the matrix edit.
Options: (a) rely on running actionlint by hand; (b) a seconds-long CI job.
Chose (b) over (a) because: a rule I already had and skipped once is not a control; the job is.
Where: .github/workflows/ci.yml job workflows-lint.

Decision: The installer resolves the hooks directory against the repository the script lives in (git -C "$WORKSPACE_ROOT"), not the caller's cwd.
Came up because: round 3 (codex, fable) - my round-2 worktree fix used the cwd's repository, so running the installer by absolute path from another repo would have written temper's hooks there. Reproduced, then driven from a foreign cwd after the fix (foreign repo untouched, temper hooks installed).
Options: (a) cd "$WORKSPACE_ROOT" at the top; (b) git -C.
Chose (b) because: one expression, no cwd side effect for the rest of the script.
Where: scripts/setup-hooks.sh.

Decision: Remove the evidence.push_post_verify self-report check and describe the post-push hook as what it is: a push-completed trace marker, no tests.
Came up because: round 3 (codex) - the report looked for push-pending/test-verified markers that nothing writes; HARNESS.md said the post-push hook runs cargo test. Both were fiction; the check could only ever "skip".
Options: (a) make the hook write the markers the report wants (re-adding push-time tests locally); (b) delete the check and correct the docs.
Chose (b) over (a) because: CI verifies pushed code; a local test run at push time is the thing this effort removed.
Where: scripts/verification-v1-report.sh, docs/internal/verification.v1.mapping.md, docs/HARNESS.md (overview diagram, hook row, Component 6, marker flow, lifecycle diagram).

Decision: The actionlint installer script is fetched from the v1.7.7 tag, not main; the lint and bench jobs declare contents: read; bench.yml installs the toolchain from rust-toolchain.toml instead of a second hard-coded pin.
Came up because: round 3 (fable) - an unpinned script piped to bash in a job with the default token; duplicated nightly pin.
Options: none worth recording for the pin; for the toolchain, (a) duplicate the env var, (b) let rustup read the file.
Chose (b) because: the file is already the source of truth for developers.
Where: .github/workflows/ci.yml workflows-lint, .github/workflows/bench.yml.

Decision: Branch protection is out of scope for this PR and surfaced to the owner instead.
Came up because: round 3 (fable) asked whether required contexts were updated. Checked: nerdsane/temper main has NO branch protection and no rulesets (GitHub API 404 / empty), so no context is required and none blocks a merge today.
Options: (a) add a ruleset from this session; (b) report it.
Chose (b) because: repository settings are the owner's call and were never part of this effort's intent; the gates are enforced by process, not by GitHub, until she decides.
Where: PR #454 completion report.

Decision: ADR-0079 amended in place rather than superseded.
Came up because: round 3 (codex) - the ADR still required the nightly and bench-on-every-non-PR-event.
Options: (a) a new ADR; (b) an amendment section.
Chose (b) because: the rest of ADR-0079 (PR smoke mode, seed shards, concurrency) still stands.
Where: docs/adrs/0079-ci-pr-smoke-and-dst-matrix.md.

Proof

Workflow-only change. Proof is this PR's own run: every kept ci.yml job green, the combined sdlc workflow reporting all four contexts, and the README badges rendering live values from Cargo.toml (rust 1.92+, version 0.1.0) at https://github.com/nerdsane/temper/blob/claude/arn-453-ci-cleanup/README.md.

Author: Claude Fable 5.1 via Claude Code (team lead session, hands-on with Rita).

🤖 Generated with Claude Code

https://claude.ai/code/session_019u3vf9EcwtfEP1FeDf5c4o

Greptile Summary

The PR removes duplicated or obsolete local and CI checks while consolidating the four SDLC gates without changing their job identities. It also restores complete DST test coverage and moves bench compilation to a dedicated weekly workflow.

  • Replaces four SDLC workflow files with one workflow containing planning, decision-log, proof, and review jobs.
  • Partitions all temper-server DST binaries by exclusion and keeps library and other-package tests in the workspace Tests job.
  • Removes the pre-push gate and adds cleanup for stale installed wrappers.
  • Replaces generated gist badges with dynamic Cargo.toml badges and moves bench compilation to weekly/manual execution.
  • Adds actionlint as a required CI job and updates harness documentation to match the revised lifecycle.

Confidence Score: 5/5

The PR appears safe to merge; no concrete changed-code defect remains after checking workflow parity, DST coverage, and stale-hook cleanup.

The consolidated SDLC jobs preserve the former gate behavior, the revised test filters cover every current DST binary exactly once without excluding library tests, and obsolete hook installations are cleaned up through repository-resolved paths.

Important Files Changed

Filename Overview
.github/workflows/ci.yml Adds workflow linting and partitions DST binaries exhaustively while retaining non-matrix tests in the workspace job.
.github/workflows/sdlc.yml Consolidates the four former SDLC workflows into jobs with their prior names, permissions, validation, and routing behavior.
.github/workflows/bench.yml Moves bench compilation to a read-only weekly and manually dispatched workflow using the repository toolchain configuration.
scripts/setup-hooks.sh Stops installing the removed pre-push hook and cleans up stale installer-owned wrappers using repository-relative hook resolution.
.claude/hooks/pre-commit.sh Self-heals existing checkouts by removing the obsolete pre-push wrapper before the next push.
scripts/verification-v1-report.sh Removes the obsolete push-verification self-report check to align the report with the remaining local harness.
README.md Replaces hardcoded metadata badges with dynamic values read from Cargo.toml.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    PR[Pull request event] --> SDLC[sdlc workflow]
    SDLC --> Planning[planning]
    SDLC --> Decisions[decision-log]
    SDLC --> Proof[proof]
    SDLC --> Review[review]
    Push[PR or main/staging push] --> CI[CI workflow]
    CI --> Lint[workflow lint]
    CI --> Workspace[workspace tests excluding temper-server DST binaries]
    CI --> Matrix[DST matrix]
    Matrix --> Core[core DST]
    Matrix --> Boot[platform boot]
    Matrix --> Consistency[platform consistency]
    Matrix --> Random[platform random shards]
    Schedule[Weekly schedule or dispatch] --> Bench[bench build workflow]
Loading

Reviews (1): Last reviewed commit: "docs(hooks): post-push comment states th..." | Re-trigger Greptile

…rate badges

Pre-push hook removed (its four gates already run in CI; it flaked on
ARN-440 and cost 20+ min per push). Nightly cron removed (main pushes run
DST full mode). badges.yml removed (expired gist token, README never showed
its output); README badges are now shields.io dynamic-TOML reads of
Cargo.toml. verification-contract job removed (it tested the hook installer
on the runner, not temper). Bench compile moves to bench.yml, weekly +
dispatch. The four SDLC gate workflows are one file, sdlc.yml, with the
same four job names so branch protection is unchanged.

Refs: ARN-453

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019u3vf9EcwtfEP1FeDf5c4o
@rita-aga

rita-aga commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator Author

Proof record - ARN-453

commit: 6b810e7050 · changed: local-harness-scripts, ci-workflows, readme-badges · blast: none · tests: pass

…heal, review-only concurrency

- DST matrix: cells select binaries by exclusion, so every dst_* binary runs
  somewhere; three (entity_key_index, entity_vector_index,
  genesis_install_rollback) had no cell and the Tests job skipped every test
  named dst_*, including lib unit tests. The deleted pre-push hook had been
  the only place they ran.
- setup-hooks.sh and the pre-commit hook remove the stale pre-push wrapper
  left by the old installer (its target no longer exists).
- sdlc.yml: concurrency group on the review job only, as before the merge.
- verify skill: dev-harness feature entry; stale pre-push mentions fixed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@rita-aga

rita-aga commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator Author

Proof record - ARN-453

commit: 1afb3a9953 · changed: dev-harness · blast: none · tests: pass

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown

Proof of implementation — ARN-453: PASS

nerdsane/temper@d79ce83f6186 · changed: dev-harness · blast: none

  • Tests: fresh clone: bash scripts/setup-hooks.sh; git commit (pre-commit hook); bash scripts/verification-v1-report.sh; bash scripts/verification-v1-validate.sh <report>. Plus cargo test -p temper-server --test dst_entity_key_index --test dst_entity_vector_index --test dst_genesis_install_rollback and cargo test -p temper-server --lib dst_ (the tests CI had never run). CI: the PR's own run on the new workflow set. -> pass
  • Features driven: 1 (0 failed, 0 unreachable)
  • Independent verifier re-ran 1 feature(s), agrees: yes

Full report attached as the proof-report artifact.

Full report: the proof-report artifact on this run (Vercel secrets not set).

…s, actionlint job, worktree-safe installer

- dst-matrix-setup: the -E expressions are JSON-escaped double quotes (the
  nested single quotes were a bash syntax error; matrix setup failed on
  1afb3a9); exclusions are anchored regexes; the Tests job's exclusion is
  scoped to temper-server so other crates' dst_ binaries still run.
  Verified with cargo nextest list: core 8 + consistency 3 + boot + random
  = all 13 dst_ binaries; the Tests job keeps the 11 lib dst_ tests.
- workflows-lint job: actionlint on every run (catches the class above).
- setup-hooks.sh resolves the hooks dir via git rev-parse --git-path, so it
  works in linked worktrees where .git is a file.
- AGENTS.md no longer claims tests run at push time.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@rita-aga

rita-aga commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator Author

RESOLVE: .github/workflows/ci.yml:190 doctests do run - the Tests job has an explicit cargo test --doc --workspace step (ci.yml:213, kept from ARN-439); nextest's doctest gap is already covered.
RESOLVE: .claude/hooks/pre-commit.sh:13 accepted as-is - the self-heal covers every commit-creating operation (commit, amend, rebase, cherry-pick); a push with no local commit after switching to this branch is rare, fails with an explicit pre-push.sh: No such file message, and scripts/setup-hooks.sh fixes it. No hook exists at push time by design.
RESOLVE: stack/review/post-review-record.sh:28 fixed in stack 6762d46 - both record scripts now look the run up with gh run list --commit <head>.

Round 2 act-on items are fixed in 7c359b5: matrix generator quoting (CI's matrix setup failed on 1afb3a9, confirmed), anchored exclusions, worktree-safe installer, plus an actionlint job so the quoting class cannot merge again.

@rita-aga

rita-aga commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator Author

Proof record - ARN-453

commit: 7c359b50e8 · changed: dev-harness · blast: none · tests: pass

…nd self-report say what the hooks do

- setup-hooks.sh: hooks dir from git -C $WORKSPACE_ROOT (round 2 used the
  caller's cwd, so an absolute-path run from another repo would have written
  temper's hooks there). Driven from a foreign cwd after the fix.
- HARNESS.md: no pre-push gate anywhere (overview, hook row, lifecycle);
  Component 6 records a push-completed marker and runs no tests; Component 7
  is disabled in settings and checks cargo check only. The self-report's
  evidence.push_post_verify check looked for markers nothing writes: removed
  (16 checks, validates).
- AGENTS.md: CI runs on pull requests and main/staging pushes, not 'every push'.
- ci.yml workflows-lint: installer pinned to the v1.7.7 tag, contents: read.
  bench.yml: contents: read; toolchain from rust-toolchain.toml.
- ADR-0079 amended: nightly retired, bench weekly.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@rita-aga

rita-aga commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator Author

Local review record - FAIL

Panel: codex, fable · open act-on: 4 · synthesis: panel-runner (non-author) · tier: cloud-sandbox

@rita-aga

rita-aga commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator Author

RESOLVE: scripts/setup-hooks.sh:9 fixed in 0ad5ae2 - HOOKS_DIR is resolved with git -C "$WORKSPACE_ROOT", so the installer always targets the repo it lives in; driven by absolute path from inside an unrelated repo (that repo's hooks untouched, temper's installed).
RESOLVE: .claude/hooks/post-push-verify.sh:30 fixed in 0ad5ae2 - the self-report check that looked for push-pending/test-verified (markers nothing writes) is removed; HARNESS.md Component 6 now says the hook records a push-completed trace marker and runs no tests; report re-run: 16 checks, 0 failed, validates.
RESOLVE: AGENTS.md:74 fixed in 0ad5ae2 - says CI runs on pull requests and on pushes to main/staging, and that a bare branch push starts nothing.
RESOLVE: docs/HARNESS.md:269 fixed in 0ad5ae2 - Component 6 rewritten; the overview diagram, hook row, marker-flow and lifecycle diagrams no longer show a pre-push gate, push-time tests, or the two phantom markers; Component 7 notes the exit gate is disabled in settings and checks cargo check only.

Round 3 record above is for 7c359b5. This PR has now been through three panel rounds; per the convergence rule the next step is the owner's decision, not a round 4 started by the implementer.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@rita-aga

rita-aga commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator Author

Proof record - ARN-453

commit: d79ce83f61 · changed: dev-harness · blast: none · tests: pass

@rita-aga
rita-aga marked this pull request as ready for review September 2, 2026 23:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant