Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
3ca63b4
feat: implement issue #1202 — [Phase 1] safety-checks lib with sc_des…
claude Oct 1, 2026
5ac4215
fix(lint): exclude tests/fixtures/safety-checks/** from markdownlint
claude Oct 1, 2026
5bf8a81
refactor(safety-checks): adopt review suggestions on sc_description_m…
claude Oct 1, 2026
8f3e01c
fix(reviews): address review comments [skip ci-relay]
don-petry Oct 1, 2026
a7b2c83
fix(bot): address bot feedback [skip ci-relay]
don-petry Oct 1, 2026
9297607
fix(safety-checks): close remaining #1976-class gaps; harden tests wo…
claude Oct 2, 2026
6ec4940
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 2, 2026
60f7c33
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 2, 2026
c30e1c8
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 2, 2026
5f7f6fb
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 3, 2026
3d5b636
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 3, 2026
46c4d5e
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 3, 2026
37d31b9
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 3, 2026
2340d82
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 3, 2026
8a2c58e
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 3, 2026
37fe29f
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 4, 2026
ff5b610
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 4, 2026
2805d38
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 4, 2026
0b981d6
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 5, 2026
cf18377
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 7, 2026
0885814
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 8, 2026
1301e63
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 9, 2026
55e0fcf
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 10, 2026
3947c1d
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 10, 2026
1ef42a0
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 10, 2026
c7720dc
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 10, 2026
3b1334e
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 10, 2026
2243118
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 10, 2026
b89c520
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 10, 2026
606cd4d
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 10, 2026
6dbd017
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 10, 2026
88a1684
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
a710d30
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
0c8da13
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
4ec9d81
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
d74779e
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
5e77074
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
6bd087f
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
122a210
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
d50a497
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
0f8191c
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
a0ec8bd
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
17c174c
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
91b8193
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
dbb8a61
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
7dd7beb
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 11, 2026
d9bea54
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 12, 2026
bca14a9
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 12, 2026
68437b4
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 12, 2026
9b159f1
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 13, 2026
f9055bd
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 14, 2026
2c8d7a7
Merge main (org renamed to combsmith) into claude/cool-babbage-ff8b77
don-petry Oct 14, 2026
d157100
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 14, 2026
8c69cd2
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 14, 2026
6fa1589
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 14, 2026
b207c68
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 16, 2026
6b40fd3
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 18, 2026
2ad41ee
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 18, 2026
d8abfde
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 18, 2026
1b8f4f2
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 20, 2026
65f8b38
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 20, 2026
25340a0
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 20, 2026
c79e1bf
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 20, 2026
e917bf5
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 20, 2026
516cc9c
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 20, 2026
1af1719
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 21, 2026
c4fb0bb
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 21, 2026
35a1710
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 21, 2026
56107ed
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 22, 2026
7d147fc
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 25, 2026
f093ba7
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 25, 2026
bf5bd83
Merge branch 'main' into claude/cool-babbage-ff8b77
don-petry Oct 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions .github/workflows/safety-checks-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# Quality gate for scripts/lib/safety-checks.sh — the sourceable PR-safety
# signal helpers backing the Layer 1 spam-pr-guard scorer (epic #1200,
# story #1202).
#
# Scope: tests sc_description_missing, which replaces the naive keyword grep
# that let an unfilled PR template score 0/5 missing — the regression that
# allowed combsmith/.github-private#1976 through automation.
#
# Pattern mirrors .github/workflows/agents-md-rules-tests.yml: pinned
# actions/checkout, path-filtered triggers, read-only token, bats runner.
# ShellCheck for the lib itself is covered by this workflow's bats "passes
# shellcheck" case AND by ci.yml's org-wide ShellCheck job over scripts/**.

name: Safety Checks Tests

on:
pull_request:
paths:
- 'scripts/lib/safety-checks.sh'
- 'tests/test_safety_checks.bats'
- 'tests/fixtures/safety-checks/**'
- '.github/workflows/safety-checks-tests.yml'
push:
branches:
- main
paths:
- 'scripts/lib/safety-checks.sh'
- 'tests/test_safety_checks.bats'
- 'tests/fixtures/safety-checks/**'
- '.github/workflows/safety-checks-tests.yml'

permissions: {}

# github.sha scopes the concurrency group per-commit, not per-ref: a rapid
# push sequence then cancels only its own in-flight run, so the LATEST
# commit always keeps its own test result (otherwise a push-then-push race
# cancels this run against the newer sha and the merged head has no test
# evidence of its own).
concurrency:
group: safety-checks-tests-${{ github.ref }}-${{ github.sha }}
cancel-in-progress: true

jobs:
test:
name: Validate PR-safety signal helpers
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 1
# Read-only test job — never pushes; don't leave the token in git config.
persist-credentials: false

# Bounded retries so a transient apt mirror / DNS blip retries instead of
# failing the quality gate — same shape as .github/workflows/ci-tests.yml
# (the fleet convention for apt-based installs, issue #935 class).
- name: Install bats and shellcheck
run: |
set -euo pipefail
for attempt in {1..3}; do
if sudo apt-get update -qq \
&& sudo apt-get install -y --no-install-recommends bats shellcheck; then
exit 0
fi
if [ "$attempt" -lt 3 ]; then
echo "Apt install failed, retrying in 5 seconds..." >&2
sleep 5
fi
done
echo "Apt install failed after 3 attempts" >&2
exit 1

- name: Run bats suite
run: |
bats --print-output-on-failure tests/test_safety_checks.bats
4 changes: 4 additions & 0 deletions .markdownlint-cli2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ ignores:
# levels, dangling cross-references, …) so scripts/agents-md-lint.sh has a
# negative case per failure mode. Linting them as real docs would always fail.
- "tests/fixtures/agents-md/**"
# Safety-checks fixtures mimic real PR descriptions, including the
# unfilled-template body that motivated epic #1200 — they start at ## by
# design (PR bodies have no H1 title), so MD041 would always fire.
- "tests/fixtures/safety-checks/**"

config:
MD010:
Expand Down
Loading
Loading