Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
0f36a4f
feat(research_extensions): RE001 accepts a deed egress declaration (s…
claude Oct 27, 2026
d6b8d82
docs(changelog): RE001 egress declaration (standards ADR-009)
claude Oct 27, 2026
a154977
Hypatia.Deed: accept var:NAME egress endpoints (standards egress.abnf)
claude Oct 27, 2026
0bcbd55
docs: the standards egress checker is deed_lint.js --egress
claude Oct 27, 2026
8ec360d
ci: run the RE001 and deed reader tests in the rule regression step
claude Oct 27, 2026
36cfb21
Hypatia.Deed, RE001: uppercase secret names, top-level egress only, R…
claude Oct 27, 2026
d262218
RE001: index-form and mid-expression secret refs; strict deed reader;…
claude Oct 27, 2026
7fbd404
RE001: skip string literals in expressions; deed: one :policy
claude Oct 27, 2026
39dbb0f
RE001: string-aware expression scan; deed: quote only symbols and lists
claude Oct 27, 2026
90da32c
Merge branch 'main' into claude/happy-sagan-mwnm7h
hyperpolymath Oct 27, 2026
08d3e6a
Merge branch 'main' into claude/happy-sagan-mwnm7h
hyperpolymath Oct 27, 2026
d23d489
Deed reader follows deed.abnf; RE001 reads expressions across lines
claude Oct 27, 2026
33d5178
Merge branch 'claude/happy-sagan-mwnm7h' of https://github.com/hyperp…
claude Oct 27, 2026
f16545c
Deed reader: cite deed.abnf v1.2.1 for the list rule
claude Oct 27, 2026
37afd40
RE001: secrets context case-insensitive; computed keys cannot be decl…
claude Oct 27, 2026
7b1e5f9
Merge branch 'main' into claude/happy-sagan-mwnm7h
hyperpolymath Oct 27, 2026
9439e46
Merge branch 'main' into claude/happy-sagan-mwnm7h
hyperpolymath Oct 27, 2026
020da4b
RE001: combine #966's exposure model with the ADR-009 declaration
claude Oct 27, 2026
653d09c
Merge branch 'claude/happy-sagan-mwnm7h' of https://github.com/hyperp…
claude Oct 27, 2026
07d7afb
Deed reader: the gate's filename, dispatch and boolean-word checks
claude Oct 27, 2026
19671c1
RE001: drift keeps the job's severity; harden-runner match ignores case
claude Oct 27, 2026
882fe51
RE001: secrets in the workflow's top-level env are read by every job
claude Oct 27, 2026
4242d2a
RE001: a declaration is checked even when harden-runner satisfies the…
claude Oct 27, 2026
f2b20fa
Merge branch 'main' into claude/happy-sagan-mwnm7h
hyperpolymath Oct 27, 2026
5b73e80
RE001: a declared block enforcement needs egress-policy: block
claude Oct 27, 2026
6f57606
Merge branch 'claude/happy-sagan-mwnm7h' of https://github.com/hyperp…
claude Oct 27, 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
4 changes: 3 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,9 @@ jobs:
mix test \
test/rules/actions_lock_test.exs \
test/rules/actions_lock_closure_corpus_test.exs \
test/rules/rsr_conformance_test.exs
test/rules/rsr_conformance_test.exs \
test/research_extensions_test.exs \
test/deed_test.exs

# The consumers' invocation, verbatim: the oracle is called with an
# EXPLICIT --ssot. The default SSOT resolution is deliberately not
Expand Down
32 changes: 32 additions & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,38 @@ https://semver.org/[Semantic Versioning].

== [Unreleased]

=== Changed

==== RE001 accepts a deed egress declaration; the job token no longer counts (2026-10-27)

The estate-wide decision on `step-security/harden-runner` (standards ADR-009) is
to declare egress instead of adopting harden-runner everywhere. RE001 now:

* ignores `secrets.GITHUB_TOKEN`, the same token as `github.token`, which it
never counted;
* accepts a job listed in the `(egress …)` clause of the repo deed
(`<repo>_chora.deed`) with exactly the secrets the job reads, as an
alternative to harden-runner;
* reports drift (the declaration and the workflow disagree on secrets) and stale
declarations (the job is gone, runs elsewhere, or reads no real secret), and
checks a declaration even when harden-runner satisfies the job, including a
claimed `:enforcement harden-runner-*` on a job that no longer installs it;
* names the job and gives the exact `(job …)` entry in its fix text;
* reads every `${{ … }}` expression whole, even one a folded scalar splits
across lines, and counts only the top-level `secrets` context (matched
without regard to case), in property or index form, outside string
literals; a read by a key computed at run time (`secrets[env.X]`,
`toJSON(secrets)`) is its own finding, since no declaration can list it;
* keeps #966's exposure model as the severity layer: an undeclared job is
`:high` when the credential shares a step with fetched or untrusted code,
and otherwise `:warn`, with or without an exposure (owner ruling
2026-10-27: ADR-009 asks every secret-bearing job to declare).

`Hypatia.Deed` is a new reader for DEED documents (`deed.abnf` v1.2.1) and the
`(egress …)` clause profile. `test/deed_test.exs` checks it against the
standards fixtures and the template's live deed. An apg-js run of the grammar
and the reader agree on 20,043 mutated deeds, semantic checks apart.

=== Fixed

==== `mix compile` was impossible: invalid guard-as-pattern in `ActionsLock` (2026-10-25)
Expand Down
Loading
Loading