✗CI#376 failure
AI failure analysis
Not analysed yet. Autopilot picks failed runs up on a five-minute tick; this runs it now instead of waiting.
✗cifailure1m 16s
✓2.1s
Install dependencies
$ bun install --frozen-lockfile✓40.6s
Typecheck
$ bash scripts/ci-typecheck.sh✗34.2sexit 1
Test (CI-safe suite)
$ bash scripts/ci-tests.sh==> Install dependencies
$ bun install --frozen-lockfile
bun install v1.3.14 (0d9b296a)
+ @playwright/test@1.60.0
+ @types/bun@1.3.14
+ @types/k6@2.0.0
+ drizzle-kit@0.31.10
+ cpu-features@0.0.10
+ @anthropic-ai/sdk@0.96.0
+ @neondatabase/serverless@1.1.0
+ @simplewebauthn/server@13.3.0
+ drizzle-orm@0.45.2
+ highlight.js@11.11.1
+ hono@4.12.18
+ marked@18.0.3
+ postgres@3.4.9
+ sanitize-html@2.17.5
+ ssh2@1.17.0
+ typescript@5.9.3
86 packages installed [2.14s]
[exit 0 in 2142ms]
==> Typecheck
$ bash scripts/ci-typecheck.sh
[exit 0 in 40610ms]
==> Test (CI-safe suite)
$ bash scripts/ci-tests.sh
--- design audit ---
FILE LITERALS BANNED SAMPLES
----------------------------------------------------------------------------------------------------
src/views/agent-workspace.tsx 76 0
src/routes/admin-server-targets.tsx 53 0
src/views/distribution.tsx 47 0
src/routes/pulls.tsx 42 0
src/routes/ai-archaeology.tsx 40 0
src/routes/claude-web.tsx 35 0
src/views/production-layers.tsx 34 0
src/views/layout.tsx 33 0
src/views/daily-brief.tsx 33 0
src/views/trust-report.tsx 33 0
src/routes/admin.tsx 29 0
src/routes/admin-integrations.tsx 28 0
src/views/org-memory.tsx 28 0
src/routes/admin-deploys-page.tsx 27 0
src/routes/share.tsx 26 0
[design-audit] 173 file(s) with literal colors · 0 banned-family literal(s)
[design-audit] no banned-family colors. Literal debt above burns down per file.
running 412 test files (20 excluded as credential-dependent)
--- failures ---
src/__tests__/git-arg-injection.test.ts:
(fail) guard is wired in > every dash-argument the module actually uses is allowlisted [1.13ms]
--
src/__tests__/dxt-extension.test.ts:
(fail) Block Q1 — .dxt manifest > declares every MCP tool, cross-checked against defaultTools() [0.38ms]
--
src/lib/selfcheck/authz.test.ts:
(fail) guard is wired in > every dash-argument the module actually uses is allowlisted [1.13ms]
(fail) Block Q1 — .dxt manifest > declares every MCP tool, cross-checked against defaultTools() [0.38ms]
--- why (assertion + stack preceding each failure) ---
(pass) legitimate arguments still pass > accepts -1
(pass) legitimate arguments still pass > accepts -I
(pass) legitimate arguments still pass > accepts -w
(pass) legitimate arguments still pass > accepts feature/my-branch
(pass) legitimate arguments still pass > accepts release-2.0 [0.02ms]
(pass) guard is wired in > exec() screens every argument after the binary [0.08ms]
(pass) guard is wired in > the streaming Bun.spawn paths are guarded too [0.04ms]
98 | const uncovered = [...found].filter((f) => {
99 | if (f.includes("${")) return false; // template — resolved at runtime
100 | if (f.startsWith("--output=")) return false; // appears only in a comment
101 | return !isAllowedGitFlag(f);
102 | });
103 | expect(uncovered).toEqual([]);
^
error: expect(received).toEqual(expected)
- []
+ [
+ "--- ",
+ ]
- Expected - 1
+ Received + 3
at <anonymous> (/ci-work/gluecron-run-srYvYW/checkout/src/__tests__/git-arg-injection.test.ts:103:23)
(fail) guard is wired in > every dash-argument the module actually uses is allowlisted [1.13ms]
--
(pass) git-receive-pack authorizes before reading the body > still parses refs, so policy and post-receive keep working [0.02ms]
src/__tests__/git-push-body-cap.test.ts:
(pass) push body cap > defaults to 256 MiB and is exported for the server ceiling to respect [0.03ms]
(pass) push body cap > index.ts server ceiling is at least the push cap [0.22ms]
(pass) push body cap > route source checks Content-Length before c.req.arrayBuffer() [0.17ms]
src/__tests__/dxt-extension.test.ts:
(pass) Block Q1 — .dxt manifest > extension/gluecron.dxt/manifest.json is valid JSON [0.69ms]
(pass) Block Q1 — .dxt manifest > declares server.type=http with the templated host placeholder [0.09ms]
(pass) Block Q1 — .dxt manifest > declares both user_config prompts (host + PAT, PAT marked sensitive) [0.07ms]
(pass) Block Q1 — .dxt manifest > does not embed any sensitive default values [0.10ms]
83 | const manifestNames = new Set(m.tools.map((t) => t.name));
84 | const handlerNames = new Set(Object.keys(defaultTools()));
85 |
86 | // Every handler MUST appear in the manifest.
87 | for (const name of handlerNames) {
88 | expect(manifestNames.has(name)).toBe(true);
^
error: expect(received).toBe(expected)
Expected: true
Received: false
at <anonymous> (/ci-work/gluecron-run-srYvYW/checkout/src/__tests__/dxt-extension.test.ts:88:39)
(fail) Block Q1 — .dxt manifest > declares every MCP tool, cross-checked against defaultTools() [0.38ms]
--
(skip) executeSlashCommand — /test (DB-backed) > falls back gracefully when no test workflow is configured
(skip) personal-semantic — DB-backed > refuses to return rows when the opt-in flag is OFF
(skip) personal-semantic — DB-backed > search returns results across multiple owned repos
(skip) personal-semantic — DB-backed > search EXCLUDES repos the user has no access to
(skip) personal-semantic — DB-backed > cross-user content leak prevention — User A's results never contain User B's repo data
(skip) personal-semantic — DB-backed > setPersonalSemanticEnabled flips the flag and isPersonalSemanticEnabled reads it
(skip) findTrackedDocs — drift detection > treats first-time observations as fresh, second-time differing hashes as stale
(skip) proposeDocUpdate > opens a PR with the refreshed markdown when Claude returns a patch
(skip) recordAiCost — DB-backed > inserts a row that summarizeCostsForUser can find
(skip) recordAiCost — DB-backed > never throws on bad input — swallows DB errors
(skip) runSpecToPr — end-to-end with fake Claude > opens a PR, tags it, and rewrites the spec status to building
(skip) runSpecToPr — end-to-end with fake Claude > refuses a spec whose status is not 'ready'
(skip) API v2 — git plumbing write endpoints (DB-backed) > POST /git/blobs round-trips utf-8 and base64 content
(skip) branch-previews — DB pipeline > enqueue creates a building row with a computed preview URL
(skip) branch-previews — DB pipeline > re-pushing the same branch DEDUPES — same id, new SHA, status='building'
(skip) branch-previews — DB pipeline > markPreviewReady flips status to 'ready' with completed_at
(skip) branch-previews — DB pipeline > markPreviewFailed records error_message + truncates
(skip) branch-previews — DB pipeline > expireOldPreviews transitions ready rows past expires_at to 'expired'
(skip) branch-previews — DB pipeline > expireOldPreviews leaves fresh rows alone
(skip) branch-previews — DB pipeline > listPreviewsForRepo orders by build_started_at descending
(skip) install-token — successful mint > mints a glc_ PAT + writes auth.install_token.created audit row
(skip) install-token — successful mint > defaults name + scope when body is empty
2 tests failed:
(fail) guard is wired in > every dash-argument the module actually uses is allowlisted [1.13ms]
(fail) Block Q1 — .dxt manifest > declares every MCP tool, cross-checked against defaultTools() [0.38ms]
--- summary ---
(skip) recordAiCost — DB-backed > inserts a row that summarizeCostsForUser can find
(skip) recordAiCost — DB-backed > never throws on bad input — swallows DB errors
(skip) runSpecToPr — end-to-end with fake Claude > opens a PR, tags it, and rewrites the spec status to building
(skip) runSpecToPr — end-to-end with fake Claude > refuses a spec whose status is not 'ready'
(skip) API v2 — git plumbing write endpoints (DB-backed) > POST /git/blobs round-trips utf-8 and base64 content
(skip) branch-previews — DB pipeline > enqueue creates a building row with a computed preview URL
(skip) branch-previews — DB pipeline > re-pushing the same branch DEDUPES — same id, new SHA, status='building'
(skip) branch-previews — DB pipeline > markPreviewReady flips status to 'ready' with completed_at
(skip) branch-previews — DB pipeline > markPreviewFailed records error_message + truncates
(skip) branch-previews — DB pipeline > expireOldPreviews transitions ready rows past expires_at to 'expired'
(skip) branch-previews — DB pipeline > expireOldPreviews leaves fresh rows alone
(skip) branch-previews — DB pipeline > listPreviewsForRepo orders by build_started_at descending
(skip) install-token — successful mint > mints a glc_ PAT + writes auth.install_token.created audit row
(skip) install-token — successful mint > defaults name + scope when body is empty
2 tests failed:
(fail) guard is wired in > every dash-argument the module actually uses is allowlisted [1.13ms]
(fail) Block Q1 — .dxt manifest > declares every MCP tool, cross-checked against defaultTools() [0.38ms]
5264 pass
163 skip
2 fail
14543 expect() calls
Ran 5429 tests across 411 files. [33.92s]
[exit 1 in 34157ms]