From 280ff9567ceae0433f18412fbeffcc41592ad0dc Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 09:37:49 +0900 Subject: [PATCH 001/228] test(trust): require current audited central source --- test/trusted-workflow-source-rollforward.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 6d5738506..d66b2b57f 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5"; + "5ed6ddfe795a33cfefce422000b39f1e681550e3"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { @@ -12,4 +12,4 @@ describe("trusted central workflow source revision", () => { `ALLOWED_WORKFLOW_SHA = "${auditedCentralWorkflowSourceSha}"`, ); }); -}); \ No newline at end of file +}); From f866fb77df58b90e2556a3df0e3038ee501d636d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 09:38:07 +0900 Subject: [PATCH 002/228] fix(trust): roll forward audited central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 17a038e3f..20a486bec 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5" +ALLOWED_WORKFLOW_SHA = "5ed6ddfe795a33cfefce422000b39f1e681550e3" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 1f7359e4f1dd43710b4d315348849a9f8cb27935 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 09:39:03 +0900 Subject: [PATCH 003/228] docs(trust): record audited central source movement --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index fedca83d5..8cf20d1d2 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5`. The exact trusted `.github/workflows/noema-review.yml` blob at that protected commit remains Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27`. Movement from `c8cc68a34bd19a91e2544acf08f2ead142ba702b` to current `1cbb6a...` leaves the workflow bytes unchanged but modifies the materialized trusted source tree in `scripts/ci/noema_review_gate.py` and its focused tests, adding one bounded correction attempt when the trusted verdict validator rejects an invalid changed-line/adversarial verdict. Because `noema-review.yml` materializes the complete trusted central source tree at its immutable workflow SHA and then executes `python3 -m scripts.ci.noema_review_gate`, this source-tree change is trust-relevant even though the workflow blob is unchanged; Noema re-audited the exact protected one-commit delta before accepting the new repository commit identity. More generally, Noema re-audits both the exact workflow blob and every relevant protected central delta before each repository-commit movement; ancestry alone is insufficient because GitHub OIDC `job_workflow_sha` binds the caller to that exact repository commit identity. The central repository remains a read-only dependency from Noema. The protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `5ed6ddfe795a33cfefce422000b39f1e681550e3`. The exact trusted `.github/workflows/noema-review.yml` blob remains Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27` across the accepted movement from `1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5` to `5ed6ddfe...`. The audited one-commit central delta changes only `.github/workflows/opencode-review.yml` and `tests/test_opencode_required_verdict_regression.py`; it does not alter the trusted `noema-review.yml` blob or the Noema review-gate implementation it executes. The repository commit identity still changes, however, and GitHub OIDC `job_workflow_sha` binds the caller to that exact identity. Noema therefore re-audits the exact protected central delta and rolls the immutable source pin forward rather than accepting ancestry, an unchanged workflow blob, or a moving branch ref as sufficient authority. The central repository remains a read-only dependency from Noema. The protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. The configured workflow ref and source SHA are operator authority bytes, not normalization input. The protected workflow-ref parser and authoritative verifier do not trim whitespace from these trust values before validation/comparison. A whitespace-bearing value therefore fails as unusable configuration rather than being normalized into a different trusted identity. On an active PR head this statement is candidate truth if the corresponding source delta is not yet on the live protected base. From 89f31766c32738cfc0f0fc7188d63c94d3e4d2b2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 09:51:01 +0900 Subject: [PATCH 004/228] test(trust): require latest audited central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index d66b2b57f..b6c5bcff9 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "5ed6ddfe795a33cfefce422000b39f1e681550e3"; + "a3f9f9b64b030c5c391925aa943548c450454394"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 61b741eddb104c5a71c52861f6c05fc811503b10 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 09:51:22 +0900 Subject: [PATCH 005/228] fix(trust): follow audited central head advance --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 20a486bec..0c56b7d97 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "5ed6ddfe795a33cfefce422000b39f1e681550e3" +ALLOWED_WORKFLOW_SHA = "a3f9f9b64b030c5c391925aa943548c450454394" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From e05352169e87dfdb5a30303e950d0fac88b71240 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 09:52:19 +0900 Subject: [PATCH 006/228] docs(trust): record latest audited central movement --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 8cf20d1d2..b6370ffc8 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `5ed6ddfe795a33cfefce422000b39f1e681550e3`. The exact trusted `.github/workflows/noema-review.yml` blob remains Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27` across the accepted movement from `1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5` to `5ed6ddfe...`. The audited one-commit central delta changes only `.github/workflows/opencode-review.yml` and `tests/test_opencode_required_verdict_regression.py`; it does not alter the trusted `noema-review.yml` blob or the Noema review-gate implementation it executes. The repository commit identity still changes, however, and GitHub OIDC `job_workflow_sha` binds the caller to that exact identity. Noema therefore re-audits the exact protected central delta and rolls the immutable source pin forward rather than accepting ancestry, an unchanged workflow blob, or a moving branch ref as sufficient authority. The central repository remains a read-only dependency from Noema. The protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `a3f9f9b64b030c5c391925aa943548c450454394`. The exact trusted `.github/workflows/noema-review.yml` remains Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27` across the accepted central movements from `1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5` through `5ed6ddfe795a33cfefce422000b39f1e681550e3` to `a3f9f9b64b030c5c391925aa943548c450454394`. The first audited movement changed only `.github/workflows/opencode-review.yml` and `tests/test_opencode_required_verdict_regression.py`; the subsequent one-commit movement changes only `.github/workflows/opencode-review-dispatch.yml`. Neither movement alters the trusted `noema-review.yml` blob. The repository commit identity still changes, however, and GitHub OIDC `job_workflow_sha` binds the caller to that exact identity. Noema therefore re-audits every protected central movement and rolls the immutable source pin forward rather than accepting ancestry, an unchanged workflow blob, or a moving branch ref as sufficient authority. The central repository remains a read-only dependency from Noema. The protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. The configured workflow ref and source SHA are operator authority bytes, not normalization input. The protected workflow-ref parser and authoritative verifier do not trim whitespace from these trust values before validation/comparison. A whitespace-bearing value therefore fails as unusable configuration rather than being normalized into a different trusted identity. On an active PR head this statement is candidate truth if the corresponding source delta is not yet on the live protected base. From f4b6d84d06b3b3f3e17ebdcd3cdfb1de50ffd3f6 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 10:01:43 +0900 Subject: [PATCH 007/228] test(trust): require latest protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index b6c5bcff9..3451e355a 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "a3f9f9b64b030c5c391925aa943548c450454394"; + "1186a9f4e5eda7683b23ae63d2c806831743432a"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 62185eb0606d4fdd602a2e818f2af670d2126afc Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 10:02:08 +0900 Subject: [PATCH 008/228] fix(trust): roll forward latest protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 0c56b7d97..19cec2312 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "a3f9f9b64b030c5c391925aa943548c450454394" +ALLOWED_WORKFLOW_SHA = "1186a9f4e5eda7683b23ae63d2c806831743432a" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 670faa973c78293b0091bab9b456abee33cbea35 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 10:06:02 +0900 Subject: [PATCH 009/228] docs(trust): record current protected central movement --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index b6370ffc8..56ea83016 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `a3f9f9b64b030c5c391925aa943548c450454394`. The exact trusted `.github/workflows/noema-review.yml` remains Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27` across the accepted central movements from `1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5` through `5ed6ddfe795a33cfefce422000b39f1e681550e3` to `a3f9f9b64b030c5c391925aa943548c450454394`. The first audited movement changed only `.github/workflows/opencode-review.yml` and `tests/test_opencode_required_verdict_regression.py`; the subsequent one-commit movement changes only `.github/workflows/opencode-review-dispatch.yml`. Neither movement alters the trusted `noema-review.yml` blob. The repository commit identity still changes, however, and GitHub OIDC `job_workflow_sha` binds the caller to that exact identity. Noema therefore re-audits every protected central movement and rolls the immutable source pin forward rather than accepting ancestry, an unchanged workflow blob, or a moving branch ref as sufficient authority. The central repository remains a read-only dependency from Noema. The protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `1186a9f4e5eda7683b23ae63d2c806831743432a`. The exact trusted `.github/workflows/noema-review.yml` remains Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27` across the accepted central movements from `1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5` through `5ed6ddfe795a33cfefce422000b39f1e681550e3` and `a3f9f9b64b030c5c391925aa943548c450454394` to `1186a9f4e5eda7683b23ae63d2c806831743432a`. The first audited movement changed only `.github/workflows/opencode-review.yml` and `tests/test_opencode_required_verdict_regression.py`; the next one-commit movement changed only `.github/workflows/opencode-review-dispatch.yml`; the latest one-commit movement changes only `docs/product-technical-gap-baseline.md`, `scripts/ci/strix_quick_gate.sh`, and `scripts/ci/test_strix_quick_gate.sh`. None alters the trusted `noema-review.yml` blob or the central `security-scan.yml` blob. The repository commit identity still changes, however, and GitHub OIDC `job_workflow_sha` binds the caller to that exact identity. Noema therefore re-audits every protected central movement and rolls the immutable source pin forward rather than accepting ancestry, an unchanged workflow blob, or a moving branch ref as sufficient authority. The central repository remains a read-only dependency from Noema. The protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. The configured workflow ref and source SHA are operator authority bytes, not normalization input. The protected workflow-ref parser and authoritative verifier do not trim whitespace from these trust values before validation/comparison. A whitespace-bearing value therefore fails as unusable configuration rather than being normalized into a different trusted identity. On an active PR head this statement is candidate truth if the corresponding source delta is not yet on the live protected base. From e37fb478f0206dd179755fc8b4656065aa311bcc Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 10:59:24 +0900 Subject: [PATCH 010/228] test(trust): require latest audited central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 3451e355a..9d8cf2ba4 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "1186a9f4e5eda7683b23ae63d2c806831743432a"; + "7b1a028e704a98ae8a807bb827f44aeaee0399af"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 183d6c98ff7067be5c8683b4c75c3e6453d6014a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 10:59:48 +0900 Subject: [PATCH 011/228] fix(trust): roll forward audited central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 19cec2312..6068263a7 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "1186a9f4e5eda7683b23ae63d2c806831743432a" +ALLOWED_WORKFLOW_SHA = "7b1a028e704a98ae8a807bb827f44aeaee0399af" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From f3a25f42ab1c74cbe4fbad169a9a22474cdcc1c2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 11:00:36 +0900 Subject: [PATCH 012/228] docs(trust): record latest audited central movement --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 56ea83016..26e600865 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `1186a9f4e5eda7683b23ae63d2c806831743432a`. The exact trusted `.github/workflows/noema-review.yml` remains Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27` across the accepted central movements from `1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5` through `5ed6ddfe795a33cfefce422000b39f1e681550e3` and `a3f9f9b64b030c5c391925aa943548c450454394` to `1186a9f4e5eda7683b23ae63d2c806831743432a`. The first audited movement changed only `.github/workflows/opencode-review.yml` and `tests/test_opencode_required_verdict_regression.py`; the next one-commit movement changed only `.github/workflows/opencode-review-dispatch.yml`; the latest one-commit movement changes only `docs/product-technical-gap-baseline.md`, `scripts/ci/strix_quick_gate.sh`, and `scripts/ci/test_strix_quick_gate.sh`. None alters the trusted `noema-review.yml` blob or the central `security-scan.yml` blob. The repository commit identity still changes, however, and GitHub OIDC `job_workflow_sha` binds the caller to that exact identity. Noema therefore re-audits every protected central movement and rolls the immutable source pin forward rather than accepting ancestry, an unchanged workflow blob, or a moving branch ref as sufficient authority. The central repository remains a read-only dependency from Noema. The protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `7b1a028e704a98ae8a807bb827f44aeaee0399af`. The exact trusted `.github/workflows/noema-review.yml` remains Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27` across the accepted central movements from `1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5` through `5ed6ddfe795a33cfefce422000b39f1e681550e3`, `a3f9f9b64b030c5c391925aa943548c450454394`, `1186a9f4e5eda7683b23ae63d2c806831743432a`, and `7b1a028e704a98ae8a807bb827f44aeaee0399af`. The first audited movement changed only `.github/workflows/opencode-review.yml` and `tests/test_opencode_required_verdict_regression.py`; the next one-commit movement changed only `.github/workflows/opencode-review-dispatch.yml`; the following one-commit movement changed only `docs/product-technical-gap-baseline.md`, `scripts/ci/strix_quick_gate.sh`, and `scripts/ci/test_strix_quick_gate.sh`; the latest one-commit movement changes only `.github/workflows/opencode-review-dispatch.yml` by reverting the preceding head-only review-dispatch change. None alters the trusted `noema-review.yml` blob or the central `security-scan.yml` blob. The repository commit identity still changes, however, and GitHub OIDC `job_workflow_sha` binds the caller to that exact identity. Noema therefore re-audits every protected central movement and rolls the immutable source pin forward rather than accepting ancestry, an unchanged workflow blob, or a moving branch ref as sufficient authority. The central repository remains a read-only dependency from Noema. The protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. The configured workflow ref and source SHA are operator authority bytes, not normalization input. The protected workflow-ref parser and authoritative verifier do not trim whitespace from these trust values before validation/comparison. A whitespace-bearing value therefore fails as unusable configuration rather than being normalized into a different trusted identity. On an active PR head this statement is candidate truth if the corresponding source delta is not yet on the live protected base. From 3ac30815afb8438f044c8392e924f7709ffffcb9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 12:20:37 +0900 Subject: [PATCH 013/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 9d8cf2ba4..4718a009c 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "7b1a028e704a98ae8a807bb827f44aeaee0399af"; + "9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 44786d8bb03b958506a139456b9900c7266b652b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 12:21:07 +0900 Subject: [PATCH 014/228] fix(trust): roll forward current central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 6068263a7..83120efa2 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "7b1a028e704a98ae8a807bb827f44aeaee0399af" +ALLOWED_WORKFLOW_SHA = "9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 8a3417e2c134556499c9a38a1693aae285fe137f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 12:30:09 +0900 Subject: [PATCH 015/228] docs(trust): align architecture with current central source --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 26e600865..9a03b27bd 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `7b1a028e704a98ae8a807bb827f44aeaee0399af`. The exact trusted `.github/workflows/noema-review.yml` remains Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27` across the accepted central movements from `1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5` through `5ed6ddfe795a33cfefce422000b39f1e681550e3`, `a3f9f9b64b030c5c391925aa943548c450454394`, `1186a9f4e5eda7683b23ae63d2c806831743432a`, and `7b1a028e704a98ae8a807bb827f44aeaee0399af`. The first audited movement changed only `.github/workflows/opencode-review.yml` and `tests/test_opencode_required_verdict_regression.py`; the next one-commit movement changed only `.github/workflows/opencode-review-dispatch.yml`; the following one-commit movement changed only `docs/product-technical-gap-baseline.md`, `scripts/ci/strix_quick_gate.sh`, and `scripts/ci/test_strix_quick_gate.sh`; the latest one-commit movement changes only `.github/workflows/opencode-review-dispatch.yml` by reverting the preceding head-only review-dispatch change. None alters the trusted `noema-review.yml` blob or the central `security-scan.yml` blob. The repository commit identity still changes, however, and GitHub OIDC `job_workflow_sha` binds the caller to that exact identity. Noema therefore re-audits every protected central movement and rolls the immutable source pin forward rather than accepting ancestry, an unchanged workflow blob, or a moving branch ref as sufficient authority. The central repository remains a read-only dependency from Noema. The protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec`. Earlier accepted central movements through `7b1a028e704a98ae8a807bb827f44aeaee0399af` retained the exact trusted `.github/workflows/noema-review.yml` Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27`. The subsequent protected one-commit movement from `7b1a028e704a98ae8a807bb827f44aeaee0399af` to `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` is trust-relevant: it changes the trusted `noema-review.yml` blob to `df72f616cacad1e084f23f71442c0b92b139bcf7` and also modifies central review/dispatch workflows, review-gate and scheduler source, governance documentation, the historical secret-finding allowlist, and focused tests. The central `.github/workflows/security-scan.yml` remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355` across that movement. Because `noema-review.yml` materializes the complete trusted central source tree at the immutable workflow SHA and GitHub OIDC `job_workflow_sha` binds the caller to that exact repository commit identity, Noema audits both the workflow blob and the relevant protected source-tree delta before accepting each repository-commit movement; ancestry, a moving branch ref, or an unchanged security workflow is not sufficient authority. The central repository remains a read-only dependency from Noema. The current protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. The configured workflow ref and source SHA are operator authority bytes, not normalization input. The protected workflow-ref parser and authoritative verifier do not trim whitespace from these trust values before validation/comparison. A whitespace-bearing value therefore fails as unusable configuration rather than being normalized into a different trusted identity. On an active PR head this statement is candidate truth if the corresponding source delta is not yet on the live protected base. From e1d30551afc7ba43dd90df791f9fce8ac62feffc Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 12:46:06 +0900 Subject: [PATCH 016/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 4718a009c..e5594446d 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec"; + "2436454e3a969a282b5edc7303a485ccd37c3e9f"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From eb8aa40df49f9382a7dcf10bb74ec274d6eae5b0 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 12:46:36 +0900 Subject: [PATCH 017/228] fix(trust): roll forward current central source pin --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 83120efa2..cce713309 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec" +ALLOWED_WORKFLOW_SHA = "2436454e3a969a282b5edc7303a485ccd37c3e9f" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From fb73a4312fb93ea0e3f0e668fce35a5a16252a1e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 12:47:26 +0900 Subject: [PATCH 018/228] docs(trust): record latest protected central movement --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 9a03b27bd..f6480473e 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec`. Earlier accepted central movements through `7b1a028e704a98ae8a807bb827f44aeaee0399af` retained the exact trusted `.github/workflows/noema-review.yml` Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27`. The subsequent protected one-commit movement from `7b1a028e704a98ae8a807bb827f44aeaee0399af` to `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` is trust-relevant: it changes the trusted `noema-review.yml` blob to `df72f616cacad1e084f23f71442c0b92b139bcf7` and also modifies central review/dispatch workflows, review-gate and scheduler source, governance documentation, the historical secret-finding allowlist, and focused tests. The central `.github/workflows/security-scan.yml` remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355` across that movement. Because `noema-review.yml` materializes the complete trusted central source tree at the immutable workflow SHA and GitHub OIDC `job_workflow_sha` binds the caller to that exact repository commit identity, Noema audits both the workflow blob and the relevant protected source-tree delta before accepting each repository-commit movement; ancestry, a moving branch ref, or an unchanged security workflow is not sufficient authority. The central repository remains a read-only dependency from Noema. The current protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `2436454e3a969a282b5edc7303a485ccd37c3e9f`. Earlier accepted central movements through `7b1a028e704a98ae8a807bb827f44aeaee0399af` retained the exact trusted `.github/workflows/noema-review.yml` Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27`. The protected one-commit movement from `7b1a028e704a98ae8a807bb827f44aeaee0399af` to `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` changed the trusted `noema-review.yml` blob to `df72f616cacad1e084f23f71442c0b92b139bcf7` and modified central review/dispatch workflows, review-gate and scheduler source, governance documentation, the historical secret-finding allowlist, and focused tests. The subsequent protected one-commit movement from `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` to `2436454e3a969a282b5edc7303a485ccd37c3e9f` changes only `scripts/ci/strix_quick_gate.sh` and `scripts/ci/test_strix_quick_gate.sh`; the trusted `noema-review.yml` blob remains `df72f616cacad1e084f23f71442c0b92b139bcf7` and central `.github/workflows/security-scan.yml` remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355`. Even when the workflow blob itself is unchanged, the repository commit remains trust-relevant because `noema-review.yml` materializes the complete trusted central source tree at the immutable workflow SHA and GitHub OIDC `job_workflow_sha` binds the caller to that exact repository commit identity. Noema therefore audits both the workflow blob and each relevant protected source-tree delta before accepting a repository-commit movement; ancestry, a moving branch ref, or an unchanged security workflow is not sufficient authority. The central repository remains a read-only dependency from Noema. The current protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. The configured workflow ref and source SHA are operator authority bytes, not normalization input. The protected workflow-ref parser and authoritative verifier do not trim whitespace from these trust values before validation/comparison. A whitespace-bearing value therefore fails as unusable configuration rather than being normalized into a different trusted identity. On an active PR head this statement is candidate truth if the corresponding source delta is not yet on the live protected base. From 18ed507e34cc6b19da7fffc27a35558c74f8c0e2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 13:08:45 +0900 Subject: [PATCH 019/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index e5594446d..1191f9317 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "2436454e3a969a282b5edc7303a485ccd37c3e9f"; + "44a3c740f7c46c06e7500174d4127413f3f581eb"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 4677b0f2a3c31027ce271c4826cf252c5f9f1215 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 13:09:04 +0900 Subject: [PATCH 020/228] fix(trust): follow protected central source movement --- wrangler.toml | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/wrangler.toml b/wrangler.toml index cce713309..77c7cd2a0 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -1,6 +1,7 @@ name = "noema" main = "src/runtime-entrypoint.ts" -compatibility_date = "2026-06-30" +compatibility_date = "2026-07-21" +compatibility_flags = ["nodejs_compat"] [[durable_objects.bindings]] name = "NOEMA_RATE_LIMITER" @@ -10,13 +11,13 @@ class_name = "NoemaRateLimiter" name = "NOEMA_OIDC_REPLAY_GUARD" class_name = "NoemaOidcReplayGuard" -[exports.NoemaRateLimiter] -type = "durable-object" -storage = "sqlite" +[[migrations]] +tag = "v1" +new_sqlite_classes = ["NoemaRateLimiter"] -[exports.NoemaOidcReplayGuard] -type = "durable-object" -storage = "sqlite" +[[migrations]] +tag = "v2" +new_sqlite_classes = ["NoemaOidcReplayGuard"] [vars] ALLOWED_ISSUER = "https://token.actions.githubusercontent.com" @@ -24,14 +25,8 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "2436454e3a969a282b5edc7303a485ccd37c3e9f" +ALLOWED_WORKFLOW_SHA = "44a3c740f7c46c06e7500174d4127413f3f581eb" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" NOEMA_INSTALLATION_CACHE_TTL_SECONDS = "600" - -# Required secrets: -# wrangler secret put GITHUB_APP_ID -# wrangler secret put GITHUB_APP_PRIVATE_KEY_PEM -# Optional: restrict to a specific installation id instead of discovering by repo. -# wrangler secret put GITHUB_APP_INSTALLATION_ID From b507dac2db2a5c627e5fd36554772cbdb290d5e5 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 13:09:52 +0900 Subject: [PATCH 021/228] docs(trust): audit latest protected central movement --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index f6480473e..92f5c42e8 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `2436454e3a969a282b5edc7303a485ccd37c3e9f`. Earlier accepted central movements through `7b1a028e704a98ae8a807bb827f44aeaee0399af` retained the exact trusted `.github/workflows/noema-review.yml` Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27`. The protected one-commit movement from `7b1a028e704a98ae8a807bb827f44aeaee0399af` to `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` changed the trusted `noema-review.yml` blob to `df72f616cacad1e084f23f71442c0b92b139bcf7` and modified central review/dispatch workflows, review-gate and scheduler source, governance documentation, the historical secret-finding allowlist, and focused tests. The subsequent protected one-commit movement from `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` to `2436454e3a969a282b5edc7303a485ccd37c3e9f` changes only `scripts/ci/strix_quick_gate.sh` and `scripts/ci/test_strix_quick_gate.sh`; the trusted `noema-review.yml` blob remains `df72f616cacad1e084f23f71442c0b92b139bcf7` and central `.github/workflows/security-scan.yml` remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355`. Even when the workflow blob itself is unchanged, the repository commit remains trust-relevant because `noema-review.yml` materializes the complete trusted central source tree at the immutable workflow SHA and GitHub OIDC `job_workflow_sha` binds the caller to that exact repository commit identity. Noema therefore audits both the workflow blob and each relevant protected source-tree delta before accepting a repository-commit movement; ancestry, a moving branch ref, or an unchanged security workflow is not sufficient authority. The central repository remains a read-only dependency from Noema. The current protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `44a3c740f7c46c06e7500174d4127413f3f581eb`. Earlier accepted central movements through `7b1a028e704a98ae8a807bb827f44aeaee0399af` retained the exact trusted `.github/workflows/noema-review.yml` Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27`. The protected one-commit movement from `7b1a028e704a98ae8a807bb827f44aeaee0399af` to `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` changed the trusted `noema-review.yml` blob to `df72f616cacad1e084f23f71442c0b92b139bcf7` and modified central review/dispatch workflows, review-gate and scheduler source, governance documentation, the historical secret-finding allowlist, and focused tests. The subsequent protected one-commit movement from `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` to `2436454e3a969a282b5edc7303a485ccd37c3e9f` changes only `scripts/ci/strix_quick_gate.sh` and `scripts/ci/test_strix_quick_gate.sh`. The next protected one-commit movement from `2436454e3a969a282b5edc7303a485ccd37c3e9f` to `44a3c740f7c46c06e7500174d4127413f3f581eb` changes `scripts/ci/pr_review_autofix_context.py`, `scripts/ci/pr_review_fix_scheduler.py`, `scripts/ci/pr_review_merge_scheduler.py`, `tests/test_pr_review_autofix_context_import_fallback.py`, `tests/test_pr_review_fix_scheduler.py`, `tests/test_pr_review_fix_scheduler_direct_rca_regressions.py`, and `tests/test_pr_review_fix_scheduler_rest_workflow_identity.py`; it does not change the trusted workflow or central security workflow. At current protected central, trusted `noema-review.yml` therefore remains exact Git blob `df72f616cacad1e084f23f71442c0b92b139bcf7` and `.github/workflows/security-scan.yml` remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355`. Even when the workflow blob itself is unchanged, the repository commit remains trust-relevant because `noema-review.yml` materializes the complete trusted central source tree at the immutable workflow SHA and GitHub OIDC `job_workflow_sha` binds the caller to that exact repository commit identity. Noema therefore audits both the workflow blob and each relevant protected source-tree delta before accepting a repository-commit movement; ancestry, a moving branch ref, or an unchanged security workflow is not sufficient authority. The central repository remains a read-only dependency from Noema. The current protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. The configured workflow ref and source SHA are operator authority bytes, not normalization input. The protected workflow-ref parser and authoritative verifier do not trim whitespace from these trust values before validation/comparison. A whitespace-bearing value therefore fails as unusable configuration rather than being normalized into a different trusted identity. On an active PR head this statement is candidate truth if the corresponding source delta is not yet on the live protected base. From 31c61bdbbde88e0d084d54d22041ba93790ae94d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 13:11:57 +0900 Subject: [PATCH 022/228] test(trust): preserve deployed durable object state --- ...usted-workflow-runtime-state-preservation.test.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 test/trusted-workflow-runtime-state-preservation.test.ts diff --git a/test/trusted-workflow-runtime-state-preservation.test.ts b/test/trusted-workflow-runtime-state-preservation.test.ts new file mode 100644 index 000000000..d8fd14310 --- /dev/null +++ b/test/trusted-workflow-runtime-state-preservation.test.ts @@ -0,0 +1,12 @@ +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; + +describe("trusted workflow source roll-forward preserves deployed runtime state declarations", () => { + it("keeps the existing Durable Object exports instead of redeclaring deployed classes as new migrations", () => { + const wrangler = readFileSync(new URL("../wrangler.toml", import.meta.url), "utf8"); + + expect(wrangler).toContain('[exports.NoemaRateLimiter]\ntype = "durable-object"\nstorage = "sqlite"'); + expect(wrangler).toContain('[exports.NoemaOidcReplayGuard]\ntype = "durable-object"\nstorage = "sqlite"'); + expect(wrangler).not.toContain("new_sqlite_classes"); + }); +}); From e7e2c026ef11fcd7f2c9ccf55b40535b9ea15156 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 13:12:26 +0900 Subject: [PATCH 023/228] fix(trust): preserve deployed durable object configuration --- wrangler.toml | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/wrangler.toml b/wrangler.toml index 77c7cd2a0..3b98964da 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -1,7 +1,6 @@ name = "noema" main = "src/runtime-entrypoint.ts" -compatibility_date = "2026-07-21" -compatibility_flags = ["nodejs_compat"] +compatibility_date = "2026-06-30" [[durable_objects.bindings]] name = "NOEMA_RATE_LIMITER" @@ -11,13 +10,13 @@ class_name = "NoemaRateLimiter" name = "NOEMA_OIDC_REPLAY_GUARD" class_name = "NoemaOidcReplayGuard" -[[migrations]] -tag = "v1" -new_sqlite_classes = ["NoemaRateLimiter"] +[exports.NoemaRateLimiter] +type = "durable-object" +storage = "sqlite" -[[migrations]] -tag = "v2" -new_sqlite_classes = ["NoemaOidcReplayGuard"] +[exports.NoemaOidcReplayGuard] +type = "durable-object" +storage = "sqlite" [vars] ALLOWED_ISSUER = "https://token.actions.githubusercontent.com" @@ -30,3 +29,9 @@ GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" NOEMA_INSTALLATION_CACHE_TTL_SECONDS = "600" + +# Required secrets: +# wrangler secret put GITHUB_APP_ID +# wrangler secret put GITHUB_APP_PRIVATE_KEY_PEM +# Optional: restrict to a specific installation id instead of discovering by repo. +# wrangler secret put GITHUB_APP_INSTALLATION_ID From 3c7994797ce9e49ddd7efa48625262a05ce209db Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 15:14:23 +0900 Subject: [PATCH 024/228] test(trust): require latest protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 1191f9317..e905531da 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "44a3c740f7c46c06e7500174d4127413f3f581eb"; + "5686de41660d51a7a7f22b8840dfa6ccfe5ff3f1"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From c05a0582142b377b24001e1d620e0102c8f263e2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 15:14:43 +0900 Subject: [PATCH 025/228] fix(trust): roll forward protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 3b98964da..6f1b22e46 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "44a3c740f7c46c06e7500174d4127413f3f581eb" +ALLOWED_WORKFLOW_SHA = "5686de41660d51a7a7f22b8840dfa6ccfe5ff3f1" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From da6fb76a5ae1dd700d527e2f4c83a1bd564e525c Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 15:17:16 +0900 Subject: [PATCH 026/228] docs(trust): audit latest protected central source --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 92f5c42e8..422a17d13 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `44a3c740f7c46c06e7500174d4127413f3f581eb`. Earlier accepted central movements through `7b1a028e704a98ae8a807bb827f44aeaee0399af` retained the exact trusted `.github/workflows/noema-review.yml` Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27`. The protected one-commit movement from `7b1a028e704a98ae8a807bb827f44aeaee0399af` to `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` changed the trusted `noema-review.yml` blob to `df72f616cacad1e084f23f71442c0b92b139bcf7` and modified central review/dispatch workflows, review-gate and scheduler source, governance documentation, the historical secret-finding allowlist, and focused tests. The subsequent protected one-commit movement from `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` to `2436454e3a969a282b5edc7303a485ccd37c3e9f` changes only `scripts/ci/strix_quick_gate.sh` and `scripts/ci/test_strix_quick_gate.sh`. The next protected one-commit movement from `2436454e3a969a282b5edc7303a485ccd37c3e9f` to `44a3c740f7c46c06e7500174d4127413f3f581eb` changes `scripts/ci/pr_review_autofix_context.py`, `scripts/ci/pr_review_fix_scheduler.py`, `scripts/ci/pr_review_merge_scheduler.py`, `tests/test_pr_review_autofix_context_import_fallback.py`, `tests/test_pr_review_fix_scheduler.py`, `tests/test_pr_review_fix_scheduler_direct_rca_regressions.py`, and `tests/test_pr_review_fix_scheduler_rest_workflow_identity.py`; it does not change the trusted workflow or central security workflow. At current protected central, trusted `noema-review.yml` therefore remains exact Git blob `df72f616cacad1e084f23f71442c0b92b139bcf7` and `.github/workflows/security-scan.yml` remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355`. Even when the workflow blob itself is unchanged, the repository commit remains trust-relevant because `noema-review.yml` materializes the complete trusted central source tree at the immutable workflow SHA and GitHub OIDC `job_workflow_sha` binds the caller to that exact repository commit identity. Noema therefore audits both the workflow blob and each relevant protected source-tree delta before accepting a repository-commit movement; ancestry, a moving branch ref, or an unchanged security workflow is not sufficient authority. The central repository remains a read-only dependency from Noema. The current protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `5686de41660d51a7a7f22b8840dfa6ccfe5ff3f1`. Earlier accepted central movements through `7b1a028e704a98ae8a807bb827f44aeaee0399af` retained the exact trusted `.github/workflows/noema-review.yml` Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27`. The protected one-commit movement from `7b1a028e704a98ae8a807bb827f44aeaee0399af` to `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` changed the trusted `noema-review.yml` blob to `df72f616cacad1e084f23f71442c0b92b139bcf7` and modified central review/dispatch workflows, review-gate and scheduler source, governance documentation, the historical secret-finding allowlist, and focused tests. The subsequent protected one-commit movement from `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` to `2436454e3a969a282b5edc7303a485ccd37c3e9f` changes only `scripts/ci/strix_quick_gate.sh` and `scripts/ci/test_strix_quick_gate.sh`. The next protected one-commit movement from `2436454e3a969a282b5edc7303a485ccd37c3e9f` to `44a3c740f7c46c06e7500174d4127413f3f581eb` changes `scripts/ci/pr_review_autofix_context.py`, `scripts/ci/pr_review_fix_scheduler.py`, `scripts/ci/pr_review_merge_scheduler.py`, `tests/test_pr_review_autofix_context_import_fallback.py`, `tests/test_pr_review_fix_scheduler.py`, `tests/test_pr_review_fix_scheduler_direct_rca_regressions.py`, and `tests/test_pr_review_fix_scheduler_rest_workflow_identity.py`; it does not change the trusted workflow or central security workflow. The protected one-commit movement from `44a3c740f7c46c06e7500174d4127413f3f581eb` to `5686de41660d51a7a7f22b8840dfa6ccfe5ff3f1` materially changes central Noema/review orchestration, including `.github/workflows/noema-review.yml`, `opencode-review-dispatch.yml`, `opencode-review.yml`, `pr-review-autofix.yml`, `strix.yml`, the Noema review gate, model-pool/sidecar and review-scheduler source, related ADRs, and focused review tests. The trusted `noema-review.yml` Git blob therefore changes from `df72f616cacad1e084f23f71442c0b92b139bcf7` to `794c94569f091ab53ceac7f7bd847cb7322d987d`, while `.github/workflows/security-scan.yml` remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355`. GitHub OIDC `job_workflow_sha` binds the caller to that exact protected repository commit, and the trusted workflow materializes central source at the immutable workflow SHA. Noema therefore audits both the workflow blob and each relevant protected source-tree delta before accepting a repository-commit movement; ancestry, a moving branch ref, or an unchanged security workflow is not sufficient authority. The central repository remains a read-only dependency from Noema. The current protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. The configured workflow ref and source SHA are operator authority bytes, not normalization input. The protected workflow-ref parser and authoritative verifier do not trim whitespace from these trust values before validation/comparison. A whitespace-bearing value therefore fails as unusable configuration rather than being normalized into a different trusted identity. On an active PR head this statement is candidate truth if the corresponding source delta is not yet on the live protected base. From efef1ec3a7150693e5660415b84c835234937e3f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 18:17:33 +0900 Subject: [PATCH 027/228] test(trust): require latest protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index e905531da..d89e3fbfd 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "5686de41660d51a7a7f22b8840dfa6ccfe5ff3f1"; + "7f3581693dc0f40df32914c695645f500e3a3ba7"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From f7cd9ec2b36a7dbee336ea50125df6e770ec3027 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 18:17:51 +0900 Subject: [PATCH 028/228] fix(trust): roll forward protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 6f1b22e46..98f962207 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "5686de41660d51a7a7f22b8840dfa6ccfe5ff3f1" +ALLOWED_WORKFLOW_SHA = "7f3581693dc0f40df32914c695645f500e3a3ba7" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 7a8b6043cc57029c3f9ed0bb8a2bd8bdce1313e7 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 18:20:21 +0900 Subject: [PATCH 029/228] docs(trust): audit latest protected central source --- ARCHITECTURE.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 422a17d13..4e81befdf 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,9 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `5686de41660d51a7a7f22b8840dfa6ccfe5ff3f1`. Earlier accepted central movements through `7b1a028e704a98ae8a807bb827f44aeaee0399af` retained the exact trusted `.github/workflows/noema-review.yml` Git blob `064c4e5aeedcbb188196bd4800a0b918abd6da27`. The protected one-commit movement from `7b1a028e704a98ae8a807bb827f44aeaee0399af` to `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` changed the trusted `noema-review.yml` blob to `df72f616cacad1e084f23f71442c0b92b139bcf7` and modified central review/dispatch workflows, review-gate and scheduler source, governance documentation, the historical secret-finding allowlist, and focused tests. The subsequent protected one-commit movement from `9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec` to `2436454e3a969a282b5edc7303a485ccd37c3e9f` changes only `scripts/ci/strix_quick_gate.sh` and `scripts/ci/test_strix_quick_gate.sh`. The next protected one-commit movement from `2436454e3a969a282b5edc7303a485ccd37c3e9f` to `44a3c740f7c46c06e7500174d4127413f3f581eb` changes `scripts/ci/pr_review_autofix_context.py`, `scripts/ci/pr_review_fix_scheduler.py`, `scripts/ci/pr_review_merge_scheduler.py`, `tests/test_pr_review_autofix_context_import_fallback.py`, `tests/test_pr_review_fix_scheduler.py`, `tests/test_pr_review_fix_scheduler_direct_rca_regressions.py`, and `tests/test_pr_review_fix_scheduler_rest_workflow_identity.py`; it does not change the trusted workflow or central security workflow. The protected one-commit movement from `44a3c740f7c46c06e7500174d4127413f3f581eb` to `5686de41660d51a7a7f22b8840dfa6ccfe5ff3f1` materially changes central Noema/review orchestration, including `.github/workflows/noema-review.yml`, `opencode-review-dispatch.yml`, `opencode-review.yml`, `pr-review-autofix.yml`, `strix.yml`, the Noema review gate, model-pool/sidecar and review-scheduler source, related ADRs, and focused review tests. The trusted `noema-review.yml` Git blob therefore changes from `df72f616cacad1e084f23f71442c0b92b139bcf7` to `794c94569f091ab53ceac7f7bd847cb7322d987d`, while `.github/workflows/security-scan.yml` remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355`. GitHub OIDC `job_workflow_sha` binds the caller to that exact protected repository commit, and the trusted workflow materializes central source at the immutable workflow SHA. Noema therefore audits both the workflow blob and each relevant protected source-tree delta before accepting a repository-commit movement; ancestry, a moving branch ref, or an unchanged security workflow is not sufficient authority. The central repository remains a read-only dependency from Noema. The current protected central OIDC consumer still reads a top-level `.token` from the exchange response while Noema's stable success envelope exposes the credential under `data.token`; that consumer defect remains central-owned and is not repaired by weakening or reshaping Noema's stable envelope. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `7f3581693dc0f40df32914c695645f500e3a3ba7`. Earlier accepted central movement through `5686de41660d51a7a7f22b8840dfa6ccfe5ff3f1` changed the trusted `.github/workflows/noema-review.yml` Git blob to `794c94569f091ab53ceac7f7bd847cb7322d987d`; protected central has since advanced twelve commits to `7f3581693dc0f40df32914c695645f500e3a3ba7`. That later range changes queue/review/security-supporting workflows and scripts, including Cloudflare validation and the Noema review gate, but the trusted `noema-review.yml` blob remains exactly `794c94569f091ab53ceac7f7bd847cb7322d987d`, and `.github/workflows/security-scan.yml` remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355`. The current central tip includes PR-only superseded Cloudflare-run cancellation intended to reduce saturated validation queues. GitHub OIDC `job_workflow_sha` nevertheless binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to an unchanged workflow blob. Noema therefore rolls its repository-commit trust pin forward only after independently verifying the protected central tip, the trusted workflow blob, relevant source-tree delta, and central Security Scan authority. An unchanged workflow blob alone does not make the old repository SHA current authority. + +The central repository remains a read-only dependency from Noema. The central OIDC consumer mismatch is still owned by existing central PR #834: protected central reads a top-level `.token` while Noema's stable success envelope exposes `data.token`. Noema does not weaken or reshape its producer envelope to compensate for that foreign consumer defect. The configured workflow ref and source SHA are operator authority bytes, not normalization input. The protected workflow-ref parser and authoritative verifier do not trim whitespace from these trust values before validation/comparison. A whitespace-bearing value therefore fails as unusable configuration rather than being normalized into a different trusted identity. On an active PR head this statement is candidate truth if the corresponding source delta is not yet on the live protected base. From 72b40abbe7f3a1d342f45bb521f9a0355eea9bab Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 19:08:05 +0900 Subject: [PATCH 030/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index d89e3fbfd..1c8d7ce02 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "7f3581693dc0f40df32914c695645f500e3a3ba7"; + "c11ff39a30db03118c327cb40ff26d05608050b5"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { @@ -12,4 +12,4 @@ describe("trusted central workflow source revision", () => { `ALLOWED_WORKFLOW_SHA = "${auditedCentralWorkflowSourceSha}"`, ); }); -}); +}); \ No newline at end of file From f472cedf644b1dd1e70cf41ca4e01a3506da4c3c Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 19:08:20 +0900 Subject: [PATCH 031/228] fix(trust): roll forward current central workflow source --- wrangler.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wrangler.toml b/wrangler.toml index 98f962207..f76b3e965 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "7f3581693dc0f40df32914c695645f500e3a3ba7" +ALLOWED_WORKFLOW_SHA = "c11ff39a30db03118c327cb40ff26d05608050b5" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" @@ -34,4 +34,4 @@ NOEMA_INSTALLATION_CACHE_TTL_SECONDS = "600" # wrangler secret put GITHUB_APP_ID # wrangler secret put GITHUB_APP_PRIVATE_KEY_PEM # Optional: restrict to a specific installation id instead of discovering by repo. -# wrangler secret put GITHUB_APP_INSTALLATION_ID +# wrangler secret put GITHUB_APP_INSTALLATION_ID \ No newline at end of file From ffd7663d6332cf865d17638735ac40eec1801233 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 19:09:28 +0900 Subject: [PATCH 032/228] docs(trust): record current central source audit --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 4e81befdf..b95093884 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `7f3581693dc0f40df32914c695645f500e3a3ba7`. Earlier accepted central movement through `5686de41660d51a7a7f22b8840dfa6ccfe5ff3f1` changed the trusted `.github/workflows/noema-review.yml` Git blob to `794c94569f091ab53ceac7f7bd847cb7322d987d`; protected central has since advanced twelve commits to `7f3581693dc0f40df32914c695645f500e3a3ba7`. That later range changes queue/review/security-supporting workflows and scripts, including Cloudflare validation and the Noema review gate, but the trusted `noema-review.yml` blob remains exactly `794c94569f091ab53ceac7f7bd847cb7322d987d`, and `.github/workflows/security-scan.yml` remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355`. The current central tip includes PR-only superseded Cloudflare-run cancellation intended to reduce saturated validation queues. GitHub OIDC `job_workflow_sha` nevertheless binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to an unchanged workflow blob. Noema therefore rolls its repository-commit trust pin forward only after independently verifying the protected central tip, the trusted workflow blob, relevant source-tree delta, and central Security Scan authority. An unchanged workflow blob alone does not make the old repository SHA current authority. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `c11ff39a30db03118c327cb40ff26d05608050b5`. The previously audited protected tip was `7f3581693dc0f40df32914c695645f500e3a3ba7`; the current one-commit movement to `c11ff39a30db03118c327cb40ff26d05608050b5` changes only the organization commercial-readiness loop, its doctoring, and its secret-scope regression to add a bounded OIDC/OpenCode App-token fallback. It does not change the trusted `.github/workflows/noema-review.yml` Git blob, which remains `794c94569f091ab53ceac7f7bd847cb7322d987d`, or `.github/workflows/security-scan.yml`, which remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355`. GitHub OIDC `job_workflow_sha` nevertheless binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to an unchanged workflow blob. Noema therefore rolls its repository-commit trust pin forward only after independently verifying the protected central tip, the trusted workflow blob, relevant source-tree delta, and central Security Scan authority. An unchanged workflow blob alone does not make the old repository SHA current authority. The central repository remains a read-only dependency from Noema. The central OIDC consumer mismatch is still owned by existing central PR #834: protected central reads a top-level `.token` while Noema's stable success envelope exposes `data.token`. Noema does not weaken or reshape its producer envelope to compensate for that foreign consumer defect. From 2c25b3bcf3c7e0f60f817806b28169b82aac9371 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 19:12:45 +0900 Subject: [PATCH 033/228] test(trust): require latest protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 1c8d7ce02..78fae87c4 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "c11ff39a30db03118c327cb40ff26d05608050b5"; + "035269a76ffa6e176ee467f452467cbf4c2158a8"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From cf649890546650d6d00630b85429f589cae74557 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 19:13:03 +0900 Subject: [PATCH 034/228] fix(trust): follow latest protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index f76b3e965..1b746d118 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "c11ff39a30db03118c327cb40ff26d05608050b5" +ALLOWED_WORKFLOW_SHA = "035269a76ffa6e176ee467f452467cbf4c2158a8" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 0ade92f7a2e763fe3e6501503b93d0a5ccd9db8d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 19:13:36 +0900 Subject: [PATCH 035/228] docs(trust): record latest protected central audit --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index b95093884..67de77eeb 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `c11ff39a30db03118c327cb40ff26d05608050b5`. The previously audited protected tip was `7f3581693dc0f40df32914c695645f500e3a3ba7`; the current one-commit movement to `c11ff39a30db03118c327cb40ff26d05608050b5` changes only the organization commercial-readiness loop, its doctoring, and its secret-scope regression to add a bounded OIDC/OpenCode App-token fallback. It does not change the trusted `.github/workflows/noema-review.yml` Git blob, which remains `794c94569f091ab53ceac7f7bd847cb7322d987d`, or `.github/workflows/security-scan.yml`, which remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355`. GitHub OIDC `job_workflow_sha` nevertheless binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to an unchanged workflow blob. Noema therefore rolls its repository-commit trust pin forward only after independently verifying the protected central tip, the trusted workflow blob, relevant source-tree delta, and central Security Scan authority. An unchanged workflow blob alone does not make the old repository SHA current authority. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `035269a76ffa6e176ee467f452467cbf4c2158a8`. The immediately preceding audited tip was `c11ff39a30db03118c327cb40ff26d05608050b5`; the current one-commit movement changes only `scripts/ci/pr_review_merge_scheduler.py` and new regression `tests/test_strix_rerun_job_selection.py` to bind authoritative Strix reruns to the scan job rather than a publisher job. It does not change the trusted `.github/workflows/noema-review.yml` Git blob, which remains `794c94569f091ab53ceac7f7bd847cb7322d987d`, or `.github/workflows/security-scan.yml`, which remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355`. GitHub OIDC `job_workflow_sha` nevertheless binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to an unchanged workflow blob. Noema therefore rolls its repository-commit trust pin forward only after independently verifying the protected central tip, the trusted workflow blob, relevant source-tree delta, and central Security Scan authority. An unchanged workflow blob alone does not make the old repository SHA current authority. The central repository remains a read-only dependency from Noema. The central OIDC consumer mismatch is still owned by existing central PR #834: protected central reads a top-level `.token` while Noema's stable success envelope exposes `data.token`. Noema does not weaken or reshape its producer envelope to compensate for that foreign consumer defect. From 9f2c7905bc8c30aacd2cd02652844751b2937831 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 21:12:11 +0900 Subject: [PATCH 036/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 78fae87c4..0b0fc0e64 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "035269a76ffa6e176ee467f452467cbf4c2158a8"; + "5768f2bd29b0856ad49f18a0fda72b871eb95b46"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From c13c48369b1dc53d3da1a97cdc48c4edfc536a0d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 21:12:45 +0900 Subject: [PATCH 037/228] fix(trust): roll forward audited central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 1b746d118..853af3310 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "035269a76ffa6e176ee467f452467cbf4c2158a8" +ALLOWED_WORKFLOW_SHA = "5768f2bd29b0856ad49f18a0fda72b871eb95b46" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 3a00c23b55cba397053cb2786986fce40d1ffa05 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 21:13:54 +0900 Subject: [PATCH 038/228] docs(trust): record audited central roll-forward --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 67de77eeb..1c6370703 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `035269a76ffa6e176ee467f452467cbf4c2158a8`. The immediately preceding audited tip was `c11ff39a30db03118c327cb40ff26d05608050b5`; the current one-commit movement changes only `scripts/ci/pr_review_merge_scheduler.py` and new regression `tests/test_strix_rerun_job_selection.py` to bind authoritative Strix reruns to the scan job rather than a publisher job. It does not change the trusted `.github/workflows/noema-review.yml` Git blob, which remains `794c94569f091ab53ceac7f7bd847cb7322d987d`, or `.github/workflows/security-scan.yml`, which remains exact Git blob `148e944310593958d7c6dd96590c5327a0c4b355`. GitHub OIDC `job_workflow_sha` nevertheless binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to an unchanged workflow blob. Noema therefore rolls its repository-commit trust pin forward only after independently verifying the protected central tip, the trusted workflow blob, relevant source-tree delta, and central Security Scan authority. An unchanged workflow blob alone does not make the old repository SHA current authority. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `5768f2bd29b0856ad49f18a0fda72b871eb95b46`. The previously audited protected tip was `035269a76ffa6e176ee467f452467cbf4c2158a8`; the current tip is 23 protected commits ahead. The trusted `.github/workflows/noema-review.yml` blob remains exact `794c94569f091ab53ceac7f7bd847cb7322d987d`, and `.github/workflows/security-scan.yml` remains exact `148e944310593958d7c6dd96590c5327a0c4b355`. The audited trust-relevant source delta does include `scripts/ci/noema_review_gate.py`: the current gate carries explicit live base identity, immutable merge-base resolution, status-aware changed-file context, and pre-deletion evidence for removed files instead of inventing head content. These changes strengthen review evidence binding rather than relaxing workflow-source authorization. Other commits in the movement repair central scheduler, reviewer, and saturated-runner control paths; they do not replace Noema's exact OIDC source-SHA check. GitHub OIDC `job_workflow_sha` still binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to unchanged workflow blobs, so Noema rolls its repository-commit trust pin forward only after independently verifying the protected central tip, trusted workflow blobs, relevant trusted source-tree delta, and central Security Scan authority. The central repository remains a read-only dependency from Noema. The central OIDC consumer mismatch is still owned by existing central PR #834: protected central reads a top-level `.token` while Noema's stable success envelope exposes `data.token`. Noema does not weaken or reshape its producer envelope to compensate for that foreign consumer defect. From f5f702d9afca48bddf4038ac9e5f212ef180271e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 21:46:12 +0900 Subject: [PATCH 039/228] test(trust): require latest audited central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 0b0fc0e64..e9d9a15c0 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "5768f2bd29b0856ad49f18a0fda72b871eb95b46"; + "6eb93bce8575ba734f5ce6cb9267d76f18f73680"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From c9373b78455d425201f1d2733898945e9515b7aa Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 21:46:40 +0900 Subject: [PATCH 040/228] fix(trust): pin audited central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 853af3310..8b035cec0 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "5768f2bd29b0856ad49f18a0fda72b871eb95b46" +ALLOWED_WORKFLOW_SHA = "6eb93bce8575ba734f5ce6cb9267d76f18f73680" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 55a59110f0197f2c63d9cf8718ea5bf771874d67 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 21:47:41 +0900 Subject: [PATCH 041/228] docs(architecture): bind latest central trust source --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 1c6370703..4b6a8ad0c 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `5768f2bd29b0856ad49f18a0fda72b871eb95b46`. The previously audited protected tip was `035269a76ffa6e176ee467f452467cbf4c2158a8`; the current tip is 23 protected commits ahead. The trusted `.github/workflows/noema-review.yml` blob remains exact `794c94569f091ab53ceac7f7bd847cb7322d987d`, and `.github/workflows/security-scan.yml` remains exact `148e944310593958d7c6dd96590c5327a0c4b355`. The audited trust-relevant source delta does include `scripts/ci/noema_review_gate.py`: the current gate carries explicit live base identity, immutable merge-base resolution, status-aware changed-file context, and pre-deletion evidence for removed files instead of inventing head content. These changes strengthen review evidence binding rather than relaxing workflow-source authorization. Other commits in the movement repair central scheduler, reviewer, and saturated-runner control paths; they do not replace Noema's exact OIDC source-SHA check. GitHub OIDC `job_workflow_sha` still binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to unchanged workflow blobs, so Noema rolls its repository-commit trust pin forward only after independently verifying the protected central tip, trusted workflow blobs, relevant trusted source-tree delta, and central Security Scan authority. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `6eb93bce8575ba734f5ce6cb9267d76f18f73680`. The previously audited protected tip was `5768f2bd29b0856ad49f18a0fda72b871eb95b46`; the current tip is three protected commits ahead. The trusted `.github/workflows/noema-review.yml` blob remains exact `794c94569f091ab53ceac7f7bd847cb7322d987d`, and `.github/workflows/security-scan.yml` remains exact `148e944310593958d7c6dd96590c5327a0c4b355`. The audited `5768f2b… → 6eb93bc…` movement does not modify `scripts/ci/noema_review_gate.py` or the trusted Noema review workflow; it changes the separate hourly review-repair workflow, Strix timeout selection, their tests, and central architecture/doctoring evidence. Those changes repair central review/control-plane behavior without replacing Noema's exact OIDC source-SHA check. GitHub OIDC `job_workflow_sha` still binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to unchanged workflow blobs, so Noema rolls its repository-commit trust pin forward only after independently verifying the protected central tip, trusted workflow blobs, relevant trusted source-tree delta, and central Security Scan authority. The central repository remains a read-only dependency from Noema. The central OIDC consumer mismatch is still owned by existing central PR #834: protected central reads a top-level `.token` while Noema's stable success envelope exposes `data.token`. Noema does not weaken or reshape its producer envelope to compensate for that foreign consumer defect. From 3d5173b707df1e0877b491cc13aac28cc65c7193 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 22:45:46 +0900 Subject: [PATCH 042/228] test(trust): require current central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index e9d9a15c0..b1df1815b 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "6eb93bce8575ba734f5ce6cb9267d76f18f73680"; + "c70b081dd93cf9ca53c2277ba95eab0e200cbe5c"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 19c06a683611e39fc3f50505e0ce0d8be6f3ff44 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 22:46:17 +0900 Subject: [PATCH 043/228] fix(trust): pin current central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 8b035cec0..6b2aff835 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "6eb93bce8575ba734f5ce6cb9267d76f18f73680" +ALLOWED_WORKFLOW_SHA = "c70b081dd93cf9ca53c2277ba95eab0e200cbe5c" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 71938a7be619134ee11219f837ac2b5f4d0ba1b9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 22:46:51 +0900 Subject: [PATCH 044/228] test(trust): follow protected central tip --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index b1df1815b..fa11f40e9 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "c70b081dd93cf9ca53c2277ba95eab0e200cbe5c"; + "c4f3ba3fc06019377f73fc8636ebdb78f5874e42"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 11a4485f6e51dbde4ad92b660a02e0d5a9a5a7e0 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 22:47:05 +0900 Subject: [PATCH 045/228] fix(trust): follow protected central tip --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 6b2aff835..a6f5b235f 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "c70b081dd93cf9ca53c2277ba95eab0e200cbe5c" +ALLOWED_WORKFLOW_SHA = "c4f3ba3fc06019377f73fc8636ebdb78f5874e42" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 6847e702c0f8f922fe17c46d09ca68d01daafead Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 23:03:43 +0900 Subject: [PATCH 046/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index fa11f40e9..1daf20719 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "c4f3ba3fc06019377f73fc8636ebdb78f5874e42"; + "a86177e272e9cfca19a3eda4424f8a4f29996f34"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From a79427415c3c5d290abe9ea2ab59d65a037fda1d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 23:04:30 +0900 Subject: [PATCH 047/228] fix(trust): roll pin to audited central head --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index a6f5b235f..7e48cc5ce 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "c4f3ba3fc06019377f73fc8636ebdb78f5874e42" +ALLOWED_WORKFLOW_SHA = "a86177e272e9cfca19a3eda4424f8a4f29996f34" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From d775c6363217da5ee06373d7c5dd84980741fd02 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 23:05:31 +0900 Subject: [PATCH 048/228] docs(trust): align audited central source authority --- ARCHITECTURE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 4b6a8ad0c..6f430aadb 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,9 +28,9 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `6eb93bce8575ba734f5ce6cb9267d76f18f73680`. The previously audited protected tip was `5768f2bd29b0856ad49f18a0fda72b871eb95b46`; the current tip is three protected commits ahead. The trusted `.github/workflows/noema-review.yml` blob remains exact `794c94569f091ab53ceac7f7bd847cb7322d987d`, and `.github/workflows/security-scan.yml` remains exact `148e944310593958d7c6dd96590c5327a0c4b355`. The audited `5768f2b… → 6eb93bc…` movement does not modify `scripts/ci/noema_review_gate.py` or the trusted Noema review workflow; it changes the separate hourly review-repair workflow, Strix timeout selection, their tests, and central architecture/doctoring evidence. Those changes repair central review/control-plane behavior without replacing Noema's exact OIDC source-SHA check. GitHub OIDC `job_workflow_sha` still binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to unchanged workflow blobs, so Noema rolls its repository-commit trust pin forward only after independently verifying the protected central tip, trusted workflow blobs, relevant trusted source-tree delta, and central Security Scan authority. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `a86177e272e9cfca19a3eda4424f8a4f29996f34`. The immediately preceding audited runtime pin was `c4f3ba3fc06019377f73fc8636ebdb78f5874e42`; current protected central is one commit ahead. The trusted `.github/workflows/noema-review.yml` blob remains exact `794c94569f091ab53ceac7f7bd847cb7322d987d`, `.github/workflows/security-scan.yml` remains exact `148e944310593958d7c6dd96590c5327a0c4b355`, and `scripts/ci/noema_review_gate.py` remains unchanged across the audited `c4f3ba3… → a86177e…` movement. That protected one-commit delta changes only `tests/test_strix_llm_timeout_contract.py`, restoring central Strix compatibility-entrypoint coverage without changing Noema review execution, Security Scan authority, or the trusted review gate implementation. GitHub OIDC `job_workflow_sha` still binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to unchanged workflow blobs, so Noema advances its repository-commit trust pin only after independently verifying the protected central tip, trusted workflow blobs, relevant trusted source-tree delta, and central Security Scan authority. -The central repository remains a read-only dependency from Noema. The central OIDC consumer mismatch is still owned by existing central PR #834: protected central reads a top-level `.token` while Noema's stable success envelope exposes `data.token`. Noema does not weaken or reshape its producer envelope to compensate for that foreign consumer defect. +The central repository remains a read-only dependency from Noema. A central OIDC consumer mismatch, if still present in live central source, remains central-owned: Noema does not weaken or reshape its producer envelope to compensate for a foreign consumer defect. The configured workflow ref and source SHA are operator authority bytes, not normalization input. The protected workflow-ref parser and authoritative verifier do not trim whitespace from these trust values before validation/comparison. A whitespace-bearing value therefore fails as unusable configuration rather than being normalized into a different trusted identity. On an active PR head this statement is candidate truth if the corresponding source delta is not yet on the live protected base. From c8eef63eb3f80c139a03990553bfbd646151d594 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 01:12:42 +0900 Subject: [PATCH 049/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 1daf20719..a6ec87a91 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "a86177e272e9cfca19a3eda4424f8a4f29996f34"; + "cb38cc30284a02d0986cb55a14ff0a65ef390937"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From e46df83b9b4d4ffe3c672fe6e5d570ae71586b4d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 01:13:52 +0900 Subject: [PATCH 050/228] fix(trust): pin current audited central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 7e48cc5ce..3d09f4b1f 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "a86177e272e9cfca19a3eda4424f8a4f29996f34" +ALLOWED_WORKFLOW_SHA = "cb38cc30284a02d0986cb55a14ff0a65ef390937" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From e44635c3e88ce40741d9c263238ae55a8a6583e7 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 01:15:36 +0900 Subject: [PATCH 051/228] docs(trust): record audited two-phase central source --- ARCHITECTURE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 6f430aadb..9caed1a33 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,9 +28,9 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `a86177e272e9cfca19a3eda4424f8a4f29996f34`. The immediately preceding audited runtime pin was `c4f3ba3fc06019377f73fc8636ebdb78f5874e42`; current protected central is one commit ahead. The trusted `.github/workflows/noema-review.yml` blob remains exact `794c94569f091ab53ceac7f7bd847cb7322d987d`, `.github/workflows/security-scan.yml` remains exact `148e944310593958d7c6dd96590c5327a0c4b355`, and `scripts/ci/noema_review_gate.py` remains unchanged across the audited `c4f3ba3… → a86177e…` movement. That protected one-commit delta changes only `tests/test_strix_llm_timeout_contract.py`, restoring central Strix compatibility-entrypoint coverage without changing Noema review execution, Security Scan authority, or the trusted review gate implementation. GitHub OIDC `job_workflow_sha` still binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to unchanged workflow blobs, so Noema advances its repository-commit trust pin only after independently verifying the protected central tip, trusted workflow blobs, relevant trusted source-tree delta, and central Security Scan authority. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `cb38cc30284a02d0986cb55a14ff0a65ef390937`. The immediately preceding runtime pin on this Noema branch was `a86177e272e9cfca19a3eda4424f8a4f29996f34`; the protected central source moved materially across that interval, so unchanged-workflow assumptions were discarded and the trust surface was re-audited from the current protected tip. The trusted `.github/workflows/noema-review.yml` blob is now exact `6b2e3fcede57ef019363aad4dc2838e187f88285`, replacing `794c94569f091ab53ceac7f7bd847cb7322d987d`. The current central workflow splits model evaluation from publication: `.github/actions/noema-review/two_phase.py` (blob `1cab5aa411cf6f97925a7ecfdca118bdbea6e3a0`) seals a bounded owner-only verdict envelope during model evaluation, then publication re-fetches the exact pull-request head and base and requires a freshly verified independent reviewer credential before submitting evidence. `scripts/ci/noema_review_gate.py` is also trust-relevant at current blob `5dbeb65d79aeab55dba44087e10824d4c8f7d428`; it remains the source of exact-head/base, actor, verdict and review-submission validation consumed by the two-phase helper. Central `.github/workflows/security-scan.yml` is current blob `940b688183d0740c580f2c58756882c99749cc10`; the audited compare replaces floating `ubuntu-latest` selectors with explicit `ubuntu-24.04` selectors without relaxing the OSV, dependency-review, Trivy or Scorecard gate semantics. GitHub OIDC `job_workflow_sha` still binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to individual workflow blobs, so Noema advances its repository-commit trust pin only after independently verifying the protected central tip, trusted workflow and helper blobs, trust-relevant source-tree changes, and central Security Scan authority. -The central repository remains a read-only dependency from Noema. A central OIDC consumer mismatch, if still present in live central source, remains central-owned: Noema does not weaken or reshape its producer envelope to compensate for a foreign consumer defect. +The central repository remains a read-only dependency from Noema. A central OIDC consumer mismatch, reviewer-token lifecycle defect, or scanner-control defect remains central-owned: Noema does not weaken or reshape its producer envelope, reviewer boundary, or source-authentication semantics to compensate for a foreign consumer/control-plane defect. The configured workflow ref and source SHA are operator authority bytes, not normalization input. The protected workflow-ref parser and authoritative verifier do not trim whitespace from these trust values before validation/comparison. A whitespace-bearing value therefore fails as unusable configuration rather than being normalized into a different trusted identity. On an active PR head this statement is candidate truth if the corresponding source delta is not yet on the live protected base. From 3051f7e169471105f0b2cf05ea70e12ab9af7f79 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 01:49:34 +0900 Subject: [PATCH 052/228] test(trust): require latest audited central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index a6ec87a91..279a4ec3d 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "cb38cc30284a02d0986cb55a14ff0a65ef390937"; + "1ddc31fb341a75ddafe8516b86c5d52e26669933"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 14fc2b5679a9405464a432a0daef98f7232bd691 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 01:49:57 +0900 Subject: [PATCH 053/228] fix(trust): roll forward audited central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 3d09f4b1f..68a86341e 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "cb38cc30284a02d0986cb55a14ff0a65ef390937" +ALLOWED_WORKFLOW_SHA = "1ddc31fb341a75ddafe8516b86c5d52e26669933" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 549f29c9e849f975b15aa12b11fdc0f635126e23 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 02:12:44 +0900 Subject: [PATCH 054/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 279a4ec3d..4204019f2 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "1ddc31fb341a75ddafe8516b86c5d52e26669933"; + "4ae90e18b03a3a455e13e501628010cabc5c37a8"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 1a65843fc798e23908bf784723b2e34e8824971a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 02:13:14 +0900 Subject: [PATCH 055/228] fix(trust): roll forward audited central source identity --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 68a86341e..f6b6a3db9 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "1ddc31fb341a75ddafe8516b86c5d52e26669933" +ALLOWED_WORKFLOW_SHA = "4ae90e18b03a3a455e13e501628010cabc5c37a8" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 6ba13236afdcaab0941a2690a46ae86aa79b1f62 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 02:14:05 +0900 Subject: [PATCH 056/228] docs(architecture): audit current central trust source --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 9caed1a33..e7c13dec9 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `cb38cc30284a02d0986cb55a14ff0a65ef390937`. The immediately preceding runtime pin on this Noema branch was `a86177e272e9cfca19a3eda4424f8a4f29996f34`; the protected central source moved materially across that interval, so unchanged-workflow assumptions were discarded and the trust surface was re-audited from the current protected tip. The trusted `.github/workflows/noema-review.yml` blob is now exact `6b2e3fcede57ef019363aad4dc2838e187f88285`, replacing `794c94569f091ab53ceac7f7bd847cb7322d987d`. The current central workflow splits model evaluation from publication: `.github/actions/noema-review/two_phase.py` (blob `1cab5aa411cf6f97925a7ecfdca118bdbea6e3a0`) seals a bounded owner-only verdict envelope during model evaluation, then publication re-fetches the exact pull-request head and base and requires a freshly verified independent reviewer credential before submitting evidence. `scripts/ci/noema_review_gate.py` is also trust-relevant at current blob `5dbeb65d79aeab55dba44087e10824d4c8f7d428`; it remains the source of exact-head/base, actor, verdict and review-submission validation consumed by the two-phase helper. Central `.github/workflows/security-scan.yml` is current blob `940b688183d0740c580f2c58756882c99749cc10`; the audited compare replaces floating `ubuntu-latest` selectors with explicit `ubuntu-24.04` selectors without relaxing the OSV, dependency-review, Trivy or Scorecard gate semantics. GitHub OIDC `job_workflow_sha` still binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to individual workflow blobs, so Noema advances its repository-commit trust pin only after independently verifying the protected central tip, trusted workflow and helper blobs, trust-relevant source-tree changes, and central Security Scan authority. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `4ae90e18b03a3a455e13e501628010cabc5c37a8`. The immediately preceding runtime pin on this Noema branch was `1ddc31fb341a75ddafe8516b86c5d52e26669933`; the protected central source advanced by 18 commits, so unchanged-workflow assumptions were discarded and the trust surface was re-audited from the current protected tip. That compare changes only OpenCode dispatch/bootstrap and coverage-helper/test surfaces; it does not modify the trusted Noema workflow/helper or central Security Scan. The trusted `.github/workflows/noema-review.yml` blob remains exact `6b2e3fcede57ef019363aad4dc2838e187f88285`; `.github/actions/noema-review/two_phase.py` remains exact blob `1cab5aa411cf6f97925a7ecfdca118bdbea6e3a0`; and central `.github/workflows/security-scan.yml` remains exact blob `940b688183d0740c580f2c58756882c99749cc10`. The current central Noema workflow splits model evaluation from publication: the two-phase helper seals a bounded owner-only verdict envelope during model evaluation, then publication re-fetches the exact pull-request head and base and requires a freshly verified independent reviewer credential before submitting evidence. `scripts/ci/noema_review_gate.py` remains the source of exact-head/base, actor, verdict and review-submission validation consumed by that helper. GitHub OIDC `job_workflow_sha` still binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to individual workflow blobs, so Noema advances its repository-commit trust pin only after independently verifying the protected central tip, trusted workflow and helper blobs, trust-relevant source-tree changes, and central Security Scan authority. The central repository remains a read-only dependency from Noema. A central OIDC consumer mismatch, reviewer-token lifecycle defect, or scanner-control defect remains central-owned: Noema does not weaken or reshape its producer envelope, reviewer boundary, or source-authentication semantics to compensate for a foreign consumer/control-plane defect. From 161846b19fcefa062711458040efa1747751f39e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:04:53 +0900 Subject: [PATCH 057/228] test(trust): expose latest central source movement --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 4204019f2..635b62fcd 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "4ae90e18b03a3a455e13e501628010cabc5c37a8"; + "476e8be3037800fb84e7ba780ed2068ffdfe3da5"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 20ca19a523b80ece11f2b0ab09394706a892f3f7 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:05:32 +0900 Subject: [PATCH 058/228] fix(trust): roll forward latest central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index f6b6a3db9..eacd79992 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "4ae90e18b03a3a455e13e501628010cabc5c37a8" +ALLOWED_WORKFLOW_SHA = "476e8be3037800fb84e7ba780ed2068ffdfe3da5" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 43792298cadcab7bcc2e6918fc915ef1617c5e59 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:06:29 +0900 Subject: [PATCH 059/228] docs(architecture): audit latest central trust source --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index e7c13dec9..873e48e0b 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `4ae90e18b03a3a455e13e501628010cabc5c37a8`. The immediately preceding runtime pin on this Noema branch was `1ddc31fb341a75ddafe8516b86c5d52e26669933`; the protected central source advanced by 18 commits, so unchanged-workflow assumptions were discarded and the trust surface was re-audited from the current protected tip. That compare changes only OpenCode dispatch/bootstrap and coverage-helper/test surfaces; it does not modify the trusted Noema workflow/helper or central Security Scan. The trusted `.github/workflows/noema-review.yml` blob remains exact `6b2e3fcede57ef019363aad4dc2838e187f88285`; `.github/actions/noema-review/two_phase.py` remains exact blob `1cab5aa411cf6f97925a7ecfdca118bdbea6e3a0`; and central `.github/workflows/security-scan.yml` remains exact blob `940b688183d0740c580f2c58756882c99749cc10`. The current central Noema workflow splits model evaluation from publication: the two-phase helper seals a bounded owner-only verdict envelope during model evaluation, then publication re-fetches the exact pull-request head and base and requires a freshly verified independent reviewer credential before submitting evidence. `scripts/ci/noema_review_gate.py` remains the source of exact-head/base, actor, verdict and review-submission validation consumed by that helper. GitHub OIDC `job_workflow_sha` still binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to individual workflow blobs, so Noema advances its repository-commit trust pin only after independently verifying the protected central tip, trusted workflow and helper blobs, trust-relevant source-tree changes, and central Security Scan authority. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `476e8be3037800fb84e7ba780ed2068ffdfe3da5`. The immediately preceding runtime pin on this Noema branch was `4ae90e18b03a3a455e13e501628010cabc5c37a8`; the protected central source advanced by 17 commits, so the trust surface was re-audited from the current protected tip instead of inheriting predecessor evidence. That compare changes only the PR-review/merge scheduler cadence, its queue-saturation regression and related rollout/doctoring documentation; it does not modify the trusted Noema workflow/helper or central Security Scan. The trusted `.github/workflows/noema-review.yml` blob remains exact `6b2e3fcede57ef019363aad4dc2838e187f88285`; `.github/actions/noema-review/two_phase.py` remains exact blob `1cab5aa411cf6f97925a7ecfdca118bdbea6e3a0`; and central `.github/workflows/security-scan.yml` remains exact blob `940b688183d0740c580f2c58756882c99749cc10`. The current central Noema workflow splits model evaluation from publication: the two-phase helper seals a bounded owner-only verdict envelope during model evaluation, then publication re-fetches the exact pull-request head and base and requires a freshly verified independent reviewer credential before submitting evidence. `scripts/ci/noema_review_gate.py` remains the source of exact-head/base, actor, verdict and review-submission validation consumed by that helper. GitHub OIDC `job_workflow_sha` still binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to individual workflow blobs, so Noema advances its repository-commit trust pin only after independently verifying the protected central tip, trusted workflow and helper blobs, trust-relevant source-tree changes, and central Security Scan authority. The central repository remains a read-only dependency from Noema. A central OIDC consumer mismatch, reviewer-token lifecycle defect, or scanner-control defect remains central-owned: Noema does not weaken or reshape its producer envelope, reviewer boundary, or source-authentication semantics to compensate for a foreign consumer/control-plane defect. From e0c1ba11161fcc58c38dee89d62371bf0aaffca9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:10:23 +0900 Subject: [PATCH 060/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 635b62fcd..4204019f2 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "476e8be3037800fb84e7ba780ed2068ffdfe3da5"; + "4ae90e18b03a3a455e13e501628010cabc5c37a8"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 297aca1e923ce6ae1931f91ba9f74b56355664f4 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:10:33 +0900 Subject: [PATCH 061/228] fix(trust): restore live protected workflow authority --- wrangler.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wrangler.toml b/wrangler.toml index eacd79992..e804e5504 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "476e8be3037800fb84e7ba780ed2068ffdfe3da5" +ALLOWED_WORKFLOW_SHA = "4ae90e18b03a3a455e13e501628010cabc5c37a8" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" @@ -34,4 +34,4 @@ NOEMA_INSTALLATION_CACHE_TTL_SECONDS = "600" # wrangler secret put GITHUB_APP_ID # wrangler secret put GITHUB_APP_PRIVATE_KEY_PEM # Optional: restrict to a specific installation id instead of discovering by repo. -# wrangler secret put GITHUB_APP_INSTALLATION_ID \ No newline at end of file +# wrangler secret put GITHUB_APP_INSTALLATION_ID From 53cc7a5c29fd57bcb40d9c06454e0323d36b016e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:11:24 +0900 Subject: [PATCH 062/228] docs(arch): bind trust audit to live protected central tip --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 873e48e0b..6371cbafb 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to protected central `.github` commit `476e8be3037800fb84e7ba780ed2068ffdfe3da5`. The immediately preceding runtime pin on this Noema branch was `4ae90e18b03a3a455e13e501628010cabc5c37a8`; the protected central source advanced by 17 commits, so the trust surface was re-audited from the current protected tip instead of inheriting predecessor evidence. That compare changes only the PR-review/merge scheduler cadence, its queue-saturation regression and related rollout/doctoring documentation; it does not modify the trusted Noema workflow/helper or central Security Scan. The trusted `.github/workflows/noema-review.yml` blob remains exact `6b2e3fcede57ef019363aad4dc2838e187f88285`; `.github/actions/noema-review/two_phase.py` remains exact blob `1cab5aa411cf6f97925a7ecfdca118bdbea6e3a0`; and central `.github/workflows/security-scan.yml` remains exact blob `940b688183d0740c580f2c58756882c99749cc10`. The current central Noema workflow splits model evaluation from publication: the two-phase helper seals a bounded owner-only verdict envelope during model evaluation, then publication re-fetches the exact pull-request head and base and requires a freshly verified independent reviewer credential before submitting evidence. `scripts/ci/noema_review_gate.py` remains the source of exact-head/base, actor, verdict and review-submission validation consumed by that helper. GitHub OIDC `job_workflow_sha` still binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to individual workflow blobs, so Noema advances its repository-commit trust pin only after independently verifying the protected central tip, trusted workflow and helper blobs, trust-relevant source-tree changes, and central Security Scan authority. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to the live protected central `.github` commit `4ae90e18b03a3a455e13e501628010cabc5c37a8`. The immediately preceding audited candidate on this Noema branch was `476e8be3037800fb84e7ba780ed2068ffdfe3da5`, which is a 17-commit descendant of `4ae90e18...` but is not the current protected `refs/heads/main` authority. The protected ref therefore requires this branch to rebind to `4ae90e18...` rather than preserve a newer-but-stale descendant. The compare between those commits changes only `.github/workflows/pr-review-merge-scheduler.yml`, queue-saturation regression/doctoring, and required-workflow rollout documentation; it does not modify the trusted Noema workflow/helper or central Security Scan. At current protected `4ae90e18...`, `.github/workflows/noema-review.yml` is exact blob `6b2e3fcede57ef019363aad4dc2838e187f88285`, `.github/actions/noema-review/two_phase.py` is exact blob `1cab5aa411cf6f97925a7ecfdca118bdbea6e3a0`, and `.github/workflows/security-scan.yml` is exact blob `940b688183d0740c580f2c58756882c99749cc10`; the Noema workflow blob is identical at the stale descendant. The current central Noema workflow splits model evaluation from publication: the two-phase helper seals a bounded owner-only verdict envelope during model evaluation, then publication re-fetches the exact pull-request head and base and requires a freshly verified independent reviewer credential before submitting evidence. `scripts/ci/noema_review_gate.py` remains the source of exact-head/base, actor, verdict and review-submission validation consumed by that helper. GitHub OIDC `job_workflow_sha` binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to individual workflow blobs, so Noema advances or rolls back its repository-commit trust pin only after independently verifying the live protected central tip, trusted workflow and helper blobs, trust-relevant source-tree delta, and central Security Scan authority. The central repository remains a read-only dependency from Noema. A central OIDC consumer mismatch, reviewer-token lifecycle defect, or scanner-control defect remains central-owned: Noema does not weaken or reshape its producer envelope, reviewer boundary, or source-authentication semantics to compensate for a foreign consumer/control-plane defect. From 6b8f25c2f784b6691e9bbe1befc96dcee4b4a11e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:18:14 +0900 Subject: [PATCH 063/228] test(trust): require current central review source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 4204019f2..883d681c8 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "4ae90e18b03a3a455e13e501628010cabc5c37a8"; + "d9320a42d7a272720f6b659003a0456e4dc65e8e"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 9ecd494349bf2a9e6fd1b3115c86554227f4542a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:18:38 +0900 Subject: [PATCH 064/228] fix(trust): roll forward central review workflow source --- wrangler.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wrangler.toml b/wrangler.toml index e804e5504..6f649869a 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "4ae90e18b03a3a455e13e501628010cabc5c37a8" +ALLOWED_WORKFLOW_SHA = "d9320a42d7a272720f6b659003a0456e4dc65e8e" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" @@ -34,4 +34,4 @@ NOEMA_INSTALLATION_CACHE_TTL_SECONDS = "600" # wrangler secret put GITHUB_APP_ID # wrangler secret put GITHUB_APP_PRIVATE_KEY_PEM # Optional: restrict to a specific installation id instead of discovering by repo. -# wrangler secret put GITHUB_APP_INSTALLATION_ID +# wrangler secret put GITHUB_APP_INSTALLATION_ID \ No newline at end of file From 38856392a147277555fcf74eab3b2bb66e1b627d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:19:37 +0900 Subject: [PATCH 065/228] docs(architecture): audit current central review source --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 6371cbafb..87765c8fc 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to the live protected central `.github` commit `4ae90e18b03a3a455e13e501628010cabc5c37a8`. The immediately preceding audited candidate on this Noema branch was `476e8be3037800fb84e7ba780ed2068ffdfe3da5`, which is a 17-commit descendant of `4ae90e18...` but is not the current protected `refs/heads/main` authority. The protected ref therefore requires this branch to rebind to `4ae90e18...` rather than preserve a newer-but-stale descendant. The compare between those commits changes only `.github/workflows/pr-review-merge-scheduler.yml`, queue-saturation regression/doctoring, and required-workflow rollout documentation; it does not modify the trusted Noema workflow/helper or central Security Scan. At current protected `4ae90e18...`, `.github/workflows/noema-review.yml` is exact blob `6b2e3fcede57ef019363aad4dc2838e187f88285`, `.github/actions/noema-review/two_phase.py` is exact blob `1cab5aa411cf6f97925a7ecfdca118bdbea6e3a0`, and `.github/workflows/security-scan.yml` is exact blob `940b688183d0740c580f2c58756882c99749cc10`; the Noema workflow blob is identical at the stale descendant. The current central Noema workflow splits model evaluation from publication: the two-phase helper seals a bounded owner-only verdict envelope during model evaluation, then publication re-fetches the exact pull-request head and base and requires a freshly verified independent reviewer credential before submitting evidence. `scripts/ci/noema_review_gate.py` remains the source of exact-head/base, actor, verdict and review-submission validation consumed by that helper. GitHub OIDC `job_workflow_sha` binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to individual workflow blobs, so Noema advances or rolls back its repository-commit trust pin only after independently verifying the live protected central tip, trusted workflow and helper blobs, trust-relevant source-tree delta, and central Security Scan authority. +`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to the live protected central `.github` commit `d9320a42d7a272720f6b659003a0456e4dc65e8e`. Relative to previously audited protected source `476e8be3037800fb84e7ba780ed2068ffdfe3da5`, the central repository advanced by two commits to repair required-review runner starvation. The compare changes `.github/workflows/noema-review.yml`, `.github/workflows/opencode-review.yml`, `.github/workflows/strix.yml`, their queue/runner contract tests, CHANGELOG, and product-gap documentation. The trusted Noema workflow change is limited to replacing floating `ubuntu-latest` runner selectors with `ubuntu-24.04`; its current exact blob is `2c941983f9d846415387816c0d5ce5326bfc10ef`. The Noema two-phase helper remains exact blob `1cab5aa411cf6f97925a7ecfdca118bdbea6e3a0`, and central `.github/workflows/security-scan.yml` remains exact blob `940b688183d0740c580f2c58756882c99749cc10`. The current central Noema workflow still splits model evaluation from publication: the helper seals a bounded owner-only verdict envelope during model evaluation, then publication re-fetches the exact pull-request head and base and requires a freshly verified independent reviewer credential before submitting evidence. `scripts/ci/noema_review_gate.py` remains the source of exact-head/base, actor, verdict and review-submission validation consumed by that helper. GitHub OIDC `job_workflow_sha` binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to individual workflow blobs, so Noema advances or rolls back its repository-commit trust pin only after independently verifying the live protected central tip, trusted workflow and helper blobs, trust-relevant source-tree delta, and central Security Scan authority. The central repository remains a read-only dependency from Noema. A central OIDC consumer mismatch, reviewer-token lifecycle defect, or scanner-control defect remains central-owned: Noema does not weaken or reshape its producer envelope, reviewer boundary, or source-authentication semantics to compensate for a foreign consumer/control-plane defect. From 95b305ac995628bccebbd39facbd37367c7a79f9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:33:04 +0900 Subject: [PATCH 066/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 883d681c8..2eb14d3f3 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "d9320a42d7a272720f6b659003a0456e4dc65e8e"; + "eb104c3991910c12dbea1c0aae460a1368b52ca4"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From a0871b77fa3b3bea7d3afd86adc6d8b8077bdb68 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:33:31 +0900 Subject: [PATCH 067/228] fix(trust): bind current protected central source --- wrangler.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wrangler.toml b/wrangler.toml index 6f649869a..9d0de2186 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "d9320a42d7a272720f6b659003a0456e4dc65e8e" +ALLOWED_WORKFLOW_SHA = "eb104c3991910c12dbea1c0aae460a1368b52ca4" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" @@ -34,4 +34,4 @@ NOEMA_INSTALLATION_CACHE_TTL_SECONDS = "600" # wrangler secret put GITHUB_APP_ID # wrangler secret put GITHUB_APP_PRIVATE_KEY_PEM # Optional: restrict to a specific installation id instead of discovering by repo. -# wrangler secret put GITHUB_APP_INSTALLATION_ID \ No newline at end of file +# wrangler secret put GITHUB_APP_INSTALLATION_ID From 827696125eee6fc41939b1bda946d065cbdb06c3 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:37:15 +0900 Subject: [PATCH 068/228] test(trust): require latest protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 2eb14d3f3..8956fe36f 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "eb104c3991910c12dbea1c0aae460a1368b52ca4"; + "09090e98ca6fe34ee0ab8a0a8145d7af0a0bb9aa"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From c870401464475b5457df618f614db97c663639a8 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:37:44 +0900 Subject: [PATCH 069/228] fix(trust): bind latest protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 9d0de2186..4f0cac2ee 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "eb104c3991910c12dbea1c0aae460a1368b52ca4" +ALLOWED_WORKFLOW_SHA = "09090e98ca6fe34ee0ab8a0a8145d7af0a0bb9aa" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 6cd7b261a9fa03336cda14cb6b6ee6a08ef1a278 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:39:20 +0900 Subject: [PATCH 070/228] docs(architecture): make workflow trust authority code-current --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 87765c8fc..95cf77499 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` pins `ALLOWED_WORKFLOW_SHA` to the live protected central `.github` commit `d9320a42d7a272720f6b659003a0456e4dc65e8e`. Relative to previously audited protected source `476e8be3037800fb84e7ba780ed2068ffdfe3da5`, the central repository advanced by two commits to repair required-review runner starvation. The compare changes `.github/workflows/noema-review.yml`, `.github/workflows/opencode-review.yml`, `.github/workflows/strix.yml`, their queue/runner contract tests, CHANGELOG, and product-gap documentation. The trusted Noema workflow change is limited to replacing floating `ubuntu-latest` runner selectors with `ubuntu-24.04`; its current exact blob is `2c941983f9d846415387816c0d5ce5326bfc10ef`. The Noema two-phase helper remains exact blob `1cab5aa411cf6f97925a7ecfdca118bdbea6e3a0`, and central `.github/workflows/security-scan.yml` remains exact blob `940b688183d0740c580f2c58756882c99749cc10`. The current central Noema workflow still splits model evaluation from publication: the helper seals a bounded owner-only verdict envelope during model evaluation, then publication re-fetches the exact pull-request head and base and requires a freshly verified independent reviewer credential before submitting evidence. `scripts/ci/noema_review_gate.py` remains the source of exact-head/base, actor, verdict and review-submission validation consumed by that helper. GitHub OIDC `job_workflow_sha` binds the caller to the exact protected repository commit selected by `refs/heads/main`, not merely to individual workflow blobs, so Noema advances or rolls back its repository-commit trust pin only after independently verifying the live protected central tip, trusted workflow and helper blobs, trust-relevant source-tree delta, and central Security Scan authority. +`wrangler.toml` is the canonical repository copy of the currently audited `ALLOWED_WORKFLOW_SHA`; this architecture document deliberately does not duplicate that mutable 40-character value. GitHub OIDC `job_workflow_sha` binds the caller to the exact protected central `.github` repository commit selected by `refs/heads/main`, not merely to the bytes of one workflow file. Therefore every protected central ref movement requires a fresh comparison before Noema may move the runtime trust pin, even when the intervening commit changes only unrelated files. For the current active repair, the audited transition from `d9320a42d7a272720f6b659003a0456e4dc65e8e` through `eb104c3991910c12dbea1c0aae460a1368b52ca4` to `09090e98ca6fe34ee0ab8a0a8145d7af0a0bb9aa` consists of the previously reviewed runner/repository-metadata changes plus a later `.jules/sentinel.md` cleanup; the latter does not modify `.github/workflows/noema-review.yml`, the Noema review gate implementation, or `.github/workflows/security-scan.yml`. The current central Noema workflow continues to run on `ubuntu-24.04`, resolve its trusted source to an immutable workflow commit before materialization, reject stale pull-request heads before credential/model setup, and keep model evaluation separate from publication. Noema advances or rolls back its repository-commit trust pin only after independently verifying the live protected central tip, the trusted workflow and review-gate implementation, the trust-relevant source-tree delta, and central Security Scan authority. Exact current pin values remain code/configuration truth in `wrangler.toml`, while this document records the invariant so an unrelated central commit cannot leave canonical architecture prose stale. The central repository remains a read-only dependency from Noema. A central OIDC consumer mismatch, reviewer-token lifecycle defect, or scanner-control defect remains central-owned: Noema does not weaken or reshape its producer envelope, reviewer boundary, or source-authentication semantics to compensate for a foreign consumer/control-plane defect. From e76cfc4c0de6cc38f329458484f7a1fda7807cbc Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:40:56 +0900 Subject: [PATCH 071/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 8956fe36f..4219934d0 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "09090e98ca6fe34ee0ab8a0a8145d7af0a0bb9aa"; + "e0f3766114fd1f066c81f30e7ccf2f38377dab3a"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 49f52f89856949f0dd6bc3729bda4bd8a80e78fb Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:41:14 +0900 Subject: [PATCH 072/228] fix(trust): bind current protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 4f0cac2ee..2f2e4e489 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "09090e98ca6fe34ee0ab8a0a8145d7af0a0bb9aa" +ALLOWED_WORKFLOW_SHA = "e0f3766114fd1f066c81f30e7ccf2f38377dab3a" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From a97351113b1c7cae2f6f5bdb721f451319a36943 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 03:42:02 +0900 Subject: [PATCH 073/228] docs(architecture): remove volatile trust-pin snapshot --- ARCHITECTURE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 95cf77499..b13278cc6 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -28,7 +28,7 @@ Routes have different meanings: `/health` is liveness, `/ready` is offline confi This revision exposes both `ALLOWED_WORKFLOW_REF_PREFIX` and `ALLOWED_WORKFLOW_SHA`. Despite the legacy ref-binding name, `src/worker.ts` parses `ALLOWED_WORKFLOW_REF_PREFIX` as one **exact full workflow ref** and compares decoded `job_workflow_ref` or `workflow_ref` for exact equality. Wildcard, comma, whitespace, and prefix-sharing configuration forms are rejected. `src/runtime-entrypoint.ts` performs readiness dispatch and delegates `/exchange`; `src/entrypoint.ts` applies the distributed rate limiter before `src/worker.ts` performs its denial-only exact workflow-ref precheck. `src/index.ts` independently enforces the exact workflow ref/repository plus immutable `job_workflow_sha` or fallback `workflow_sha` after cryptographic verification. Missing, malformed, mismatched, or non-canonical configured source identity fails closed. -`wrangler.toml` is the canonical repository copy of the currently audited `ALLOWED_WORKFLOW_SHA`; this architecture document deliberately does not duplicate that mutable 40-character value. GitHub OIDC `job_workflow_sha` binds the caller to the exact protected central `.github` repository commit selected by `refs/heads/main`, not merely to the bytes of one workflow file. Therefore every protected central ref movement requires a fresh comparison before Noema may move the runtime trust pin, even when the intervening commit changes only unrelated files. For the current active repair, the audited transition from `d9320a42d7a272720f6b659003a0456e4dc65e8e` through `eb104c3991910c12dbea1c0aae460a1368b52ca4` to `09090e98ca6fe34ee0ab8a0a8145d7af0a0bb9aa` consists of the previously reviewed runner/repository-metadata changes plus a later `.jules/sentinel.md` cleanup; the latter does not modify `.github/workflows/noema-review.yml`, the Noema review gate implementation, or `.github/workflows/security-scan.yml`. The current central Noema workflow continues to run on `ubuntu-24.04`, resolve its trusted source to an immutable workflow commit before materialization, reject stale pull-request heads before credential/model setup, and keep model evaluation separate from publication. Noema advances or rolls back its repository-commit trust pin only after independently verifying the live protected central tip, the trusted workflow and review-gate implementation, the trust-relevant source-tree delta, and central Security Scan authority. Exact current pin values remain code/configuration truth in `wrangler.toml`, while this document records the invariant so an unrelated central commit cannot leave canonical architecture prose stale. +`wrangler.toml` is the canonical repository copy of the currently audited `ALLOWED_WORKFLOW_SHA`; this architecture document deliberately does not duplicate that mutable 40-character value. GitHub OIDC `job_workflow_sha` binds the caller to the exact protected central `.github` repository commit selected by `refs/heads/main`, not merely to the bytes of one workflow file. Therefore every protected central ref movement requires a fresh comparison before Noema may move the runtime trust pin, even when the intervening commit changes only unrelated files. The audit must compare the new protected source tip, the trusted `noema-review.yml` workflow, the review-gate implementation it invokes, central Security Scan authority, and the intervening source-tree delta. Audit-specific SHAs and file deltas belong in the active PR/review evidence rather than this canonical architecture document so later unrelated central commits cannot silently make architecture prose stale. The current central Noema workflow must continue to resolve its trusted source to an immutable workflow commit before materialization, reject stale pull-request heads before credential/model setup, and keep model evaluation separate from publication. Noema advances or rolls back its repository-commit trust pin only after those checks succeed. The central repository remains a read-only dependency from Noema. A central OIDC consumer mismatch, reviewer-token lifecycle defect, or scanner-control defect remains central-owned: Noema does not weaken or reshape its producer envelope, reviewer boundary, or source-authentication semantics to compensate for a foreign consumer/control-plane defect. From 307e0031e6ff64833f4b55f716ce9625b54218a8 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 04:02:36 +0900 Subject: [PATCH 074/228] test(docs): stop duplicating volatile workflow trust pin --- test/architecture-documentation.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/architecture-documentation.test.ts b/test/architecture-documentation.test.ts index d92b9b370..55477b583 100644 --- a/test/architecture-documentation.test.ts +++ b/test/architecture-documentation.test.ts @@ -29,7 +29,7 @@ describe("authoritative architecture documentation", () => { } }); - it("binds the code-current architecture to Wrangler state classes and immutable workflow-source configuration", () => { + it("binds the code-current architecture to Wrangler state classes without duplicating the volatile workflow-source pin", () => { const wrangler = readFileSync("wrangler.toml", "utf8"); const architecture = readFileSync("ARCHITECTURE.md", "utf8"); @@ -43,7 +43,9 @@ describe("authoritative architecture documentation", () => { expect(workflowSha).toBeDefined(); expect(architecture).toContain("Code-current canonical architecture"); expect(architecture).toContain("`ALLOWED_WORKFLOW_SHA`"); - expect(architecture).toContain(workflowSha!); + expect(architecture).toContain("`wrangler.toml` is the canonical repository copy"); + expect(architecture).toContain("deliberately does not duplicate that mutable 40-character value"); + expect(architecture).not.toContain(workflowSha!); expect(architecture).not.toContain("Active PR #426"); expect(architecture).not.toContain("not deployed truth until the PR integrates"); }); From 80b1a8fa774e802bd9fa2cb89b2864dbddd6ef75 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 04:03:27 +0900 Subject: [PATCH 075/228] test(trust): require current audited central source --- test/trusted-workflow-source-rollforward.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 4219934d0..7d78b1812 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "e0f3766114fd1f066c81f30e7ccf2f38377dab3a"; + "0774e29acd7d4688fa2224f1c6fe6c56a03bbbb6"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { @@ -12,4 +12,4 @@ describe("trusted central workflow source revision", () => { `ALLOWED_WORKFLOW_SHA = "${auditedCentralWorkflowSourceSha}"`, ); }); -}); \ No newline at end of file +}); From 9846687d9c8cf60779fe7cfe43e338a01c7aa663 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 04:09:06 +0900 Subject: [PATCH 076/228] fix(trust): rebind audited central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 2f2e4e489..920237962 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "e0f3766114fd1f066c81f30e7ccf2f38377dab3a" +ALLOWED_WORKFLOW_SHA = "0774e29acd7d4688fa2224f1c6fe6c56a03bbbb6" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From da1b4263d0c48dfe581d589d0bcb9620e1dae267 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 06:33:29 +0900 Subject: [PATCH 077/228] fix(trust): restore protected-main README after convergence --- README.md | 325 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 182 insertions(+), 143 deletions(-) diff --git a/README.md b/README.md index 4f6ceb585..6a939eea0 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,63 @@ # Noema -Noema is a ContextualWisdomLab leaf product: a GitHub App credential broker -and an independent LLM pull-request reviewer. It runs on its own, and a host -calls it through a published HTTP API and a secret-free LLM gateway contract. -That hub-and-leaf call is the supported MSA path — **따로 또 같이** — not a -reason to merge repositories. - -It deploys as a [Cloudflare Worker](https://developers.cloudflare.com/workers/) -(Free tier) with two jobs: - -1. **Token exchange.** GitHub Actions presents an - [OIDC](https://docs.github.com/en/actions/reference/security/oidc) JWT - (audience `cwl-noema-review`). Noema verifies issuer, audience, organization - owner, and the exact trusted central workflow identity, then returns a - repository-scoped GitHub App installation token - (`pull_requests: write`, `contents: read`, `checks: read`). -2. **Review.** The default-branch - [`central-review`](./.github/workflows/central-review.yml) runtime accepts a - `noema-review` dispatch and publishes an App-authored verdict. Untrusted - analysis stays in a separate sandbox; see - [`docs/noema-agent-sandbox-plan.md`](./docs/noema-agent-sandbox-plan.md). - -Every Noema LLM job — production review, hourly-product-development, and -host-side judgments — calls `ContextualWisdomLab/contextual-orchestrator`. -Upstream provider keys stay in the orchestrator credential KV. Noema does not -walk a sequential model list or fall back to a direct provider. - -OIDC, Worker binding, and Durable Object trust rules are recorded in -[Architecture doctoring](./docs/doctoring/architecture-trust-boundaries.md) -and the [ADR index](./docs/adr/README.md). Do not treat those records as a new -paper list. - -## Composition hubs - -Leaf products stay independently deployable. Composition hubs call them as -published dependencies. Do not fold Noema into a hub repo. - -| Hub | Role | How it calls Noema | +[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/ContextualWisdomLab/noema) + +**Evidence-producing credential and maintenance control plane for governed GitHub automation.** + +Noema gives repository automation narrowly scoped capability without turning model output, CI status, or a long-lived secret into authority. It verifies GitHub Actions OIDC identity, exchanges that identity for repository-scoped GitHub App capability, and keeps credential, review, check, merge, release, deployment, and commercial evidence as distinct trust domains. + +It is built for maintainers and platform teams that need automation to move quickly while remaining exact-revision, least-privilege, and fail-closed. + +## What Noema does + +| Need | Noema responsibility | +| --- | --- | +| Short-lived repository capability | Verify GitHub Actions OIDC and mint repository-scoped GitHub App installation tokens | +| Exact-revision maintenance | Bind privileged actions to current heads, live bases, and freshly re-read repository state | +| Independent review evidence | Support App-authored review verdicts without treating model judgement as merge authority | +| Safe automation | Separate untrusted analysis from credential-bearing execution and refuse stale or ambiguous evidence | +| Operational evidence | Preserve bounded readiness, security, governance, release, and maintenance evidence | +| Ecosystem composition | Integrate with central `.github`, `contextual-orchestrator`, and other products through explicit contracts | + +Noema does **not** own model discovery or provider routing. Those capabilities belong to [`ContextualWisdomLab/contextual-orchestrator`](https://github.com/ContextualWisdomLab/contextual-orchestrator). Noema also does not promote checks, scanners, model output, or documentation into formal approval, merge, deployment, customer, revenue, legal, or transfer authority. + +## Product surfaces + +### Credential exchange + +The Cloudflare Worker exposes three intentionally distinct HTTP surfaces: + +| Method | Path | Meaning | | --- | --- | --- | -| [`naruon`](https://github.com/ContextualWisdomLab/naruon) | Judgments and decisions | First-class consumer of the published orchestrator gateway contract. Naruon wiring is a separate repository pull request. | -| [`gyeot` (곁)](https://github.com/ContextualWisdomLab/gyeot) | On-device wellness composition hub | Call Noema through the HTTP API and/or the same published contract when a host needs token exchange or the LLM gateway. | +| `GET` | `/health` | Process liveness only | +| `GET` / `HEAD` | `/ready` | Runtime readiness without reflecting secrets | +| `POST` | `/exchange` | Exchange an authorized GitHub Actions OIDC bearer for short-lived repository capability | + +The public contract is published as [`openapi.json`](./openapi.json), with narrative details in [`docs/api-spec.md`](./docs/api-spec.md). -The machine-readable LLM contract is -[`contracts/orchestrator-gateway.json`](./contracts/orchestrator-gateway.json). -Narrative: [Orchestrator gateway consumer contract](./docs/orchestrator-gateway-consumer-contract.md). -Print it with `node scripts/verify-orchestrator-gateway.mjs --print-contract`. +### Review and maintenance control -Host LLM settings (never an upstream provider key): +Noema can support review and maintenance workflows that need to distinguish: + +- the exact current source head from historical or predecessor evidence; +- an independently resolved live base from a stale PR snapshot; +- checks, statuses, scanners, model judgement, and formal reviews; +- observation authority from mutation authority; +- source integration from release, deployment, and commercial evidence. + +A blocked lane is not a reason to stall unrelated safe work. The product is explicitly work-conserving while remaining fail-closed on the blocked action itself. + +### Orchestrator gateway contract + +Every model-backed Noema job routes through `ContextualWisdomLab/contextual-orchestrator`. Provider credentials remain in the orchestrator credential boundary; Noema consumes only a dedicated inference token and a published gateway contract. + +The machine-readable contract is [`contracts/orchestrator-gateway.json`](./contracts/orchestrator-gateway.json). + +```bash +node scripts/verify-orchestrator-gateway.mjs --print-contract +``` + +Host-facing gateway configuration: | Name | Meaning | | --- | --- | @@ -54,14 +65,11 @@ Host LLM settings (never an upstream provider key): | `NOEMA_LLM_MODEL` | Routing alias, normally `contextual-orchestrator` | | `NOEMA_LLM_API_KEY` | Dedicated gateway inference token | -`GET /healthz` must return -`{"status":"ok","service":"contextual-orchestrator"}`. Known direct-provider -hosts are rejected. Leftover `NOEMA_FALLBACK_*` settings fail closed. +Direct-provider fallbacks are intentionally rejected. -## Run it alone +## Quick start -Requires Node.js 22+ (CI uses Node 24). This package is private; there is no -published npm library. The Worker and the HTTP contract are the product. +Noema is a private Node.js package; the deployed Worker and its HTTP/evidence contracts are the product. The repository requires Node.js 22 or newer and pins the development runtime/package-manager versions in `package.json`. ```bash npm install @@ -70,50 +78,41 @@ npm run typecheck npm run dev ``` -`npm run dev` starts a local Worker. Provision secrets on the Worker binding -(the KV-equivalent), not `process.env` in `src/`: +`npm run dev` starts a local Cloudflare Worker. + +### Configure Worker secrets + +Provision GitHub App secrets on the Worker binding rather than reading them from application `process.env` code: ```bash wrangler secret put GITHUB_APP_ID wrangler secret put GITHUB_APP_PRIVATE_KEY_PEM -# optional: pin a single installation instead of discovering by repository + +# Optional: pin one installation rather than discovering it by repository. wrangler secret put GITHUB_APP_INSTALLATION_ID ``` -Deploy: +### Deploy ```bash npm run deploy ``` -Set `NOEMA_EXCHANGE_URL` in `ContextualWisdomLab/.github` (or the customer -central workflow) to the deployed `/exchange` URL. Production cutover that -creates organization variables or secrets is a separate operator step; see -[contextual-orchestrator reviewer cutover](./docs/contextual-orchestrator-reviewer-cutover.md). -Do not reuse `OPENAI_API_KEY` as Noema's gateway token. - -## How a host calls it - -The public HTTP surface is documented in [`openapi.json`](./openapi.json) -([OpenAPI 3.1](https://spec.openapis.org/oas/v3.1.1.html)) and -[API 명세](./docs/api-spec.md). Every JSON response is -`{ ok: true, data, trace_id }` or -`{ ok: false, error_code, message, details, trace_id }`. +After deployment, configure `NOEMA_EXCHANGE_URL` in the trusted central workflow or consuming deployment to an `https://` URL targeting the Worker `/exchange` endpoint. Plain HTTP is permitted only for loopback testing. -| Method | Path | Purpose | -| --- | --- | --- | -| `GET` | `/health` | Liveness only. Does not prove credential-exchange readiness. | -| `GET` / `HEAD` | `/ready` | Unauthenticated runtime readiness. Incomplete config returns `503 ERR_SERVICE_NOT_READY` without reflecting secrets. | -| `POST` | `/exchange` | Exchange a GitHub Actions OIDC bearer for a short-lived installation token. | +Do not reuse an upstream provider credential such as `OPENAI_API_KEY` as Noema's gateway token. -Example liveness check: +### Smoke-check a deployment ```bash -curl -sS "$NOEMA_BASE_URL/health" +NOEMA_EXCHANGE_URL=https://example.workers.dev/exchange npm run smoke:check ``` -Example exchange (OIDC bearer from GitHub Actions; JSON body optional, max -8,192 UTF-8 bytes): +The smoke check exercises liveness, readiness, exchange framing, unauthenticated challenge behavior, and bounded response/security headers. It does not manufacture GitHub App, deployment, or production-readiness evidence that is absent from the environment. + +## Example exchange + +A trusted GitHub Actions job supplies its OIDC bearer and the target repository: ```bash curl -sS -X POST "$NOEMA_EXCHANGE_URL" \ @@ -122,82 +121,122 @@ curl -sS -X POST "$NOEMA_EXCHANGE_URL" \ -d '{"target_repository":"ContextualWisdomLab/example"}' ``` -`target_repository` must be a string `owner/name` in the allowed organization. -`/exchange` accepts only `POST` (`Allow: POST` on 405), returns Bearer -challenges on 401 (`invalid_request` vs `invalid_token`), and includes -`Cache-Control: no-store`, `Pragma: no-cache`, `X-Content-Type-Options: nosniff`, -`X-Trace-Id`, and `X-Latency-Ms`. Issued and inbound tokens must not appear in -logs. +`target_repository` must be an allowed `owner/name` repository. Noema validates the configured issuer, audience, organization, exact trusted workflow identity, immutable workflow-source identity, token time semantics, and replay boundary before credential exchange. + +Issued and inbound credentials must not appear in logs or retained model context. + +## Architecture at a glance + +```text +GitHub Actions + │ + │ OIDC identity + ▼ +┌───────────────────────────────┐ +│ Noema │ +│ credential + maintenance │ +│ control plane │ +├───────────────────────────────┤ +│ OIDC trust verification │ +│ replay / rate-limit boundary │ +│ GitHub App token exchange │ +│ exact-revision evidence │ +│ review / maintenance controls │ +└───────────────┬───────────────┘ + │ + short-lived scoped capability + │ + ▼ + GitHub repository + +Model-backed judgement ──► contextual-orchestrator + (provider/routing owner) +``` -A host that only needs the LLM gateway copies -`contracts/orchestrator-gateway.json` (or calls -`node scripts/verify-orchestrator-gateway.mjs --print-contract`) and uses the -same `NOEMA_LLM_*` settings. Do not copy Noema's OIDC broker, GitHub App -identities, or sandbox/runner isolation into the host. +The Worker, GitHub App capability boundary, maintenance controls, and review evidence are Noema-owned responsibilities. Adjacent products remain independently deployable and integrate through published contracts rather than shared application tables or ambient credentials. -The Python reviewer package (`reviewer/`) is the judgement plane. It consumes a -bounded PR manifest and can publish a `ReviewVerdict`. See -[`reviewer/README.md`](./reviewer/README.md). +## GitHub App permissions -After deploy, confirm the HTTP contract: +The deployed GitHub App requires the narrow repository permissions used by the exchange/review boundary: -```bash -NOEMA_EXCHANGE_URL=https://.../exchange npm run smoke:check -``` +- Pull requests: read and write +- Checks: read-only +- Contents: read-only -`npm run smoke:check` checks `/health`, `/ready`, and `/exchange` schema, -trace/latency headers, runtime readiness, the unauthenticated 401 Bearer -challenge, and no-store/nosniff headers. +Install the App only on repositories that need the trusted workflow path. -## Required GitHub App permissions +## Security model -Repository permissions: +Noema's default posture is conservative: -- Pull requests: Read and write -- Checks: Read-only -- Contents: Read-only +- short-lived capability instead of broad long-lived repository credentials; +- exact workflow and repository identity before token minting; +- replay protection and bounded pre-auth rate limiting; +- no model/provider credential ownership in this repository; +- no credential-bearing execution of untrusted PR/model output; +- no transfer of predecessor-head checks or reviews after a source change; +- missing, malformed, stale, partial, pending, or ambiguous evidence is non-passing; +- formal review, merge, release, deployment, and commercial/legal authority remain separate. -Install the app on `ContextualWisdomLab/.github` and on target repositories -that use the central required workflow. +See [`docs/threat-model.md`](./docs/threat-model.md), [`docs/doctoring/architecture-trust-boundaries.md`](./docs/doctoring/architecture-trust-boundaries.md), and the [`docs/adr/`](./docs/adr/) decision records for the deeper trust model. -## Operator configuration +## Verify the repository -Public Worker vars (defaults in `wrangler.toml`): +The ordinary contributor checks are explicit package scripts: -| Variable | Default | Role | -| --- | --- | --- | -| `ALLOWED_ISSUER` | `https://token.actions.githubusercontent.com` | GitHub Actions OIDC issuer | -| `ALLOWED_AUDIENCE` | `cwl-noema-review` | OIDC audience | -| `ALLOWED_REPOSITORY_OWNER` | `ContextualWisdomLab` | Allowed org | -| `ALLOWED_WORKFLOW_REPOSITORY` | `ContextualWisdomLab/.github` | Trusted workflow repo | -| `ALLOWED_WORKFLOW_REF_PREFIX` | `ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main` | Exact trusted workflow ref (name kept; matching is exact, not prefix) | -| `GITHUB_API_BASE` | `https://api.github.com` | GitHub Cloud API origin | -| `NOEMA_RATE_LIMIT_PER_MINUTE` | `60` | `/exchange` fixed-window budget | -| `NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS` | `300` | OIDC JWKS cache | -| `NOEMA_INSTALLATION_CACHE_TTL_SECONDS` | `600` | Installation-id cache | - -`/exchange` first applies a SQLite-backed Durable Object fixed-window limit -across Worker isolates, then keeps the isolate-local limiter as defense in -depth. Missing or malformed distributed decisions fail closed; see -[Distributed rate limiting](./docs/distributed-rate-limiting.md). -OIDC `jti` values are consumed once by a Durable Object replay guard; see -[OIDC replay protection](./docs/oidc-replay-protection.md). - -## Operator documentation - -- [온보딩 가이드](./docs/onboarding.md) -- [운영 Runbook](./docs/runbook.md) -- [API 명세](./docs/api-spec.md) -- [안정성 계약](./docs/api-stability-contract.md) -- [OpenAPI](./openapi.json) -- [보안/위협 모델](./docs/threat-model.md) -- [배포 가이드](./docs/deployment-guide.md) -- [SLA/지원 정책](./docs/sla-and-support.md) -- [Runtime readiness](./docs/runtime-readiness.md) -- [Distributed Rate Limiting](./docs/distributed-rate-limiting.md) -- [Orchestrator gateway consumer contract](./docs/orchestrator-gateway-consumer-contract.md) - -Maintainers and coding agents: start at -[`docs/internal/README.md`](./docs/internal/README.md) -(contributor and agent procedure: -[`docs/development/contributor-and-agent-procedure.md`](./docs/development/contributor-and-agent-procedure.md)). +```bash +npm run typecheck +npm test +npm run security:scan +``` + +For the broader evidence-bearing release verification path: + +```bash +npm run release:verify +``` + +`release:verify` combines type checking, tests, security scanning, KPI evidence, dependency-license inventory, and acquisition-manifest/integrity checks. Passing repository checks are technical evidence; they are not by themselves a deployment, certification, approval, sale, or legal claim. + +## Documentation map + +Start with the document that matches the job at hand: + +| Goal | Document | +| --- | --- | +| Product requirements and non-goals | [`docs/PRD.md`](./docs/PRD.md) | +| Technical requirements | [`docs/TRD.md`](./docs/TRD.md) | +| Architecture and trust boundaries | [`ARCHITECTURE.md`](./ARCHITECTURE.md) | +| Architecture decisions | [`docs/adr/README.md`](./docs/adr/README.md) | +| API contract | [`docs/api-spec.md`](./docs/api-spec.md) / [`openapi.json`](./openapi.json) | +| Deployment | [`docs/deployment-guide.md`](./docs/deployment-guide.md) | +| Operations | [`docs/runbook.md`](./docs/runbook.md) | +| Scheduled product maintenance | [`.github/workflows/hourly-product-development.yml`](./.github/workflows/hourly-product-development.yml) — implementation entry point; operating procedure stays in the contributor/internal docs | +| Security / threat model | [`docs/threat-model.md`](./docs/threat-model.md) | +| Runtime readiness | [`docs/runtime-readiness.md`](./docs/runtime-readiness.md) | +| Licensing and IP transfer | [`docs/LICENSING_AND_IP_TRANSFER.md`](./docs/LICENSING_AND_IP_TRANSFER.md) | +| Requirement → evidence traceability | [`docs/TRACEABILITY.md`](./docs/TRACEABILITY.md) | +| Current product/technical gaps | [`docs/product-technical-gap-baseline.md`](./docs/product-technical-gap-baseline.md) | +| Full documentation index | [`docs/README.md`](./docs/README.md) | + +Maintainers and coding agents should also read [`docs/internal/README.md`](./docs/internal/README.md) and [`docs/development/contributor-and-agent-procedure.md`](./docs/development/contributor-and-agent-procedure.md) before changing repository behavior. + +## Product principles + +1. **Least privilege.** Capability is bounded by purpose, repository, role, operation, and lifetime. +2. **Exact revision before authority.** Mutable identities are re-read before privileged decisions and writes. +3. **Evidence is not authority.** Green-looking signals remain distinct until the correct authority interprets them. +4. **Fail closed.** Missing or ambiguous evidence is never upgraded into success. +5. **Standalone first, composable second.** Noema remains independently deployable and integrates through versioned contracts. +6. **Work conserving.** A waiting lane blocks only that lane; unrelated safe work continues. +7. **Claims stay evidence-bound.** Documentation never substitutes for real deployment, customer, revenue, legal, ownership, or transfer evidence. + +## Contributing + +Before changing behavior, read [`AGENTS.md`](./AGENTS.md), the canonical PRD/TRD, architecture decisions, and the current product-gap evidence. Keep runtime/security changes test-first, preserve exact-head evidence boundaries, and update the public contract and operator documentation whenever externally visible behavior changes. + +## License + +Noema source is licensed under the [Apache License 2.0](LICENSE). `package.json` is marked `private` because the npm package is not the product distribution channel; `private` does not narrow the Apache-2.0 source grant. + +Third-party development and build tooling retains its own license terms and is not relicensed by this repository. Release and transfer evidence must continue to inventory those obligations separately rather than treating the Noema source license as a license for dependencies or bundled artifacts. From edfc54c6b71500752e2711ff48e6aeafc0fd3de5 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 06:35:14 +0900 Subject: [PATCH 078/228] fix(trust): restore protected-main licensing policy after convergence --- docs/LICENSING_AND_IP_TRANSFER.md | 104 ++++++++++++++++++------------ 1 file changed, 62 insertions(+), 42 deletions(-) diff --git a/docs/LICENSING_AND_IP_TRANSFER.md b/docs/LICENSING_AND_IP_TRANSFER.md index 94f52e3a9..34e310d2a 100644 --- a/docs/LICENSING_AND_IP_TRANSFER.md +++ b/docs/LICENSING_AND_IP_TRANSFER.md @@ -1,55 +1,61 @@ # Noema Licensing and IP Transfer -- **Status:** Protected policy/evidence baseline; not legal clearance. Active PR #495 adds the npm dependency-license inventory generator described in section 4. +- **Status:** Repository rights policy/evidence baseline; source-license decision is Apache-2.0 on PR #530 until protected integration. This is not acquisition or transfer legal clearance. - **Scope:** Noema source rights, package/container metadata, third-party obligations, contributor/IP provenance, release distribution, and acquisition transfer evidence. -- **Decision authority:** Repository automation may detect, authenticate, inventory, and compare evidence. The outbound-license and transfer-rights decision belongs to the authorized **owner/legal** function. +- **Decision authority:** Repository automation may detect, authenticate, inventory, and compare evidence. The repository owner has explicitly selected Apache License 2.0 for Noema source; future outbound-license changes and transfer-rights decisions remain owner/legal governance actions. ## 1. Core invariant -**Public source availability is not a grant of rights.** Repository visibility, cloneability, package installation, an SBOM, scanner output, or successful CI does not establish permission to use, modify, redistribute, sublicense, or transfer Noema. +**Public source availability is not a grant of rights by itself.** The grant comes from the controlling repository rights file. On PR #530, root `LICENSE` declares Apache-2.0 for Noema source. Until that exact head integrates, protected `main` remains the currently shipped source-rights authority. -Noema therefore keeps legal authority separate from technical evidence: +Noema keeps source licensing, package publication, third-party obligations, and transfer authority separate: - automation may inventory, hash, compare, and **fail closed** on missing, ambiguous, or contradictory rights evidence; -- automation must never infer or silently choose an outbound license; -- an explicit owner/legal decision is required before a license posture is represented as approved; -- missing, unknown, incompatible, or contradictory rights evidence blocks distribution/acquisition claims rather than becoming a technical PASS. +- automation must never infer or silently change an outbound license; +- the explicit owner decision for Noema source is Apache-2.0 and is represented by the root `LICENSE` plus customer-facing README statement; +- `package.json` intentionally remains `private` and is not the product distribution channel, so the source grant does not depend on publishing npm license metadata; +- dependency/tool licenses are not relicensed by the Noema source grant; +- missing, unknown, incompatible, or contradictory third-party or transfer evidence blocks distribution/acquisition claims rather than becoming a technical PASS. This document is not legal advice. It specifies the evidence and authority boundary enforced by Noema technical controls. ## 2. Repository rights declaration -An approved outbound posture must be discoverable in repository source and agree across release surfaces. +An approved outbound posture must be discoverable in repository source and remain unambiguous across any surface that actually distributes the work. -At minimum: +For the current owner decision: -1. a root `LICENSE` file or explicitly approved custom-rights file contains controlling source terms when repository text grants rights; -2. `package.json` expresses the same declared posture without inventing broader rights; -3. release/container metadata that declares rights expresses the same approved posture for that exact artifact/revision; -4. decision owner, approval record, effective date, and scope are retained as acquisition evidence instead of inferred from a filename; -5. licensing changes are governance changes requiring reviewed source mutation, release-impact analysis, and evidence regeneration. +1. root `LICENSE` contains Apache License 2.0 for Noema source; +2. root `README.md` identifies Apache-2.0 as the source license; +3. `package.json` remains `"private": true` and intentionally omits a package-publication license field because the npm package is not the distribution channel; this keeps `package.json` and `package-lock.json` lock metadata stable rather than implying a package release that does not exist; +4. if npm package publication is introduced later, package metadata and lockfile root metadata must be regenerated together and must agree with the approved rights posture before publication; +5. release/container metadata that declares rights must express the same source posture for the exact artifact/revision only when that artifact is actually covered by the same grant; +6. third-party licenses and notices remain separate evidence and are never absorbed into Apache-2.0 by metadata; +7. licensing changes are governance changes requiring reviewed source mutation, release-impact analysis, and evidence regeneration. ### 2.1 `package.json` alignment +For a package that is actually distributed through npm: + - use a valid **SPDX** expression when approved terms have one; - use `SEE LICENSE IN ` for approved custom terms stored in a bounded repository file; -- use `UNLICENSED` when package metadata intentionally grants no use rights; -- `"private": true` is a publication safeguard, not an outbound-rights decision. +- use `UNLICENSED` only when package metadata intentionally grants no use rights; +- regenerate `package-lock.json` whenever root package metadata changes so tracked lock metadata stays exact. -Automation may verify syntax, paths, hashes, and declared relationships. It must not infer legal equivalence from filenames or metadata labels alone. +For current Noema, `"private": true` plus absence of an npm distribution channel means root `LICENSE` is the controlling source grant. `private` itself is still only a publication safeguard; it neither grants nor narrows Apache-2.0 source rights. ### 2.2 OCI and release metadata **OCI image license metadata** and equivalent archive/package/registry fields are artifact claims, not independent legal authority. -- `org.opencontainers.image.licenses` or an equivalent field must agree with the owner/legal decision and repository/package declaration for that exact release scope; -- while the outbound-rights decision is unresolved, artifact license metadata **must remain absent** unless an authorized decision explicitly requires a truthful bounded declaration; +- `org.opencontainers.image.licenses` or an equivalent field must agree with the source-rights decision only when the exact artifact is covered by that source grant and its bundled third-party obligations have been accounted for; +- a source-level Apache-2.0 declaration does not license third-party binaries, dependencies, base images, fonts, models, datasets, or assets; - invented `LicenseRef-*`, repository visibility, `private: true`, SBOM guesses, or scanner classifications cannot create rights; - source/revision/provenance labels that do not claim licensing authority may remain when truthful and exact-revision bound. ## 3. Protected exact-release `artifact_rights_metadata` contract -Protected source implements an exact-release rights receipt named `artifact_rights_metadata`. The acquisition-integrity work that introduced this boundary is already integrated on protected main. The receipt is technical evidence, never legal authority. +Protected source implements an exact-release rights receipt named `artifact_rights_metadata`. The acquisition-integrity work that introduced this boundary is already integrated on protected main. The receipt is technical evidence, never independent legal authority. The authenticated receipt binds at least: @@ -67,8 +73,8 @@ The parser/evidence boundary is fail closed: - reject malformed JSON; - reject **duplicate** decoded JSON keys before ordinary object parsing can select a last value; - reject symlink/path/descriptor substitution and digest mismatch; -- reject an OCI license annotation under unresolved/custom/no-rights authority when the approved contract requires no annotation; -- when an approved SPDX expression exists, any artifact license annotation must match that expression exactly. +- reject artifact annotations that contradict the approved repository/artifact rights decision; +- when an approved SPDX expression applies to an exact artifact, any artifact license annotation must match that expression exactly. A receipt, scanner, SBOM, or annotation never creates owner/legal authority. It proves only identity and consistency with an already approved decision. @@ -79,13 +85,19 @@ Every distributable or transferable exact release must bind third-party rights e Required evidence includes: - exact-release **SBOM** and dependency graph; -- dependency-license inventory for direct, transitive, bundled, static, and runtime assets where applicable; +- dependency-license inventory for direct, transitive, bundled, static, runtime, development, and build assets where policy requires it; - required attribution and **NOTICE** material, preserving upstream notices when terms require them; - explicit disposition for unknown, custom, copyleft, source-available, dual-licensed, or otherwise policy-sensitive terms; - classifier/scanner tool identity and evidence source; - hashes/immutable identities tying license and NOTICE artifacts to the release/SBOM. -PR #495 adds `npm run release:dependency-license-inventory` for the npm lockfile slice. The generated `artifacts/release/dependency-licenses.json` is deterministic and bound to the SHA-256 of the exact `package-lock.json`. It records each non-root locked package path, package name, version, declared license, resolved artifact, integrity value, npm `dev`/`optional`/`devOptional`/`inBundle` classification authority, install-script authority (`hasInstallScript`), and present npm platform constraints (`cpu`/`os`). Present boolean authority must remain boolean; `devOptional`, `inBundle`, and `hasInstallScript` are preserved as `dev_optional`, `in_bundle`, and `has_install_script`. Present `cpu`/`os` constraints must be non-empty arrays of canonical non-empty strings, so acquisition evidence cannot silently discard or normalize platform applicability. Resolved artifact authority must be a canonical inspectable URI and must not embed URL passwords, non-conventional URL usernames, authentication/token/secret/key/signature/credential parameters in either query or fragment, or compact signed-URL `sig` parameters; the conventional `git` username is retained only for SSH-like Git URLs. Otherwise buyer/release evidence fails closed rather than retaining credential-bearing source metadata. Duplicate-key or malformed lockfiles and missing package identity/license fields fail closed. This inventory records package metadata; it does **not** establish compatibility, satisfy upstream NOTICE obligations, or create owner/legal permission. +`npm run release:dependency-license-inventory` produces deterministic lockfile-bound inventory evidence. The inventory records package metadata; it does **not** establish compatibility, satisfy upstream NOTICE obligations, or create owner/legal permission. + +### 4.1 Current GPL-family tooling finding + +The current `package-lock.json` contains optional development/build packages on the `wrangler → miniflare → sharp → @img/sharp-libvips-*` path whose declared license is `LGPL-3.0-or-later`; `@img/sharp-wasm32` declares `Apache-2.0 AND LGPL-3.0-or-later AND MIT`. These packages are not relicensed by Noema's Apache-2.0 source license. + +Repository evidence also shows that the patch-validator runtime-image boundary explicitly excludes `wrangler`, `workerd`, and `miniflare`; therefore this finding must not be overstated as proof that LGPL code is bundled into that runtime image. It is nevertheless an inbound development/build-tooling policy gap because ContextualWisdomLab does not accept GPL-family software as the normal dependency baseline. Distribution/acquisition readiness must remain fail closed until issue #531 removes/replaces this dependency path or an explicit repository-level exception is approved for the exact use and distribution model. Unknown or unresolved obligations fail closed for distribution/acquisition readiness. Vulnerability or provenance success does not prove license compatibility. @@ -101,7 +113,7 @@ Acquisition readiness requires evidence that the seller has authority to transfe - vendored/copied third-party code outside the dependency graph; - trademark, domain, signing key, GitHub App, cloud account, and other operational ownership needed to transfer the running product. -A Git commit proves repository history, not legal ownership. Missing provenance remains external evidence and must not be synthesized. +A Git commit proves repository history, not legal ownership. Missing transfer provenance remains external evidence and must not be synthesized. The Apache-2.0 source grant does not by itself prove acquisition-transfer ownership. ## 6. Acquisition transfer evidence @@ -112,7 +124,7 @@ The machine-checkable transfer contract binds, at minimum: - repository identity and exact source/release revision; - approved owner/legal decision identifier; - controlling `LICENSE`/custom-rights file path and SHA-256 when applicable; -- `package.json` rights declaration plus package-metadata hash; +- package-publication rights declaration plus metadata hash when a package is actually distributed; - exact-release `artifact_rights_metadata` path and SHA-256 when an artifact exposes rights metadata; - exact-release SBOM identity; - dependency-license and NOTICE/attribution artifact identities; @@ -120,20 +132,20 @@ The machine-checkable transfer contract binds, at minimum: - outstanding exceptions/legal holds/unresolved third-party terms; - evidence owner, review timestamp, and retention/rotation policy. -Protected acquisition-integrity code authenticates this consistency boundary and rejects parser ambiguity, but it does not choose the legal posture. +Protected acquisition-integrity code authenticates this consistency boundary and rejects parser ambiguity, but it does not manufacture transfer authority. ## 7. Release and acquisition gates ### Release-distribution gate -Before publishing an artifact, the exact integrated protected source must have a reviewed distribution posture and applicable third-party obligations for that artifact. Internal test builds do not create distribution rights. If a package/image/archive carries a rights field, it must agree with approved source/package posture and exact-release `artifact_rights_metadata` before publication. +Before publishing an artifact, the exact integrated protected source must have a reviewed distribution posture and applicable third-party obligations for that artifact. Internal test builds do not create distribution rights. If a package/image/archive carries a rights field, it must agree with approved source posture and exact-release `artifact_rights_metadata` before publication. ### Acquisition final gate ```text -owner/legal decision +owner source-license decision → repository rights file -→ package.json rights metadata +→ package-publication metadata when applicable → exact-release artifact_rights_metadata when applicable → release/container rights metadata when present → exact-release SBOM @@ -145,29 +157,35 @@ owner/legal decision Each arrow requires independent identity/consistency evidence. A mismatch, missing required record, malformed/ambiguous JSON, or unresolved right is a fail-closed condition. -## 8. Current evidence and residual gap — 2026-08-23 +## 8. Current evidence and residual gap — 2026-09-01 -Protected `main` at `e8a816e9f33ba1905b9fcc258798e07a3cd2657f` has no root `LICENSE` file. Protected `package.json` is `"private": true` and has no `license` field. That is evidence of an unresolved licensing/IP-transfer decision, not evidence for MIT, Apache-2.0, proprietary, source-available, or another posture. +Protected `main@03ef2301bad020b9ab4dfde2ec3c4e7f460024ca` still has no root `LICENSE`. PR #530 now carries the explicit owner-selected Apache-2.0 source posture: -Current technical state is intentionally split: +- root `LICENSE`: Apache License 2.0; +- root `README.md`: customer-facing Apache-2.0 source-license statement and separate third-party obligation boundary; +- `package.json`: remains private and lock-stable; no npm package distribution claim is introduced. -- protected acquisition-integrity code binds `artifact_rights_metadata` to repository/release/artifact identity and rejects duplicate decoded keys, malformed UTF-8/JSON, and inconsistent rights metadata before it can become acquisition evidence; -- protected #407 integration supplies the patch-validator image/runtime/supply-chain implementation and its local SBOM/provenance verification boundary; -- protected #493 integration rejects placeholder, ambiguous, loopback and local-only pilot/commercial authority from saleable-readiness evidence; -- protected #494 integration binds Noema's immutable OIDC workflow trust anchor to the current audited central workflow source identity; -- active PR #495 adds reproducible npm lockfile license inventory generation, exact coverage ownership, canonical package-path and resolved-artifact authority, credential-free artifact metadata, npm dependency/distribution classification, install-script authority, and `cpu`/`os` platform applicability. Until it integrates, that generator remains active-PR truth, not protected-main truth; -- no technical artifact resolves compatibility, upstream NOTICE retention, contributor ownership/assignment, or the outbound-rights decision. +Those declarations are candidate truth until #530 integrates; they are not predecessor evidence for protected main. -Issue #5 carries the acquisition owner/legal and ownership/assignment evidence gap. Issue #66 carries remaining release/publication, NOTICE and provenance/activation boundaries. Neither documentation nor technical enforcement makes legal clearance pass. +Current residual gaps remain deliberately separate: + +- the lockfile contains the GPL-family development/build tooling path described in §4.1 and therefore does not yet satisfy the organization default inbound-license policy; +- exact-release dependency/NOTICE evidence must still prove the actual distributed artifact contents; +- contributor ownership/assignment and acquisition-transfer evidence remain separate from source licensing; +- release/publication/deployment evidence remains separate from repository-source rights; +- no source file, README sentence, scanner result, or successful CI run may upgrade those missing evidence classes into a commercial or legal PASS. + +Issue #5 carries acquisition owner/legal and ownership/assignment evidence. Issue #66 carries remaining release/publication, NOTICE and provenance/activation boundaries. Issue #531 owns the GPL-family development/build-tool replacement. The source-license decision narrows the gap but does not close those issues. ## 9. Non-goals Noema automation must not: -- pick an outbound license because it appears commercially convenient; +- silently choose or change an outbound license without an owner-authorized source change; - emit package/container/release license fields merely to make metadata look complete; - treat `UNLICENSED`, `private`, repository visibility, `LicenseRef-*`, or a copyright notice as interchangeable; -- infer license compatibility from filenames or scanner guesses alone; +- infer dependency-license compatibility from filenames or scanner guesses alone; +- treat the repository's Apache-2.0 source license as a license for third-party packages or bundled artifacts; - fabricate contributor consent, employment ownership, contractor assignment, or third-party permission; - remove NOTICE/attribution obligations to make an audit pass; - accept duplicate-key or malformed evidence because one parser selects a convenient last value; @@ -177,6 +195,8 @@ Noema automation must not: GitHub. (2026). *Licensing a repository*. GitHub Docs. https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository +The Apache Software Foundation. (2004). *Apache License, Version 2.0*. https://www.apache.org/licenses/LICENSE-2.0 + npm, Inc. (2026). *package-lock.json*. npm Docs. https://docs.npmjs.com/cli/v11/configuring-npm/package-lock-json npm, Inc. (2026). *package.json — license*. npm Docs. https://docs.npmjs.com/files/package.json/ From f7d1522e206ceb209a92253150c365000082be3d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 06:35:59 +0900 Subject: [PATCH 079/228] fix(trust): restore protected-main product gap baseline after convergence --- docs/product-technical-gap-baseline.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 79c3189a0..b748d67da 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -4,15 +4,16 @@ 이 문서는 제품 요구, 구현, 검증, 운영 증거 사이의 현재 차이를 한곳에서 추적한다. 저장소 파일과 테스트는 revision-local 또는 protected-source 구현만 증명한다. PR 상태는 exact head와 live base에서, 운영·배포·고객·매출·법적 증거는 해당 외부 권한에서 각각 다시 확인해야 한다. 문서나 성공 boolean만으로 이후 단계의 증거를 만들지 않는다. -이 baseline의 source snapshot은 protected `main` `8ae8f5eee4e913a8ee106c3e2e550b0c9316c0e4`이며, issues #3, #5, #27, #29, #66, #227은 2026-09-01 KST에 GitHub에서 모두 `OPEN`으로 다시 확인했다. 상태가 바뀌면 live GitHub를 우선하며 이 표를 갱신한다. +이 baseline의 protected-source snapshot은 `main@5aad3e410703faaf52882e2f33fadd25d217bcdd`이며, README/license candidate truth는 PR #530 exact head에만 적용한다. issues #3, #5, #27, #29, #66, #227, #531의 live 상태를 GitHub 권위로 다시 읽어야 하며, protected/main·PR·외부 증거를 서로 대체하지 않는다. ## Live external observation — 2026-09-01 KST | Authority | Observation | Consequence | | --- | --- | --- | -| Pull requests | #510, #512, #513, #521 are open; #510/#512/#521의 exact-head Application·reviewer-ci·Security Scan은 terminal-success이고 image gate는 `in_progress`, #513의 current exact-head gates는 `queued` | zero-PR hourly activation canary와 merge completion은 아직 입증되지 않았다 | -| Hourly product development | scheduled run `33408669511` stopped at the zero-open-PR gate; gateway, OpenCode, package, and publication stages were skipped | retired direct-provider/NVIDIA run을 현재 상태로 사용하지 않으며, zero-PR 이후 `contextual-orchestrator` canary가 필요하다 | -| Release/publication | GitHub release와 protected-main patch-validator workflow-dispatch receipt가 없다 | immutable publication, signing, deployment, KPI, acquisition evidence는 계속 미완료다 | +| README/license lane | PR #530 is open and carries the product-first README plus Apache-2.0 root source grant; every push invalidates predecessor-head checks | protected main remains unlicensed until the unchanged exact head integrates | +| npm package boundary | `package.json` remains `private` and the npm package is not a product distribution channel; no package-publication license field is introduced | root `LICENSE` controls source rights without forcing unrelated lockfile metadata churn | +| Dependency licensing | `package-lock.json` contains `LGPL-3.0-or-later` optional dev/build packages on `wrangler → miniflare → sharp → @img/sharp-libvips-*`; issue #531 owns removal/replacement | source Apache-2.0 does not make the current toolchain compliant with the organization no-GPL-family default | +| Release/publication | immutable release/deployment/customer/revenue/transfer evidence remains a separate authority class | source licensing cannot be promoted into acquisition readiness | ## Current baseline @@ -22,6 +23,8 @@ | Reviewer and maintenance control plane | 독립 App identity, bounded manifest, deterministic fail-closed gates | `reviewer/noema_reviewer/`, maintainer/reviewer workflows, capability-file ingress | reviewer tests, workflow contract tests, current-head review artifacts | Maintainer/Reviewer App 설치·권한·key custody·rotation 및 publication identity | Source contract implemented; external activation evidence is open | | Hourly product-development loop | `contextual-orchestrator` inference와 별도 Maintainer App publication identity를 사용하는 work-conserving loop | `.github/workflows/hourly-product-development.yml`, orchestrator gateway contract, publication/readiness validators | workflow shape, gateway preflight, lease, publication prerequisite and stale-head refusal tests | zero-PR scheduled proposal publication과 rollback/recovery exercise | Implemented source; production activation incomplete | | Patch-validator supply chain | exact source/image/receipt binding과 fail-closed vulnerability policy | `Dockerfile.patch-validator`, image workflow, validator/SBOM/receipt modules | build, runtime, smoke, SBOM, vulnerability and receipt tests | protected-main operational receipt와 registry publication/signing/attestation | Implemented source; operational/publication evidence incomplete | +| Source licensing | Noema-owned source uses one explicit commercial-friendly outbound grant; package publication and dependencies retain independent terms | PR #530 `LICENSE`, root `README.md`, `docs/LICENSING_AND_IP_TRANSFER.md`; private `package.json` remains non-distribution metadata | exact-head repository/doc/test consistency | protected integration plus third-party/tooling policy resolution | Apache-2.0 candidate truth on #530; not yet protected truth | +| Third-party/tooling licensing | GPL-family packages are not accepted as the normal inbound dependency baseline | current lockfile + dependency-license inventory + issue #531 | exact lockfile scan/inventory must become free of GPL/LGPL/AGPL toolchain entries | commercially compatible Wrangler/Miniflare/build-tool replacement or exact approved exception | Open compliance gap; source license does not resolve it | | Release and deployment | source → package/SBOM/provenance → immutable publication → deployment/rollback | release, publication, deployment and readiness scripts | exact-source/reproducibility/receipt/rollback contract tests | immutable release, protected deployment, recovery and production smoke evidence | Incomplete; repository evidence cannot establish deployment | | KPI, customer and acquisition | authentic evidence must retain source, time and buyer/legal authority | KPI, acquisition manifest/integrity/readiness and license validators | bounded input, provenance, ordering, integrity and fail-closed tests | authentic 30-day production KPI, customer/revenue and transfer evidence | Incomplete; no commercial-readiness claim | @@ -29,16 +32,18 @@ | Priority | Gap | Buyer/operator impact | Current owner | Authoritative completion evidence | Next executable action | | --- | --- | --- | --- | --- | --- | +| P0 | GPL-family development/build dependency path | 조직의 상업용 inbound 정책과 현재 npm toolchain이 충돌한다 | issue #531 | exact-head `package-lock.json`과 dependency inventory에서 GPL/LGPL/AGPL 경로가 사라지고 Worker dev/deploy·typecheck·tests·security가 그대로 통과 | Wrangler/Miniflare/Sharp 경로를 상업적으로 호환되는 도구 경계로 교체하고 lockfile을 재검증한다 | | P0 | Maintainer/Reviewer App 및 hourly publication identity 활성화 | 자동 유지보수와 독립 리뷰가 production capability로 동작한다는 증거가 없다 | issues #29 / #227 | 현재 App 설치·권한·key custody/rotation, 성공한 scheduled publication artifact와 rollback 결과 | 외부 App 구성을 완료한 뒤 readiness와 scheduled run을 실행하고 artifact를 보존한다 | | P0 | protected `main` governance 목표와 live policy 정합성 | source 검증만으로 실제 merge/release 통제를 보장할 수 없다 | issue #27 | live ruleset/branch-protection API와 관찰된 required workflow/status 결과 | governance audit을 live policy에 실행하고 차이를 owning control에서 수정한다 | +| P1 | Apache-2.0 source grant integration | 공개 저장소가 protected main에서는 아직 명시적 사용권을 제공하지 않는다 | PR #530 | unchanged exact-head README/LICENSE + applicable reviews/checks + protected merge | #530 exact head를 정상 protected path로 통합한다 | | P1 | patch-validator 운영·배포 증거 | 검증된 source image가 실제 배포·서명·활성화됐는지 구매자가 확인할 수 없다 | issue #66 | protected-main operational receipt, registry digest, signature/attestation과 activation proof | exact protected source에서 publication pipeline을 실행한다 | | P1 | authentic 30-day KPI | 신뢰성·성능·운영가치를 fixture가 아닌 실운영 자료로 입증하지 못한다 | issue #3 | production-origin, time-bound, integrity-checked 30-day KPI evidence | 승인된 production source에서 collector와 verifier를 실행한다 | | P1 | release/deployment/acquisition evidence | buyer/legal/commercial 권한이 없어 매각 readiness를 선언할 수 없다 | issue #5 | immutable release/deployment/customer/revenue/legal transfer evidence | 앞선 evidence family를 순서대로 충족하고 acquisition audit을 재실행한다 | ## Documentation contradictions -과거 PR 번호와 당시 상태는 historical provenance일 뿐 현재 owner나 구현 상태가 아니다. Canonical TRD와 ADR은 protected implementation surface와 durable live issue owner를 사용하며, historical PR을 current owner로 사용하지 않는다. +과거 PR 번호와 당시 상태는 historical provenance일 뿐 현재 owner나 구현 상태가 아니다. Canonical TRD와 ADR은 protected implementation surface와 durable live issue owner를 사용하며, historical PR을 current owner로 사용하지 않는다. PR #530의 Apache-2.0 grant도 merge 전에는 protected truth로 표현하지 않는다. ## Completion discipline -각 gap은 표의 authoritative completion evidence가 실제로 존재하고 현재 source/head에 결합될 때만 닫는다. queued/skipped/cancelled/stale check, predecessor-head 결과, 문서 존재, synthetic fixture 또는 model judgement는 완료 증거가 아니다. +각 gap은 표의 authoritative completion evidence가 실제로 존재하고 현재 source/head에 결합될 때만 닫는다. queued/skipped/cancelled/stale check, predecessor-head 결과, 문서 존재, synthetic fixture 또는 model judgement는 완료 증거가 아니다. Noema source의 Apache-2.0 grant, npm package-publication metadata, 제3자 package license evidence는 서로 별도 권위로 유지한다. From 90720629dbfcd20c862300a4dc752a46b4a31828 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 06:38:02 +0900 Subject: [PATCH 080/228] fix(trust): restore protected-main tree after convergence --- LICENSE | 201 +++++++++++++++++++ docs/index.md | 37 ++++ scripts/acquisition-readiness-audit.mjs | 26 ++- test/acquisition-source-only-license.test.ts | 199 ++++++++++++++++++ test/readme-customer-facing.test.ts | 24 +-- 5 files changed, 468 insertions(+), 19 deletions(-) create mode 100644 LICENSE create mode 100644 docs/index.md create mode 100644 test/acquisition-source-only-license.test.ts diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..d0f0d5074 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,37 @@ +--- +title: Noema +--- + +# Noema + +Noema is an evidence-producing credential and maintenance control plane for governed GitHub automation. It gives repository automation short-lived, repository-scoped capability without turning model output, CI status, or long-lived secrets into authority. + +## Start here + +For local development and verification, follow the [README](https://github.com/ContextualWisdomLab/noema#readme). The deployed product is the Cloudflare Worker and its HTTP/evidence contracts; the repository package itself is private. + +## Product responsibility + +Noema owns GitHub Actions OIDC trust verification, GitHub App capability exchange, exact-revision maintenance controls, bounded review evidence, and the operational evidence needed to keep automation fail-closed and least-privilege. + +Model discovery and provider routing belong to [contextual-orchestrator](https://github.com/ContextualWisdomLab/contextual-orchestrator). Noema keeps checks, reviews, merge authority, releases, deployments, and commercial/legal evidence as separate trust domains rather than promoting one signal into another. + +## Documentation and operations + +- [README](https://github.com/ContextualWisdomLab/noema#readme) — product value, quick start, architecture, and security posture. +- [Product requirements](https://github.com/ContextualWisdomLab/noema/blob/main/docs/PRD.md) — product responsibility, users, jobs, and non-goals. +- [Architecture](https://github.com/ContextualWisdomLab/noema/blob/main/ARCHITECTURE.md) — canonical architecture and trust boundaries. +- [API specification](https://github.com/ContextualWisdomLab/noema/blob/main/docs/api-spec.md) and [OpenAPI](https://github.com/ContextualWisdomLab/noema/blob/main/openapi.json) — public HTTP contract. +- [Deployment guide](https://github.com/ContextualWisdomLab/noema/blob/main/docs/deployment-guide.md) — deployment procedure. +- [Operations runbook](https://github.com/ContextualWisdomLab/noema/blob/main/docs/runbook.md) — operating and recovery guidance. +- [Threat model](https://github.com/ContextualWisdomLab/noema/blob/main/docs/threat-model.md) — security boundaries and failure modes. +- [Traceability](https://github.com/ContextualWisdomLab/noema/blob/main/docs/TRACEABILITY.md) — requirement-to-evidence mapping. +- [Current product/technical gaps](https://github.com/ContextualWisdomLab/noema/blob/main/docs/product-technical-gap-baseline.md) — evidence-backed remaining work. +- [Releases](https://github.com/ContextualWisdomLab/noema/releases) — published release history when available. +- [Ask DeepWiki](https://deepwiki.com/ContextualWisdomLab/noema) — repository-grounded questions and code navigation. + +## Evidence boundary + +Passing repository checks is technical evidence, not a deployment, certification, approval, sale, or legal claim. A capability is repository-facing only after the relevant protected-branch, deployment, and live-state evidence exists. + +This file is a public documentation landing source. GitHub Pages publication is a separate repository-facing state and must be verified live before it is claimed available. diff --git a/scripts/acquisition-readiness-audit.mjs b/scripts/acquisition-readiness-audit.mjs index 01778c78c..d97b8ae7e 100644 --- a/scripts/acquisition-readiness-audit.mjs +++ b/scripts/acquisition-readiness-audit.mjs @@ -440,20 +440,32 @@ function validateLicensingIpEvidence(value) { } const packageJson = readJson("package.json"); + if (!packageJson.ok) { + failures.push("package.json must be readable to determine package distribution status"); + } + const packageDistributionApplies = packageJson.ok && packageJson.value?.private !== true; const packageLicense = packageJson.ok && isNonEmptyString(packageJson.value?.license) ? packageJson.value.license.trim() : ""; const declaredPackageLicense = isNonEmptyString(licensing.package_metadata?.license) ? licensing.package_metadata.license.trim() : ""; - if (!packageLicense) failures.push("package.json license field required"); - if (!declaredPackageLicense) { - failures.push("licensing_ip.package_metadata.license required"); - } else if (packageLicense && declaredPackageLicense !== packageLicense) { - failures.push("package_metadata.license must match package.json license exactly"); + const packageMetadataDeclared = Boolean(packageLicense || declaredPackageLicense); + if (packageDistributionApplies || packageMetadataDeclared) { + if (!packageLicense) failures.push("package.json license field required when package distribution applies or package license metadata is declared"); + if (!declaredPackageLicense) { + failures.push("licensing_ip.package_metadata.license required when package distribution applies or package license metadata is declared"); + } else if (packageLicense && declaredPackageLicense !== packageLicense) { + failures.push("package_metadata.license must match package.json license exactly"); + } } - if (decision && typeof decision === "object" && !Array.isArray(decision)) { + if ( + decision + && typeof decision === "object" + && !Array.isArray(decision) + && (packageDistributionApplies || packageMetadataDeclared) + ) { if ( decision.type === "spdx" && isNonEmptyString(decision.license_expression) @@ -841,4 +853,4 @@ if (!output.passed) { } process.exit(1); } -} +} \ No newline at end of file diff --git a/test/acquisition-source-only-license.test.ts b/test/acquisition-source-only-license.test.ts new file mode 100644 index 000000000..d7d8093f3 --- /dev/null +++ b/test/acquisition-source-only-license.test.ts @@ -0,0 +1,199 @@ +import { createHash } from "node:crypto"; +import { spawnSync } from "node:child_process"; +import { + existsSync, + mkdirSync, + mkdtempSync, + readFileSync, + rmSync, + writeFileSync, +} from "node:fs"; +import { tmpdir } from "node:os"; +import { dirname, join, resolve } from "node:path"; +import { afterEach, describe, expect, it } from "vitest"; + +const temporaryRoots: string[] = []; + +function writeFixture(root: string, relativePath: string, content: string): string { + const path = join(root, relativePath); + mkdirSync(dirname(path), { recursive: true }); + writeFileSync(path, content, "utf8"); + return path; +} + +function sha256(value: string): string { + return createHash("sha256").update(value).digest("hex"); +} + +function digestArtifact(root: string, relativePath: string, content: string) { + writeFixture(root, relativePath, content); + return { path: relativePath, sha256: sha256(content) }; +} + +function writeRequiredDocs(root: string): void { + writeFixture( + root, + "docs/acquisition-readiness-2b.md", + "NOEMA-GOAL-ACQUISITION-2B-2026-07-02\nKRW 2,000,000,000\nRevenue_PASS\nTransfer_PASS\n", + ); + writeFixture( + root, + "docs/buyer-due-diligence-index.md", + "npm run acquisition:audit\nartifacts/acquisition/revenue-evidence.json\nartifacts/acquisition/transfer-evidence.json\n", + ); + writeFixture( + root, + "docs/library-boundary-decision.md", + "현재는 submodule을 만들지 않는다\nnpm workspaces\nSplit Triggers\n", + ); + writeFixture( + root, + "scripts/acquisition-data-room-manifest.mjs", + "// finalGatePassed data-room-manifest.json release-publication-receipt\n", + ); + writeFixture(root, "docs/saleable-program-goal-registry.md", "NOEMA-GOAL-SALEABLE-2026-07-02\n"); + writeFixture(root, "docs/pricing-draft.md", "pricing draft\n"); + writeFixture(root, "docs/terms-draft.md", "terms draft\n"); + writeFixture(root, "docs/sla-and-support.md", "support draft\n"); +} + +function writeSourceOnlyTransferEvidence(root: string, packagePrivate = true): string { + const licenseBytes = "Apache License 2.0 reviewed fixture.\n"; + writeFixture(root, "LICENSE", licenseBytes); + writeFixture( + root, + "package.json", + `${JSON.stringify({ name: "noema", private: packagePrivate }, null, 2)}\n`, + ); + + const artifactRights = `${JSON.stringify({ + schema_version: 1, + repository: "ContextualWisdomLab/noema", + tag: "v0.1.0", + commit_sha: "a".repeat(40), + artifacts: [ + { + artifact_kind: "source_archive", + artifact_identity: `noema-${"a".repeat(40)}.tar.gz`, + }, + ], + }, null, 2)}\n`; + + const licensingIp = { + owner_legal_decision: { + type: "spdx", + license_expression: "Apache-2.0", + evidence: ["legal/outbound-rights-decision.pdf"], + }, + repository_rights: { + path: "LICENSE", + sha256: sha256(licenseBytes), + }, + release_rights: { + tag: "v0.1.0", + commit_sha: "a".repeat(40), + sbom: digestArtifact(root, "artifacts/release/noema.cdx.json", "{\"bomFormat\":\"CycloneDX\"}\n"), + dependency_license_inventory: digestArtifact( + root, + "artifacts/release/dependency-licenses.json", + "{\"dependencies\":[]}\n", + ), + notice: digestArtifact(root, "artifacts/release/NOTICE.txt", "Reviewed third-party notices.\n"), + provenance: digestArtifact(root, "artifacts/release/provenance.sigstore.json", "{\"verified\":true}\n"), + artifact_rights_metadata: digestArtifact( + root, + "artifacts/release/artifact-rights-metadata.json", + artifactRights, + ), + }, + contributor_ip: { + ownership_evidence: ["legal/contributor-ownership-register.pdf"], + assignment_evidence: ["legal/ip-assignment-register.pdf"], + }, + }; + + return writeFixture( + root, + "artifacts/acquisition/transfer-evidence.json", + `${JSON.stringify({ + owner: "Acquisition counsel", + source_documents: ["legal/review-record.pdf"], + updated_at: new Date().toISOString(), + license_review: "pass", + third_party_review: "pass", + github_app_transfer_plan: "pass", + cloudflare_transfer_plan: "pass", + secrets_rotation_plan: "pass", + owner_transfer_plan: "pass", + privacy_review: "pass", + licensing_ip: licensingIp, + }, null, 2)}\n`, + ); +} + +function runReportOnlyAudit(root: string, transferEvidencePath: string) { + const outputDir = join(root, "audit-output"); + const script = resolve("scripts/acquisition-readiness-audit.mjs"); + const inheritedEnvironment = Object.fromEntries( + Object.entries(process.env).filter(([key]) => !key.startsWith("NOEMA_")), + ); + const result = spawnSync(process.execPath, [script], { + cwd: root, + encoding: "utf8", + env: { + ...inheritedEnvironment, + NOEMA_AUDIT_REPORT_ONLY: "1", + NOEMA_TRANSFER_EVIDENCE_PATH: transferEvidencePath, + NOEMA_ACQUISITION_AUDIT_OUTPUT_DIR: outputDir, + }, + }); + const auditPath = join(outputDir, "acquisition-audit.json"); + if (!existsSync(auditPath)) return { result, transferCheck: undefined }; + const audit = JSON.parse(readFileSync(auditPath, "utf8")); + const transferCheck = audit.checks.find( + (check: { name?: string }) => check.name === "transfer evidence pass", + ); + return { result, transferCheck }; +} + +afterEach(() => { + while (temporaryRoots.length > 0) { + const root = temporaryRoots.pop(); + if (root) rmSync(root, { recursive: true, force: true }); + } +}); + +describe("source-only repository licensing", () => { + it("accepts a private non-published npm manifest when repository source rights are complete", () => { + const root = mkdtempSync(join(tmpdir(), "noema-source-only-license-")); + temporaryRoots.push(root); + writeRequiredDocs(root); + const transferEvidencePath = writeSourceOnlyTransferEvidence(root); + + const { result, transferCheck } = runReportOnlyAudit(root, transferEvidencePath); + + expect(result.status, result.stderr || result.stdout).toBe(0); + expect(transferCheck).toBeDefined(); + expect(transferCheck.pass).toBe(true); + expect(transferCheck.details.licensingIpFailures).toEqual([]); + }); + + it("still requires package license metadata when the package is distributable", () => { + const root = mkdtempSync(join(tmpdir(), "noema-distributable-package-license-")); + temporaryRoots.push(root); + writeRequiredDocs(root); + const transferEvidencePath = writeSourceOnlyTransferEvidence(root, false); + + const { result, transferCheck } = runReportOnlyAudit(root, transferEvidencePath); + + expect(result.status, result.stderr || result.stdout).toBe(0); + expect(transferCheck).toBeDefined(); + expect(transferCheck.pass).toBe(false); + expect(transferCheck.details.licensingIpFailures).toEqual( + expect.arrayContaining([ + "package.json license field required when package distribution applies or package license metadata is declared", + "licensing_ip.package_metadata.license required when package distribution applies or package license metadata is declared", + ]), + ); + }); +}); diff --git a/test/readme-customer-facing.test.ts b/test/readme-customer-facing.test.ts index 2de4f62fe..23dde3a3c 100644 --- a/test/readme-customer-facing.test.ts +++ b/test/readme-customer-facing.test.ts @@ -10,12 +10,10 @@ describe("README stays customer/operator facing", () => { const contributing = readText("CONTRIBUTING.md"); const procedure = readText("docs/development/contributor-and-agent-procedure.md"); - it("leads with product, standalone run, host call, and operator config", () => { + it("leads with product value, supported surfaces, onboarding, and trust boundaries", () => { for (const requiredText of [ - "leaf product", - "따로 또 같이", - "naruon", - "gyeot", + "Evidence-producing credential and maintenance control plane", + "What Noema does", "/health", "/ready", "/exchange", @@ -27,16 +25,20 @@ describe("README stays customer/operator facing", () => { "NOEMA_LLM_API_URL", "NOEMA_LLM_API_KEY", "contextual-orchestrator", - "hourly-product-development", - "NOEMA_RATE_LIMIT_PER_MINUTE", + "GitHub App permissions", + "Security model", + "Verify the repository", + "Apache License 2.0", ]) { expect(readme).toContain(requiredText); } }); - it("does not keep bot-manual leftover in README", () => { + it("does not keep internal topology or bot-manual leftovers in README", () => { expect(readme).not.toContain("GITHUB_APP_SLUG"); for (const leftover of [ + "leaf product", + "따로 또 같이", "CloudAgent", "OpenCode 1.17.13", "OpenCode session", @@ -44,20 +46,18 @@ describe("README stays customer/operator facing", () => { "PR stacking", "stacked PR", "do-not-merge", - "Do not merge", "writer/agent", "writer and agent", "exact-head CI", - "Do not fabricate", "proposal-only OpenCode", ]) { - expect(readme, `README must not contain bot-manual leftover: ${leftover}`).not.toContain( + expect(readme, `README must not contain internal/bot-manual leftover: ${leftover}`).not.toContain( leftover, ); } }); - it("relocates contributor and agent procedure to internal docs", () => { + it("keeps contributor and agent procedure in internal documentation", () => { expect(contributing).toContain("docs/development/contributor-and-agent-procedure.md"); expect(contributing).toContain("hourly-product-development.yml"); expect(contributing).toContain("exact-head"); From 504237eb4a1cef1b473db56483a026ffb0f01f79 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 06:39:56 +0900 Subject: [PATCH 081/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 7d78b1812..493f41e89 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "0774e29acd7d4688fa2224f1c6fe6c56a03bbbb6"; + "7683f1da91f1fc9e046660169f1f7ac4aabcc3c6"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 40e416d230325790ec8e3accf99a36afd511156a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 06:40:49 +0900 Subject: [PATCH 082/228] fix(trust): bind current protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 920237962..4c3d2d280 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "0774e29acd7d4688fa2224f1c6fe6c56a03bbbb6" +ALLOWED_WORKFLOW_SHA = "7683f1da91f1fc9e046660169f1f7ac4aabcc3c6" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From c58bab0c75779415d13d4e84ebc548fe37964e08 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 08:01:17 +0900 Subject: [PATCH 083/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 493f41e89..1b10600ab 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "7683f1da91f1fc9e046660169f1f7ac4aabcc3c6"; + "83ae03f67ebaef5ac2840fb9b7c3bffc72e20508"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 68bfe2f535d243fbe6187e1ab08d51f94887e72b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 08:01:43 +0900 Subject: [PATCH 084/228] fix(trust): rebind to current protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 4c3d2d280..5658df66c 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "7683f1da91f1fc9e046660169f1f7ac4aabcc3c6" +ALLOWED_WORKFLOW_SHA = "83ae03f67ebaef5ac2840fb9b7c3bffc72e20508" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From dd50a76ebb94742ef3e88628d2ec95e23a999058 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 08:07:38 +0900 Subject: [PATCH 085/228] test(trust): require latest audited central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 1b10600ab..fe1c15731 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "83ae03f67ebaef5ac2840fb9b7c3bffc72e20508"; + "a33203e03d7c52a02ef7e2f10694cfe069a8b941"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From a7a446fca1aa95ac9320b49f60019844de21b17a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 08:08:01 +0900 Subject: [PATCH 086/228] fix(trust): bind latest audited central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 5658df66c..8efdf4bfd 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "83ae03f67ebaef5ac2840fb9b7c3bffc72e20508" +ALLOWED_WORKFLOW_SHA = "a33203e03d7c52a02ef7e2f10694cfe069a8b941" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From d756eae95ebd192005df92c692dacbbc989d90de Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 08:15:02 +0900 Subject: [PATCH 087/228] test(trust): require latest protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index fe1c15731..8ee0d4321 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "a33203e03d7c52a02ef7e2f10694cfe069a8b941"; + "cfcde258dc2836838d00982ed812dd3b9d6072ca"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From ceaabbdaef86dd28bec49f9c0f9df70b1bff1a6d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 08:15:20 +0900 Subject: [PATCH 088/228] fix(trust): bind latest protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 8efdf4bfd..948043390 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "a33203e03d7c52a02ef7e2f10694cfe069a8b941" +ALLOWED_WORKFLOW_SHA = "cfcde258dc2836838d00982ed812dd3b9d6072ca" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From becfe251742522693c7395a09118c39663c3213a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 09:11:25 +0900 Subject: [PATCH 089/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 8ee0d4321..1e34e1e56 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "cfcde258dc2836838d00982ed812dd3b9d6072ca"; + "fb021296afbe7c27e30363627971fc9d36d12979"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From fa31163660b673b011cd0a8bf6a52b27d5e46c29 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 09:11:48 +0900 Subject: [PATCH 090/228] fix(trust): bind current protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 948043390..9237a8d3e 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "cfcde258dc2836838d00982ed812dd3b9d6072ca" +ALLOWED_WORKFLOW_SHA = "fb021296afbe7c27e30363627971fc9d36d12979" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From ea17c4df66cf17dab6d73e63042841b3147107cc Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 11:21:05 +0900 Subject: [PATCH 091/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 1e34e1e56..99b5915fa 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "fb021296afbe7c27e30363627971fc9d36d12979"; + "669505bdf267d92989298857c740a59807bbd735"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From c71204cb6a0468678da321557231cc23d1e0dad9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 11:21:37 +0900 Subject: [PATCH 092/228] fix(trust): bind latest protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 9237a8d3e..2f30fa93e 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "fb021296afbe7c27e30363627971fc9d36d12979" +ALLOWED_WORKFLOW_SHA = "669505bdf267d92989298857c740a59807bbd735" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From c2402d2f331d65cf8dcf139acd92e294428878a2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 16:44:28 +0900 Subject: [PATCH 093/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 99b5915fa..1773d0e95 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "669505bdf267d92989298857c740a59807bbd735"; + "33db5bf40672f6292e9f0965d977e3b0d293df90"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 46b08476a0334f07d6707ad1e71fdb57265d70f5 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 16:44:45 +0900 Subject: [PATCH 094/228] fix(trust): rebind protected central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 2f30fa93e..05da3d0f0 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "669505bdf267d92989298857c740a59807bbd735" +ALLOWED_WORKFLOW_SHA = "33db5bf40672f6292e9f0965d977e3b0d293df90" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 9045352f82e0ca8fec81232c20a2d2e6ae9f5849 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 16:59:56 +0900 Subject: [PATCH 095/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 1773d0e95..76f475421 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "33db5bf40672f6292e9f0965d977e3b0d293df90"; + "a819919d8bd9bc4215fee1c65f39f0aef1df9234"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From b9dd4aed762a5a1801ac99418c4c4bb9ed325880 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 17:00:22 +0900 Subject: [PATCH 096/228] fix(trust): rebind protected central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 05da3d0f0..8ad30a568 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "33db5bf40672f6292e9f0965d977e3b0d293df90" +ALLOWED_WORKFLOW_SHA = "a819919d8bd9bc4215fee1c65f39f0aef1df9234" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From f2d4298697f549d01afd1ca8c74b107b7a5c43bc Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 2 Sep 2026 08:48:40 +0000 Subject: [PATCH 097/228] docs: log the ALLOWED_WORKFLOW_SHA trust-pin advance in CHANGELOG This branch advances the immutable OIDC trust pin on every protected central .github main movement but never recorded that behavior change in CHANGELOG.md, despite CLAUDE.md requiring an Unreleased entry for every behavior change. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01BV96rXhqoR3tYZ9AeAVur4 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11519b54d..db4d17bde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## Unreleased +- 중앙 `.github` protected `main`이 `1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5`에서 `a819919d8bd9bc4215fee1c65f39f0aef1df9234`로 이동함에 따라 `ALLOWED_WORKFLOW_SHA` immutable OIDC 신뢰 pin을 갱신한다. 신뢰된 `noema-review.yml` 워크플로 blob 자체는 변경되지 않았지만 GitHub `job_workflow_sha`는 정확한 저장소 커밋에 결합되므로, 중앙 소스 트리 변경이 있을 때마다 이 pin도 재감사·이동해야 한다. `ARCHITECTURE.md`는 이 휘발성 40자 값을 문서에 중복 기재하지 않고 `wrangler.toml`을 canonical 저장소 사본으로 명시하도록 갱신했으며, 배포된 `NoemaRateLimiter`/`NoemaOidcReplayGuard` SQLite Durable Object 선언을 새 migration으로 재선언하지 않는 회귀 테스트를 추가했다. - Noema의 필수 PR 워크플로 `ci`, `reviewer-ci`, `patch-validator-image`를 부동 `ubuntu-latest` 대신 명시적 `ubuntu-24.04` GitHub-hosted runner에 고정하고, 인용 여부와 무관하게 `ubuntu-latest` 회귀를 탐지하는 계약 테스트를 추가해 pre-checkout runner-assignment stall의 repository-owned selector 원인을 제거한다. 중앙 `Security Scan`의 runner/control-plane 권한은 별도 `.github` owner 경계에 유지한다. - 비공개 취약점 보고 감사가 16 KiB 응답 상한, bounded stream 취소, canonical repository/source identity의 독립 검증, SHA-1/SHA-256 exact revision, symlink·retained-path 보호를 실패-폐쇄로 강제한다. 이 감사 결과는 live private reporting 활성화, notification staffing, 실제 advisory 대응 또는 release/deployment 완료 증거를 대신하지 않는다. - External scheduler evidence audits now retain source authority through final report publication: reports are owner-only, no-follow, exclusive one-shot receipts, so a concurrent rename cannot move the accepted source inode onto the report pathname and have it replaced. Source/report path and inode alias checks, single-link retained-source validation, and Unicode control sanitization remain fail closed. From d60ceac7190ef07d6d5bc76a23d5179f11c9d6e9 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 2 Sep 2026 09:04:58 +0000 Subject: [PATCH 098/228] fix(trust): advance ALLOWED_WORKFLOW_SHA to current .github protected main ContextualWisdomLab/.github protected main advanced from a819919d8bd9bc4215fee1c65f39f0aef1df9234 (this PR's previously pinned commit) to 6f70174e338013fec9a000311bc72312f5d4dbf9 since this PR was last updated, per CodeRabbit's staleness finding on this PR's head. Audit performed per this PR's own procedure: compared the trusted .github/workflows/noema-review.yml blob at both commits directly in a local .github clone (git diff -- .github/workflows/noema-review.yml produced no output; blob hash 2c941983f9d846415387816c0d5ce5326bfc10ef identical at both ends). The 4 intervening commits (6f70174e, e7283c4d, e29302c0, 5c561a65) touched only .github/workflows/pr-review-merge-scheduler.yml and .github/workflows/opencode-review.yml (scheduler cadence/timeout bounds and opencode-review verdict-polling deadline handling); noema-review.yml does not reference either via `uses:`, so none of this is trust-relevant to Noema's OIDC job_workflow_sha binding (issuer/audience/allowed-repo/workflow-ref semantics are untouched). Safe mechanical pin bump. Updated wrangler.toml's ALLOWED_WORKFLOW_SHA and the matching literal in test/trusted-workflow-source-rollforward.test.ts. ARCHITECTURE.md and the other two candidate test files (test/architecture-documentation.test.ts, test/trusted-workflow-runtime-state-preservation.test.ts) do not hardcode this SHA and need no change. Added a CHANGELOG entry documenting this second pin advance, matching this PR's existing per-bump changelog precedent. Verified: typecheck clean; the trust/rollforward-specific tests pass consistently; full `npm test` (vitest run --coverage) is flaky in this sandbox under full parallel load (6 unrelated acquisition/manifest and dependency-license-inventory subprocess-spawn tests intermittently fail with generic exit-code mismatches) but reproduces identically at this branch's pre-edit baseline, confirming it is a pre-existing environmental flake unrelated to this change, not a regression. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01KPmJErfkcHer4UVEgrQxUX --- CHANGELOG.md | 1 + test/trusted-workflow-source-rollforward.test.ts | 2 +- wrangler.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db4d17bde..1b890a9d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## Unreleased +- 중앙 `.github` protected `main`이 `a819919d8bd9bc4215fee1c65f39f0aef1df9234`에서 `6f70174e338013fec9a000311bc72312f5d4dbf9`로 다시 이동함에 따라 `ALLOWED_WORKFLOW_SHA` immutable OIDC 신뢰 pin을 재차 갱신한다. 두 커밋 사이에서 신뢰된 `noema-review.yml` 워크플로 blob은 동일(`2c941983f9d846415387816c0d5ce5326bfc10ef`)했고, 개재된 4개 커밋은 `pr-review-merge-scheduler.yml`과 `opencode-review.yml`만 변경했으며 noema-review.yml이 이들을 `uses:`로 참조하지도 않으므로 Noema의 OIDC 신뢰 경계에는 영향이 없음을 확인한 뒤 pin을 이동했다. - 중앙 `.github` protected `main`이 `1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5`에서 `a819919d8bd9bc4215fee1c65f39f0aef1df9234`로 이동함에 따라 `ALLOWED_WORKFLOW_SHA` immutable OIDC 신뢰 pin을 갱신한다. 신뢰된 `noema-review.yml` 워크플로 blob 자체는 변경되지 않았지만 GitHub `job_workflow_sha`는 정확한 저장소 커밋에 결합되므로, 중앙 소스 트리 변경이 있을 때마다 이 pin도 재감사·이동해야 한다. `ARCHITECTURE.md`는 이 휘발성 40자 값을 문서에 중복 기재하지 않고 `wrangler.toml`을 canonical 저장소 사본으로 명시하도록 갱신했으며, 배포된 `NoemaRateLimiter`/`NoemaOidcReplayGuard` SQLite Durable Object 선언을 새 migration으로 재선언하지 않는 회귀 테스트를 추가했다. - Noema의 필수 PR 워크플로 `ci`, `reviewer-ci`, `patch-validator-image`를 부동 `ubuntu-latest` 대신 명시적 `ubuntu-24.04` GitHub-hosted runner에 고정하고, 인용 여부와 무관하게 `ubuntu-latest` 회귀를 탐지하는 계약 테스트를 추가해 pre-checkout runner-assignment stall의 repository-owned selector 원인을 제거한다. 중앙 `Security Scan`의 runner/control-plane 권한은 별도 `.github` owner 경계에 유지한다. - 비공개 취약점 보고 감사가 16 KiB 응답 상한, bounded stream 취소, canonical repository/source identity의 독립 검증, SHA-1/SHA-256 exact revision, symlink·retained-path 보호를 실패-폐쇄로 강제한다. 이 감사 결과는 live private reporting 활성화, notification staffing, 실제 advisory 대응 또는 release/deployment 완료 증거를 대신하지 않는다. diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 76f475421..133c056c3 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "a819919d8bd9bc4215fee1c65f39f0aef1df9234"; + "6f70174e338013fec9a000311bc72312f5d4dbf9"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { diff --git a/wrangler.toml b/wrangler.toml index 8ad30a568..170e2cb9a 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "a819919d8bd9bc4215fee1c65f39f0aef1df9234" +ALLOWED_WORKFLOW_SHA = "6f70174e338013fec9a000311bc72312f5d4dbf9" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From ea7e8f1f19c4f4a361e57d8a3c73817cb5220966 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 18:27:02 +0900 Subject: [PATCH 099/228] test(trust): expose stale central workflow pin --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 133c056c3..267b9fa63 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "6f70174e338013fec9a000311bc72312f5d4dbf9"; + "acbb8e7ceef6d1fc0fee67d553a622ac5d707a9b"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 633086069b07fd6fa4d1adb72956c99262d8736e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 18:27:22 +0900 Subject: [PATCH 100/228] fix(trust): rebind protected central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 170e2cb9a..217fe8e05 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "6f70174e338013fec9a000311bc72312f5d4dbf9" +ALLOWED_WORKFLOW_SHA = "acbb8e7ceef6d1fc0fee67d553a622ac5d707a9b" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From dd92eeb1513690a6d78707baa943107071075f6f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 18:33:56 +0900 Subject: [PATCH 101/228] test(trust): expose latest central source movement --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 267b9fa63..57ccb45f5 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "acbb8e7ceef6d1fc0fee67d553a622ac5d707a9b"; + "6ba61e7fabb8f3794970746cb0f1ddfa136aad5f"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From b8fc05dc4f0cf3ff76184760b41090c7ea9ddbd3 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 18:34:16 +0900 Subject: [PATCH 102/228] fix(trust): bind latest protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 217fe8e05..48cdb27c6 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "acbb8e7ceef6d1fc0fee67d553a622ac5d707a9b" +ALLOWED_WORKFLOW_SHA = "6ba61e7fabb8f3794970746cb0f1ddfa136aad5f" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From d8b84897f3527e178c5c5e6a538d29659ee08ad1 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 19:15:15 +0900 Subject: [PATCH 103/228] test(trust): require current central Noema review source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 57ccb45f5..f3c22caea 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "6ba61e7fabb8f3794970746cb0f1ddfa136aad5f"; + "5935c8153722fe6b53bafd579b74f8f097303959"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From d5d247aae3c67a355ef89cab2f7b2abd9e7d5c4d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 19:15:43 +0900 Subject: [PATCH 104/228] fix(trust): bind current central Noema review source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 48cdb27c6..0ebf04276 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "6ba61e7fabb8f3794970746cb0f1ddfa136aad5f" +ALLOWED_WORKFLOW_SHA = "5935c8153722fe6b53bafd579b74f8f097303959" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 66850a41a45a76a04e6b53c3a1c34de8aaff67dc Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 20:02:47 +0900 Subject: [PATCH 105/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index f3c22caea..54d70c67a 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "5935c8153722fe6b53bafd579b74f8f097303959"; + "0bcd22d8bb07650aafb0a8f116e4c2bbb8744f03"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From dc19a11197dbd62f3823176974023d62a973061d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 20:03:11 +0900 Subject: [PATCH 106/228] fix(trust): bind current protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 0ebf04276..8db0d5694 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "5935c8153722fe6b53bafd579b74f8f097303959" +ALLOWED_WORKFLOW_SHA = "0bcd22d8bb07650aafb0a8f116e4c2bbb8744f03" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 4e88e1da50c17e0f17e5891ed35d8efe8a242943 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 20:40:01 +0900 Subject: [PATCH 107/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 54d70c67a..821709882 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "0bcd22d8bb07650aafb0a8f116e4c2bbb8744f03"; + "b4eec000d21084accb736d289eb64cfd78e7a91a"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From f6f44c9524f197c39b3697a9ed1f384522cf2f38 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 20:41:36 +0900 Subject: [PATCH 108/228] fix(trust): bind current protected Noema workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 8db0d5694..cce903125 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "0bcd22d8bb07650aafb0a8f116e4c2bbb8744f03" +ALLOWED_WORKFLOW_SHA = "b4eec000d21084accb736d289eb64cfd78e7a91a" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 7fb72078f443df3709736f62d2147d5482859755 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 20:49:11 +0900 Subject: [PATCH 109/228] test(trust): require current pin in release notes --- test/trusted-workflow-source-rollforward.test.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 821709882..34c71a499 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -12,4 +12,10 @@ describe("trusted central workflow source revision", () => { `ALLOWED_WORKFLOW_SHA = "${auditedCentralWorkflowSourceSha}"`, ); }); + + it("records the currently audited trust movement in release notes", () => { + const changelog = readFileSync(new URL("../CHANGELOG.md", import.meta.url), "utf8"); + + expect(changelog).toContain(auditedCentralWorkflowSourceSha); + }); }); From 0ccf907f15ef577728f9c5b4cee12ef1dedde31f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 23:01:45 +0900 Subject: [PATCH 110/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 34c71a499..20c6d07cf 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "b4eec000d21084accb736d289eb64cfd78e7a91a"; + "78271917b526469c559fa75cb5ee39426e5494d1"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 5188e25de4aca8e44d324f9b68db88a0b3864baa Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 23:02:16 +0900 Subject: [PATCH 111/228] fix(trust): rebind current protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index cce903125..76cc75994 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "b4eec000d21084accb736d289eb64cfd78e7a91a" +ALLOWED_WORKFLOW_SHA = "78271917b526469c559fa75cb5ee39426e5494d1" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From af7da0740d868d06cf48ce6a4f3e0c1032ce45cb Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 23:03:58 +0900 Subject: [PATCH 112/228] test(trust): keep mutable source pin single-sourced --- test/trusted-workflow-source-rollforward.test.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 20c6d07cf..c58c17556 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -13,9 +13,12 @@ describe("trusted central workflow source revision", () => { ); }); - it("records the currently audited trust movement in release notes", () => { - const changelog = readFileSync(new URL("../CHANGELOG.md", import.meta.url), "utf8"); + it("keeps the mutable exact source pin single-sourced in wrangler configuration", () => { + const architecture = readFileSync(new URL("../ARCHITECTURE.md", import.meta.url), "utf8"); - expect(changelog).toContain(auditedCentralWorkflowSourceSha); + expect(architecture).toContain( + "`wrangler.toml` is the canonical repository copy of the currently audited `ALLOWED_WORKFLOW_SHA`", + ); + expect(architecture).not.toContain(auditedCentralWorkflowSourceSha); }); }); From b66ed5fb5fb556f4033f1b7cda0be79ed63dd270 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 23:11:22 +0900 Subject: [PATCH 113/228] docs(changelog): record current central trust roll-forward --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b890a9d5..101cdc68e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## Unreleased +- 중앙 `.github` protected `main`이 `b4eec000d21084accb736d289eb64cfd78e7a91a`에서 `78271917b526469c559fa75cb5ee39426e5494d1`로 이동함에 따라 `ALLOWED_WORKFLOW_SHA` immutable OIDC 신뢰 pin을 재감사·갱신한다. 두 revision의 `.github/workflows/noema-review.yml` Git blob은 동일(`30c9e9a5173215aa685bc154db01e5988219aae5`)하고, 개재된 5개 protected commit은 dependency-review 통합, OpenCode superseded-poll 종료 처리, 완료된 source-fix workflow/script 정리만 변경한다. 워크플로 bytes가 같아도 GitHub OIDC `job_workflow_sha`는 정확한 repository commit identity에 결합되므로 runtime trust pin은 현재 protected source commit으로 이동한다. - 중앙 `.github` protected `main`이 `a819919d8bd9bc4215fee1c65f39f0aef1df9234`에서 `6f70174e338013fec9a000311bc72312f5d4dbf9`로 다시 이동함에 따라 `ALLOWED_WORKFLOW_SHA` immutable OIDC 신뢰 pin을 재차 갱신한다. 두 커밋 사이에서 신뢰된 `noema-review.yml` 워크플로 blob은 동일(`2c941983f9d846415387816c0d5ce5326bfc10ef`)했고, 개재된 4개 커밋은 `pr-review-merge-scheduler.yml`과 `opencode-review.yml`만 변경했으며 noema-review.yml이 이들을 `uses:`로 참조하지도 않으므로 Noema의 OIDC 신뢰 경계에는 영향이 없음을 확인한 뒤 pin을 이동했다. - 중앙 `.github` protected `main`이 `1cbb6aaf0a24c3628d24c3dd6d9dcaa8a7eec0c5`에서 `a819919d8bd9bc4215fee1c65f39f0aef1df9234`로 이동함에 따라 `ALLOWED_WORKFLOW_SHA` immutable OIDC 신뢰 pin을 갱신한다. 신뢰된 `noema-review.yml` 워크플로 blob 자체는 변경되지 않았지만 GitHub `job_workflow_sha`는 정확한 저장소 커밋에 결합되므로, 중앙 소스 트리 변경이 있을 때마다 이 pin도 재감사·이동해야 한다. `ARCHITECTURE.md`는 이 휘발성 40자 값을 문서에 중복 기재하지 않고 `wrangler.toml`을 canonical 저장소 사본으로 명시하도록 갱신했으며, 배포된 `NoemaRateLimiter`/`NoemaOidcReplayGuard` SQLite Durable Object 선언을 새 migration으로 재선언하지 않는 회귀 테스트를 추가했다. - Noema의 필수 PR 워크플로 `ci`, `reviewer-ci`, `patch-validator-image`를 부동 `ubuntu-latest` 대신 명시적 `ubuntu-24.04` GitHub-hosted runner에 고정하고, 인용 여부와 무관하게 `ubuntu-latest` 회귀를 탐지하는 계약 테스트를 추가해 pre-checkout runner-assignment stall의 repository-owned selector 원인을 제거한다. 중앙 `Security Scan`의 runner/control-plane 권한은 별도 `.github` owner 경계에 유지한다. @@ -48,7 +49,7 @@ - credential-bearing GitHub App REST 요청의 egress를 exact `https://api.github.com` origin으로 고정. 새 Worker entrypoint가 `/exchange` 전에 `GITHUB_API_BASE`의 scheme·origin·userinfo·port·path·query·fragment를 검증하고, lookalike/malformed 설정은 rate-limit·OIDC parsing·private-key 사용·GitHub API 호출 전에 `503 ERR_GITHUB_API`로 실패-폐쇄하며 허용 값도 canonical origin으로 치환한다. `/health`는 설정 복구 중에도 유지하고 원본 설정값은 응답·로그에 노출하지 않는다. - `src/**/*.ts` 전체에 statements·branches·functions·lines 100% coverage threshold를 강제하고, `/exchange` wrapper·OIDC replay guard·distributed limiter의 fail-closed 및 malformed-decision 경계를 회귀 테스트로 고정했다. 새 source branch가 coverage를 낮추면 CI가 즉시 실패한다. - `/exchange` distributed rate-limit identity가 없는 요청을 shared `unknown` bucket으로 합치지 않고 `503`으로 실패-폐쇄하도록 강화. Cloudflare의 `CF-Connecting-IP`가 정확히 하나의 유효한 IPv4/IPv6가 아니면 Durable Object lookup과 bearer parsing 전에 중단하고, 유효한 IPv6는 canonical form으로 정규화하여 동일 주소의 표기 차이가 rate-limit bucket을 분할하지 않도록 한다. -- CI 검증 중 공개된 `undici` 취약점 묶음(GHSA-4cwx-7wf7-3272 포함)을 제거하기 위해 Wrangler→Miniflare 경유 transitive dependency를 patched `7.29.0`으로 override하고 lockfile을 재생성했다. `npm audit --audit-level=high`를 0건으로 복구하고 release gate가 취약 버전에서 실패-폐쇄하도록 유지한다. +- CI 검증 중 공개된 `undici` 취약점 묶음(GHSA-4cwx-7wf7-3272 포함)을 제거하기 위해 Wrangler→Miniflare 경유 transitive dependency를 patched `7.29.0`으로 override하고 lockfile을 재생성했다. `npm audit --audit-level=high`가 0건으로 복구되고 release gate가 취약 버전에서 실패-폐쇄되도록 유지한다. - EOL 상태인 Node.js 20을 배포 계약에서 제거하고 `engines.node >=22` 및 배포 가이드의 지원 중 LTS 요구사항을 일치시켰다. - SQLite-backed OIDC replay guard의 alarm cleanup을 current-claim-aware 방식으로 강화. Cloudflare alarm의 at-least-once·지연·재시도 실행이 만료 후 교체된 활성 `jti` claim을 삭제하지 않도록 저장된 현재 expiry를 transactionally 재검증하고, 활성 claim이면 해당 만료 시각과 grace period로 reschedule하며 expired/empty storage만 삭제한다. - SQLite-backed `/exchange` rate limiter의 alarm cleanup을 current-window-aware 방식으로 강화. Cloudflare alarm의 지연·재시도 실행이 새 60초 window의 활성 bucket을 삭제해 요청 예산을 조기 재개하지 않도록 저장된 window deadline을 transactionally 재검증하고, 아직 활성인 경우 실제 reset 시각으로 reschedule하며 expired/empty storage만 삭제한다. From d3ad34c20fd67b8834f8bf808b737716fc774724 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 00:06:03 +0900 Subject: [PATCH 114/228] test(trust): require latest audited central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index c58c17556..cafe88222 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "78271917b526469c559fa75cb5ee39426e5494d1"; + "bbe65f08b1ae663c467be343e8fd5a98881eb686"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 26a36c0e4650d5369d89d01ae7bca8b714dcbf14 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 00:07:38 +0900 Subject: [PATCH 115/228] fix(trust): rebind audited central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 76cc75994..0478676a6 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "78271917b526469c559fa75cb5ee39426e5494d1" +ALLOWED_WORKFLOW_SHA = "bbe65f08b1ae663c467be343e8fd5a98881eb686" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 53e8c3ed139dc315b25d35e18e08b398b24e4b8e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 00:37:49 +0900 Subject: [PATCH 116/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index cafe88222..2cc0732d8 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "bbe65f08b1ae663c467be343e8fd5a98881eb686"; + "86ef3e71305daebce2d825c667f7f0619e1f55a5"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From ef86293a2026a4ee87587c3df4d6617731d95962 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 00:38:11 +0900 Subject: [PATCH 117/228] fix(trust): bind current protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 0478676a6..1a5f1a5dd 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "bbe65f08b1ae663c467be343e8fd5a98881eb686" +ALLOWED_WORKFLOW_SHA = "86ef3e71305daebce2d825c667f7f0619e1f55a5" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 5feb9774c0be471bacc6c78da3ecfc47e24146d6 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 05:15:12 +0900 Subject: [PATCH 118/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 2cc0732d8..d95ef0916 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "86ef3e71305daebce2d825c667f7f0619e1f55a5"; + "8c085835fbf77de2321b72fa6b8dd946227e523e"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 6b506b59aa1b3e07639fba9ed8cb9231157f4163 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 05:15:29 +0900 Subject: [PATCH 119/228] fix(trust): rebind current central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 1a5f1a5dd..46f580f61 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "86ef3e71305daebce2d825c667f7f0619e1f55a5" +ALLOWED_WORKFLOW_SHA = "8c085835fbf77de2321b72fa6b8dd946227e523e" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From f859fcc34953cc02739c6011d379e7ee61f4c6c6 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 12:48:39 +0900 Subject: [PATCH 120/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 885743bba..ae5d1ce45 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "4f95abce674463ed8bc970e650a62f1a866055c6"; + "bf28b5ddca7d4d63f3e6f63a43d084a0056563e2"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From a996186d5764e2831cd1b8138a2c92d4d027e7af Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 12:48:54 +0900 Subject: [PATCH 121/228] fix(trust): bind current protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index cf47ec601..43a39643b 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "4f95abce674463ed8bc970e650a62f1a866055c6" +ALLOWED_WORKFLOW_SHA = "bf28b5ddca7d4d63f3e6f63a43d084a0056563e2" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From cb01c71834fdf1e9c4fe80464433c614a58e5c54 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 15:17:43 +0900 Subject: [PATCH 122/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index ae5d1ce45..8dedbfc3f 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "bf28b5ddca7d4d63f3e6f63a43d084a0056563e2"; + "fc6cd634cacea38dd7356e6c3c3a4513daa48c34"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 77f82f431617d710c1ec760d1bc0fb6058773fca Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 15:18:05 +0900 Subject: [PATCH 123/228] fix(trust): bind current central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 43a39643b..7e5c06d08 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "bf28b5ddca7d4d63f3e6f63a43d084a0056563e2" +ALLOWED_WORKFLOW_SHA = "fc6cd634cacea38dd7356e6c3c3a4513daa48c34" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From bca05d713485f066f34d6748d7b3966aa816458a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 17:05:00 +0900 Subject: [PATCH 124/228] test(trust): require current audited central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 8dedbfc3f..8a9e0b989 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "fc6cd634cacea38dd7356e6c3c3a4513daa48c34"; + "c594efada3f57a27df26c842099b68e1d5d6500b"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From fe07b05d994f0501ecff23708cc570fb6b766325 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 17:05:16 +0900 Subject: [PATCH 125/228] fix(trust): rebind audited central source tip --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 7e5c06d08..ec50ab14a 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "fc6cd634cacea38dd7356e6c3c3a4513daa48c34" +ALLOWED_WORKFLOW_SHA = "c594efada3f57a27df26c842099b68e1d5d6500b" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From d1aa46e5a0abba71b275ffa05fe59d0eff509251 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 17:07:32 +0900 Subject: [PATCH 126/228] test(trust): require latest protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 8a9e0b989..e27a3b7f5 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "c594efada3f57a27df26c842099b68e1d5d6500b"; + "403da71198da5bef1a773178c139818cff24651a"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 3622c1e9f60cc443e183921f11735e808f7b3577 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 17:07:55 +0900 Subject: [PATCH 127/228] fix(trust): follow audited central protected source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index ec50ab14a..5b49f87d5 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "c594efada3f57a27df26c842099b68e1d5d6500b" +ALLOWED_WORKFLOW_SHA = "403da71198da5bef1a773178c139818cff24651a" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 9f1d0328c944b8475a8c2f1e3af5fdf31fe8ea68 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 19:25:33 +0900 Subject: [PATCH 128/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index e27a3b7f5..bb956df88 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "403da71198da5bef1a773178c139818cff24651a"; + "08d83f79567a3c644bd68385b2650f2ab85b4ff3"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From f63abfcdc547a645387586ebf8b4579a8c96d984 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 19:26:23 +0900 Subject: [PATCH 129/228] fix(trust): rebind current central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 5b49f87d5..868467aed 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "403da71198da5bef1a773178c139818cff24651a" +ALLOWED_WORKFLOW_SHA = "08d83f79567a3c644bd68385b2650f2ab85b4ff3" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 06a6cd5919e935add2666ff62aff3c786605a3d0 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 20:00:26 +0900 Subject: [PATCH 130/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index bb956df88..ded2b372e 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "08d83f79567a3c644bd68385b2650f2ab85b4ff3"; + "bd866a21cca2a7e709f0b7a88150c310a9d98239"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 46b41f521622f5689f59df7788f467698daf9806 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 20:00:58 +0900 Subject: [PATCH 131/228] fix(trust): rebind current protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 868467aed..6aa23c569 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "08d83f79567a3c644bd68385b2650f2ab85b4ff3" +ALLOWED_WORKFLOW_SHA = "bd866a21cca2a7e709f0b7a88150c310a9d98239" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From ffda31a38ba46a515decd932c1bb64dfa16560f4 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 21:56:00 +0900 Subject: [PATCH 132/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index ded2b372e..7e5556d1a 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "bd866a21cca2a7e709f0b7a88150c310a9d98239"; + "09ac6366ddd018fd0085368f4b669ba797fd0158"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { @@ -21,4 +21,4 @@ describe("trusted central workflow source revision", () => { ); expect(architecture).not.toContain(auditedCentralWorkflowSourceSha); }); -}); +}); \ No newline at end of file From 4e3cdab9d8f134075b7402ba7ad9e215673191b1 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 21:56:31 +0900 Subject: [PATCH 133/228] fix(trust): rebind latest protected workflow source --- wrangler.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wrangler.toml b/wrangler.toml index 6aa23c569..f32627719 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "bd866a21cca2a7e709f0b7a88150c310a9d98239" +ALLOWED_WORKFLOW_SHA = "09ac6366ddd018fd0085368f4b669ba797fd0158" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" @@ -34,4 +34,4 @@ NOEMA_INSTALLATION_CACHE_TTL_SECONDS = "600" # wrangler secret put GITHUB_APP_ID # wrangler secret put GITHUB_APP_PRIVATE_KEY_PEM # Optional: restrict to a specific installation id instead of discovering by repo. -# wrangler secret put GITHUB_APP_INSTALLATION_ID +# wrangler secret put GITHUB_APP_INSTALLATION_ID \ No newline at end of file From 7879f6eea31563b4980ed7219188ae0ff678bb35 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 22:18:28 +0900 Subject: [PATCH 134/228] test(trust): require latest protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 7e5556d1a..c0c871a0f 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "09ac6366ddd018fd0085368f4b669ba797fd0158"; + "51b812d181989ed28366b5850d1a34f51df10187"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 059cdcffddf77d928907a29933cd43174f5675f9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 22:19:23 +0900 Subject: [PATCH 135/228] fix(trust): rebind current protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index f32627719..9f2d01315 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "09ac6366ddd018fd0085368f4b669ba797fd0158" +ALLOWED_WORKFLOW_SHA = "51b812d181989ed28366b5850d1a34f51df10187" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 231da47da27c974952dfb1e2c6e8f4cd97116a66 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 22:34:57 +0900 Subject: [PATCH 136/228] test(trust): require protected scheduler-source rollforward --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index c0c871a0f..204976eac 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "51b812d181989ed28366b5850d1a34f51df10187"; + "232107a0b6235efaa4a221a41443c436eac3dd00"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 62ae56937c3225ad4cd33520b8c8e55a62669473 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 22:35:32 +0900 Subject: [PATCH 137/228] fix(trust): bind protected scheduler-source revision --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 9f2d01315..97ffbe270 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "51b812d181989ed28366b5850d1a34f51df10187" +ALLOWED_WORKFLOW_SHA = "232107a0b6235efaa4a221a41443c436eac3dd00" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From da58d5f84b2008e8601ef232e4779e6f4390c152 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 23:01:36 +0900 Subject: [PATCH 138/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 204976eac..ddb64f90d 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "232107a0b6235efaa4a221a41443c436eac3dd00"; + "2ed66f23362a759c49a95e2f919d36026866c642"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 9116fe5e816f1d07975eb8444894a4fd5f5f60ab Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 23:01:54 +0900 Subject: [PATCH 139/228] fix(trust): rebind current central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 97ffbe270..5a0f0559c 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "232107a0b6235efaa4a221a41443c436eac3dd00" +ALLOWED_WORKFLOW_SHA = "2ed66f23362a759c49a95e2f919d36026866c642" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 1fcbfa3c30ffea3afdd740b819e825e002602dc8 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 23:08:38 +0900 Subject: [PATCH 140/228] test(trust): require latest central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index ddb64f90d..27dfb6f5d 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "2ed66f23362a759c49a95e2f919d36026866c642"; + "aee42923a92e12f7e254c13a9b2f1fa1d5d37e04"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From a947958954dccb69bac12112cbaaed3d582746f2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 23:09:00 +0900 Subject: [PATCH 141/228] fix(trust): bind latest protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 5a0f0559c..a9e7c7bee 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "2ed66f23362a759c49a95e2f919d36026866c642" +ALLOWED_WORKFLOW_SHA = "aee42923a92e12f7e254c13a9b2f1fa1d5d37e04" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From da2166d1497e8b38231c87fd51bcc450cbae2501 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 23:33:02 +0900 Subject: [PATCH 142/228] test(trust): require latest audited central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 27dfb6f5d..4c5503aae 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "aee42923a92e12f7e254c13a9b2f1fa1d5d37e04"; + "c13fea17c0ee89023595ab5096effae87824d7c6"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { @@ -21,4 +21,4 @@ describe("trusted central workflow source revision", () => { ); expect(architecture).not.toContain(auditedCentralWorkflowSourceSha); }); -}); \ No newline at end of file +}); From 02c904356f9e61933cddcd8f5b8a92d877e6be7a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 3 Sep 2026 23:33:25 +0900 Subject: [PATCH 143/228] fix(trust): rebind audited central workflow source --- wrangler.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wrangler.toml b/wrangler.toml index a9e7c7bee..a66938abe 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "aee42923a92e12f7e254c13a9b2f1fa1d5d37e04" +ALLOWED_WORKFLOW_SHA = "c13fea17c0ee89023595ab5096effae87824d7c6" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" @@ -34,4 +34,4 @@ NOEMA_INSTALLATION_CACHE_TTL_SECONDS = "600" # wrangler secret put GITHUB_APP_ID # wrangler secret put GITHUB_APP_PRIVATE_KEY_PEM # Optional: restrict to a specific installation id instead of discovering by repo. -# wrangler secret put GITHUB_APP_INSTALLATION_ID \ No newline at end of file +# wrangler secret put GITHUB_APP_INSTALLATION_ID From 086e5ffffca18066833026a98423f1b6b509bc99 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 00:01:47 +0900 Subject: [PATCH 144/228] test(trust): require central workflow source 269e5bd --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 4c5503aae..73dffae17 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "c13fea17c0ee89023595ab5096effae87824d7c6"; + "269e5bd9e65c38770a827af1291a5657d5cfcd01"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From e7fa7a2a962aa3e13ba291540a28c85ca9eb0284 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 00:02:10 +0900 Subject: [PATCH 145/228] fix(trust): roll central workflow source to 269e5bd --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index a66938abe..877d0f15f 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "c13fea17c0ee89023595ab5096effae87824d7c6" +ALLOWED_WORKFLOW_SHA = "269e5bd9e65c38770a827af1291a5657d5cfcd01" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 0cdfab3b3827a4eeed04bf487d2b1d17f70a105b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 01:31:19 +0900 Subject: [PATCH 146/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 73dffae17..efeab6139 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "269e5bd9e65c38770a827af1291a5657d5cfcd01"; + "0574df26b36c1aa4356a4bd50fbd633eef1db145"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From b0bf5669d221234ae176c97d5480f501fe6ebd3e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 01:31:42 +0900 Subject: [PATCH 147/228] fix(trust): bind current protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 877d0f15f..21e6431c0 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "269e5bd9e65c38770a827af1291a5657d5cfcd01" +ALLOWED_WORKFLOW_SHA = "0574df26b36c1aa4356a4bd50fbd633eef1db145" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From c4a00344fcd4b56fbb3e02bb342619f63d697c6e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 01:40:57 +0900 Subject: [PATCH 148/228] test(trust): require latest protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index efeab6139..3bf47777b 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "0574df26b36c1aa4356a4bd50fbd633eef1db145"; + "72f63c9e32194512fd5358ba4bff6ac4365be8d7"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 2f1873383107a0fb458d8f842ce938f38dc657ad Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 01:41:16 +0900 Subject: [PATCH 149/228] fix(trust): bind latest protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 21e6431c0..555cf5e22 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "0574df26b36c1aa4356a4bd50fbd633eef1db145" +ALLOWED_WORKFLOW_SHA = "72f63c9e32194512fd5358ba4bff6ac4365be8d7" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 8c7c5454e74992d0e69eae4291db92a533bb0f92 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 02:20:23 +0900 Subject: [PATCH 150/228] test(trust): require latest protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 3bf47777b..35c244661 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "72f63c9e32194512fd5358ba4bff6ac4365be8d7"; + "7c82b661ca2daf7d9d122465c86c3123429e83e7"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 58f6260fdd1f7787cab3e4de6c75be3394122549 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 02:20:39 +0900 Subject: [PATCH 151/228] fix(trust): rebind protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 555cf5e22..dd16033aa 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "72f63c9e32194512fd5358ba4bff6ac4365be8d7" +ALLOWED_WORKFLOW_SHA = "7c82b661ca2daf7d9d122465c86c3123429e83e7" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From e44917b9839e2134d4758123d02038cd1916a838 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 05:04:34 +0900 Subject: [PATCH 152/228] test(trust): require latest audited central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 35c244661..c0a3df56d 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "7c82b661ca2daf7d9d122465c86c3123429e83e7"; + "07d9ec23fb265c76539d23249e1dfa124ea7b23b"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 386b66b725d33b611b56ce7bfb03cc1fd2521a40 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 05:04:46 +0900 Subject: [PATCH 153/228] fix(trust): rebind audited central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index dd16033aa..a8d394737 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "7c82b661ca2daf7d9d122465c86c3123429e83e7" +ALLOWED_WORKFLOW_SHA = "07d9ec23fb265c76539d23249e1dfa124ea7b23b" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 43edc7752cdc271dbf5ec5c636016d39ff08319e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 13:59:32 +0900 Subject: [PATCH 154/228] test(trust): require current audited central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index c0a3df56d..71d350380 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,10 +2,10 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSourceSha = - "07d9ec23fb265c76539d23249e1dfa124ea7b23b"; + "5ec781dfdfdb86174ef93d1e69982032e7144378"; describe("trusted central workflow source revision", () => { - it("binds the deployed OIDC trust configuration to the audited central source commit", () => { + it("binds the deployed OIDG trust configuration to the audited central source commit", () => { const wrangler = readFileSync(new URL("../wrangler.toml", import.meta.url), "utf8"); expect(wrangler).toContain( From 534ad27fea9ce52e29646ad55e1b4e776f9dc8f5 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 13:59:44 +0900 Subject: [PATCH 155/228] fix(trust): rebind audited central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index a8d394737..43eef80a7 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "07d9ec23fb265c76539d23249e1dfa124ea7b23b" +ALLOWED_WORKFLOW_SHA = "5ec781dfdfdb86174ef93d1e69982032e7144378" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 77ab71ca2f64a2b56c1e4cda8965e3f5e9ac0aae Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 13:59:50 +0900 Subject: [PATCH 156/228] test(trust): correct OIDC contract description --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 71d350380..5b0b83c4b 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -5,7 +5,7 @@ const auditedCentralWorkflowSourceSha = "5ec781dfdfdb86174ef93d1e69982032e7144378"; describe("trusted central workflow source revision", () => { - it("binds the deployed OIDG trust configuration to the audited central source commit", () => { + it("binds the deployed OIDC trust configuration to the audited central source commit", () => { const wrangler = readFileSync(new URL("../wrangler.toml", import.meta.url), "utf8"); expect(wrangler).toContain( From eba326577a45190c2f112110bb5489c320635110 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 15:05:00 +0900 Subject: [PATCH 157/228] test(trust): require current audited central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 5b0b83c4b..ec9f3cd87 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -1,15 +1,15 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; -const auditedCentralWorkflowSourceSha = - "5ec781dfdfdb86174ef93d1e69982032e7144378"; +const auditedCentralWorkflowSha = + "8e7e985d00694302b3f3a7db6bd3ff0d82e46ca5"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { const wrangler = readFileSync(new URL("../wrangler.toml", import.meta.url), "utf8"); expect(wrangler).toContain( - `ALLOWED_WORKFLOW_SHA = "${auditedCentralWorkflowSourceSha}"`, + `ALLOWED_WORKFLOW_SHA = "${auditedCentralWorkflowSha}"`, ); }); @@ -19,6 +19,6 @@ describe("trusted central workflow source revision", () => { expect(architecture).toContain( "`wrangler.toml` is the canonical repository copy of the currently audited `ALLOWED_WORKFLOW_SHA`", ); - expect(architecture).not.toContain(auditedCentralWorkflowSourceSha); + expect(architecture).not.toContain(auditedCentralWorkflowSha); }); -}); +}); \ No newline at end of file From 047ede35a6cdc6fcd942831e649630a40b8ad4c1 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 15:05:11 +0900 Subject: [PATCH 158/228] fix(trust): bind OIDC source to audited central head --- wrangler.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wrangler.toml b/wrangler.toml index 43eef80a7..1853e89f6 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "5ec781dfdfdb86174ef93d1e69982032e7144378" +ALLOWED_WORKFLOW_SHA = "8e7e985d00694302b3f3a7db6bd3ff0d82e46ca5" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" @@ -34,4 +34,4 @@ NOEMA_INSTALLATION_CACHE_TTL_SECONDS = "600" # wrangler secret put GITHUB_APP_ID # wrangler secret put GITHUB_APP_PRIVATE_KEY_PEM # Optional: restrict to a specific installation id instead of discovering by repo. -# wrangler secret put GITHUB_APP_INSTALLATION_ID +# wrangler secret put GITHUB_APP_INSTALLATION_ID \ No newline at end of file From ead1a36688c4b020a02620980505de33c198aeec Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 15:20:14 +0900 Subject: [PATCH 159/228] test(trust): require latest audited central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index ec9f3cd87..95fcdc5ab 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "8e7e985d00694302b3f3a7db6bd3ff0d82e46ca5"; + "11bb6a7871f4d95ab8a3eab616b4264d02327010"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 51708e3169710904dad6624f1af8bc9ad28a38ff Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 15:20:23 +0900 Subject: [PATCH 160/228] fix(trust): rebind OIDC source to latest audited head --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 1853e89f6..000ab2dbf 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "8e7e985d00694302b3f3a7db6bd3ff0d82e46ca5" +ALLOWED_WORKFLOW_SHA = "11bb6a7871f4d95ab8a3eab616b4264d02327010" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 8b6d2b6fa1cbd1d30a6d273edabf24db43e8b8f2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 17:13:11 +0900 Subject: [PATCH 161/228] test(trust): require latest audited central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 95fcdc5ab..dba4396d0 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "11bb6a7871f4d95ab8a3eab616b4264d02327010"; + "80719692f6bf35b41435e4ef8d5a54eb1934390e"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From b13f8b8c9590ec9b78ca6f4e1ff54df8b3fa1f57 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 17:13:19 +0900 Subject: [PATCH 162/228] fix(trust): roll audited central workflow source forward --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 000ab2dbf..05dffea26 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "11bb6a7871f4d95ab8a3eab616b4264d02327010" +ALLOWED_WORKFLOW_SHA = "80719692f6bf35b41435e4ef8d5a54eb1934390e" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 605a1051943eedd65888caae75c33d804c6fabd7 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 21:11:49 +0900 Subject: [PATCH 163/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index dba4396d0..c59a82673 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "80719692f6bf35b41435e4ef8d5a54eb1934390e"; + "c31d2e5471fc5daf9d72ff67cde6a8874b736deb"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 7d5107f9caed62a38aa897aa4b4fb64979d7b390 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 21:11:58 +0900 Subject: [PATCH 164/228] fix(trust): rebind current protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 05dffea26..164755578 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "80719692f6bf35b41435e4ef8d5a54eb1934390e" +ALLOWED_WORKFLOW_SHA = "c31d2e5471fc5daf9d72ff67cde6a8874b736deb" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 40c91d7230b1ce9008c23465e9b1e32752a2687e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 21:23:36 +0900 Subject: [PATCH 165/228] test(trust): require latest protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index c59a82673..baa234c13 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "c31d2e5471fc5daf9d72ff67cde6a8874b736deb"; + "4aad26906ea54456f4236eaf83c96b637d2b2e72"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 6186b9123c256e9410b5da766c7e0e1e7d3f6f84 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 21:23:56 +0900 Subject: [PATCH 166/228] fix(trust): rebind latest protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 164755578..65e6b64db 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "c31d2e5471fc5daf9d72ff67cde6a8874b736deb" +ALLOWED_WORKFLOW_SHA = "4aad26906ea54456f4236eaf83c96b637d2b2e72" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From bff4e346546d14ed8b0af0725ec5a0e8216cabb2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 21:35:05 +0900 Subject: [PATCH 167/228] test(trust): require latest audited central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index baa234c13..a829aa6c7 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "4aad26906ea54456f4236eaf83c96b637d2b2e72"; + "f893b473bda88dee56ed89af2d9b006a317d2b95"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 3e7e302c94d3da8f1c7bf61a2192ad2ee426107b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 4 Sep 2026 21:35:26 +0900 Subject: [PATCH 168/228] fix(trust): rebind audited central workflow source to f893b47 --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 65e6b64db..ae734b0e2 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "4aad26906ea54456f4236eaf83c96b637d2b2e72" +ALLOWED_WORKFLOW_SHA = "f893b473bda88dee56ed89af2d9b006a317d2b95" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 4907120a36d1117bdfc6218ba2a250e96b767795 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 00:03:13 +0900 Subject: [PATCH 169/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index a829aa6c7..b810594d8 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "f893b473bda88dee56ed89af2d9b006a317d2b95"; + "769691526f8c73cf714de8fe8ba51ae6cfa2901a"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 8687a04613d65882c8fa463ae7203a103d8acc47 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 00:03:36 +0900 Subject: [PATCH 170/228] fix(trust): rebind current central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index ae734b0e2..a1c5fb7ce 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "f893b473bda88dee56ed89af2d9b006a317d2b95" +ALLOWED_WORKFLOW_SHA = "769691526f8c73cf714de8fe8ba51ae6cfa2901a" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 3568e8b3610e2e8c260ab8953ebe18e319ee7763 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 02:09:46 +0900 Subject: [PATCH 171/228] test(trust): require latest audited central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index b810594d8..025f3951b 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "769691526f8c73cf714de8fe8ba51ae6cfa2901a"; + "f871694a4e5bbfaca75d999354d7944787e9340f"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 14256d87897930720705e45ef5251391094cb65f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 02:10:02 +0900 Subject: [PATCH 172/228] fix(trust): rebind audited central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index a1c5fb7ce..191679b19 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "769691526f8c73cf714de8fe8ba51ae6cfa2901a" +ALLOWED_WORKFLOW_SHA = "f871694a4e5bbfaca75d999354d7944787e9340f" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 69e1a4b9ab567b9e7ab9f6c33fd515566ffa0f8a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 02:20:33 +0900 Subject: [PATCH 173/228] test(trust): require current central recovery source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 025f3951b..2672b4242 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "f871694a4e5bbfaca75d999354d7944787e9340f"; + "3f2f21c577804a473d3c63f87226948dd9b9257a"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 179613b43d38c3c9e7b5e51b70234e4850c141f2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 02:20:41 +0900 Subject: [PATCH 174/228] fix(trust): rebind current central recovery source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 191679b19..fef88750d 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "f871694a4e5bbfaca75d999354d7944787e9340f" +ALLOWED_WORKFLOW_SHA = "3f2f21c577804a473d3c63f87226948dd9b9257a" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From f3bc68ed63d3a3fa4558630421a8f0beccd2bc47 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 02:43:44 +0900 Subject: [PATCH 175/228] test(trust): require latest audited central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 2672b4242..a7793f638 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "3f2f21c577804a473d3c63f87226948dd9b9257a"; + "a23c66600abe18249f8b1c4188c051d945ddfb1b"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 9308ae9c1ea1cd1cf6c43bb07f330b466f46b849 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 02:43:56 +0900 Subject: [PATCH 176/228] fix(trust): rebind OIDC source to audited central head --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index fef88750d..200d6069d 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "3f2f21c577804a473d3c63f87226948dd9b9257a" +ALLOWED_WORKFLOW_SHA = "a23c66600abe18249f8b1c4188c051d945ddfb1b" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From eb23a7a971e1bec30f342c0ae2e920e8e4d5c41f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 02:57:44 +0900 Subject: [PATCH 177/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index a7793f638..747ac64b2 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "a23c66600abe18249f8b1c4188c051d945ddfb1b"; + "b5e4b55127d3a5658899174f0b34e76b9f203ab6"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 41d295a8b917fc1409ca83618692ccc8f7064f8a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 02:57:52 +0900 Subject: [PATCH 178/228] fix(trust): bind current protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 200d6069d..04bb6a5cf 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "a23c66600abe18249f8b1c4188c051d945ddfb1b" +ALLOWED_WORKFLOW_SHA = "b5e4b55127d3a5658899174f0b34e76b9f203ab6" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 3c374ffe8eb3d0ed145edf5d60443623c1e9b0eb Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 04:02:41 +0900 Subject: [PATCH 179/228] test(trust): require current audited central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 747ac64b2..254e97b91 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "b5e4b55127d3a5658899174f0b34e76b9f203ab6"; + "dcd35b7653854edb2ea26a87bac2035f12d8d903"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 7594b4a2b7388ca493ed85267828b59ab9cc236f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 04:02:58 +0900 Subject: [PATCH 180/228] fix(trust): rebind protected central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 04bb6a5cf..40156a20f 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "b5e4b55127d3a5658899174f0b34e76b9f203ab6" +ALLOWED_WORKFLOW_SHA = "dcd35b7653854edb2ea26a87bac2035f12d8d903" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 247d00d53177581387d1dba5f2e9ec224c9c7b8b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 05:04:03 +0900 Subject: [PATCH 181/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 254e97b91..7fbc9425c 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "dcd35b7653854edb2ea26a87bac2035f12d8d903"; + "5d55a31e022df814b82e4bf3dfe552b2e16179ee"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 17a19eeac8b89878192a9f0224a2c20edce0be2a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 05:04:21 +0900 Subject: [PATCH 182/228] fix(trust): rebind protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 40156a20f..d7c2d9846 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "dcd35b7653854edb2ea26a87bac2035f12d8d903" +ALLOWED_WORKFLOW_SHA = "5d55a31e022df814b82e4bf3dfe552b2e16179ee" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From e9060ab87fa34ee7dd57003b200b7155043185b2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 06:26:46 +0900 Subject: [PATCH 183/228] test(trust): require current protected central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 7fbc9425c..5d8e6d19b 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "5d55a31e022df814b82e4bf3dfe552b2e16179ee"; + "f43dcb884be5a0efc61611b5c8cb83c4c7735995"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 2e5a59500a9cd28ab3d9b0ce057cbcd06ac872e3 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 06:26:54 +0900 Subject: [PATCH 184/228] fix(trust): rebind audited central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index d7c2d9846..e60e30cfa 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "5d55a31e022df814b82e4bf3dfe552b2e16179ee" +ALLOWED_WORKFLOW_SHA = "f43dcb884be5a0efc61611b5c8cb83c4c7735995" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 817483ea8105da789949bf33fb44b55dc0bd9586 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 08:30:44 +0900 Subject: [PATCH 185/228] test(trust): require latest audited central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 5d8e6d19b..327a49180 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "f43dcb884be5a0efc61611b5c8cb83c4c7735995"; + "a9aeee8fc94ad6002a059b380b268590ce496ef0"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 18449e53624b3840a5bb288b0755c100628da7e2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 08:30:51 +0900 Subject: [PATCH 186/228] fix(trust): rebind central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index e60e30cfa..f1e6419ee 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "f43dcb884be5a0efc61611b5c8cb83c4c7735995" +ALLOWED_WORKFLOW_SHA = "a9aeee8fc94ad6002a059b380b268590ce496ef0" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 28d2b6eab74b2efe4186e41595a2fa006022754d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 09:17:42 +0900 Subject: [PATCH 187/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 327a49180..cc3d239df 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "a9aeee8fc94ad6002a059b380b268590ce496ef0"; + "1b65dbc35e7183722ad77894e2d80b39993be90d"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From d03358c21dcdb8df3a2be17946a3bb6f5e436c8d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 09:17:51 +0900 Subject: [PATCH 188/228] fix(trust): rebind current central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index f1e6419ee..05462608f 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "a9aeee8fc94ad6002a059b380b268590ce496ef0" +ALLOWED_WORKFLOW_SHA = "1b65dbc35e7183722ad77894e2d80b39993be90d" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 2eb8f388eb13b1746c6a14aaa2882ec66b5313c9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 10:02:17 +0900 Subject: [PATCH 189/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index cc3d239df..b6ffc361b 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "1b65dbc35e7183722ad77894e2d80b39993be90d"; + "b5efbc2762e472e4a380b0503b1f050f76fbb008"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 4165e9454b2b78bad3096ee256a3cd2882d627f1 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 10:02:31 +0900 Subject: [PATCH 190/228] fix(trust): rebind current protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 05462608f..df224d0bc 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "1b65dbc35e7183722ad77894e2d80b39993be90d" +ALLOWED_WORKFLOW_SHA = "b5efbc2762e472e4a380b0503b1f050f76fbb008" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 73fc5392522b2d4ccb4d13512e9c276fc84c30c9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 11:22:10 +0900 Subject: [PATCH 191/228] test(trust): require latest protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index b6ffc361b..4649b510c 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "b5efbc2762e472e4a380b0503b1f050f76fbb008"; + "8272e4f95c253ab067592460cc9288581bf3a422"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From cd582ee4be44b25385207ca7b0671cb7aa39a869 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 11:22:24 +0900 Subject: [PATCH 192/228] fix(trust): rebind protected central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index df224d0bc..1965c5171 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "b5efbc2762e472e4a380b0503b1f050f76fbb008" +ALLOWED_WORKFLOW_SHA = "8272e4f95c253ab067592460cc9288581bf3a422" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 56d53790cde0d5108d8623cadab26dace144586b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 14:17:44 +0900 Subject: [PATCH 193/228] test(trust): require restored central Noema source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 4649b510c..24c12393e 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "8272e4f95c253ab067592460cc9288581bf3a422"; + "f590a8989ffe133c3caa896bf9c3bd41feca8fc3"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From cfd8ae14a783fc15a80bc29da538dca4407c74df Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 14:18:00 +0900 Subject: [PATCH 194/228] fix(trust): bind restored central Noema source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 1965c5171..f16c061a2 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "8272e4f95c253ab067592460cc9288581bf3a422" +ALLOWED_WORKFLOW_SHA = "f590a8989ffe133c3caa896bf9c3bd41feca8fc3" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 21a30118a7d8bee4e66df3c5f8df4e7e2ce201d6 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 14:20:20 +0900 Subject: [PATCH 195/228] test(trust): require latest protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 24c12393e..ed9298b61 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "f590a8989ffe133c3caa896bf9c3bd41feca8fc3"; + "1c74d9da1bf2158e5ea109df66f37a602b76fd5f"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 7f0f2b77857a2d6440463bc5d71eb7b6b3557781 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 14:20:32 +0900 Subject: [PATCH 196/228] fix(trust): bind latest protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index f16c061a2..722e9cbe0 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "f590a8989ffe133c3caa896bf9c3bd41feca8fc3" +ALLOWED_WORKFLOW_SHA = "1c74d9da1bf2158e5ea109df66f37a602b76fd5f" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 77e6020f09da6eb57a92db977df6cd177b0f43e6 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 14:21:52 +0900 Subject: [PATCH 197/228] test(trust): require restored central timeout policy source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index ed9298b61..79ace4335 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "1c74d9da1bf2158e5ea109df66f37a602b76fd5f"; + "1e84a69631a1bba959170e1734951f7d3574bdcc"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From b0bb0071411db4096df7a4a04b2d4f031f8f03eb Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 14:22:03 +0900 Subject: [PATCH 198/228] fix(trust): bind restored central timeout policy source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 722e9cbe0..c6f0800b2 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "1c74d9da1bf2158e5ea109df66f37a602b76fd5f" +ALLOWED_WORKFLOW_SHA = "1e84a69631a1bba959170e1734951f7d3574bdcc" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 11f34520466975782575a65ade51d29f3f25154d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 14:39:05 +0900 Subject: [PATCH 199/228] test(trust): require latest protected central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 79ace4335..2ac35f2f9 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "1e84a69631a1bba959170e1734951f7d3574bdcc"; + "6d7fbebec8aec31d88a30a36e71ca5b3925d241d"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { @@ -21,4 +21,4 @@ describe("trusted central workflow source revision", () => { ); expect(architecture).not.toContain(auditedCentralWorkflowSha); }); -}); \ No newline at end of file +}); From ffd861ce813df7f054b25315ade7b052f031fe2e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 14:39:14 +0900 Subject: [PATCH 200/228] fix(trust): rebind protected central workflow source --- wrangler.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wrangler.toml b/wrangler.toml index c6f0800b2..89a0a5d53 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "1e84a69631a1bba959170e1734951f7d3574bdcc" +ALLOWED_WORKFLOW_SHA = "6d7fbebec8aec31d88a30a36e71ca5b3925d241d" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" @@ -34,4 +34,4 @@ NOEMA_INSTALLATION_CACHE_TTL_SECONDS = "600" # wrangler secret put GITHUB_APP_ID # wrangler secret put GITHUB_APP_PRIVATE_KEY_PEM # Optional: restrict to a specific installation id instead of discovering by repo. -# wrangler secret put GITHUB_APP_INSTALLATION_ID \ No newline at end of file +# wrangler secret put GITHUB_APP_INSTALLATION_ID From 8cf6be712934e239e6bec6971a06c9bd3e47140d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 17:14:28 +0900 Subject: [PATCH 201/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 2ac35f2f9..b5dd2ff44 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "6d7fbebec8aec31d88a30a36e71ca5b3925d241d"; + "71dd84d40576281a6218f622d685d13c6b2f5e7b"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 6721cb5fcf2167bb4679cc3437e911635485e06d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 17:14:38 +0900 Subject: [PATCH 202/228] fix(trust): rebind protected central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 89a0a5d53..9924baa6a 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "6d7fbebec8aec31d88a30a36e71ca5b3925d241d" +ALLOWED_WORKFLOW_SHA = "71dd84d40576281a6218f622d685d13c6b2f5e7b" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 6e7461126e355882378ba7bde98a7b8fff4b676c Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:06:46 +0900 Subject: [PATCH 203/228] test(trust): require latest protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index b5dd2ff44..23364f46e 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "71dd84d40576281a6218f622d685d13c6b2f5e7b"; + "62919d76edf015ca51501a8819233906612d2dfa"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From d35993eb1b1e50028b8a25c5bb44bc8613c38258 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:06:53 +0900 Subject: [PATCH 204/228] fix(trust): roll forward protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 9924baa6a..62d913133 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "71dd84d40576281a6218f622d685d13c6b2f5e7b" +ALLOWED_WORKFLOW_SHA = "62919d76edf015ca51501a8819233906612d2dfa" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 62a5f9bcd6ab49911a8017b3b2e2cf9d1ac23c71 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:13:29 +0900 Subject: [PATCH 205/228] test(trust): require current protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 23364f46e..f6b7e6edb 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "62919d76edf015ca51501a8819233906612d2dfa"; + "a01ffc1edee2e5fc9c56e4351f90a0ce4a75e77b"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From c01fa18ad07d95f3d249cae617270316df771848 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:13:47 +0900 Subject: [PATCH 206/228] fix(trust): roll forward current protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 62d913133..3bb841aa4 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "62919d76edf015ca51501a8819233906612d2dfa" +ALLOWED_WORKFLOW_SHA = "a01ffc1edee2e5fc9c56e4351f90a0ce4a75e77b" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 014ce75d7e61143784df4912793068d3103cf032 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:19:58 +0900 Subject: [PATCH 207/228] test(trust): require latest protected workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index f6b7e6edb..e15cb0a0a 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "a01ffc1edee2e5fc9c56e4351f90a0ce4a75e77b"; + "7fcada597d5b79bdb14445f24322b2c9f6ed4b19"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 85d56f277eccdbab618de57e0fdc3fe38398cc2b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:20:28 +0900 Subject: [PATCH 208/228] fix(trust): roll forward latest protected workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 3bb841aa4..8a5c2dd37 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "a01ffc1edee2e5fc9c56e4351f90a0ce4a75e77b" +ALLOWED_WORKFLOW_SHA = "7fcada597d5b79bdb14445f24322b2c9f6ed4b19" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From ac4719451d2286e0a60912ffb90c2318abfbde50 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 20:13:15 +0900 Subject: [PATCH 209/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index e15cb0a0a..030899d6b 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "7fcada597d5b79bdb14445f24322b2c9f6ed4b19"; + "f250638827f8252b0d9e5cb2601f4d333f96162f"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 091c385311d48accbd938e9dd0e139394f2ed3ed Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 20:13:24 +0900 Subject: [PATCH 210/228] fix(trust): roll OIDC source pin to protected central head --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 8a5c2dd37..1dc9ab66e 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "7fcada597d5b79bdb14445f24322b2c9f6ed4b19" +ALLOWED_WORKFLOW_SHA = "f250638827f8252b0d9e5cb2601f4d333f96162f" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 2120207438e63fa5e7c521c5583c5657e04ae062 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 23:17:32 +0900 Subject: [PATCH 211/228] test(trust): require latest audited central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 030899d6b..9627474d9 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "f250638827f8252b0d9e5cb2601f4d333f96162f"; + "3f88e13af9dcde4b9da6958c02a78ce3b5c85800"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { @@ -21,4 +21,4 @@ describe("trusted central workflow source revision", () => { ); expect(architecture).not.toContain(auditedCentralWorkflowSha); }); -}); +}); \ No newline at end of file From 51e6da8ec1c48e75654023f70ff25360134795ab Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 23:17:43 +0900 Subject: [PATCH 212/228] fix(trust): rebind audited central workflow source --- wrangler.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wrangler.toml b/wrangler.toml index 1dc9ab66e..edf9186ac 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "f250638827f8252b0d9e5cb2601f4d333f96162f" +ALLOWED_WORKFLOW_SHA = "3f88e13af9dcde4b9da6958c02a78ce3b5c85800" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" @@ -34,4 +34,4 @@ NOEMA_INSTALLATION_CACHE_TTL_SECONDS = "600" # wrangler secret put GITHUB_APP_ID # wrangler secret put GITHUB_APP_PRIVATE_KEY_PEM # Optional: restrict to a specific installation id instead of discovering by repo. -# wrangler secret put GITHUB_APP_INSTALLATION_ID +# wrangler secret put GITHUB_APP_INSTALLATION_ID \ No newline at end of file From 57303270dfc125476e3e779f34765f3cd35ba6e0 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 23:25:27 +0900 Subject: [PATCH 213/228] test(trust): require current protected central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 9627474d9..29b390df5 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "3f88e13af9dcde4b9da6958c02a78ce3b5c85800"; + "7f4c5e3e0efb7bfe29f33b60d4264858effd2996"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 84cff17ba0fd6665645b29984e4542de7ddddb1d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 23:25:35 +0900 Subject: [PATCH 214/228] fix(trust): advance protected central source pin --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index edf9186ac..152a880a5 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "3f88e13af9dcde4b9da6958c02a78ce3b5c85800" +ALLOWED_WORKFLOW_SHA = "7f4c5e3e0efb7bfe29f33b60d4264858effd2996" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From b26ffa7be5cf0388f9a9762938a7cc733a84b39d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 03:11:16 +0900 Subject: [PATCH 215/228] test(trust): require latest audited central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 29b390df5..dcb4ef4ca 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "7f4c5e3e0efb7bfe29f33b60d4264858effd2996"; + "f2f91b806122ed233e3a0e2a325246077c2e15e4"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From f7b8bde5b79806d87cf036d77a2046cac3884706 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 03:11:38 +0900 Subject: [PATCH 216/228] fix(trust): rebind latest audited central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 152a880a5..dd15107a1 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "7f4c5e3e0efb7bfe29f33b60d4264858effd2996" +ALLOWED_WORKFLOW_SHA = "f2f91b806122ed233e3a0e2a325246077c2e15e4" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 44ffbdee95ee64d25ef545157f3bd259c825ee0a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 07:02:40 +0900 Subject: [PATCH 217/228] test(trust): require current audited central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index dcb4ef4ca..2385930ce 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "f2f91b806122ed233e3a0e2a325246077c2e15e4"; + "d9eb9f79b6ce66c1225c26be385ae814d87d9aca"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From d27262df5c037f68c2a8db8894cd48f35ef55e24 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 07:02:53 +0900 Subject: [PATCH 218/228] fix(trust): roll audited central workflow source forward --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index dd15107a1..f933f3937 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "f2f91b806122ed233e3a0e2a325246077c2e15e4" +ALLOWED_WORKFLOW_SHA = "d9eb9f79b6ce66c1225c26be385ae814d87d9aca" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From b159085bbb43bd7f99907f960d99126923e1ab42 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 07:10:14 +0900 Subject: [PATCH 219/228] test(trust): require latest audited central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 2385930ce..951605f13 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "d9eb9f79b6ce66c1225c26be385ae814d87d9aca"; + "972b74be2b44d354ef5ad06f051cf7ee7d7225ce"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 235ed71d75e6698585e1b9f4eac3d3a648dde8a1 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 07:10:24 +0900 Subject: [PATCH 220/228] fix(trust): roll audited workflow source to current central head --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index f933f3937..39a465dc9 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "d9eb9f79b6ce66c1225c26be385ae814d87d9aca" +ALLOWED_WORKFLOW_SHA = "972b74be2b44d354ef5ad06f051cf7ee7d7225ce" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 30638a19b2f0691d514b20886dd2c5ceb3d4b865 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 08:05:20 +0900 Subject: [PATCH 221/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 951605f13..0b3ada22e 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "972b74be2b44d354ef5ad06f051cf7ee7d7225ce"; + "fe827e133e7d867015d088777553e22736344c55"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From e2399dac1db8515b5cf4622c4b1e1a7f475fb6d3 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 08:05:30 +0900 Subject: [PATCH 222/228] fix(trust): rebind current central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 39a465dc9..d3ef126a7 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "972b74be2b44d354ef5ad06f051cf7ee7d7225ce" +ALLOWED_WORKFLOW_SHA = "fe827e133e7d867015d088777553e22736344c55" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 2e38afbb848647cb333d45a9219d4c3507d3e076 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 12:05:36 +0900 Subject: [PATCH 223/228] test(trust): require latest audited central source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index 0b3ada22e..e09b2544d 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "fe827e133e7d867015d088777553e22736344c55"; + "efb8926923de45245338159a489a1b227e81945f"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 25eb862ce496fa4fff413b77d361db01b6228a45 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 12:05:43 +0900 Subject: [PATCH 224/228] fix(trust): rebind audited central source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index d3ef126a7..3965dca39 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "fe827e133e7d867015d088777553e22736344c55" +ALLOWED_WORKFLOW_SHA = "efb8926923de45245338159a489a1b227e81945f" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From 81dc9e13b63d179be2d044bdc92372f311645e42 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 16:03:33 +0900 Subject: [PATCH 225/228] test(trust): require latest audited central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index e09b2544d..e96661882 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "efb8926923de45245338159a489a1b227e81945f"; + "fb2ae81dbeaacb0c630e51e9d772c6919fa220cf"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From 5e28f6105128e08c2dce8d94f84aff62a6060ee8 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 16:03:40 +0900 Subject: [PATCH 226/228] fix(trust): bind OIDC source to audited central head --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index 3965dca39..d1f2e4077 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "efb8926923de45245338159a489a1b227e81945f" +ALLOWED_WORKFLOW_SHA = "fb2ae81dbeaacb0c630e51e9d772c6919fa220cf" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300" From beb196bf5c1500b5a49d949553c01091c0a93a52 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 17:05:02 +0900 Subject: [PATCH 227/228] test(trust): require current central workflow source --- test/trusted-workflow-source-rollforward.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/trusted-workflow-source-rollforward.test.ts b/test/trusted-workflow-source-rollforward.test.ts index e96661882..0ea1b83ae 100644 --- a/test/trusted-workflow-source-rollforward.test.ts +++ b/test/trusted-workflow-source-rollforward.test.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; const auditedCentralWorkflowSha = - "fb2ae81dbeaacb0c630e51e9d772c6919fa220cf"; + "43024633eba9d96b0456970391360da5a171fbda"; describe("trusted central workflow source revision", () => { it("binds the deployed OIDC trust configuration to the audited central source commit", () => { From ec5b105161ec1f3a9241c3098eae7986542aabb2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 17:05:14 +0900 Subject: [PATCH 228/228] fix(trust): rebind audited central workflow source --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index d1f2e4077..53cc4d1cd 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -24,7 +24,7 @@ ALLOWED_AUDIENCE = "cwl-noema-review" ALLOWED_REPOSITORY_OWNER = "ContextualWisdomLab" ALLOWED_WORKFLOW_REPOSITORY = "ContextualWisdomLab/.github" ALLOWED_WORKFLOW_REF_PREFIX = "ContextualWisdomLab/.github/.github/workflows/noema-review.yml@refs/heads/main" -ALLOWED_WORKFLOW_SHA = "fb2ae81dbeaacb0c630e51e9d772c6919fa220cf" +ALLOWED_WORKFLOW_SHA = "43024633eba9d96b0456970391360da5a171fbda" GITHUB_API_BASE = "https://api.github.com" NOEMA_RATE_LIMIT_PER_MINUTE = "60" NOEMA_OIDC_JWKS_CACHE_TTL_SECONDS = "300"