Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
569 commits
Select commit Hold shift + click to select a range
717d6bd
test(oidc): align non-object rejection contract
seonghobae Aug 27, 2026
2e1cd10
fix(oidc): remove unreachable non-object claim branch
seonghobae Aug 27, 2026
22ff97b
test(worker): reject normalized trace authority
seonghobae Aug 27, 2026
16ba120
fix(worker): preserve canonical trace authority
seonghobae Aug 27, 2026
58caf63
test(oidc): require central workflow repository authority
seonghobae Aug 27, 2026
15d495f
test(oidc): bind regression to protected worker boundary
seonghobae Aug 27, 2026
01d7c3e
fix(oidc): require central workflow repository authority
seonghobae Aug 27, 2026
b42691e
fix(readiness): bind workflow authority to central repository
seonghobae Aug 27, 2026
517b9e6
test(oidc): model configured distributed limit in trust regression
seonghobae Aug 27, 2026
3529a4e
test(oidc): cover central repository owner mismatch
seonghobae Aug 27, 2026
b8c3e84
test(github): bound installation token authority
seonghobae Aug 27, 2026
e7486e4
fix(github): bound installation token authority
seonghobae Aug 27, 2026
05fcbb2
test(observability): require collision-resistant OIDC subject receipt
seonghobae Aug 27, 2026
2d08525
fix(observability): strengthen OIDC subject evidence identity
seonghobae Aug 27, 2026
ae6bd2a
test(exchange): reject unreviewed request authority
seonghobae Aug 27, 2026
ea50fb1
fix(exchange): reject unreviewed request authority
seonghobae Aug 27, 2026
2afc8f4
docs(api): close exchange request schema
seonghobae Aug 27, 2026
9329b00
test(exchange): converge exact-schema regressions
seonghobae Aug 27, 2026
498955e
test(readiness): preserve canonical trace correlation
seonghobae Aug 27, 2026
d58b6aa
fix(readiness): preserve canonical trace correlation
seonghobae Aug 27, 2026
0530be8
test(oidc): reject ambiguous JWKS key identifiers
seonghobae Aug 28, 2026
44702a3
fix(oidc): reject ambiguous JWKS key identifiers
seonghobae Aug 28, 2026
0dd4653
test(oidc): reject unsupported critical JOSE headers
seonghobae Aug 28, 2026
71cb7f3
test(oidc): bind critical JOSE rejection to bearer boundary
seonghobae Aug 28, 2026
bc6f4d6
fix(oidc): reject unsupported critical JOSE headers
seonghobae Aug 28, 2026
ff803d5
test(oidc): reject unsupported b64 signing semantics
seonghobae Aug 28, 2026
489ba34
fix(oidc): reject unsupported b64 signing semantics
seonghobae Aug 28, 2026
20edfc0
test(rate-limit): reject normalized IPv6 client aliases
seonghobae Aug 28, 2026
0b8ccec
fix(rate-limit): reject non-canonical IPv6 client aliases
seonghobae Aug 28, 2026
ec5ff0c
fix(rate-limit): preserve semantic IPv6 bucket identity
seonghobae Aug 28, 2026
6f952dd
test(oidc): reject mismatched metadata media types
seonghobae Aug 28, 2026
e2746c3
fix(oidc): bind metadata responses to JSON media type
seonghobae Aug 28, 2026
4115783
test(oidc): cover missing JWKS media type
seonghobae Aug 28, 2026
6bdc55f
test(oidc): cover absent metadata content types
seonghobae Aug 28, 2026
8788bd7
test(github-api): reject unreviewed JSON media type
seonghobae Aug 28, 2026
8bf2ec8
fix(github-api): bind JSON responses to reviewed media type
seonghobae Aug 28, 2026
f780dc0
chore(source): restore final newline after GitHub API repair
seonghobae Aug 28, 2026
26d2066
test(github-api): cover missing JSON media type
seonghobae Aug 28, 2026
25070d4
test(github-api): reject BOM-normalized credential JSON
seonghobae Aug 28, 2026
27e8930
test(oidc): reject BOM-normalized discovery JSON
seonghobae Aug 28, 2026
e2fc03d
fix(json): reject normalized external authority bytes
seonghobae Aug 28, 2026
aa8584f
test(github-api): reject duplicate credential keys
seonghobae Aug 28, 2026
3a5c314
fix(json): reject duplicate external authority keys
seonghobae Aug 28, 2026
9303644
test(oidc): reject duplicate nested JWK authority keys
seonghobae Aug 28, 2026
c305e4c
fix(json): reject nested duplicate authority keys
seonghobae Aug 28, 2026
07c1994
test(json): cover whitespace before authority separators
seonghobae Aug 28, 2026
c7d2e63
test(json): bound streamed external authority responses
seonghobae Aug 28, 2026
39af6c4
fix(json): bound external authority response bodies
seonghobae Aug 28, 2026
3488d91
test(json): cover empty external authority body
seonghobae Aug 28, 2026
bd19ad0
test(oidc): require current central workflow source
seonghobae Aug 28, 2026
02ff991
fix(oidc): roll trusted workflow source forward
seonghobae Aug 28, 2026
9f73921
docs(architecture): bind current central workflow trust
seonghobae Aug 28, 2026
9b175ee
test(oidc): reject non-string JOSE key ids
seonghobae Aug 28, 2026
c7b581c
fix(oidc): reject non-string JOSE key ids
seonghobae Aug 28, 2026
3f053f5
test(oidc): reject stale issued-at authority
seonghobae Aug 28, 2026
d6f572f
fix(oidc): bound issued-at token lifetime
seonghobae Aug 28, 2026
0479133
test(oidc): require current audited central trust source
seonghobae Aug 28, 2026
f4f7f52
fix(oidc): roll trusted central workflow source forward
seonghobae Aug 28, 2026
ce26183
docs(architecture): bind current audited workflow source
seonghobae Aug 28, 2026
dd95e3b
test(oidc): bound JOSE key-id discovery authority
seonghobae Aug 28, 2026
067609a
fix(oidc): bound JOSE key-id discovery selector
seonghobae Aug 28, 2026
c035471
test(ci): require reusable patch-validator build cache
seonghobae Aug 28, 2026
fdf4bd4
fix(ci): cache exact-head patch-validator builds
seonghobae Aug 28, 2026
b20ca3d
test(readiness): fail closed without credential fetch capability
seonghobae Aug 28, 2026
cdc9d83
fix(readiness): require credential fetch capability
seonghobae Aug 28, 2026
8b6f932
test(readiness): reject non-installable fetch capability
seonghobae Aug 28, 2026
740e126
fix(readiness): require replaceable credential fetch capability
seonghobae Aug 28, 2026
f28d02c
test(exchange): reject overlong GitHub repository authority
seonghobae Aug 28, 2026
0cde5cb
fix(exchange): bound GitHub repository name authority
seonghobae Aug 28, 2026
a20ded2
test(openapi): bound repository locator name segment
seonghobae Aug 28, 2026
39e4ded
fix(openapi): bound repository locator name segment
seonghobae Aug 28, 2026
0da20e3
docs(api): document repository-name authority bound
seonghobae Aug 28, 2026
ed63294
docs(security): align repository-name validation contract
seonghobae Aug 28, 2026
481889f
test(egress): reject overlong repository token scope
seonghobae Aug 28, 2026
3a905c8
fix(egress): bound repository token scope
seonghobae Aug 28, 2026
3feafcf
test(openapi): bind pre-limiter 405 headers
seonghobae Aug 28, 2026
eaa4b82
fix(openapi): align pre-limiter 405 headers
seonghobae Aug 28, 2026
a5b173a
test(openapi): align distributed header authority
seonghobae Aug 28, 2026
0a37077
test(oidc): require current central workflow source
seonghobae Aug 28, 2026
9233f62
fix(oidc): trust current central workflow source
seonghobae Aug 28, 2026
62b1527
docs(architecture): record current central trust rollforward
seonghobae Aug 28, 2026
7cbfcaa
test(oidc): roll trusted central workflow source
seonghobae Aug 28, 2026
1bed960
fix(oidc): trust current protected central source
seonghobae Aug 28, 2026
fba53f1
docs(architecture): record current central workflow trust
seonghobae Aug 28, 2026
6e3fddf
test(oidc): require authoritative metadata status
seonghobae Aug 28, 2026
f9771f6
fix(oidc): require authoritative metadata status
seonghobae Aug 28, 2026
806d13b
test(github): require endpoint-specific success status authority
seonghobae Aug 28, 2026
3734c00
fix(github): bind JSON success to endpoint status
seonghobae Aug 28, 2026
c199798
test(github): align app token fixtures with HTTP 201
seonghobae Aug 28, 2026
c00ee25
test(github): use HTTP 201 token-mint fixtures
seonghobae Aug 28, 2026
5a534ae
test(github): model token creation as HTTP 201
seonghobae Aug 28, 2026
3e49c9c
test(github): model successful token creation status
seonghobae Aug 28, 2026
cde6492
test(github): preserve token expiry semantics under HTTP 201
seonghobae Aug 28, 2026
2b1377f
test(github): model expiry fixture as HTTP 201
seonghobae Aug 28, 2026
ef25107
test(github): preserve token response semantics under HTTP 201
seonghobae Aug 28, 2026
ea58ea1
test(github): model worker token responses as HTTP 201
seonghobae Aug 28, 2026
6edea7a
test(oidc): reject contradictory JWKS key operations
seonghobae Aug 28, 2026
de5b2cf
fix(oidc): enforce JWKS verification key operations
seonghobae Aug 28, 2026
f899ad9
test(egress): reject unused app installation listing authority
seonghobae Aug 28, 2026
978c54b
fix(egress): remove unused app installation listing authority
seonghobae Aug 28, 2026
f5a2875
test(egress): keep redirect coverage on used installation lookup
seonghobae Aug 28, 2026
7cb8ca8
test(egress): bind authorization framing to used lookup
seonghobae Aug 28, 2026
e9193ed
test(rate-limit): bound local client bucket cardinality
seonghobae Aug 29, 2026
eb8c721
fix(rate-limit): bound local client bucket retention
seonghobae Aug 29, 2026
0c65c58
fix(rate-limit): restore canonical source newline
seonghobae Aug 29, 2026
bfb6f88
test(rate-limit): cover expired bucket cleanup at capacity
seonghobae Aug 29, 2026
33b6c1d
fix(rate-limit): remove unreachable capacity branch
seonghobae Aug 29, 2026
42fcb19
test(rate-limit): preserve renewed bucket eviction recency
seonghobae Aug 29, 2026
e2095a8
fix(rate-limit): refresh renewed bucket eviction recency
seonghobae Aug 29, 2026
9a62f08
test(ci): preserve in-flight validator cache seed
seonghobae Aug 29, 2026
e111bf3
fix(ci): let validator builds seed shared cache
seonghobae Aug 29, 2026
b8a9254
test(exchange): reject misleading JSON media types in base worker
seonghobae Aug 29, 2026
66982b4
fix(exchange): enforce reviewed JSON media type in base worker
seonghobae Aug 29, 2026
3a22b65
test(exchange): align helper coverage with reviewed media type
seonghobae Aug 29, 2026
07e0971
test(exchange): cover missing media type with request body
seonghobae Aug 29, 2026
91e7295
test(exchange): exercise truly missing media type
seonghobae Aug 29, 2026
895cd67
test(exchange): accept GitHub App PKCS#1 private key
seonghobae Aug 29, 2026
51df024
fix(exchange): normalize GitHub App PKCS#1 private keys
seonghobae Aug 29, 2026
dba837b
fix(runtime): accept GitHub App PKCS#1 private keys
seonghobae Aug 29, 2026
53206e0
test(runtime): verify GitHub App PKCS#1 readiness
seonghobae Aug 29, 2026
89580bb
fix(runtime): remove unreachable private-key branches
seonghobae Aug 29, 2026
48d0f40
test(runtime): cover private-key envelope rejection paths
seonghobae Aug 29, 2026
c12dc70
test(runtime): accept canonical PKCS8 terminal newline
seonghobae Aug 29, 2026
de79d57
fix(runtime): canonicalize PKCS8 terminal newline
seonghobae Aug 29, 2026
9900a6c
test(runtime): preserve private-key readiness cache after normalization
seonghobae Aug 29, 2026
5abf296
fix(runtime): preserve readiness cache across key normalization
seonghobae Aug 29, 2026
106dcb9
fix(runtime): type normalized credential cache source safely
seonghobae Aug 29, 2026
5aba3b5
test(runtime): reject stale cached binding authority
seonghobae Aug 29, 2026
14dcc58
fix(runtime): drop withdrawn cached bindings
seonghobae Aug 29, 2026
6324905
test(oidc): reject encryption-use JWKS keys
seonghobae Aug 29, 2026
8045096
test(trust): require current central workflow source
seonghobae Aug 29, 2026
efad421
fix(oidc): honor JWKS signing-use authority
seonghobae Aug 29, 2026
311c76e
fix(trust): roll forward audited central source
seonghobae Aug 29, 2026
a878de0
docs(architecture): record audited central trust roll-forward
seonghobae Aug 29, 2026
eb28212
test(trust): require latest central workflow source
seonghobae Aug 29, 2026
d307e4a
fix(trust): follow current protected central source
seonghobae Aug 29, 2026
6fe3e76
docs(architecture): track latest central trust authority
seonghobae Aug 29, 2026
0d4dc6f
test(egress): reject unreviewed anonymous GitHub API calls
seonghobae Aug 29, 2026
5e4c0f8
test(egress): preserve exact public metadata diagnostic
seonghobae Aug 29, 2026
237334a
chore(test): drop superseded egress experiment
seonghobae Aug 29, 2026
4e8b6f3
test(private-key): reject bare-CR PEM termination
seonghobae Aug 29, 2026
3d740e6
fix(private-key): reject bare-CR PEM termination
seonghobae Aug 29, 2026
ddc1df8
test(exchange): reject unreviewed query authority
seonghobae Aug 29, 2026
e504385
fix(exchange): reject unreviewed query authority
seonghobae Aug 29, 2026
8a30904
test(exchange): reject bare query delimiter authority
seonghobae Aug 29, 2026
5bc743a
fix(exchange): require exact resource-form URL
seonghobae Aug 29, 2026
609af78
fix(exchange): preserve stable validation message
seonghobae Aug 29, 2026
2a6a922
test(github-app): refresh stale installation cache
seonghobae Aug 29, 2026
b39b4f1
fix(github-app): refresh retired cached installation ids
seonghobae Aug 29, 2026
d3ea853
test(github-app): retry installation refresh only from cache
seonghobae Aug 29, 2026
484f39c
fix(github-app): refresh only cached installation authority
seonghobae Aug 29, 2026
bfae9ee
ci: retrigger exact-head patch validator
seonghobae Aug 29, 2026
3d2c4d3
test(egress): restrict anonymous GitHub API authority
seonghobae Aug 29, 2026
f2e0802
fix(egress): bound anonymous GitHub API authority
seonghobae Aug 29, 2026
9cce753
merge(main): adopt protected #505 integration for egress repair
seonghobae Aug 29, 2026
05e4a66
merge(main): retain licensing integration with egress repair
seonghobae Aug 29, 2026
cba0900
test(egress): align legacy cases with reviewed operations
seonghobae Aug 29, 2026
dc6c302
test(egress): reject unreviewed outbound header authority
seonghobae Aug 29, 2026
b2367eb
fix(egress): bound outbound header authority
seonghobae Aug 29, 2026
bbb4e98
test(egress): align retired listing destination verdict
seonghobae Aug 29, 2026
6ee5540
test(egress): use reviewed GitHub media type
seonghobae Aug 29, 2026
77c6b39
test(egress): match production token-mint headers
seonghobae Aug 29, 2026
75e6e1e
test(egress): require exact token-mint JSON media type
seonghobae Aug 29, 2026
fa11c84
fix(egress): bind token mint to JSON media type
seonghobae Aug 29, 2026
a3046ad
fix(egress): canonicalize token mint media type
seonghobae Aug 29, 2026
ac96ea4
test(egress): bind scope cases to JSON media type
seonghobae Aug 29, 2026
8d5f0c0
test(egress): bind token operation to JSON media type
seonghobae Aug 29, 2026
b802dc5
test(egress): prove canonical token media type on wire
seonghobae Aug 29, 2026
d94a069
test(egress): close token media-type branch coverage
seonghobae Aug 29, 2026
a4a318b
test(egress): cover noncanonical reviewed header value
seonghobae Aug 29, 2026
b4812ae
test(egress): cover rejected-header short circuit
seonghobae Aug 29, 2026
f4527e9
test(egress): prove reviewed production header contract
seonghobae Aug 29, 2026
cf3a756
test(github-app): bind configured installation to repository
seonghobae Aug 29, 2026
e87212d
fix(github-app): verify configured installation ownership
seonghobae Aug 29, 2026
71859c3
test(github-app): reflect repository-bound configured installs
seonghobae Aug 29, 2026
355ca3d
test(egress): require canonical Bearer framing
seonghobae Aug 29, 2026
cb7cf4d
fix(egress): enforce canonical Bearer scheme
seonghobae Aug 29, 2026
69cde35
test(egress): reject non-canonical HTTP method casing
seonghobae Aug 29, 2026
172cc90
fix(egress): preserve canonical HTTP method bytes
seonghobae Aug 29, 2026
39d9b63
test(egress): fail closed on malformed request headers
seonghobae Aug 29, 2026
0239b29
fix(egress): fail closed on malformed headers
seonghobae Aug 29, 2026
ab15f39
test(egress): require explicit installation token media authority
seonghobae Aug 29, 2026
b5eb23f
test(egress): preserve canonical media-type synthesis contract
seonghobae Aug 29, 2026
07c9b13
test(egress): fail closed on malformed cancellation authority
seonghobae Aug 29, 2026
5a550d5
fix(egress): fail closed on invalid cancellation signals
seonghobae Aug 29, 2026
e135ad9
test(egress): classify streamed deadline expiry as timeout
seonghobae Aug 29, 2026
c19549b
fix(egress): preserve streamed timeout authority
seonghobae Aug 29, 2026
2c065df
test(egress): reject pre-aborted caller authority before transport
seonghobae Aug 29, 2026
7615cfc
fix(egress): honor pre-aborted caller signal before transport
seonghobae Aug 29, 2026
6e71cbf
test(ci): require stale image runs to cancel
seonghobae Aug 29, 2026
8819ec6
fix(ci): cancel superseded image verification runs
seonghobae Aug 29, 2026
0c3f1f3
test(ci): require resilient image scanner downloads
seonghobae Aug 29, 2026
bd6e936
fix(ci): retry transient scanner release downloads
seonghobae Aug 29, 2026
1208839
test(egress): preserve mid-flight caller cancellation
seonghobae Aug 29, 2026
804f6ed
fix(egress): honor mid-flight caller cancellation
seonghobae Aug 29, 2026
ffa11e6
test(egress): cover bodyless late cancellation
seonghobae Aug 29, 2026
2828948
test(egress): preserve cancellation during body streaming
seonghobae Aug 29, 2026
439fa8f
fix(egress): honor cancellation during body streaming
seonghobae Aug 29, 2026
873496d
test(egress): preserve cancellation over late transport rejection
seonghobae Aug 29, 2026
3677562
fix(egress): preserve caller abort reason on late rejection
seonghobae Aug 29, 2026
2eb620d
test(egress): reject normalized reviewed header authority
seonghobae Aug 29, 2026
36bfd2c
fix(egress): preserve raw reviewed header authority
seonghobae Aug 29, 2026
0212ef8
test(egress): require timeout despite abort-ignoring body
seonghobae Aug 29, 2026
00c6161
fix(egress): enforce abort-aware response reads
seonghobae Aug 29, 2026
271d47b
fix(egress): type abort listener for exact deadline
seonghobae Aug 29, 2026
6faee9f
test(egress): exercise active abort race
seonghobae Aug 29, 2026
5f6ea1a
test(egress): cover post-read cancellation race
seonghobae Aug 29, 2026
dc3fb50
fix(egress): remove synthetic abort no-op
seonghobae Aug 29, 2026
2d79b35
test(ci): require license evidence before manifest
seonghobae Aug 29, 2026
44107bd
fix(ci): materialize license evidence before manifest
seonghobae Aug 29, 2026
3b4abd3
test(egress): require abort-bounded transport headers
seonghobae Aug 29, 2026
0f75d39
test(egress): cover late transport cleanup branches
seonghobae Aug 29, 2026
7726c93
fix(egress): bound transport wait to abort authority
seonghobae Aug 29, 2026
1be5bd4
test(egress): cover synchronous abort transport cleanup
seonghobae Aug 29, 2026
1cb9a10
fix(egress): clean late transport on synchronous abort
seonghobae Aug 29, 2026
32046d1
test(egress): await caller cancellation deterministically
seonghobae Aug 29, 2026
acf9659
test(egress): cover response-settle cancellation race
seonghobae Aug 29, 2026
84bc542
test(egress): deterministically cover post-transport revocation
seonghobae Aug 29, 2026
a76c1d4
test(ci): require branch coverage failure diagnostics
seonghobae Aug 29, 2026
f307d13
fix(ci): report uncovered branches on coverage failure
seonghobae Aug 29, 2026
9a5d86a
test(acquisition): align CLI audit timeout hierarchy
seonghobae Aug 29, 2026
d47073d
test(egress): cover native transport-settlement revocation race
seonghobae Aug 29, 2026
6c8d90b
test(egress): cover revoked bodyless transport response
seonghobae Aug 29, 2026
e230074
test(ci): require concrete branch diagnostic locations
seonghobae Aug 29, 2026
df110e8
fix(ci): emit concrete branch coverage locations
seonghobae Aug 29, 2026
ed707c7
test(image): require patched OpenSSL security floor
seonghobae Aug 30, 2026
41191c1
fix(image): link static Node against OpenSSL 3.5.8
seonghobae Aug 30, 2026
784d37e
test(image): anchor Node PATH regression to Node build
seonghobae Aug 30, 2026
d4a895e
test(image): require pre-materialized validator dependencies
seonghobae Aug 30, 2026
417eabc
fix(image): pre-materialize validator dependencies
seonghobae Aug 30, 2026
83d21b8
fix(image): use local validator dependency context
seonghobae Aug 30, 2026
db11e1c
test(image): align contract with bounded dependency context
seonghobae Aug 30, 2026
cc20967
docs(governance): align security scan authority
seonghobae Aug 30, 2026
bee00f8
test(governance): align central security-scan trigger contract
seonghobae Aug 30, 2026
59f0728
test(image): require runner-pinned runtime sources
seonghobae Aug 30, 2026
25adc41
test(image): require bounded runtime source fetches
seonghobae Aug 30, 2026
ca2155e
fix(image): bound checksum-pinned source fetches
seonghobae Aug 30, 2026
7dfacbf
test(image): align bounded source-fetch contract
seonghobae Aug 30, 2026
971989a
test(image): require bounded scanner downloads
seonghobae Aug 30, 2026
217b336
fix(image): bound scanner asset downloads
seonghobae Aug 30, 2026
5b3cd3d
fix(image): constrain source redirect protocols
seonghobae Aug 30, 2026
d675e54
fix(image): restore exact verification contract
seonghobae Aug 30, 2026
68b0e43
fix(image): bound scanner asset transport
seonghobae Aug 30, 2026
d51ef8a
test(image): align scanner retry bound with hardened workflow
seonghobae Aug 30, 2026
4599144
Merge d51ef8ac0cf87fda183c7680c2f2b017e496d10b into 9fd64b184a7df5292…
seonghobae Aug 30, 2026
7b8f109
test(egress): reject headers on anonymous meta
seonghobae Aug 30, 2026
226553d
test(egress): prove body cancellation is immediate
seonghobae Aug 30, 2026
20aaafa
test(supply-chain): bind Node source URL to digest
seonghobae Aug 30, 2026
ef0d57e
fix(egress): keep anonymous meta headerless
seonghobae Aug 30, 2026
738aa68
chore(stack): converge #508 onto protected #500 merge
seonghobae Aug 30, 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
5 changes: 3 additions & 2 deletions src/outbound-fetch-policy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,8 @@ export function isTrustedCredentialEgressRequest(
if (!authorization) {
return url.href === TRUSTED_GITHUB_API_META
&& method === "GET"
&& !bodyPresent;
&& !bodyPresent
&& hasNoHeaders(headers);
}
const rawAuthorization = rawHeaderValueFromInit(init?.headers, "authorization");
if (
Expand Down Expand Up @@ -573,7 +574,7 @@ export function ensureGlobalOutboundFetchPolicy(
/**
* Restores an installed fetch host during tests while leaving production policy installation one-way for normal operation.
* @param host Mutable fetch host whose test-only installation state should be removed.
* @returns Nothing; cleanup is best-effort and never masks the security behavior being tested.
* @returns Nothing; cleanup is best-effort and never masks the security behavior under examination.
*/
export function resetGlobalOutboundFetchPolicy(
host: FetchHost = globalThis,
Expand Down
18 changes: 18 additions & 0 deletions test/outbound-fetch-anonymous-authority.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,24 @@ describe("anonymous GitHub API egress authority", () => {
expect(response.headers.get("x-noema-egress-policy")).toBe("blocked-request-policy");
});

it("rejects reviewed headers on the anonymous /meta diagnostic", async () => {
const metaUrl = "https://api.github.com/meta";
const request = {
method: "GET",
headers: { accept: "application/vnd.github+json" },
} satisfies RequestInit;

expect(isTrustedCredentialEgressRequest(metaUrl, request)).toBe(false);

const rawFetch = vi.fn<FetchLike>(async () => new Response(null, { status: 204 }));
const wrapped = createFailClosedFetch(rawFetch);
const response = await wrapped(metaUrl, request);

expect(rawFetch).not.toHaveBeenCalled();
expect(response.status).toBe(502);
expect(response.headers.get("x-noema-egress-policy")).toBe("blocked-request-policy");
});

it("rejects arbitrary anonymous GitHub REST destinations outside reviewed operations", async () => {
const unreviewedUrl = "https://api.github.com/repos/ContextualWisdomLab/noema/issues";

Expand Down
2 changes: 1 addition & 1 deletion test/outbound-fetch-preaborted-signal.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,8 @@ describe("credential-egress caller cancellation authority", () => {
);
await pullStarted;
caller.abort(reason);
releaseBody();

await expect(pending).rejects.toBe(reason);
releaseBody();
});
});
10 changes: 7 additions & 3 deletions test/patch-validator-static-runtime.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,13 @@ describe("patch-validator static scratch runtime", () => {
expect(dockerfile).toContain("ARG NODE_VERSION=24.19.0");
expect(dockerfile).toContain(`ARG NODE_SOURCE_SHA256=${nodeSourceSha256}`);
expect(dockerfile).toContain(
'"https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}.tar.xz"',
[
" download_exact \\",
' "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}.tar.xz" \\',
' "$NODE_SOURCE_SHA256" \\',
" /tmp/node.tar.xz; \\",
].join("\n"),
);
expect(dockerfile).toContain('"$NODE_SOURCE_SHA256"');
expect(dockerfile).toContain("sha256sum --check --strict");
expect(dockerfile).toContain("timeout --signal=TERM --kill-after=30s 5m");
expect(dockerfile).toContain("--connect-timeout 20");
Expand Down Expand Up @@ -80,4 +84,4 @@ describe("patch-validator static scratch runtime", () => {
expect(workflow).toContain("--severity MEDIUM,HIGH,CRITICAL");
expect(workflow).toContain("--exit-code 1");
});
});
});
Loading