Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
6b89cf4
docs(docs): record the wave 3 steps 1-8 merge
cemililik Oct 19, 2026
c64f3c3
fix(llm): examine glued url schemes in the split-credential scan
cemililik Oct 19, 2026
f597977
test(cli): pin the native close join on every publication branch
cemililik Oct 19, 2026
ebbec1c
test(cli): harden the owner-join table and drop an ineffective wait b…
cemililik Oct 19, 2026
fcfe79b
docs(llm): correct overclaiming comments in the url scrub rule
cemililik Oct 19, 2026
7913b7b
docs(llm): correct three comments after the third review round
cemililik Oct 19, 2026
9902e0a
docs(docs): record the post-merge review of a3e164b5
cemililik Oct 19, 2026
38e10d4
docs(docs): record the wave 3 steps 9-19 preflight rulings
cemililik Oct 19, 2026
dda3b45
fix(llm): close the PR #95 scrubber residuals
cemililik Oct 19, 2026
ef3ded0
fix(llm): address the first PR95 review round
cemililik Oct 19, 2026
bdd292a
fix(llm): address the second PR95 review round
cemililik Oct 19, 2026
6fb7e9d
fix(llm): merge the masked ranges of the scrubber rules
cemililik Oct 20, 2026
b2c50e8
fix(llm): address the fourth PR95 review round
cemililik Oct 20, 2026
6b2e94d
fix(core): address the fifth PR95 review round
cemililik Oct 20, 2026
b89ac62
fix(core): address the sixth PR95 review round
cemililik Oct 20, 2026
082962e
fix(core): address the seventh PR95 review round
cemililik Oct 20, 2026
6f7dd34
fix(core): address the eighth PR95 review round
cemililik Oct 21, 2026
59c6449
fix(core): address the ninth PR95 review round
cemililik Oct 21, 2026
9eb3815
fix(core): close the PR95 increment after its tenth review round
cemililik Oct 21, 2026
2a1f735
test(core): split the round-9 linear-views case for the coverage job
cemililik Oct 22, 2026
4c3cafe
ci(repo): shard the filesystem causal controls under the evidence bound
cemililik Oct 22, 2026
a72c7ec
feat(repo): build and finalize the CLI release candidate (Step 9a.1)
cemililik Oct 22, 2026
8ddb7ec
fix(repo): address the first Step 9a.1 review round
cemililik Oct 22, 2026
184562b
fix(repo): address the second Step 9a.1 review round
cemililik Oct 22, 2026
aa5c994
fix(repo): address the third Step 9a.1 review round
cemililik Oct 22, 2026
d51a243
fix(repo): address the fourth Step 9a.1 review round
cemililik Oct 22, 2026
3c6c5dc
fix(repo): address the fifth Step 9a.1 review round
cemililik Oct 22, 2026
0e59f5f
fix(repo): address the sixth Step 9a.1 review round
cemililik Oct 22, 2026
c691ef9
fix(repo): address the seventh Step 9a.1 review round
cemililik Oct 22, 2026
08f296c
fix(repo): address the eighth Step 9a.1 review round
cemililik Oct 22, 2026
954d6a6
fix(repo): address the ninth Step 9a.1 review round
cemililik Oct 22, 2026
d890abf
fix(repo): address the tenth Step 9a.1 review round
cemililik Oct 22, 2026
7862396
fix(repo): address the eleventh Step 9a.1 review round
cemililik Oct 23, 2026
1f24777
fix(repo): address the twelfth Step 9a.1 review round
cemililik Oct 23, 2026
cf97b7f
fix(repo): close the Step 9a.1 internal rigor pass
cemililik Oct 24, 2026
b057958
docs(repo): record the Step 9a.1 acceptance
cemililik Oct 24, 2026
6277e37
docs(repo): record the Step 9a.2 split and preflight decisions
cemililik Oct 24, 2026
1ab4c13
feat(repo): seal the private map manifest and symbolicate packed frames
cemililik Oct 24, 2026
fd6cd1c
fix(repo): close the Step 9a.2a internal rigor pass
cemililik Oct 24, 2026
990a5d1
fix(repo): confine the symbolication run's module resolution
cemililik Oct 24, 2026
a92a760
fix(repo): refuse a producer Node without module.registerHooks
cemililik Oct 24, 2026
f65999a
docs(repo): record the Step 9a.2a acceptance
cemililik Oct 24, 2026
436d7c6
docs(repo): record the Step 9a.2b preflight decisions
cemililik Oct 24, 2026
a45f814
feat(repo): refuse a re-seal and a changed dist before the receipt
cemililik Oct 24, 2026
6d98133
feat(repo): run the product map controls on one real production
cemililik Oct 24, 2026
5e914cc
ci(repo): require the product map controls before ci
cemililik Oct 24, 2026
c3a41a7
feat(repo): flip the package-test receipt to package_test
cemililik Oct 24, 2026
77ee5d0
docs(repo): record the Step 9a.2b implementation
cemililik Oct 24, 2026
9f8b089
docs(repo): record 9a.2a's push CI and the native-identity increment
cemililik Oct 24, 2026
3e6ae33
fix(repo): close the Step 9a.2b internal rigor pass
cemililik Oct 24, 2026
0f73c25
fix(repo): address the first Step 9a.2b review round
cemililik Oct 24, 2026
10993bb
docs(repo): record the Step 9a.2b acceptance
cemililik Oct 24, 2026
451223f
docs(repo): record the NI preflight decisions
cemililik Oct 24, 2026
477e11d
fix(cli): pin filesystem roots and admit catalog opens by exact nativ…
cemililik Oct 24, 2026
2dc469d
test(cli): probe Windows identity collisions and repeat the replaceme…
cemililik Oct 24, 2026
ed690d0
fix(db): read and compare media-store identities as exact bigints
cemililik Oct 24, 2026
fda99a8
fix(repo): compare tooling identities as exact bigints
cemililik Oct 24, 2026
7d628fa
test(repo): add native-identity precision causal controls
cemililik Oct 24, 2026
209e719
docs(repo): record the NI implementation
cemililik Oct 24, 2026
6c943db
fix(repo): close the NI internal rigor pass
cemililik Oct 25, 2026
fc5af70
docs(repo): record 9a.2b's push CI
cemililik Oct 25, 2026
c8c0d41
docs(repo): record the NI acceptance
cemililik Oct 25, 2026
12883df
docs(repo): record the Step 9b preflight decisions
cemililik Oct 25, 2026
4aeee3e
refactor(repo): extract the strict USTAR dialect into one reader and …
cemililik Oct 25, 2026
27e8e99
feat(repo): build the private custody container from the sealed staging
cemililik Oct 25, 2026
f3f5b32
feat(repo): add the isolated GnuPG runner for recipient custody
cemililik Oct 25, 2026
e0d39a4
test(repo): commit the synthetic custody fixtures
cemililik Oct 25, 2026
85a9aeb
feat(repo): encrypt a private container once to one pinned recipient
cemililik Oct 25, 2026
0bd1953
docs(repo): record the Step 9b.1 implementation
cemililik Oct 25, 2026
45bc565
fix(repo): close the Step 9b.1 mutation sweep
cemililik Oct 25, 2026
f0555a6
fix(repo): close the Step 9b.1 internal rigor pass
cemililik Oct 25, 2026
dea32ea
fix(repo): address the first Step 9b.1 review round
cemililik Oct 25, 2026
ade62b7
fix(repo): address the second Step 9b.1 review round
cemililik Oct 25, 2026
b3eaeba
docs(repo): record the Step 9b.1 round 2 evidence
cemililik Oct 25, 2026
147c278
fix(repo): address the third Step 9b.1 review round
cemililik Oct 25, 2026
56ccae6
docs(repo): record the Step 9b.1 acceptance
cemililik Oct 25, 2026
819f8cb
docs(repo): record the Step 9b.2 preflight decisions
cemililik Oct 25, 2026
84b8e45
feat(repo): add the absent production recipient loader and release scope
cemililik Oct 25, 2026
cbf6ea4
feat(repo): add the release binding receipt v1, its validator and ver…
cemililik Oct 25, 2026
4d1a189
feat(repo): gate encryption by scope and seal the binding receipt aft…
cemililik Oct 25, 2026
4d49176
test(repo): pin release scope separation, the reuse closure and the i…
cemililik Oct 25, 2026
d94ed70
docs(repo): record the Step 9b.2 implementation
cemililik Oct 25, 2026
91d08a6
fix(repo): close the Step 9b.2 internal rigor pass
cemililik Oct 25, 2026
5cda645
fix(repo): address the first Step 9b.2 review round
cemililik Oct 25, 2026
463a047
fix(repo): address the second Step 9b.2 review round
cemililik Oct 26, 2026
563402e
fix(repo): address the third Step 9b.2 review round
cemililik Oct 26, 2026
5a328bc
docs(repo): record the Step 9b.2 acceptance
cemililik Oct 26, 2026
64fb877
docs(repo): reset the roadmap priority to the CLI MVP
cemililik Nov 4, 2026
0826f30
fix(core): mask credential flags and URL passwords, bound omitted media
cemililik Nov 4, 2026
b4ef937
fix(cli): mask secret shapes in the run failure summary
cemililik Nov 4, 2026
8445a70
chore(cli): typecheck the build configuration
cemililik Nov 4, 2026
e8121aa
fix(repo): clear the release tooling's review and Sonar findings
cemililik Nov 4, 2026
002ff6d
ci(repo): require the Windows job, scope the npm token, report skippe…
cemililik Nov 4, 2026
964994c
docs(repo): restore current.md's dropped records and settle the revie…
cemililik Nov 4, 2026
eb2cce4
docs(repo): add the publish-credential prerequisite to MVP-A23
cemililik Nov 4, 2026
062564f
refactor(core): keep the review fixes inside the complexity bound
cemililik Nov 4, 2026
f25fb83
refactor(core): pass the media byte counter unconditionally
cemililik Nov 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude/skills/commit-and-pr/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ Turn finished work into a clean, auditable commit history and a reviewable PR. R

## Workflow
1. **Gate first.** Run ../standards-check/SKILL.md and `pnpm turbo run lint typecheck test`. Do not commit red.
2. **Branch if on the default branch.** Never commit straight to `main`.
2. **Commit on `development`, never straight to `main`.** Work reaches `main` through a PR from `development`; create no other branch unless the maintainer asks (the [Git workflow](../../../AGENTS.md#git-workflow) in AGENTS.md is the canonical rule).
```bash
git rev-parse --abbrev-ref HEAD
# if main: git switch -c feat/<scope>-<short-topic>
# if main: git switch development
```
3. **One scope per commit.** Stage only one package's changes. A change spanning packages is usually two commits; if genuinely atomic, pick the primary scope and name the rest in the body. Do not bundle generated/formatting churn with logic.
4. **Write the message** in Conventional Commits form. Summary is imperative, lower-case, no trailing period, ≤ ~72 chars. Body (expected for anything non-obvious) explains the *why*, not a restatement of the diff. Reference the ADR in a trailer; end with the required co-author trailer.
Expand Down
113 changes: 84 additions & 29 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
# Runs lint + typecheck + test across every workspace in dependency order with the
# Turborepo cache, plus the formatting check and the no-vendor-type-across-the-seam fence.
#
# Branch protection (set in the GitHub repo settings, not here): `ci` and `coverage` are the REQUIRED
# status checks to merge into `main`. Wire, usage, filesystem, secrets and packed CLI jobs feed `ci` through an explicit
# success-only aggregation; they cannot silently skip or fail while `ci` stays green. The other jobs
# self-label `(advisory)` — `floor-check`, `peer-dep-gate` and `windows-concurrency`.
# Branch protection (set in the GitHub repo settings, not here): `ci`, `coverage` and `windows-concurrency`
# are the REQUIRED status checks to merge into `main` (the Windows job since 2026-11-04: ADR-0106's
# acceptance names required CI for the platform-scoped claims it carries). Wire, usage, filesystem, secrets,
# packed CLI and product map control jobs feed `ci` through an explicit success-only aggregation; they cannot
# silently skip or fail while `ci` stays green. The other jobs self-label `(advisory)` — `floor-check` and
# `peer-dep-gate`.
#
# `coverage` enforces the testing.md >=90% line+branch floor for `@relavium/llm` and `@relavium/mcp` only.
# `packages/core` is measured and printed by the same run but does not fail it: its branch margin is +0.83
Expand Down Expand Up @@ -57,7 +59,8 @@ env:

jobs:
ci:
needs: [wire-mutations, usage-mutations, fs-mutations, secrets-mutations, packed-cli]
needs:
[wire-mutations, usage-mutations, fs-mutations, secrets-mutations, packed-cli, map-controls]
if: ${{ always() }}
name: lint · typecheck · test
runs-on: ubuntu-latest
Expand Down Expand Up @@ -102,17 +105,20 @@ jobs:
PACKED_CLI_RESULT: ${{ needs.packed-cli.result }}
run: node -e "require('node:assert/strict').equal(process.env.PACKED_CLI_RESULT, 'success')"

- name: Require complete product map controls
env:
MAP_CONTROLS_RESULT: ${{ needs.map-controls.result }}
run: node -e "require('node:assert/strict').equal(process.env.MAP_CONTROLS_RESULT, 'success')"

# A squash/main-based checkout need not contain development's immutable predecessor object.
# Fetch only this canonical pin during CI setup; the acceptance harness itself stays offline.
- name: Ensure immutable replay predecessor is available
shell: bash
run: |
BASELINE=$(node --input-type=module -e "import { baselineCommit } from './tools/budget-replay-compat/baseline-provenance.mjs'; process.stdout.write(baselineCommit)")
if ! git --no-replace-objects cat-file -e "$BASELINE^{commit}"; then
if ! git fetch --no-tags origin "$BASELINE"; then
echo "::error::Immutable replay predecessor $BASELINE is unavailable from origin; restore that exact object before running the offline gate."
exit 1
fi
if ! git --no-replace-objects cat-file -e "$BASELINE^{commit}" && ! git fetch --no-tags origin "$BASELINE"; then
echo "::error::Immutable replay predecessor $BASELINE is unavailable from origin; restore that exact object before running the offline gate."
exit 1
fi
git --no-replace-objects cat-file -e "$BASELINE^{commit}"

Expand Down Expand Up @@ -245,13 +251,21 @@ jobs:
# Offline, uncached semantic removal/restoration evidence. Required indirectly through ci.needs.
# ADR-0105 isolated, current-source removal/restoration evidence, required through ci.needs.
fs-mutations:
name: Wave 2 filesystem causal controls
name: Wave 2 filesystem causal controls (shard ${{ matrix.shard }} of 2)
# ADR-0106/0109 extend the original 26 controls with complete media/lifetime workloads.
# The 20-minute job historically reached only 46 of 93 controls; the later budget covered 99.
# The current cohort is 110 controls (2026-10-15); this comment does not certify its execution.
# The current cohort is 115 controls (2026-10-25); this comment does not certify its execution.
# Per-phase 90-second/test 15-second deadlines and output/evidence ceilings remain unchanged.
# Every phase retains a manifest of the whole source graph (about 200 KB each), so the 330 phase
# manifests of one export passed the unchanged 64-MiB retained-evidence bound once Wave 3's PR95
# increment grew that graph (2026-10-22). As for the secrets controls, two legs each run and
# export a disjoint round-robin half (`--shard k/2`) under the unchanged bounds.
timeout-minutes: 60
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
shard: [1, 2]
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
Expand All @@ -268,23 +282,32 @@ jobs:
- name: Run filesystem removal and restoration controls
env:
RELAVIUM_ACCEPTANCE_EVIDENCE: ${{ runner.temp }}/wave2-acceptance
run: pnpm check:fs-mutations
run: pnpm check:fs-mutations --shard ${{ matrix.shard }}/2
- name: Retain bounded filesystem control metadata
if: ${{ always() }}
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: wave2-filesystem-${{ github.run_id }}-${{ github.run_attempt }}
name: wave2-filesystem-${{ matrix.shard }}-of-2-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/wave2-acceptance/filesystem
if-no-files-found: warn
retention-days: 7

secrets-mutations:
name: Wave 2 secrets causal controls
name: Wave 2 secrets causal controls (shard ${{ matrix.shard }} of 2)
# The historical 35-control, three-phase capture exceeded the former aggregate budget.
# The current cohort is 57 controls (2026-10-18); this comment does not certify its execution.
# Per-phase, case/hook, output and retained-evidence bounds remain unchanged.
timeout-minutes: 30
# Wave 3's PR95 increment grows the cohort to 130 controls (2026-10-21): each scrubber
# control runs its eight-MiB-heavy file in three phases (about 24 s locally). One export
# of the whole cohort no longer fits the unchanged 64-MiB retained-evidence bound, so two
# legs each run and export a disjoint round-robin half (`--shard k/2`) under the
# unchanged per-phase, case/hook, output, 2,000-file and 64-MiB bounds. A leg took up to 48 minutes
# by 2026-11-04 (runner variance, not imbalance), so its allowance is 75 minutes rather than the
# filesystem job's 60. This comment does not certify execution.
timeout-minutes: 75
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
shard: [1, 2]
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
Expand All @@ -301,12 +324,12 @@ jobs:
- name: Run secrets removal and restoration controls
env:
RELAVIUM_ACCEPTANCE_EVIDENCE: ${{ runner.temp }}/wave2-acceptance
run: pnpm check:secrets-mutations
run: pnpm check:secrets-mutations --shard ${{ matrix.shard }}/2
- name: Retain bounded secrets control metadata
if: ${{ always() }}
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: wave2-secrets-${{ github.run_id }}-${{ github.run_attempt }}
name: wave2-secrets-${{ matrix.shard }}-of-2-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/wave2-acceptance/secrets
if-no-files-found: warn
retention-days: 7
Expand Down Expand Up @@ -365,11 +388,9 @@ jobs:
shell: bash
run: |
BASELINE=$(node --input-type=module -e "import { baselineCommit } from './tools/budget-replay-compat/baseline-provenance.mjs'; process.stdout.write(baselineCommit)")
if ! git --no-replace-objects cat-file -e "$BASELINE^{commit}"; then
if ! git fetch --no-tags origin "$BASELINE"; then
echo "::error::Immutable replay predecessor $BASELINE is unavailable from origin; restore that exact object before running the offline gate."
exit 1
fi
if ! git --no-replace-objects cat-file -e "$BASELINE^{commit}" && ! git fetch --no-tags origin "$BASELINE"; then
echo "::error::Immutable replay predecessor $BASELINE is unavailable from origin; restore that exact object before running the offline gate."
exit 1
fi
git --no-replace-objects cat-file -e "$BASELINE^{commit}"

Expand Down Expand Up @@ -472,8 +493,9 @@ jobs:
runs-on: ubuntu-latest
# One file worker isolates unchanged admitted-size case budgets from instrumentation
# contention. A measured 1,481-second complete run plus setup exhausted 25 minutes;
# reserve finite whole-suite headroom without changing case bounds or coverage thresholds.
timeout-minutes: 30
# reserve finite whole-suite headroom without changing case bounds or coverage thresholds. By
# 2026-11-04 the job took 15-27 minutes, up to 91% of the former 30, so the allowance is 45.
timeout-minutes: 45
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
Expand Down Expand Up @@ -520,7 +542,7 @@ jobs:
# perm assertions are NOT exercised here (a documented Windows no-op — ADR-0050); nor is ink's raw-mode code,
# which is TTY-gated (the driver-selection gate picks the plain driver without a TTY — see the smoke below).
windows-concurrency:
name: windows · db concurrency + filesystem + headless smoke (advisory)
name: windows · db concurrency + filesystem + headless smoke
runs-on: windows-latest
timeout-minutes: 25
steps:
Expand Down Expand Up @@ -619,7 +641,11 @@ jobs:
node-version-file: .nvmrc
- name: Install (frozen lockfile)
run: pnpm install --frozen-lockfile
# The runner builds inlined dependencies fresh, then prepack performs the sole final CLI build.
# The runner builds inlined dependencies fresh in an owned candidate tree, then prepack performs the sole
# final CLI build, where original-TS maps are built, validated, staged privately and discarded (Wave 3
# Step 9a.1); the seal then writes the private manifest and symbolicates actual packed frames, both
# discarded too (Step 9a.2a); only the tarball and its package_test receipt leave this job. The mode is a
# claim: the map-controls job below runs the negative controls, and `ci` requires its success (Step 9a.2b).
- name: Pack once and independently inspect the public package
env:
RELAVIUM_PACKAGE_SOURCE_SHA: ${{ github.sha }}
Expand All @@ -634,6 +660,35 @@ jobs:
retention-days: 7
if-no-files-found: error

# Product map controls (Wave 3 Step 9a.2b): a second, independent real production at this commit whose
# every named corruption must refuse with its exact code; its private maps, manifests and copies stay in
# the producer's owner-only root and are removed with it. Uncached, and nothing is uploaded.
map-controls:
name: product map controls
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: read
env:
TURBO_TOKEN: ''
TURBO_TEAM: ''
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
persist-credentials: false
- name: Set up pnpm
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0
- name: Set up Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: .nvmrc
- name: Install (frozen lockfile)
run: pnpm install --frozen-lockfile
- name: Corrupt product copies and require each exact refusal
env:
RELAVIUM_PACKAGE_SOURCE_SHA: ${{ github.sha }}
run: pnpm check:map-controls

packed-cli-consumer:
name: installed CLI (${{ matrix.id }})
needs: pack-cli
Expand Down
27 changes: 27 additions & 0 deletions .github/workflows/models-catalog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,33 @@ jobs:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
# One configured key keeps the run from being a false green, but each missing key still skips its
# provider's lane while the job stays green (a PR #96 review: only DEEPSEEK_API_KEY was configured).
# Name every lane as live or skipped, as a warning and in the job summary, until all four keys exist
# (decision D37) and a missing one can fail the run instead. Only emptiness is tested; no value prints.
- name: Report which provider lanes run live
shell: bash
run: |
{
echo '### Live effort conformance lanes'
echo ''
echo '| Provider | Lane |'
echo '|---|---|'
} >> "$GITHUB_STEP_SUMMARY"
for provider in ANTHROPIC OPENAI GEMINI DEEPSEEK; do
variable="${provider}_API_KEY"
if [ -n "${!variable}" ]; then
echo "| ${provider} | live |" >> "$GITHUB_STEP_SUMMARY"
else
echo "::warning::${variable} is not configured; the ${provider} live effort probes are skipped, not verified."
echo "| ${provider} | skipped: no key |" >> "$GITHUB_STEP_SUMMARY"
fi
done
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
# The conformance suite (fixtures + the `it.skipIf(<key> === '')` live cases). With the provider keys set here
# the live cases execute — and a catalog that claims a tier a model rejects fails red — while a missing key
# simply skips that provider's lane. Scoped to `src/conformance` so a flaky live case cannot widen the red
Expand Down
Loading
Loading