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
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.
- ATTEMPT 1
M-100FAILED AUTHORauthoring - ATTEMPT 2
M-103FAILED ORACLEverification - ATTEMPT 3
M-106READY
ATTEMPT 3 / EXECUTION ANATOMY
03 / ECONOMIC NARRATIVE
Economic identity
Observed sponsorship, authorization, scope, transfer, and outcome. No estimates or inferred value.
01 / MANDATE
Sponsored and authorized
The recorded mandate names both its sponsor and initiative, with authorization tied to a named approver and approval time.
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.
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.
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
No complete total is recorded; see the missing or unpriced component record above.
Evidence annexEconomic · technical · provenance · limitations
01Economic evidence
Lineage, usage, caps, outcome, and cost provenance
Economic evidence
Lineage, usage, caps, outcome, and cost provenanceAttempt lineage
M-100attempt 1 · FAILED AUTHOR · authoringM-103attempt 2 · FAILED ORACLE · verificationM-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
02Technical evidence
Code, environment, exact commands, patch, and outputs
Technical evidence
Code, environment, exact commands, patch, and outputsProject
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
corepack pnpm@8.15.5 --dir client test:unit -- src/__tests__/utils/fetchWithTimeout.test.tsexit 0 · 18s
corepack pnpm@8.15.5 --dir client exec tsc --noEmitexit 0 · 20.1s
corepack pnpm@8.15.5 --dir client build:clientexit 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"
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.8 [39m[90m/workspace/client[39m
[32m✓[39m src/__tests__/services/audioFocus.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 9[2mms[22m[39m
[90mstdout[2m | src/__tests__/adapters/seedAdapter.test.tsx
[22m[39m[uiStore] Hydrated from localStorage: {
modals: {
menuOpen: [33mfalse[39m,
figureCarouselOpen: [33mfalse[39m,
historyOpen: [33mfalse[39m,
seedsOpen: [33mfalse[39m,
modeSelectorOpen: [33mfalse[39m,
onboardingOpen: [33mfalse[39m,
wisdomGalleryOpen: [33mfalse[39m,
councilSetupOpen: [33mfalse[39m
},
helpDismissedKeys: []
}
[90mstdout[2m | src/__tests__/adapters/seedAdapter.test.tsx
[22m[39m[AudioQueue] module instance [33m1[39m
[2m[90m↓[39m[22m src/__tests__/adapters/seedAdapter.test.tsx [2m([22m[2m2 tests[22m[2m | [22m[33m2 skipped[39m[2m)[22m
[32m✓[39m src/__tests__/critical/translationSystem.test.tsx [2m([22m[2m8 tests[22m[2m)[22m[32m 184[2mms[22m[39m
[32m✓[39m src/__tests__/critical/seedLoading.test.tsx [2m([22m[2m6 tests[22m[2m)[22m[32m 29[2mms[22m[39m
[90mstdout[2m | src/__tests__/utils/modeStateManager.test.ts
[22m[39m[uiStore] Hydrated from localStorage: {
modals: {
menuOpen: [33mfalse[39m,
figureCarouselOpen: [33mfalse[39m,
historyOpen: [33mfalse[39m,
seedsOpen: [33mfalse[39m,
modeSelectorOpen: [33mfalse[39m,
onboardingOpen: [33mfalse[39m,
wisdomGalleryOpen: [33mfalse[39m,
councilSetupOpen: [33mfalse[39m
},
helpDismissedKeys: []
}
[32m✓[39m src/__tests__/utils/modeStateManager.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
[32m✓[39m src/__tests__/critical/figureSelection.test.tsx [2m([22m[2m5 tests[22m[2m)[22m[32m 24[2mms[22m[39m
[90mstdout[2m | src/__tests__/services/SeedStateManager.test.ts[2m > [22m[2mSeedStateManager[2m > [22m[2mdetects gathered seeds via LocalStorageAdapter
[22m[39mSeed gathered: plato/42
[90mstdout[2m | src/__tests__/services/SeedStateManager.test.ts[2m > [22m[2mSeedStateManager[2m > [22m[2mdumps completion records using adapter accessors
[22m[39m=== SEED COMPLETION RECORDS ===
completion_plato_1 = true
Total completion records: 1
==============================
[32m✓[39m src/__tests__/services/SeedStateManager.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 5[2mms[22m[39m
[32m✓[39m src/__tests__/utils/fetchWithTimeout.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
[2m Test Files [22m [1m[32m7 passed[39m[22m[2m | [22m[33m1 skipped[39m[90m (8)[39m
[2m Tests [22m [1m[32m38 passed[39m[22m[2m | [22m[33m2 skipped[39m[90m (40)[39m
[2m Start at [22m 17:06:00
[2m Duration [22m 15.41s[2m (transform 3.15s, setup 1.97s, import 4.89s, tests 261ms, environment 6.33s)[22m
=== 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
[36mvite v7.3.5 [32mbuilding client environment for production...[36m[39m
transforming...
[32m✓[39m 5006 modules transformed.
rendering chunks...
computing gzip size...
[2mbuild/[22m[32mindex.html [39m[1m[2m 7.06 kB[22m[1m[22m[2m │ gzip: 2.45 kB[22m
[2mbuild/[22m[2massets/[22m[35mindex-B15wYv-9.css [39m[1m[2m 3.12 kB[22m[1m[22m[2m │ gzip: 0.99 kB[22m
[2mbuild/[22m[2massets/[22m[35mindex-BTURdDUJ.css [39m[1m[2m 4.58 kB[22m[1m[22m[2m │ gzip: 1.14 kB[22m
[2mbuild/[22m[2massets/[22m[35mindex-DNT4t31o.css [39m[1m[2m 4.65 kB[22m[1m[22m[2m │ gzip: 1.59 kB[22m
[2mbuild/[22m[2massets/[22m[35mPrismPlayer-BoKTCWVy.css [39m[1m[2m 10.74 kB[22m[1m[22m[2m │ gzip: 2.43 kB[22m
[2mbuild/[22m[2massets/[22m[35mWelcomeDisclosureModal-B6138XpU.css [39m[1m[2m 17.12 kB[22m[1m[22m[2m │ gzip: 3.95 kB[22m
[2mbuild/[22m[2massets/[22m[35mindex-BvtZ_1YX.css [39m[1m[2m 20.88 kB[22m[1m[22m[2m │ gzip: 4.47 kB[22m
[2mbuild/[22m[2massets/[22m[35mWisdomGalleryModal-BzTa-CaT.css [39m[1m[2m 21.51 kB[22m[1m[22m[2m │ gzip: 4.40 kB[22m
[2mbuild/[22m[2massets/[22m[35mStoryPlayer-RLictRzs.css [39m[1m[2m 25.60 kB[22m[1m[22m[2m │ gzip: 4.87 kB[22m
[2mbuild/[22m[2massets/[22m[35mSettingsModal-0IbRe1hN.css [39m[1m[2m 36.97 kB[22m[1m[22m[2m │ gzip: 6.80 kB[22m
[2mbuild/[22m[2massets/[22m[35mindex-BepB4aGm.css [39m[1m[2m119.75 kB[22m[1m[22m[2m │ gzip: 20.99 kB[22m
[2mbuild/[22m[2massets/[22m[35mHomePage-B52D2oeb.css [39m[1m[2m400.40 kB[22m[1m[22m[2m │ gzip: 61.75 kB[22m
[2mbuild/[22m[2massets/[22m[36muserState-BkfjtOFD.js [39m[1m[2m 1.01 kB[22m[1m[22m[2m │ gzip: 0.49 kB[22m
[2mbuild/[22m[2massets/[22m[36mFigureController-CKRy-uzg.js [39m[1m[2m 1.12 kB[22m[1m[22m[2m │ gzip: 0.55 kB[22m
[2mbuild/[22m[2massets/[22m[36mWarningCircle.es-C6UINtAk.js [39m[1m[2m 1.84 kB[22m[1m[22m[2m │ gzip: 0.64 kB[22m
[2mbuild/[22m[2massets/[22m[36mselfHostedTTS-D6s3LV-W.js [39m[1m[2m 2.24 kB[22m[1m[22m[2m │ gzip: 1.19 kB[22m
[2mbuild/[22m[2massets/[22m[36museAudio-ghT1Gmdt.js [39m[1m[2m 3.20 kB[22m[1m[22m[2m │ gzip: 1.31 kB[22m
[2mbuild/[22m[2massets/[22m[36mindex-ChtyRdLD.js [39m[1m[2m 3.87 kB[22m[1m[22m[2m │ gzip: 2.08 kB[22m
[2mbuild/[22m[2massets/[22m[36mindex-B5zTWrTf.js [39m[1m[2m 4.34 kB[22m[1m[22m[2m │ gzip: 1.81 kB[22m
[2mbuild/[22m[2massets/[22m[36mparser--xEah0jm.js [39m[1m[2m 5.00 kB[22m[1m[22m[2m │ gzip: 1.83 kB[22m
[2mbuild/[22m[2massets/[22m[36men-Bd_DRCC5.js [39m[1m[2m 5.80 kB[22m[1m[22m[2m │ gzip: 2.53 kB[22m
[2mbuild/[22m[2massets/[22m[36mde-DigxyS7v.js [39m[1m[2m 6.53 kB[22m[1m[22m[2m │ gzip: 2.98 kB[22m
[2mbuild/[22m[2massets/[22m[36mhistoryClearService-B9ioXapB.js [39m[1m[2m 6.74 kB[22m[1m[22m[2m │ gzip: 1.91 kB[22m
[2mbuild/[22m[2massets/[22m[36men-CagRTBXx.js [39m[1m[2m 8.06 kB[22m[1m[22m[2m │ gzip: 3.35 kB[22m
[2mbuild/[22m[2massets/[22m[36mde-DKVtMOS7.js [39m[1m[2m 8.80 kB[22m[1m[22m[2m │ gzip: 3.71 kB[22m
[2mbuild/[22m[2massets/[22m[36mWelcomeDisclosureModal-B50W8SFE.js [39m[1m[2m 8.82 kB[22m[1m[22m[2m │ gzip: 3.01 kB[22m
[2mbuild/[22m[2massets/[22m[36mui-en-D-d7OL0J.js [39m[1m[2m 9.60 kB[22m[1m[22m[2m │ gzip: 4.23 kB[22m
[2mbuild/[22m[2massets/[22m[36mui-de-C2rt6OkN.js [39m[1m[2m 10.51 kB[22m[1m[22m[2m │ gzip: 4.63 kB[22m
[2mbuild/[22m[2massets/[22m[36mindex-teaMivPW.js [39m[1m[2m 11.36 kB[22m[1m[22m[2m │ gzip: 3.57 kB[22m
[2mbuild/[22m[2massets/[22m[36mWisdomGalleryModal-DmerJKxA.js [39m[1m[2m 15.28 kB[22m[1m[22m[2m │ gzip: 5.83 kB[22m
[2mbuild/[22m[2massets/[22m[36mindex-IA5_bqg1.js [39m[1m[2m 21.85 kB[22m[1m[22m[2m │ gzip: 7.54 kB[22m
[2mbuild/[22m[2massets/[22m[36mStoryPlayer-wVXbKij2.js [39m[1m[2m 32.76 kB[22m[1m[22m[2m │ gzip: 9.56 kB[22m
[2mbuild/[22m[2massets/[22m[36mindex-Bivp0FNE.js [39m[1m[2m 43.67 kB[22m[1m[22m[2m │ gzip: 14.34 kB[22m
[2mbuild/[22m[2massets/[22m[36mui-en-BkZuBSJN.js [39m[1m[2m 72.03 kB[22m[1m[22m[2m │ gzip: 26.76 kB[22m
[2mbuild/[22m[2massets/[22m[36mui-de-BB4putMa.js [39m[1m[2m 80.58 kB[22m[1m[22m[2m │ gzip: 29.69 kB[22m
[2mbuild/[22m[2massets/[22m[36mSettingsModal-BIbpfHvw.js [39m[1m[2m176.81 kB[22m[1m[22m[2m │ gzip: 42.19 kB[22m
[2mbuild/[22m[2massets/[22m[36mindex-vMcxIQW-.js [39m[1m[33m587.85 kB[39m[22m[2m │ gzip: 187.22 kB[22m
[2mbuild/[22m[2massets/[22m[36mHomePage-DgapNi-5.js [39m[1m[33m691.15 kB[39m[22m[2m │ gzip: 188.03 kB[22m
[32m✓ built in 9.20s[39m
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.
[33m[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.
[39m
[33m[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.
[39m
[33m[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.
[39m
[33m[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.
[39m
[33m[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.
[39m
[33m[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.
[39m
[33m[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.
[39m
[33m[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.
[39m
[33m
(!) 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.[39m
03Provenance & limitations
Bundle identity, attestation, verification, and claims boundary
Provenance & limitations
Bundle identity, attestation, verification, and claims boundaryRecord 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
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.ymlAttestation 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