diff --git a/.github/workflows/issue-gate.yml b/.github/workflows/issue-gate.yml index 164fe0ce5..57c4d2912 100644 --- a/.github/workflows/issue-gate.yml +++ b/.github/workflows/issue-gate.yml @@ -13,7 +13,10 @@ jobs: check-linked-issue: runs-on: ubuntu-latest # Closes #1059: bypass Issue Gate for trusted bots (Dependabot opens dep PRs without issues) - if: github.actor != 'dependabot[bot]' && github.actor != 'github-actions[bot]' + if: >- + github.actor != 'dependabot[bot]' && github.actor != 'github-actions[bot]' + && github.event.pull_request.user.login != 'dependabot[bot]' + && github.event.pull_request.user.login != 'github-actions[bot]' steps: - name: Check for linked issues in PR env: diff --git a/.github/workflows/l1-traceability.yml b/.github/workflows/l1-traceability.yml index 24089ac71..2fcba854f 100644 --- a/.github/workflows/l1-traceability.yml +++ b/.github/workflows/l1-traceability.yml @@ -9,7 +9,10 @@ jobs: name: Check L1 TRACEABILITY runs-on: ubuntu-latest # Closes #1059: bypass L1 gate for trusted bots (Dependabot maintains deps, not features) - if: github.actor != 'dependabot[bot]' && github.actor != 'github-actions[bot]' + if: >- + github.actor != 'dependabot[bot]' && github.actor != 'github-actions[bot]' + && github.event.pull_request.user.login != 'dependabot[bot]' + && github.event.pull_request.user.login != 'github-actions[bot]' steps: - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/now-sync-gate.yml b/.github/workflows/now-sync-gate.yml index 68b42c8c8..feb8cb319 100644 --- a/.github/workflows/now-sync-gate.yml +++ b/.github/workflows/now-sync-gate.yml @@ -9,7 +9,10 @@ jobs: check-now-freshness: runs-on: ubuntu-latest # Closes #1059: bypass NOW Sync Gate for trusted bots (deps PRs don't touch docs/NOW.md) - if: github.actor != 'dependabot[bot]' && github.actor != 'github-actions[bot]' + if: >- + github.actor != 'dependabot[bot]' && github.actor != 'github-actions[bot]' + && github.event.pull_request.user.login != 'dependabot[bot]' + && github.event.pull_request.user.login != 'github-actions[bot]' steps: - uses: actions/checkout@v4 with: diff --git a/docs/NOW.md b/docs/NOW.md index 5a69bc3d2..ab6aebe80 100644 --- a/docs/NOW.md +++ b/docs/NOW.md @@ -2,6 +2,12 @@ Last updated: 2026-06-14 +## ci-bot-bypass-author-guard -- harden trusted-bot gate bypass against human branch-updates (Closes #1031) + +- **WHERE** (CI only): `.github/workflows/l1-traceability.yml`, `.github/workflows/issue-gate.yml`, `.github/workflows/now-sync-gate.yml`. Each gate job's `if:` guard is extended from the actor-only check (`github.actor != 'dependabot[bot]' && != 'github-actions[bot]'`) to ALSO require `github.event.pull_request.user.login != 'dependabot[bot]'` and `!= 'github-actions[bot]'`. No source, no specs, no codegen, no conformance JSON, no `gen/` artefacts touched. +- **Why**: the original #1059 bypass keyed only on `github.actor`, which is the Dependabot bot only on its OWN push. When a maintainer clicks 'Update branch' on a Dependabot PR, the resulting `synchronize` event carries `github.actor = `, so all three gates RAN and FAILED (dependency bumps legitimately have no `Closes #N` and no `docs/NOW.md` change), blocking routine dep PRs #1042/#1044/#1045/#1043/#1047/#1048/#1057/#1058 behind branch protection. `github.event.pull_request.user.login` is the PR AUTHOR and stays `dependabot[bot]` regardless of who triggered the event, so bot dependency PRs now SKIP the gates even after a human branch-update; human PRs remain fully gated by Constitutional Law L1. On `push` events `pull_request` is null so the added clause is vacuously true -- existing push behavior of now-sync-gate is unchanged. L6 untouched; L5 untouched (no silicon impact); L4 not applicable (workflow YAML, not a `.t27` spec). Closes #1031. +- **Anchor**: phi^2 + phi^-2 = 3 + ## conformance-structural-to-bitexact -- promote 6 structural packs to bit-precise (IBM HFP, x87, NF4, GFTernary) (Closes #1076) - **WHERE** (conformance vectors): extends `conformance/vectors/gen_all_formats.py` with dedicated reference codecs that promote 6 packs from structural (`bitexact: false`, placeholder) to bit-precise (`bitexact: true`, `abs_error = 0` for every recorded vector): `ibm_hfp32/64/128` (IBM Hexadecimal Floating Point, base-16 exponent, layout S1:E7 excess-64:M, value = 0.M(2) * 16^(E-64)); `x87_fp80` (Intel 80-bit extended with the explicit integer bit as the MSB of the 64-bit significand field, S1:E15:SIG64, bias 16383); `nf4` (QLoRA/bitsandbytes NF4 16-entry quantile table over [-1,1], exhaustive 16-code lookup); `gfternary` (2-bit {-phi, 0, +phi}, exhaustive 4-code enumeration). Adds `make_ibm_hfp_decoder`/`ibm_hfp_encode_exact`, `make_x87_decoder`/`x87_encode_exact`, `make_nf4_decoder` + `NF4_TABLE`, `make_gfternary_decoder`, and routes them in `build_decodable`/`build_bitexact_pack`. Regenerates `INDEX_all_formats.json` (`total_packs=83, bitexact_packs=55, structural_packs=28`) and the 6 affected `*_conformance_v0.json` packs. `README.md` index, counts, SHA-256 block, and a new changelog entry updated. The catalog itself is unchanged at 83 formats; only round-trip depth increases. Follows #1070.