Repository navigation
feat: add Contextivity ACP and permanent nightly distribution #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
afef6c2
f5f416d
1848249
61c1454
9802e38
9ea05a1
2bc047d
d582048
039052b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,251 @@ | ||||||||||||||||||
| name: Contextivity candidate | ||||||||||||||||||
|
|
||||||||||||||||||
| on: | ||||||||||||||||||
| schedule: | ||||||||||||||||||
| - cron: "15 */3 * * *" | ||||||||||||||||||
| workflow_dispatch: | ||||||||||||||||||
| inputs: | ||||||||||||||||||
| tag: | ||||||||||||||||||
| description: Exact official pingdotgg/t3code nightly tag (vX.Y.Z-nightly.YYYYMMDD.N) | ||||||||||||||||||
| required: false | ||||||||||||||||||
| type: string | ||||||||||||||||||
|
|
||||||||||||||||||
| permissions: | ||||||||||||||||||
| contents: write | ||||||||||||||||||
| issues: write | ||||||||||||||||||
| id-token: write | ||||||||||||||||||
| attestations: write | ||||||||||||||||||
| actions: read | ||||||||||||||||||
|
|
||||||||||||||||||
| concurrency: | ||||||||||||||||||
| group: contextivity-candidate | ||||||||||||||||||
| cancel-in-progress: false | ||||||||||||||||||
|
|
||||||||||||||||||
| jobs: | ||||||||||||||||||
| sync: | ||||||||||||||||||
| name: Sync exact upstream nightly | ||||||||||||||||||
| runs-on: ubuntu-24.04 | ||||||||||||||||||
| timeout-minutes: 20 | ||||||||||||||||||
| outputs: | ||||||||||||||||||
| tag: ${{ steps.sync.outputs.tag }} | ||||||||||||||||||
| sha: ${{ steps.sync.outputs.sha }} | ||||||||||||||||||
| upstream_commit: ${{ steps.sync.outputs.upstream_commit }} | ||||||||||||||||||
| steps: | ||||||||||||||||||
| - name: Checkout downstream | ||||||||||||||||||
| uses: actions/checkout@v6 | ||||||||||||||||||
| with: | ||||||||||||||||||
| fetch-depth: 0 | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Setup Node | ||||||||||||||||||
| uses: actions/setup-node@v5 | ||||||||||||||||||
| with: | ||||||||||||||||||
| node-version-file: package.json | ||||||||||||||||||
|
|
||||||||||||||||||
| - id: discover | ||||||||||||||||||
| name: Discover official upstream nightly | ||||||||||||||||||
| env: | ||||||||||||||||||
| INPUT_TAG: ${{ github.event.inputs.tag }} | ||||||||||||||||||
| run: | | ||||||||||||||||||
| set -eu | ||||||||||||||||||
| if test -n "${INPUT_TAG:-}"; then | ||||||||||||||||||
| echo "tag=$INPUT_TAG" >> "$GITHUB_OUTPUT" | ||||||||||||||||||
| else | ||||||||||||||||||
| node --experimental-strip-types contextivity/src/cli.ts discover-upstream > "$RUNNER_TEMP/upstream.json" | ||||||||||||||||||
| node -e 'const fs=require("fs"); const n=JSON.parse(fs.readFileSync(process.env.RUNNER_TEMP+"/upstream.json","utf8")); fs.appendFileSync(process.env.GITHUB_OUTPUT, "tag="+n.tag+"\n")' | ||||||||||||||||||
| fi | ||||||||||||||||||
|
|
||||||||||||||||||
| - id: sync | ||||||||||||||||||
| name: Merge exact upstream tag | ||||||||||||||||||
| run: | | ||||||||||||||||||
| set -eu | ||||||||||||||||||
| tag="${{ steps.discover.outputs.tag }}" | ||||||||||||||||||
| if ! node --experimental-strip-types contextivity/src/cli.ts sync-tag --tag "$tag" > "$RUNNER_TEMP/sync.json"; then | ||||||||||||||||||
| reason=$(node -e 'const fs=require("fs"); const s=JSON.parse(fs.readFileSync(process.env.RUNNER_TEMP+"/sync.json","utf8")); process.stdout.write(s.reason||"sync failed")') | ||||||||||||||||||
| node --experimental-strip-types contextivity/src/cli.ts report-sync-failure --tag "$tag" --reason "$reason" || true | ||||||||||||||||||
| exit 1 | ||||||||||||||||||
| fi | ||||||||||||||||||
| echo "tag=$tag" >> "$GITHUB_OUTPUT" | ||||||||||||||||||
| echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" | ||||||||||||||||||
| echo "upstream_commit=$(node -e 'const fs=require("fs"); const s=JSON.parse(fs.readFileSync(process.env.RUNNER_TEMP+"/sync.json","utf8")); process.stdout.write(s.upstreamCommit||"")')" >> "$GITHUB_OUTPUT" | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Downstream unit tests | ||||||||||||||||||
| run: node --test --experimental-strip-types contextivity/src/*.test.ts | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Persist synced commit | ||||||||||||||||||
| env: | ||||||||||||||||||
| GH_TOKEN: ${{ github.token }} | ||||||||||||||||||
| run: | | ||||||||||||||||||
| set -eu | ||||||||||||||||||
| sha=$(git rev-parse HEAD) | ||||||||||||||||||
| if git merge-base --is-ancestor "$sha" "origin/${GITHUB_REF_NAME}" 2>/dev/null; then | ||||||||||||||||||
| exit 0 | ||||||||||||||||||
| fi | ||||||||||||||||||
| git push origin "HEAD:refs/heads/contextivity-sync/${GITHUB_RUN_ID}" | ||||||||||||||||||
|
|
||||||||||||||||||
| verify: | ||||||||||||||||||
| name: ACP tests and server build | ||||||||||||||||||
| needs: sync | ||||||||||||||||||
| runs-on: ubuntu-24.04 | ||||||||||||||||||
| timeout-minutes: 30 | ||||||||||||||||||
| steps: | ||||||||||||||||||
| - name: Checkout synced SHA | ||||||||||||||||||
| uses: actions/checkout@v6 | ||||||||||||||||||
| with: | ||||||||||||||||||
| ref: ${{ needs.sync.outputs.sha }} | ||||||||||||||||||
| fetch-depth: 0 | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Setup Vite+ | ||||||||||||||||||
| uses: voidzero-dev/setup-vp@v1 | ||||||||||||||||||
| with: | ||||||||||||||||||
| node-version-file: package.json | ||||||||||||||||||
| cache: true | ||||||||||||||||||
| run-install: true | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Print candidate test plan | ||||||||||||||||||
| run: node --experimental-strip-types contextivity/src/cli.ts candidate-test-plan | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Generic ACP and sub-agent tests | ||||||||||||||||||
| run: | | ||||||||||||||||||
| vp test run \ | ||||||||||||||||||
| apps/server/src/provider/Layers/AcpRegistryAdapter.test.ts \ | ||||||||||||||||||
| apps/server/src/provider/Layers/AcpRegistryProvider.test.ts \ | ||||||||||||||||||
| apps/server/src/provider/acp/AcpAdapterSupport.test.ts \ | ||||||||||||||||||
| apps/server/src/provider/acp/AcpCoreRuntimeEvents.test.ts \ | ||||||||||||||||||
| apps/server/src/provider/acp/AcpRegistrySupport.test.ts \ | ||||||||||||||||||
| apps/server/src/provider/acp/AcpRuntimeModel.test.ts \ | ||||||||||||||||||
| apps/server/src/provider/acp/AcpSessionRuntime.policy.test.ts \ | ||||||||||||||||||
| apps/server/src/provider/acp/ContextivityAcpExtension.test.ts \ | ||||||||||||||||||
| apps/server/src/provider/acp/ContextivityAcpSubagentMapper.test.ts \ | ||||||||||||||||||
| packages/client-runtime/src/state/subagentRuntime.test.ts \ | ||||||||||||||||||
| apps/server/src/distribution/contextivityDistribution.test.ts \ | ||||||||||||||||||
| apps/server/src/cloud/selfUpdate.test.ts | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Server typecheck and build | ||||||||||||||||||
| run: | | ||||||||||||||||||
| vp run --filter t3 typecheck | ||||||||||||||||||
| vp run --filter t3 build | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Upload server dist | ||||||||||||||||||
| uses: actions/upload-artifact@v4 | ||||||||||||||||||
| with: | ||||||||||||||||||
| name: t3-server-dist | ||||||||||||||||||
| path: apps/server/dist | ||||||||||||||||||
| if-no-files-found: error | ||||||||||||||||||
|
|
||||||||||||||||||
| pack: | ||||||||||||||||||
| name: Pack ${{ matrix.platform }} | ||||||||||||||||||
| needs: [sync, verify] | ||||||||||||||||||
| strategy: | ||||||||||||||||||
| fail-fast: true | ||||||||||||||||||
| matrix: | ||||||||||||||||||
| include: | ||||||||||||||||||
| - os: ubuntu-24.04 | ||||||||||||||||||
| platform: linux-x64 | ||||||||||||||||||
| - os: ubuntu-24.04-arm | ||||||||||||||||||
| platform: linux-arm64 | ||||||||||||||||||
| - os: macos-13 | ||||||||||||||||||
| platform: darwin-x64 | ||||||||||||||||||
| - os: macos-14 | ||||||||||||||||||
| platform: darwin-arm64 | ||||||||||||||||||
|
Comment on lines
+146
to
+149
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🩺 Stability & Availability | 🔴 Critical | ⚡ Quick win 🧩 Analysis chain🌐 Web query:
💡 Result: The GitHub Actions macos-13 runner image was officially retired on December 4, 2025 [1][2]. Following this retirement, it is no longer supported for use in GitHub Actions workflows [3]. To address the removal of this image, GitHub introduced the macos-15-intel label as a replacement for users who require an x86_64 (Intel) environment on macOS [4]. Users who were previously using macos-13 are advised to migrate their workflows to macos-14, macos-15, or the macos-15-intel label depending on their architecture requirements [2][4]. Citations:
🏁 Script executed: #!/bin/bash
set -eu
printf '%s\n' '--- workflow context ---'
sed -n '1,180p' .github/workflows/contextivity-candidate.yml
printf '%s\n' '--- runner labels and matrix controls ---'
rg -n -C 3 'macos-|fail-fast|strategy:|matrix:|platform:' .github/workflows/contextivity-candidate.ymlRepository: Contextivity/t3code Length of output: 6888 🌐 Web query:
💡 Result: As of August 22, 2026, the status of GitHub Actions hosted runner labels for macOS is as follows: macOS 15: The macos-15-intel runner label is available and supported for x64 architecture [1][2]. This is designated as the final supported Intel-based image for GitHub Actions, with support scheduled until August 2027 [3][2]. macOS 26: The macos-26-intel runner label exists and is available for use [1][4]. It provides x64 architecture support [1]. macOS 14: These images are currently being phased out [5][6]. Deprecation began on July 6, 2026, and they will be fully unsupported by November 2, 2026 [5]. Users are encouraged to migrate workflows using macos-14, macos-14-large, or macos-14-xlarge to newer versions such as macos-latest (which now uses macOS 26), macos-15, or macos-26 [5][7]. Summary Table of Intel (x64) Support Runner Label | Status | Notes --- | --- | --- macos-15-intel | Supported | Last supported Intel image until August 2027 [3][2]. macos-26-intel | Available | Supported x64 architecture [1][4]. macos-14 | Deprecating | Unsupported after November 2, 2026 [5]. In general, macos-latest now refers to macOS 26 (Apple Silicon) [7]. Users requiring x86_64 environments must specifically use the designated Intel labels [4][2]. Citations:
🌐 Web query:
💡 Result: In GitHub Actions, the behavior of a matrix job when a runner label is unavailable or a job remains queued depends on whether the mismatch is considered an impossible configuration or a temporary resource shortage. If a job specifies a runner label (or label set) that does not exist or is never registered, GitHub immediately fails the job with an error indicating no runner matches the specified labels [1]. Because this is treated as an invalid configuration rather than a failure of a running job, the fail-fast setting does not typically apply to this specific "job start" error in the way it handles execution failures [1]. When runners are available but busy, jobs enter a "queued" or "pending" state [2]. If Citations:
Replace
🛠️ Proposed fix- - os: macos-13
+ - os: macos-15-intel
platform: darwin-x64📝 Committable suggestion
Suggested change
🧰 Tools🪛 actionlint (1.7.12)[error] 146-146: label "macos-13" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2025-vs2026", "windows-2022", "windows-11-arm", "ubuntu-slim", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "macos-latest", "macos-latest-xlarge", "macos-latest-large", "macos-26-intel", "macos-26-xlarge", "macos-26-large", "macos-26", "macos-15-intel", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xlarge", "macos-14-large", "macos-14", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file (runner-label) 🤖 Prompt for AI AgentsSource: Linters/SAST tools |
||||||||||||||||||
| runs-on: ${{ matrix.os }} | ||||||||||||||||||
| timeout-minutes: 30 | ||||||||||||||||||
| steps: | ||||||||||||||||||
| - name: Checkout synced SHA | ||||||||||||||||||
| uses: actions/checkout@v6 | ||||||||||||||||||
| with: | ||||||||||||||||||
| ref: ${{ needs.sync.outputs.sha }} | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Setup Vite+ | ||||||||||||||||||
| uses: voidzero-dev/setup-vp@v1 | ||||||||||||||||||
| with: | ||||||||||||||||||
| node-version-file: package.json | ||||||||||||||||||
| cache: true | ||||||||||||||||||
| run-install: true | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Build server | ||||||||||||||||||
| run: vp run --filter t3 build | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Stage self-contained archive | ||||||||||||||||||
| env: | ||||||||||||||||||
| PLATFORM: ${{ matrix.platform }} | ||||||||||||||||||
| run: | | ||||||||||||||||||
| set -eu | ||||||||||||||||||
| mkdir -p contextivity-dist | ||||||||||||||||||
| node --experimental-strip-types contextivity/src/pack-server.ts \ | ||||||||||||||||||
| --platform "$PLATFORM" \ | ||||||||||||||||||
| --out contextivity-dist \ | ||||||||||||||||||
| --upstream-version "$(node -e 'console.log(require("./apps/server/package.json").version)')" \ | ||||||||||||||||||
| --contextivity-revision "$(git rev-parse --short=7 HEAD)" | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Upload archive | ||||||||||||||||||
| uses: actions/upload-artifact@v4 | ||||||||||||||||||
| with: | ||||||||||||||||||
| name: archive-${{ matrix.platform }} | ||||||||||||||||||
| path: contextivity-dist/t3-server-${{ matrix.platform }}.tar.gz | ||||||||||||||||||
| if-no-files-found: error | ||||||||||||||||||
|
|
||||||||||||||||||
| publish: | ||||||||||||||||||
| name: Publish immutable candidate | ||||||||||||||||||
| needs: [sync, pack] | ||||||||||||||||||
| runs-on: ubuntu-24.04 | ||||||||||||||||||
| timeout-minutes: 15 | ||||||||||||||||||
| steps: | ||||||||||||||||||
| - name: Checkout | ||||||||||||||||||
| uses: actions/checkout@v6 | ||||||||||||||||||
| with: | ||||||||||||||||||
| ref: ${{ needs.sync.outputs.sha }} | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Setup Node | ||||||||||||||||||
| uses: actions/setup-node@v5 | ||||||||||||||||||
| with: | ||||||||||||||||||
| node-version-file: package.json | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Download archives | ||||||||||||||||||
| uses: actions/download-artifact@v4 | ||||||||||||||||||
| with: | ||||||||||||||||||
| pattern: archive-* | ||||||||||||||||||
| merge-multiple: true | ||||||||||||||||||
| path: contextivity-dist | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Write candidate manifest | ||||||||||||||||||
| env: | ||||||||||||||||||
| TAG: ${{ needs.sync.outputs.tag }} | ||||||||||||||||||
| SHA: ${{ needs.sync.outputs.sha }} | ||||||||||||||||||
| run: | | ||||||||||||||||||
| set -eu | ||||||||||||||||||
| node --experimental-strip-types contextivity/src/write-candidate-manifest.ts \ | ||||||||||||||||||
| --tag "$TAG" \ | ||||||||||||||||||
| --sha "${{ needs.sync.outputs.upstream_commit }}" \ | ||||||||||||||||||
| --dir contextivity-dist \ | ||||||||||||||||||
| --build-revision "${GITHUB_RUN_ID}-${GITHUB_SHA}" \ | ||||||||||||||||||
| --node-engine "$(node -e 'console.log(require("./apps/server/package.json").engines.node)')" \ | ||||||||||||||||||
| --contextivity-revision "$(git rev-parse --short=7 HEAD)" | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Attest artifacts | ||||||||||||||||||
| uses: actions/attest-build-provenance@v3 | ||||||||||||||||||
| with: | ||||||||||||||||||
| subject-path: contextivity-dist/* | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Publish immutable candidate release | ||||||||||||||||||
| env: | ||||||||||||||||||
| GH_TOKEN: ${{ github.token }} | ||||||||||||||||||
| run: | | ||||||||||||||||||
| set -eu | ||||||||||||||||||
| node --experimental-strip-types contextivity/src/cli.ts publish-candidate \ | ||||||||||||||||||
| --dir contextivity-dist \ | ||||||||||||||||||
| --repo "${{ github.repository }}" | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Advance downstream branch after a successful candidate | ||||||||||||||||||
| env: | ||||||||||||||||||
| GH_TOKEN: ${{ github.token }} | ||||||||||||||||||
| run: | | ||||||||||||||||||
| set -eu | ||||||||||||||||||
| git push origin "${{ needs.sync.outputs.sha }}:refs/heads/${GITHUB_REF_NAME}" | ||||||||||||||||||
| git push origin --delete "contextivity-sync/${GITHUB_RUN_ID}" || true | ||||||||||||||||||
|
|
||||||||||||||||||
| - name: Upload candidate assets | ||||||||||||||||||
| uses: actions/upload-artifact@v4 | ||||||||||||||||||
| with: | ||||||||||||||||||
| name: contextivity-candidate | ||||||||||||||||||
| path: contextivity-dist | ||||||||||||||||||
| if-no-files-found: error | ||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,81 @@ | ||
| name: Contextivity promote | ||
|
|
||
| on: | ||
| workflow_dispatch: | ||
| inputs: | ||
| channel: | ||
| description: Fleet pointer to advance | ||
| required: true | ||
| type: choice | ||
| options: | ||
| - nightly | ||
| - stable | ||
| version: | ||
| description: Exact candidate identity (upstreamVersion-ctx.revision) | ||
| required: true | ||
| type: string | ||
| macClientVersion: | ||
| description: Installed official Mac desktop version (must equal manifest upstreamVersion) | ||
| required: true | ||
| type: string | ||
|
|
||
| permissions: | ||
| contents: write | ||
| issues: write | ||
|
|
||
| concurrency: | ||
| group: contextivity-promote | ||
| cancel-in-progress: false | ||
|
|
||
| jobs: | ||
| promote: | ||
| name: Manual fleet promotion | ||
| runs-on: ubuntu-24.04 | ||
| timeout-minutes: 10 | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v6 | ||
|
|
||
| - name: Setup Node | ||
| uses: actions/setup-node@v5 | ||
| with: | ||
| node-version-file: package.json | ||
|
|
||
| - name: Download matching candidate | ||
| env: | ||
| GH_TOKEN: ${{ github.token }} | ||
| run: | | ||
| set -eu | ||
| mkdir -p contextivity-dist | ||
| gh release download "contextivity-candidate/${{ github.event.inputs.version }}" \ | ||
| --repo "${{ github.repository }}" \ | ||
| --dir contextivity-dist \ | ||
| --pattern "manifest.json" | ||
|
|
||
| - name: Exact-version Mac client gate | ||
| run: | | ||
| set -eu | ||
| node --experimental-strip-types contextivity/src/cli.ts promote \ | ||
| --channel "${{ github.event.inputs.channel }}" \ | ||
| --manifest contextivity-dist/manifest.json \ | ||
| --version "${{ github.event.inputs.version }}" \ | ||
| --mac-client-version "${{ github.event.inputs.macClientVersion }}" \ | ||
| > contextivity-dist/pointer.json | ||
|
|
||
| - name: Publish pointer without touching the official desktop app | ||
| env: | ||
| GH_TOKEN: ${{ github.token }} | ||
| run: | | ||
| set -eu | ||
| channel="${{ github.event.inputs.channel }}" | ||
|
Comment on lines
+44
to
+70
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win Dispatch-controlled values are expanded inside
🧰 Tools🪛 zizmor (1.29.0)[error] 50-50: code injection via template expansion (template-injection): may expand into attacker-controllable code (template-injection) [error] 59-59: code injection via template expansion (template-injection): may expand into attacker-controllable code (template-injection) [error] 61-61: code injection via template expansion (template-injection): may expand into attacker-controllable code (template-injection) [error] 62-62: code injection via template expansion (template-injection): may expand into attacker-controllable code (template-injection) [error] 70-70: code injection via template expansion (template-injection): may expand into attacker-controllable code (template-injection) 📍 Affects 3 files
🤖 Prompt for AI AgentsSource: Linters/SAST tools |
||
| tag="contextivity-${channel}" | ||
| notes="Pointer only. Install with t3-ctx updater update --channel ${channel}. Do not use the public npm t3 package." | ||
| if gh release view "$tag" --repo "${{ github.repository }}" >/dev/null 2>&1; then | ||
| gh release delete "$tag" --repo "${{ github.repository }}" --yes --cleanup-tag | ||
| fi | ||
| gh release create "$tag" contextivity-dist/pointer.json contextivity-dist/manifest.json \ | ||
| --repo "${{ github.repository }}" \ | ||
| --title "Contextivity ${channel} pointer" \ | ||
| --notes "$notes" \ | ||
| --prerelease \ | ||
| --latest=false | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -38,3 +38,4 @@ node_modules/ | |
| *.log | ||
| .env* | ||
| !.env.example | ||
| contextivity-dist/ | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
The failure report is skipped when the CLI throws.
cli.tsonly writes JSON to stdout on handled failures. On an unhandled error it writes the message to stderr and exits 1, leaving$RUNNER_TEMP/sync.jsonempty.JSON.parsethen throws,reason=$(...)fails underset -eu, and the script exits beforereport-sync-failureruns. The fail-closed issue never gets filed for exactly the cases that most need it.🛠️ Proposed fix
📝 Committable suggestion
🤖 Prompt for AI Agents