☆ 1
CodeIssuesPull RequestsActionsSecurityInsights
✨ AI
More
Settings

CI#376 failure

push·fix/readiness-wave-2·9d123b8·queued 23h ago·duration 1m 18s
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
Install dependencies
$ bun install --frozen-lockfile
2.1s
Typecheck
$ bash scripts/ci-typecheck.sh
40.6s
Test (CI-safe suite)
$ bash scripts/ci-tests.sh
34.2sexit 1
==> 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]