☆ 1
CodeIssuesPull RequestsActionsSecurityInsights
✨ AI
More
Settings

CI#378 failure

push·fix/readiness-wave-2·20b5c86·queued 2h ago·duration 1m 37s
AI failure analysis
Not analysed yet. Autopilot picks failed runs up on a five-minute tick; this runs it now instead of waiting.
cifailure1m 36s
Install dependencies
$ bun install --frozen-lockfile
3.7s
Typecheck
$ bash scripts/ci-typecheck.sh
41.9s
Test (CI-safe suite)
$ bash scripts/ci-tests.sh
50.7sexit 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 [3.72s]

[exit 0 in 3731ms]

==> Typecheck
$ bash scripts/ci-typecheck.sh

[exit 0 in 41921ms]

==> 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 414 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 [2.17ms]
--
src/__tests__/mcp-security-surface.test.ts:
(fail) assessOsvForRepo — an empty result must say WHY it is empty > reports a database failure as 'error', never as clean [1.22ms]
--
src/__tests__/dxt-extension.test.ts:
(fail) Block Q1 — .dxt manifest > declares every MCP tool, cross-checked against defaultTools() [0.45ms]
--
src/lib/selfcheck/authz.test.ts:
(fail) guard is wired in > every dash-argument the module actually uses is allowlisted [2.17ms]
(fail) assessOsvForRepo — an empty result must say WHY it is empty > reports a database failure as 'error', never as clean [1.22ms]
(fail) Block Q1 — .dxt manifest > declares every MCP tool, cross-checked against defaultTools() [0.45ms]
--- 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.01ms]
(pass) guard is wired in > exec() screens every argument after the binary [0.09ms]
(pass) guard is wired in > the streaming Bun.spawn paths are guarded too [0.05ms]
 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-3HnYY8/checkout/src/__tests__/git-arg-injection.test.ts:103:23)
(fail) guard is wired in > every dash-argument the module actually uses is allowlisted [2.17ms]
--
src/__tests__/repo-access.test.ts:
(pass) resolveRepoAccess > owner returns "owner" [0.41ms]
(pass) resolveRepoAccess > collaborator with accepted invite returns their role [0.16ms]
(pass) resolveRepoAccess > pending invite (acceptedAt=null) does NOT grant access [0.15ms]
(pass) resolveRepoAccess > public repo + no collaborator row returns "read" [0.15ms]
(pass) resolveRepoAccess > private repo + no collaborator row returns "none" [0.12ms]

src/__tests__/mcp-security-surface.test.ts:
(pass) gluecron_security_scan registration > is registered in the expanded set and in defaultTools() [0.12ms]
(pass) gluecron_security_scan registration > is marked read-only and non-destructive [0.03ms]
(pass) gluecron_security_scan registration > requires only owner and repo; ai review and file cap are optional [0.04ms]
(pass) gluecron_security_scan registration > the AI review is OPT-IN, which the schema description must state [0.03ms]
(pass) gluecron_security_scan registration > advertises the vocabulary an agent searches for [0.05ms]
(skip) assessOsvForRepo — an empty result must say WHY it is empty > reports not_assessed / dependency_graph_not_indexed for a repo with no indexed graph
(skip) assessOsvForRepo — an empty result must say WHY it is empty > never returns status 'assessed' with zero packages checked
792 | 
793 |   const lastIndexedAt =
794 |     deps.length > 0
795 |       ? new Date(Math.max(...deps.map((d) => d.indexedAt.getTime()))).toISOString()
796 |       : null;
797 |   const indexedCommitShas = [...new Set(deps.map((d) => d.commitSha).filter(Boolean))];
                                                   ^
TypeError: deps.map is not a function. (In 'deps.map((d) => d.commitSha)', 'deps.map' is undefined)
      at assessOsvForRepo (/ci-work/gluecron-run-3HnYY8/checkout/src/lib/osv.ts:797:46)
      at async <anonymous> (/ci-work/gluecron-run-3HnYY8/checkout/src/__tests__/mcp-security-surface.test.ts:128:26)
(fail) assessOsvForRepo — an empty result must say WHY it is empty > reports a database failure as 'error', never as clean [1.22ms]
--
(pass) git-receive-pack authorizes before reading the body > still parses refs, so policy and post-receive keep working [0.03ms]

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.09ms]
(pass) push body cap > index.ts server ceiling is at least the push cap [0.26ms]
(pass) push body cap > route source checks Content-Length before c.req.arrayBuffer() [0.14ms]

src/__tests__/dxt-extension.test.ts:
(pass) Block Q1 — .dxt manifest > extension/gluecron.dxt/manifest.json is valid JSON [1.04ms]
(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.08ms]
(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-3HnYY8/checkout/src/__tests__/dxt-extension.test.ts:88:39)
(fail) Block Q1 — .dxt manifest > declares every MCP tool, cross-checked against defaultTools() [0.45ms]
--
(skip) personal-semantic — DB-backed > setPersonalSemanticEnabled flips the flag and isPersonalSemanticEnabled reads it
(skip) assessOsvForRepo — an empty result must say WHY it is empty > reports not_assessed / dependency_graph_not_indexed for a repo with no indexed graph
(skip) assessOsvForRepo — an empty result must say WHY it is empty > never returns status 'assessed' with zero packages checked
(skip) gluecron_security_scan argument + access handling > hides a repo the caller cannot see
(skip) response contract > returns every category with a status, and never an implicit pass
(skip) response contract > carries fixed versions on advisory findings when OSV has one
(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


3 tests failed:
(fail) guard is wired in > every dash-argument the module actually uses is allowlisted [2.17ms]
(fail) assessOsvForRepo — an empty result must say WHY it is empty > reports a database failure as 'error', never as clean [1.22ms]
(fail) Block Q1 — .dxt manifest > declares every MCP tool, cross-checked against defaultTools() [0.45ms]
--- summary ---
(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


3 tests failed:
(fail) guard is wired in > every dash-argument the module actually uses is allowlisted [2.17ms]
(fail) assessOsvForRepo — an empty result must say WHY it is empty > reports a database failure as 'error', never as clean [1.22ms]
(fail) Block Q1 — .dxt manifest > declares every MCP tool, cross-checked against defaultTools() [0.45ms]

 5318 pass
 168 skip
 3 fail
 14681 expect() calls
Ran 5489 tests across 413 files. [50.25s]

[exit 1 in 50654ms]