clocksmith commited on
Commit
fa3325d
·
verified ·
1 Parent(s): c118678

Publish qualified installed Node document search application

Browse files
document-search/node/releases/0.1.0/caa1f395d8a0943d9cd62442f87860a1ccbe6e5abb2eb3b5ff54375e4b1e1a6e/README.md ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Local document search in Node
2
+
3
+ This application uses the same document controller and search implementation as
4
+ the browser starter. Embedding and reranking stay loaded together in interactive
5
+ mode. Documents and queries stay on this machine; installation downloads the
6
+ exact signed model artifacts.
7
+
8
+ The qualified configuration is Linux x64, Node 22.22.1, `webgpu` 0.4.0, and AMD
9
+ Radeon 8060S with RADV Mesa 26.0.3. The GPU needs `shader-f16`, subgroups, and the
10
+ buffer limits declared by both Capsules. Qualification used a 122 GiB host;
11
+ minimum system memory and other GPUs are not established. Requested GPU buffer
12
+ sizes are not measurements of physical residency. Electron and Bun are separate.
13
+
14
+ Download size is approximately 2.15 GB for the two models, plus this application
15
+ and npm dependencies. Allow at least 3 GB of free private storage for models,
16
+ atomic replacement files, and a small corpus; larger corpora need additional
17
+ space. Persistent disk and reboot qualification remain outstanding. Each process
18
+ opening verifies the retained artifacts and prepares both models on the GPU.
19
+
20
+ From the extracted application directory:
21
+
22
+ ```sh
23
+ npm ci --omit=optional --no-audit --no-fund
24
+ node node.js install ./search-data
25
+ node node.js index ./search-data ./documents.json
26
+ node node.js interactive ./search-data
27
+ ```
28
+
29
+ Create `documents.json` with your own text or Markdown:
30
+
31
+ ```json
32
+ [
33
+ { "id": "notes", "title": "Project notes", "mediaType": "text/plain", "text": "The text you want to search." }
34
+ ]
35
+ ```
36
+
37
+ Keep each document's `id` stable across revisions. Indexing the same content again
38
+ reuses its embedding. Interactive mode accepts one query per line, reports its
39
+ measured duration, and keeps both models loaded. EOF closes the application.
40
+ `node node.js search ./search-data "your query"` runs one query and closes.
41
+
42
+ Ctrl-C requests cancellation. Already submitted GPU work must finish before
43
+ cleanup; cancellation is not immediate. Failed saves preserve the previous
44
+ document/index snapshot. After a device loss, close and reopen the application.
45
+ For a corrupt installation, run `node node.js repair ./search-data`; repair
46
+ verifies retained bytes and reacquires damaged artifacts. Downloads require
47
+ networking, while reopening and searching retained documents work offline.
48
+
49
+ Use a dedicated WebGPU process and one process per storage directory. The runner
50
+ rejects an existing provider rather than taking ownership of its device.
51
+ A crash leaves `.document-search.lock`
52
+ with its owner PID; confirm that process has stopped before removing the lock.
53
+ Uncommitted `*.pending` files can then be removed. Keep the directory private and
54
+ do not modify it while the application is running.
55
+
56
+ For integration, import `createNodeDocumentSearch` from `./node.js`, call
57
+ `app.controller.openRetained()` (or `install()` initially), then use
58
+ `indexDocuments()` and `search()`. Always `await app.close()` in `finally`.
59
+ Existing release checkpoints and explicit retained-local authorization remain
60
+ part of the installation; offline use cannot discover unseen revocations.
document-search/node/releases/0.1.0/caa1f395d8a0943d9cd62442f87860a1ccbe6e5abb2eb3b5ff54375e4b1e1a6e/doppler-gpu-0.6.2.tgz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:73c0d1227f5d64e2e60d78b2a14d4ecb5b90535d932cf7b184d24eaa466c6b3e
3
+ size 2153927
document-search/node/releases/0.1.0/caa1f395d8a0943d9cd62442f87860a1ccbe6e5abb2eb3b5ff54375e4b1e1a6e/doppler-node-document-search-0.1.0.tgz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:caa1f395d8a0943d9cd62442f87860a1ccbe6e5abb2eb3b5ff54375e4b1e1a6e
3
+ size 8554262
document-search/node/releases/0.1.0/caa1f395d8a0943d9cd62442f87860a1ccbe6e5abb2eb3b5ff54375e4b1e1a6e/final-clean-qualification.json ADDED
The diff for this file is too large to render. See raw diff
 
document-search/node/releases/0.1.0/caa1f395d8a0943d9cd62442f87860a1ccbe6e5abb2eb3b5ff54375e4b1e1a6e/final-cli.json ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "doppler.node-document-search-cli/v1",
3
+ "passed": true,
4
+ "failure": null,
5
+ "config": {
6
+ "applicationDir": "/var/tmp/doppler-node-search-installed-20260925-05",
7
+ "storageDir": "/dev/shm/doppler-node-search-storage-20260925-03",
8
+ "fixturePath": "/home/x/deco/doppler/artifacts/document-search-delivery-2026-09-23/reference-corpus.json",
9
+ "requiredVendor": "amd",
10
+ "install": false,
11
+ "offline": true,
12
+ "lifecycle": false,
13
+ "outputPath": "/var/tmp/doppler-search-node-20260925/final-cli.json",
14
+ "offlineKernelRequired": true,
15
+ "previousReportPath": "/var/tmp/doppler-search-node-20260925/final-clean-qualification.json"
16
+ },
17
+ "exit": {
18
+ "code": 0,
19
+ "signal": null
20
+ },
21
+ "borrowedProviderRejected": true,
22
+ "results": [
23
+ {
24
+ "query": "How should I store the culture that leavens my bread when I only bake occasionally?",
25
+ "queryMs": 1071.242502000001,
26
+ "results": [
27
+ {
28
+ "id": "sourdough",
29
+ "title": "Maintaining a sourdough starter",
30
+ "score": 20.549711227416992,
31
+ "excerpt": "# Maintaining a sourdough starter\nA starter is a living mixture of flour, water, yeast and bacteria. Feed it fresh flour and water regularly. For occasional baking, keep it refrigerated and refresh it before mixing dough. Discard any starte"
32
+ },
33
+ {
34
+ "id": "starter-motor",
35
+ "title": "What a starter motor does",
36
+ "score": 1.7680528163909912,
37
+ "excerpt": "The starter motor uses electricity from a vehicle battery to rotate the engine until combustion can continue on its own. A clicking sound with no engine rotation can indicate a weak battery or poor connection. This electrical starter does n"
38
+ },
39
+ {
40
+ "id": "tire",
41
+ "title": "Repairing a bicycle puncture",
42
+ "score": 0.917273759841919,
43
+ "excerpt": "Remove the bicycle wheel and lift one tire bead off the rim. Pull out the tube and inflate it to locate the puncture. Check the tire for glass or thorns before patching the tube or fitting a replacement. Seat the bead and inflate to the tir"
44
+ }
45
+ ]
46
+ },
47
+ {
48
+ "query": "What should I inspect before replacing the inner tube on my bike?",
49
+ "queryMs": 1194.9881900000037,
50
+ "results": [
51
+ {
52
+ "id": "tire",
53
+ "title": "Repairing a bicycle puncture",
54
+ "score": 20.673477172851562,
55
+ "excerpt": "Remove the bicycle wheel and lift one tire bead off the rim. Pull out the tube and inflate it to locate the puncture. Check the tire for glass or thorns before patching the tube or fitting a replacement. Seat the bead and inflate to the tir"
56
+ },
57
+ {
58
+ "id": "starter-motor",
59
+ "title": "What a starter motor does",
60
+ "score": 2.3796067237854004,
61
+ "excerpt": "The starter motor uses electricity from a vehicle battery to rotate the engine until combustion can continue on its own. A clicking sound with no engine rotation can indicate a weak battery or poor connection. This electrical starter does n"
62
+ },
63
+ {
64
+ "id": "sourdough",
65
+ "title": "Maintaining a sourdough starter",
66
+ "score": 2.3478808403015137,
67
+ "excerpt": "# Maintaining a sourdough starter\nA starter is a living mixture of flour, water, yeast and bacteria. Feed it fresh flour and water regularly. For occasional baking, keep it refrigerated and refresh it before mixing dough. Discard any starte"
68
+ }
69
+ ]
70
+ }
71
+ ],
72
+ "buildReceiptSha256": "5929241fca8a74c17db845d43b84c091e5ba523c51614539feb8a2826af8a8ef",
73
+ "probeSha256": "87894328a2ac0ce83a2482f61c1d134a0c2746f6345b04b6f05c105efc0876be",
74
+ "stdoutSha256": "63003e354a40aeaa8b38495e1088b902a50fadd45bc8b0e77dc54473ccc9b8ca",
75
+ "stderrSha256": "5ba3fc6bf23fd827f79ca3ec877413aadc0a982af7c67503a0566ee82b0eb1b1",
76
+ "physicalExecution": true,
77
+ "externalAdoption": false
78
+ }
document-search/node/releases/0.1.0/caa1f395d8a0943d9cd62442f87860a1ccbe6e5abb2eb3b5ff54375e4b1e1a6e/final-offline-qualification.json ADDED
The diff for this file is too large to render. See raw diff
 
document-search/node/releases/0.1.0/caa1f395d8a0943d9cd62442f87860a1ccbe6e5abb2eb3b5ff54375e4b1e1a6e/release.json ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "doppler.document-search-node-release/v1",
3
+ "passed": true,
4
+ "createdAtUtc": "2026-09-25T14:27:24.729Z",
5
+ "archive": {
6
+ "filename": "doppler-node-document-search-0.1.0.tgz",
7
+ "sha256": "caa1f395d8a0943d9cd62442f87860a1ccbe6e5abb2eb3b5ff54375e4b1e1a6e",
8
+ "sizeBytes": 8554262
9
+ },
10
+ "runtime": {
11
+ "version": "0.6.2",
12
+ "sha256": "73c0d1227f5d64e2e60d78b2a14d4ecb5b90535d932cf7b184d24eaa466c6b3e",
13
+ "sizeBytes": 2153927,
14
+ "source": "separately qualified vendored candidate; npm registry unchanged"
15
+ },
16
+ "buildReceiptSha256": "5929241fca8a74c17db845d43b84c091e5ba523c51614539feb8a2826af8a8ef",
17
+ "models": [
18
+ {
19
+ "role": "embedding",
20
+ "identity": {
21
+ "schema": "doppler.capsule/v3",
22
+ "capsuleId": "qwen-3-embedding-0-6b-f16-af32-capsule-v3-055c6df34d6a0b831a570caeed55847dbe9d93578f01d630587b0a241d423f13",
23
+ "semanticRoot": "sha256:055c6df34d6a0b831a570caeed55847dbe9d93578f01d630587b0a241d423f13",
24
+ "envelopeDigest": "sha256:b55dac90d845ca16e252d50b79d4009fda8fcd8834d023d1308da1b5091ea310",
25
+ "artifactClosureDigest": "sha256:6459bfac1fa531ef32bdebc9a7947149cea72e85782e2cd4d5096ffb6eaa1bcf"
26
+ }
27
+ },
28
+ {
29
+ "role": "reranker",
30
+ "identity": {
31
+ "schema": "doppler.capsule/v3",
32
+ "capsuleId": "qwen-3-reranker-0-6b-q4k-ehf16-af32-capsule-v3-86fd4533703b22f8a9ba875d5da62e2968bb3c2d7450ea25c6a816ca896283a5",
33
+ "semanticRoot": "sha256:86fd4533703b22f8a9ba875d5da62e2968bb3c2d7450ea25c6a816ca896283a5",
34
+ "envelopeDigest": "sha256:bd85fb9d46280d8ed4bff1a6df58638c1d64430f8fa50fd7ffd03ed0924c1026",
35
+ "artifactClosureDigest": "sha256:b2ce8fb7b5ffb60301d06351da485590a5321cbdb66fa3038d087619d541cf59"
36
+ }
37
+ }
38
+ ],
39
+ "hardware": {
40
+ "vendor": "amd",
41
+ "architecture": "rdna-3",
42
+ "device": "radeon-8060s-graphics-radv-strix-halo-",
43
+ "description": "radv: Mesa 26.0.3-1ubuntu1",
44
+ "isFallbackAdapter": false
45
+ },
46
+ "nodeVersion": "v22.22.1",
47
+ "provider": {
48
+ "provider": "webgpu",
49
+ "version": "0.4.0",
50
+ "binary": "dist/linux-x64.dawn.node",
51
+ "sha256": "fbfe599055b469963e4c9bfc900a702843db962dcaba0799b3c81ae33fa43db1",
52
+ "sizeBytes": 18617336
53
+ },
54
+ "npmVersion": "9.2.0",
55
+ "checks": {
56
+ "cleanInstallation": true,
57
+ "publicShardDownloads": 32,
58
+ "installedAssetInventory": true,
59
+ "twoModelsResident": true,
60
+ "unchangedDocumentReuse": true,
61
+ "repeatedSearch": true,
62
+ "cancelledIndexAfterSubmission": {
63
+ "passed": true,
64
+ "submissions": 12
65
+ },
66
+ "cancelledQueryAfterSubmission": {
67
+ "passed": true,
68
+ "submissions": 12
69
+ },
70
+ "supersededQuery": true,
71
+ "interruptedSave": true,
72
+ "explicitClosure": true,
73
+ "corruptionRepair": true,
74
+ "deviceLossRecovery": true,
75
+ "offlineRestart": true,
76
+ "offlineRequests": 0,
77
+ "kernelSocketDenials": [
78
+ {
79
+ "host": "127.0.0.1",
80
+ "error": "EPERM"
81
+ },
82
+ {
83
+ "host": "::1",
84
+ "error": "EPERM"
85
+ }
86
+ ],
87
+ "interactiveCli": true,
88
+ "borrowedProviderRejected": true
89
+ },
90
+ "timings": {
91
+ "initialInstallationMs": 223935.22875100002,
92
+ "coldIndexMs": 2219.9216650000017,
93
+ "firstQueryMs": 973.585665999999,
94
+ "subsequentQueryMedianMs": 1003.5095719999954,
95
+ "offlineReopenMs": 50906.993127
96
+ },
97
+ "memory": {
98
+ "sampledPeakProcessRssBytes": 3266555904,
99
+ "processHighWaterRssBytes": 3266555904,
100
+ "gpu": {
101
+ "submitCalls": 1293,
102
+ "createdBufferBytes": 33507633344,
103
+ "liveRequestedBufferBytes": 0,
104
+ "peakRequestedBufferBytes": 3989755736
105
+ },
106
+ "gpuScope": "Requested buffer allocation sizes and explicit destruction; not measured physical GPU residency."
107
+ },
108
+ "conditions": {
109
+ "storageFilesystem": {
110
+ "type": 16914836,
111
+ "rebootTested": false,
112
+ "physicalGpuResidencyMeasured": false
113
+ },
114
+ "systemUsableRamGiB": 122,
115
+ "repositoryCheckConcurrentWithPartOfQualification": true,
116
+ "timingScope": "Observed qualification diagnostics, not a controlled throughput comparison or minimum hardware claim."
117
+ },
118
+ "limitations": {
119
+ "diskBackedBrowserAcceptance": false,
120
+ "rebootAcceptance": false,
121
+ "minimumSystemMemoryEstablished": false,
122
+ "physicalGpuResidencyMeasured": false,
123
+ "externalAdoption": false,
124
+ "electronQualified": false,
125
+ "bunQualified": false
126
+ },
127
+ "evidence": {
128
+ "final-clean-qualification.json": "7bd0ea8cdde71cfba1f5b9fb1baa8af1815263f25489e27305855ab46a3e93e8",
129
+ "final-offline-qualification.json": "f9b903544a262d22f0265b1bb095399d96ff8d1e09116534ad0282b1483d2549",
130
+ "final-cli.json": "e77a40180b484caf6dfaea42752fb1aed17edd8dd230b0fb02c75a1308168742",
131
+ "build-receipt.json": "5929241fca8a74c17db845d43b84c091e5ba523c51614539feb8a2826af8a8ef"
132
+ }
133
+ }