Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
d69a67e
test: define T4 API v1 client conformance
Jul 21, 2026
6058f1c
feat: define T4 API v1 contract and SDK boundary
Jul 21, 2026
329ac18
ci: emit T4 API generation artifacts
Jul 21, 2026
b50b7d9
build: recover T4 API generation lockfile
Jul 21, 2026
8a7e8cc
fix: use OpenAPI parser named API
Jul 21, 2026
e549d60
feat: add generated T4 API v1 types
Jul 21, 2026
6cd0e12
fix: typecheck T4 API conformance fixtures
Jul 21, 2026
bcca1cb
test: expose T4 API semantic blockers
Jul 21, 2026
797717c
fix: enforce T4 API public contract semantics
Jul 21, 2026
65a8524
build: accept authorized T4 API schema artifact
Jul 21, 2026
93f50e5
test: complete bounded API conformance cases
Jul 21, 2026
033e64d
test: expose remaining API runtime blockers
Jul 21, 2026
788516d
fix: fail closed across public API payloads
Jul 21, 2026
b0a7445
build: accept revised T4 API schema artifact
Jul 21, 2026
4a21fce
fix: select bounded conformance frames
Jul 21, 2026
cdbf49d
test: assert bounded consecutive watch retries
Jul 21, 2026
bf6a356
test: cover OP03 fail-closed review contracts
Jul 21, 2026
dfba497
fix: close OP03 fail-closed review gaps
Jul 21, 2026
77c9380
build: accept authorized OP03 schema artifact
Jul 21, 2026
9209caf
fix: enforce exact watch response contract
Jul 21, 2026
ecc29a0
fix: close watch retry and body ownership gaps
Jul 21, 2026
fb42ef8
test: prove watch media and stream cleanup
Jul 21, 2026
ed2c7f7
test: align terminal watch protocol assertions
Jul 21, 2026
7673616
test: cover Unicode bounds and SSE cancellation
Jul 21, 2026
578e3c4
fix: validate response lengths by code point
Jul 21, 2026
b555a13
test: cover strict response protocol gaps
Jul 21, 2026
ac59504
fix: enforce declared response protocol
Jul 21, 2026
afb136c
test: reject invalid mutations before idempotency
Jul 21, 2026
3a056c7
fix: close strict API contract gaps
Jul 21, 2026
2b1433f
test: type omitted command metadata
Jul 21, 2026
94e74df
fix: preserve optional generated defaults
Jul 21, 2026
b541ed5
chore: accept authorized API schema artifact
Jul 21, 2026
ca908f9
fix: require API generation in release gate
Jul 21, 2026
1577e8b
test: cover final strict conformance gaps
Jul 21, 2026
d31442e
fix: validate create and watch contracts
Jul 21, 2026
ff25fda
test: cover final header and precondition parity
Jul 21, 2026
e0f3972
fix: align required response headers
Jul 21, 2026
a0c3a08
chore: accept required-header schema artifact
Jul 21, 2026
d71383f
test(t4-api): cover final strict response gaps
Jul 22, 2026
deff712
fix(t4-api): close strict response gaps
Jul 22, 2026
6ca35ab
test(t4-api): isolate watch query validation
Jul 22, 2026
643de6e
test(t4-api): pin leap dates and RFC850 pivot
Jul 22, 2026
451b327
fix(t4-api): validate announced leap seconds
Jul 22, 2026
8423958
test(t4-api): require declared request media
Jul 22, 2026
01a49d6
fix(t4-api): enforce JSON request media
Jul 22, 2026
681f6db
test(t4-api): sanitize media fixture keys
Jul 22, 2026
2df2da4
test(t4-api): bound resync session ids
Jul 22, 2026
319ccf1
fix(t4-api): bound resync session ids
Jul 22, 2026
32aab1e
test(t4-api): require truthful mutation contracts
Jul 22, 2026
b115a3f
feat(t4-api): expose truthful mutation contracts
Jul 22, 2026
d430685
chore: accept truthful API schema artifact
Jul 22, 2026
1f574dc
test(t4-api): use fixture auth proof
Jul 22, 2026
409882b
test(t4-api): reject malformed page cursors
Jul 22, 2026
e15eb7c
test(t4-api): reject silent version downgrade
Jul 22, 2026
3fa3bf3
fix(t4-api): reject invalid cursors and downgrades
Jul 22, 2026
ad46ce7
test(t4-api): require issued page cursors
Jul 22, 2026
c4e2336
fix(t4-api): bind issued page cursors
Jul 22, 2026
907b5aa
fix(t4-api): issue unique opaque page cursors
Jul 22, 2026
97fe26f
test(t4-api): reject stale issued cursors
Jul 22, 2026
3e5295a
fix(t4-api): sign scoped page cursors
Jul 22, 2026
5ae50a0
test(t4-api): reject noncanonical cursor signatures
Jul 22, 2026
9cd5494
fix(t4-api): require canonical cursor signatures
Jul 22, 2026
00c27f3
test(t4-api): cover every cursor signature alias
Jul 22, 2026
da2f32d
test(t4-api): reject every cursor signature alias
Jul 22, 2026
5c8ae41
test(t4-api): avoid needless alias allocation
Jul 22, 2026
4859cac
test(t4-api): reject oversized snapshots and duplicate cursors
Jul 22, 2026
9ce270c
fix(t4-api): align snapshot and watch cursor bounds
Jul 22, 2026
1e22cdd
test(t4-api): cover snapshot boundary and heartbeat cursors
Jul 22, 2026
b9163ce
fix(t4-api): preserve heartbeat cursor semantics
Jul 22, 2026
0768883
test(t4-api): model heartbeat cursor liveness
Jul 22, 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
44 changes: 43 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,46 @@ jobs:
[[ "$HEAD_SHA" =~ ^[0-9a-f]{40}$ ]]
git diff --name-only -z "$BASE_SHA...$HEAD_SHA" | node scripts/ci-paths.mjs >> "$GITHUB_OUTPUT"

t4-api-generation:
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- name: Check out exact source
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}

- name: Install pinned pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
with:
version: 11.10.0

- name: Install pinned Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 24.13.1

- name: Install dependencies from the committed lockfile
run: pnpm install --frozen-lockfile

- name: Validate OpenAPI and deterministic generation
run: |
pnpm --filter @t4-code/t4-api-contract validate
pnpm --filter @t4-code/t4-api-contract generate:ci
pnpm --filter @t4-code/t4-api-contract check:generated
pnpm --filter @t4-code/t4-api-client typecheck
pnpm --filter @t4-code/client typecheck
pnpm --filter @t4-code/client exec vp test run test/t4-api-v1-conformance.test.ts
- name: Upload deterministic T4 API client
if: ${{ always() }}
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: t4-api-generated-${{ github.run_id }}
path: artifacts/t4-api/generated/schema.ts
if-no-files-found: error



core:
runs-on: ubuntu-24.04
timeout-minutes: 25
Expand Down Expand Up @@ -521,14 +561,15 @@ jobs:
verify:
name: verify
if: ${{ always() }}
needs: [changes, core, legacy-bridge-continuity, official-omp-gate0, cluster, tooling, android-debug, flutter, flutter-android, flutter-apple]
needs: [changes, t4-api-generation, core, legacy-bridge-continuity, official-omp-gate0, cluster, tooling, android-debug, flutter, flutter-android, flutter-apple]
runs-on: ubuntu-24.04
timeout-minutes: 5
steps:
- name: Require every selected CI leg
shell: bash
env:
CHANGES_RESULT: ${{ needs.changes.result }}
T4_API_GENERATION_RESULT: ${{ needs.t4-api-generation.result }}
CORE_RESULT: ${{ needs.core.result }}
CONTINUITY_RESULT: ${{ needs.legacy-bridge-continuity.result }}
OFFICIAL_OMP_GATE0_RESULT: ${{ needs.official-omp-gate0.result }}
Expand All @@ -541,6 +582,7 @@ jobs:
run: |
set -euo pipefail
test "$CHANGES_RESULT" = success
test "$T4_API_GENERATION_RESULT" = success
test "$CORE_RESULT" = success
for result in \
"$CONTINUITY_RESULT" \
Expand Down
28 changes: 27 additions & 1 deletion .woodpecker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,32 @@ steps:
memory: 2Gi
ephemeral-storage: 4Gi

t4-api-contract:
depends_on: [dependencies]
image: mirror.gcr.io/library/node:24.13.1-bookworm@sha256:00e9195ebd49985a6da8921f419978d85dfe354589755192dc090425ce4da2f7
commands:
- corepack enable
- pnpm --filter @t4-code/t4-api-contract validate
- pnpm --filter @t4-code/t4-api-contract generate:ci
- test -f artifacts/t4-api/generated/schema.ts
- echo "T4_API_GENERATED_ARTIFACT=artifacts/t4-api/generated/schema.ts"
- pnpm --filter @t4-code/t4-api-contract check:generated
- pnpm --filter @t4-code/t4-api-client typecheck
- pnpm --filter @t4-code/client typecheck
- pnpm --filter @t4-code/client exec vp test run test/t4-api-v1-conformance.test.ts
backend_options:
kubernetes:
serviceAccountName: woodpecker-ci-untrusted
resources:
requests:
cpu: "0"
memory: 256Mi
ephemeral-storage: 256Mi
limits:
cpu: "1"
memory: 2Gi
ephemeral-storage: 2Gi

bun-runtime:
depends_on: [dependencies]
image: mirror.gcr.io/oven/bun:1.3.14@sha256:e10577f0db68676a7024391c6e5cb4b879ebd17188ab750cf10024a6d700e5c4
Expand All @@ -50,7 +76,7 @@ steps:
ephemeral-storage: 256Mi

upstream-core:
depends_on: [cluster-ci-contracts, bun-runtime]
depends_on: [cluster-ci-contracts, t4-api-contract, bun-runtime]
image: mirror.gcr.io/library/node:24.13.1-bookworm@sha256:00e9195ebd49985a6da8921f419978d85dfe354589755192dc090425ce4da2f7
commands:
- export PATH="$PWD/.ci:$PATH"
Expand Down
1 change: 1 addition & 0 deletions packages/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"devDependencies": {
"@t4-code/fixture-server": "workspace:*",
"@t4-code/host-wire": "workspace:*",
"@t4-code/t4-api-client": "workspace:*",
"@types/node": "catalog:",
"@types/ws": "8.5.13",
"vite-plus": "catalog:",
Expand Down
Loading
Loading