NORTHSET

Proof-of-Pass Receipt

Receipt ID M-106

ISSUE / WORKfetchWithTimeout may ignore a caller signal that's already aborted · PR #19

CONTRIBUTOR SELF-RUN — NOT MAINTAINER VERIFICATION

RUN

01 / TECHNICAL RESULT

Technical result

3/3

declared commands passed

Recorded on the named code in the named execution environment. The evidence annex carries the exact scope.

Upstream
OPENmutable external state
Attempts
3 totalcurrent M-106 · #3
Cost record
PARTIALunpriced

02 / RECORDED WORK SEQUENCE

Northset Proofline

Every task-bound attempt is shown in recorded order. Anatomy geometry follows each non-null elapsed duration’s share; labels retain exact recorded time.

  1. ATTEMPT 1M-100FAILED AUTHORauthoring
  2. ATTEMPT 2M-103FAILED ORACLEverification
  3. ATTEMPT 3M-106READY

ATTEMPT 3 / EXECUTION ANATOMY

01Discoverynot captured
02Qualification2m37s32.7%
03Authoring3m01s37.7%
04Verification2m22s29.6%

03 / ECONOMIC NARRATIVE

Economic identity

Observed sponsorship, authorization, scope, transfer, and outcome. No estimates or inferred value.

  1. 01 / MANDATE

    Sponsored and authorized

    The recorded mandate names both its sponsor and initiative, with authorization tied to a named approver and approval time.

    SPONSORNorthset OSS Fund · OSS mission experimentation

    AUTHORIZEDinternal-user:aeziz ·

  2. 02 / WORK

    Demand became scoped work

    An external issue invitation became a stable task and a recorded code-and-test scope, without treating scope as a measure of value.

    TASKTASK-OSS-0BF90B7FA82703D0 · defect fix · attempt 3

    INVITATIONIssue #17 · label

    SCOPE2 files · 25 changed lines · 1 production files · 1 test files · 3 declared checks

  3. 03 / EXTERNAL OUTCOME

    Transfer and upstream state

    The recorded maintainer transfer and its contingency are separate from upstream state, which remains a mutable external observation.

    MAINTAINER TRANSFERnone · not merge contingent

    UPSTREAMOPEN · mutable external observation

04 / COST COMPLETENESS

Known, unknown, and unpriced

Known: maintainer payment was none. A known zero external transfer is not a zero total cost.

Missing or unpriced components

  • model inference
  • actual host compute
  • human review
  • shared tooling
TOTAL COSTUNPRICED

No complete total is recorded; see the missing or unpriced component record above.

Evidence annexEconomic · technical · provenance · limitations
01

Economic evidence

Lineage, usage, caps, outcome, and cost provenance

Attempt lineage

  • M-100attempt 1 · FAILED AUTHOR · authoring
  • M-103attempt 2 · FAILED ORACLE · verification
  • M-106attempt 3 · READY

Recorded usage

requested reviewer model
gpt-5.6-sol
actual reviewer model
not captured
requested author model
gpt-5.6-sol
actual author model
not captured
networked setup phase
1m04s
install-only duration
not captured
declared commands
49.2s
unclassified executor time
28.8s
CPU time
not captured
peak RSS
not captured

Configured resource envelope

CPU cap
2
memory cap
4096 MB
PID cap
512
command wall cap
1800s
output cap / stream
2000000 bytes

Configured limits are an envelope, not observed consumption.

Cost lines

  • maintainer paymentobserved quantity unpriced · 0 external transfer · amount unavailable

Cost status: partial. Values without source-backed quantities and rates remain null.

Outcome facts

technical checks passed
true
PR opened
true
CI
pending
merged
false
accepted as submitted
not established
external cycle time
not captured
released
not observed
deployed
not observed
business result
not observed
02

Technical evidence

Code, environment, exact commands, patch, and outputs

Project

chipmates/agoracosmica

Work

fetchWithTimeout may ignore a caller signal that's already aborted · PR #19

Verification execution

runtime: northset-oss executor v1
human operator: aeziz

Code

base
99bafe8e5f1082c32f247f13749a44f468a0577a
recorded patch commit
5fbd2c8e324385c49f04b26ad92a6b082b89369d
declared metadata; not execution-bound
patch diff SHA-256
sha256:f5bd8c175799a7292f673035d31129d5bbf7510c823e7267f37a8d93f68b4e60
bound to executed patch bytes

Environment

image reference
node@sha256:40ad9f3064e67d6860b4bc3fe1880b2953934fd6320ada990e45fe0efa6badd7
repository digest
node@sha256:40ad9f3064e67d6860b4bc3fe1880b2953934fd6320ada990e45fe0efa6badd7
immutable image ID
sha256:6ed6ff875e9714bb845b850b08f3ad231ccbb5848812647bcf11acdd4bd1d2f8
platform
linux/arm64
network
phaseA:bridge,phaseB:none

Declared checks

Execution summary
3/3 declared commands returned exit 0 in the recorded environment

  1. corepack pnpm@8.15.5 --dir client test:unit -- src/__tests__/utils/fetchWithTimeout.test.ts

    exit 0 · 18s

  2. corepack pnpm@8.15.5 --dir client exec tsc --noEmit

    exit 0 · 20.1s

  3. corepack pnpm@8.15.5 --dir client build:client

    exit 0 · 11.1s

run wall (derived from recorded timestamps) 2m22s

PASS — 3/3 declared commands

Every command listed returned exit 0 in the declared environment. Only the listed commands are in scope. Unlisted test, lint, typecheck, build, coverage, compiler, full-suite, and CI gates are not implied or recorded.

Public scope interpretation

The receipt proves the declared automated checks only; maintainer review and merge remain independent human decisions.

Committed patch.diff
diff --git a/client/src/__tests__/utils/fetchWithTimeout.test.ts b/client/src/__tests__/utils/fetchWithTimeout.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bf7ef5dc03a87fd503ac1f27ff46e17506ad64d2
--- /dev/null
+++ b/client/src/__tests__/utils/fetchWithTimeout.test.ts
@@ -0,0 +1,24 @@
+import { describe, expect, it, vi } from 'vitest';
+
+import { fetchWithTimeout } from '@/utils/fetchWithTimeout';
+
+describe('fetchWithTimeout', () => {
+  it('handles a signal already aborted before fetch', async () => {
+    const fetchMock = vi.fn((_input: RequestInfo | URL, init?: RequestInit) => {
+      if (!init?.signal?.aborted) {
+        return Promise.reject(new Error('fetch started with a live signal'));
+      }
+
+      return Promise.reject(new DOMException('The operation was aborted.', 'AbortError'));
+    });
+    vi.stubGlobal('fetch', fetchMock);
+
+    const controller = new AbortController();
+    controller.abort();
+
+    await expect(fetchWithTimeout('/test', { signal: controller.signal })).rejects.toMatchObject({
+      name: 'AbortError',
+    });
+    expect(fetchMock).toHaveBeenCalledOnce();
+  });
+});
diff --git a/client/src/utils/fetchWithTimeout.ts b/client/src/utils/fetchWithTimeout.ts
index 8f5c59fe1a68a645a5a9b9115ec2b4da8dc82ce2..392056feac456f5975ea99594667531271d546ea 100644
--- a/client/src/utils/fetchWithTimeout.ts
+++ b/client/src/utils/fetchWithTimeout.ts
@@ -22,6 +22,7 @@ export async function fetchWithTimeout(
   // If caller provided a signal, abort our controller when theirs fires
   const onExternalAbort = () => controller.abort();
   externalSignal?.addEventListener('abort', onExternalAbort, { once: true });
+  if (externalSignal?.aborted) onExternalAbort();
 
   try {
     const response = await fetch(url, {
Redacted stdout
=== cmd 1: corepack pnpm@8.15.5 --dir client test:unit -- src/__tests__/utils/fetchWithTimeout.test.ts ===

> agoracosmica-client@1.1.2 test:unit /workspace/client
> vitest run "--" "src/__tests__/utils/fetchWithTimeout.test.ts"


 RUN  v4.1.8 /workspace/client

 ✓ src/__tests__/services/audioFocus.test.ts (11 tests) 9ms
stdout | src/__tests__/adapters/seedAdapter.test.tsx
[uiStore] Hydrated from localStorage: {
  modals: {
    menuOpen: false,
    figureCarouselOpen: false,
    historyOpen: false,
    seedsOpen: false,
    modeSelectorOpen: false,
    onboardingOpen: false,
    wisdomGalleryOpen: false,
    councilSetupOpen: false
  },
  helpDismissedKeys: []
}

stdout | src/__tests__/adapters/seedAdapter.test.tsx
[AudioQueue] module instance 1

 ↓ src/__tests__/adapters/seedAdapter.test.tsx (2 tests | 2 skipped)
 ✓ src/__tests__/critical/translationSystem.test.tsx (8 tests) 184ms
 ✓ src/__tests__/critical/seedLoading.test.tsx (6 tests) 29ms
stdout | src/__tests__/utils/modeStateManager.test.ts
[uiStore] Hydrated from localStorage: {
  modals: {
    menuOpen: false,
    figureCarouselOpen: false,
    historyOpen: false,
    seedsOpen: false,
    modeSelectorOpen: false,
    onboardingOpen: false,
    wisdomGalleryOpen: false,
    councilSetupOpen: false
  },
  helpDismissedKeys: []
}

 ✓ src/__tests__/utils/modeStateManager.test.ts (3 tests) 5ms
 ✓ src/__tests__/critical/figureSelection.test.tsx (5 tests) 24ms
stdout | src/__tests__/services/SeedStateManager.test.ts > SeedStateManager > detects gathered seeds via LocalStorageAdapter
Seed gathered: plato/42

stdout | src/__tests__/services/SeedStateManager.test.ts > SeedStateManager > dumps completion records using adapter accessors
=== SEED COMPLETION RECORDS ===
completion_plato_1 = true
Total completion records: 1
==============================

 ✓ src/__tests__/services/SeedStateManager.test.ts (4 tests) 5ms
 ✓ src/__tests__/utils/fetchWithTimeout.test.ts (1 test) 5ms

 Test Files  7 passed | 1 skipped (8)
      Tests  38 passed | 2 skipped (40)
   Start at  17:06:00
   Duration  15.41s (transform 3.15s, setup 1.97s, import 4.89s, tests 261ms, environment 6.33s)

=== cmd 2: corepack pnpm@8.15.5 --dir client exec tsc --noEmit ===
=== cmd 3: corepack pnpm@8.15.5 --dir client build:client ===

> agoracosmica-client@1.1.2 build:client /workspace/client
> vite build

[vite/audio-proxy] target=http://localhost:8800 bearer=MISSING adminToken=MISSING
vite v7.3.5 building client environment for production...
transforming...
✓ 5006 modules transformed.
rendering chunks...
computing gzip size...
build/index.html                                    7.06 kB │ gzip:   2.45 kB
build/assets/index-B15wYv-9.css                     3.12 kB │ gzip:   0.99 kB
build/assets/index-BTURdDUJ.css                     4.58 kB │ gzip:   1.14 kB
build/assets/index-DNT4t31o.css                     4.65 kB │ gzip:   1.59 kB
build/assets/PrismPlayer-BoKTCWVy.css              10.74 kB │ gzip:   2.43 kB
build/assets/WelcomeDisclosureModal-B6138XpU.css   17.12 kB │ gzip:   3.95 kB
build/assets/index-BvtZ_1YX.css                    20.88 kB │ gzip:   4.47 kB
build/assets/WisdomGalleryModal-BzTa-CaT.css       21.51 kB │ gzip:   4.40 kB
build/assets/StoryPlayer-RLictRzs.css              25.60 kB │ gzip:   4.87 kB
build/assets/SettingsModal-0IbRe1hN.css            36.97 kB │ gzip:   6.80 kB
build/assets/index-BepB4aGm.css                   119.75 kB │ gzip:  20.99 kB
build/assets/HomePage-B52D2oeb.css                400.40 kB │ gzip:  61.75 kB
build/assets/userState-BkfjtOFD.js                  1.01 kB │ gzip:   0.49 kB
build/assets/FigureController-CKRy-uzg.js           1.12 kB │ gzip:   0.55 kB
build/assets/WarningCircle.es-C6UINtAk.js           1.84 kB │ gzip:   0.64 kB
build/assets/selfHostedTTS-D6s3LV-W.js              2.24 kB │ gzip:   1.19 kB
build/assets/useAudio-ghT1Gmdt.js                   3.20 kB │ gzip:   1.31 kB
build/assets/index-ChtyRdLD.js                      3.87 kB │ gzip:   2.08 kB
build/assets/index-B5zTWrTf.js                      4.34 kB │ gzip:   1.81 kB
build/assets/parser--xEah0jm.js                     5.00 kB │ gzip:   1.83 kB
build/assets/en-Bd_DRCC5.js                         5.80 kB │ gzip:   2.53 kB
build/assets/de-DigxyS7v.js                         6.53 kB │ gzip:   2.98 kB
build/assets/historyClearService-B9ioXapB.js        6.74 kB │ gzip:   1.91 kB
build/assets/en-CagRTBXx.js                         8.06 kB │ gzip:   3.35 kB
build/assets/de-DKVtMOS7.js                         8.80 kB │ gzip:   3.71 kB
build/assets/WelcomeDisclosureModal-B50W8SFE.js     8.82 kB │ gzip:   3.01 kB
build/assets/ui-en-D-d7OL0J.js                      9.60 kB │ gzip:   4.23 kB
build/assets/ui-de-C2rt6OkN.js                     10.51 kB │ gzip:   4.63 kB
build/assets/index-teaMivPW.js                     11.36 kB │ gzip:   3.57 kB
build/assets/WisdomGalleryModal-DmerJKxA.js        15.28 kB │ gzip:   5.83 kB
build/assets/index-IA5_bqg1.js                     21.85 kB │ gzip:   7.54 kB
build/assets/StoryPlayer-wVXbKij2.js               32.76 kB │ gzip:   9.56 kB
build/assets/index-Bivp0FNE.js                     43.67 kB │ gzip:  14.34 kB
build/assets/ui-en-BkZuBSJN.js                     72.03 kB │ gzip:  26.76 kB
build/assets/ui-de-BB4putMa.js                     80.58 kB │ gzip:  29.69 kB
build/assets/SettingsModal-BIbpfHvw.js            176.81 kB │ gzip:  42.19 kB
build/assets/index-vMcxIQW-.js                    587.85 kB │ gzip: 187.22 kB
build/assets/HomePage-DgapNi-5.js                 691.15 kB │ gzip: 188.03 kB
✓ built in 9.20s
Redacted stderr
=== cmd 1: corepack pnpm@8.15.5 --dir client test:unit -- src/__tests__/utils/fetchWithTimeout.test.ts ===
=== cmd 2: corepack pnpm@8.15.5 --dir client exec tsc --noEmit ===
=== cmd 3: corepack pnpm@8.15.5 --dir client build:client ===
⚠️  AUDIO_ADMIN_TOKEN not set in client/.env.development.local — /v1/audio/* requests will be rejected by nginx edge-auth (500/401). Add AUDIO_ADMIN_TOKEN=<token> to fix.
[plugin vite:reporter] 
(!) /workspace/client/src/api/figures.ts is dynamically imported by /workspace/client/src/services/IntroductionAudioService.ts, /workspace/client/src/services/IntroductionAudioService.ts, /workspace/client/src/services/audio/introduction/navigationHelper.ts, /workspace/client/src/services/audio/introduction/navigationHelper.ts but also statically imported by /workspace/client/src/adapters/figureAdapter.ts, /workspace/client/src/components/AudioLibrary/AudioLibraryModal.tsx, /workspace/client/src/components/CommunityGovernance/computeVotingPower.ts, /workspace/client/src/components/CommunityGovernance/topicCatalog.ts, /workspace/client/src/components/CosmicCouncil/CouncilSetupModal.tsx, /workspace/client/src/components/FigureCarousel.tsx, /workspace/client/src/components/Sidebar.tsx, /workspace/client/src/components/WisdomGalleryModal.tsx, /workspace/client/src/hooks/useHelperFunctions.ts, /workspace/client/src/utils/pendingBlooms.ts, dynamic import will not move module into another chunk.

[plugin vite:reporter] 
(!) /workspace/client/src/utils/performanceDetector.ts is dynamically imported by /workspace/client/src/App.tsx, /workspace/client/src/hooks/useBatteryAwareGlass.ts but also statically imported by /workspace/client/src/components/ParticleEffect.tsx, /workspace/client/src/hooks/useLiquidGlass.tsx, dynamic import will not move module into another chunk.

[plugin vite:reporter] 
(!) /workspace/client/node_modules/idb/build/index.js is dynamically imported by /workspace/client/src/storage/indexedDbAdapter.ts but also statically imported by /workspace/client/src/services/storage/deviceKeyManager.ts, /workspace/client/src/services/storage/keyStorageService.ts, dynamic import will not move module into another chunk.

[plugin vite:reporter] 
(!) /workspace/client/src/services/seedCacheInitializer.ts is dynamically imported by /workspace/client/src/stores/slices/languageSlice.ts but also statically imported by /workspace/client/src/adapters/figureAdapter.ts, /workspace/client/src/components/AudioLibrary/StoryCollection.tsx, /workspace/client/src/controllers/sessionController.ts, /workspace/client/src/index.tsx, /workspace/client/src/services/StoryIntegrationManager.ts, /workspace/client/src/services/SummaryService.ts, /workspace/client/src/services/audio/introduction/navigationHelper.ts, /workspace/client/src/services/seedAcquisition/SeedAcquisitionManager.ts, dynamic import will not move module into another chunk.

[plugin vite:reporter] 
(!) /workspace/client/src/storage/index.ts is dynamically imported by /workspace/client/src/services/history/historyEncryption.ts but also statically imported by /workspace/client/src/controllers/conversationController.ts, /workspace/client/src/services/history/historyClearService.ts, /workspace/client/src/services/history/historyEncryptionMigration.ts, /workspace/client/src/services/history/historyExportService.ts, /workspace/client/src/services/history/historyStorageUtils.ts, /workspace/client/src/utils/questRestart.ts, dynamic import will not move module into another chunk.

[plugin vite:reporter] 
(!) /workspace/client/src/services/audio/voices/index.ts is dynamically imported by /workspace/client/src/services/council/CustomCouncilService.ts but also statically imported by /workspace/client/src/components/settings/panels/VoicePanel.tsx, /workspace/client/src/services/council/generator.ts, dynamic import will not move module into another chunk.

[plugin vite:reporter] 
(!) /workspace/client/src/services/council/speakerRegistry.ts is dynamically imported by /workspace/client/src/services/council/generator.ts but also statically imported by /workspace/client/src/services/council/generator.ts, /workspace/client/src/services/council/parser.ts, dynamic import will not move module into another chunk.

[plugin vite:reporter] 
(!) /workspace/client/src/services/history/historyStorageUtils.ts is dynamically imported by /workspace/client/src/utils/storageKeysV2.ts but also statically imported by /workspace/client/src/services/history/historyDataLoader.ts, /workspace/client/src/services/history/historyEncryptionMigration.ts, /workspace/client/src/services/history/historyExportService.ts, dynamic import will not move module into another chunk.


(!) Some chunks are larger than 500 kB after minification. Consider:
- Using dynamic import() to code-split the application
- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
03

Provenance & limitations

Bundle identity, attestation, verification, and claims boundary

Record details

payment
none · not merge-contingent
redactions
none recorded
Bundle contents digest
sha256:9306fe04bc177379f12143e2c91427f6f69c3071b82b2110802e5ec31d9c0167
Signed asset SHA-256
sha256:5dc6578b9845068bda4685b1a189e09ce97153cd69c21e979d621f7591c5e7a8
Signed provenance recorded
verified 2026-07-16T17:16:19.522Z

NOT INCLUDED

  • Does not prove code quality
  • Does not prove security
  • Contributor self-run record of Northset's own contribution; not the maintainer's verification.
  • The receipt proves the declared automated checks only; maintainer review and merge remain independent human decisions.

Signed bundle

Download signed bundle

Verify this receipt

gh attestation verify run-record-M-106-9306fe04bc17.tar.gz --repo northset-oss/verification-pilot --signer-workflow northset-oss/verification-pilot/.github/workflows/attest-bundle.yml

Attestation confirms that Northset's signing workflow produced this exact bundle. The signer does not witness the recorded run, and verification does not turn it into maintainer verification.

QR → receipt page
Northset contributed this fix and ran its declared checks. Contributor self-run. Not maintainer verification.

Evidence of what ran — not a verdict that the code is good.

SELF-FUNDED FIELD-TESTING.

FOR MAINTAINERS

Request a private run

Maintain an open-source project? Send Northset a PR already in your queue. We run its repository-declared checks in an isolated container and return the run record privately. We do not modify the PR. Nothing is published without your approval. Free during the pilot.

The issue form is public. Do not include secrets or private repository details there; use email instead.

Already onboarded? Add northset-verify to a PR to request a run on that PR.

Claims boundary

This page reports scoped proof-of-pass receipt evidence. It does not prove code quality, security, full CI coverage, production readiness, or maintainer approval. An attestation confirms bundle provenance; it does not broaden the receipt's claim.

Read the full Claims Boundary policy.