arkiv-images 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md CHANGED
@@ -2,7 +2,7 @@ Edit instructions only in AGENTS.md; CLAUDE.md only imports this file.
2
2
 
3
3
  # Integrating arkiv-images
4
4
 
5
- Read [README.md](README.md) explicitly for the public API, runnable local example, data model, limits, signing and recovery. Version 1.0.0 is a candidate until verification/publication evidence says otherwise.
5
+ Read [README.md](README.md) explicitly for the public API, runnable local example, data model, limits, signing and recovery. Install version 1.0.2 with `npm install arkiv-images@1.0.2 @arkiv-network/sdk@1.0.0 viem@2.56.3`.
6
6
 
7
7
  - Ask whether the task needs local inspection, retrieval or a new public upload. Inspection requires no network. Retrieval needs an image key, Rabdi and optionally an independently trusted SHA-256. Writes additionally require a locally configured signing wallet and test funds.
8
8
  - Ask whether original bytes, filename and metadata are safe to publish. EXIF/GPS is preserved. Stop if confidentiality is required; encryption is a different tool.
@@ -13,5 +13,6 @@ Read [README.md](README.md) explicitly for the public API, runnable local exampl
13
13
  - Serialize account writes. Recheck browser wallet identity/network before each signature, including the final root. Confirm completion only after storeImage resolves. Preserve error imageKey/manifestKey/transactionHashes, including CONFIRMATION_PENDING. Never display raw provider errors or causes.
14
14
  - No independent part mutation, transfer or extension. Root existence does not prove chunk availability; expiration does not erase historical copies.
15
15
  - Sample reads keep the access key server-side in its own endpoint. Browser writes use the visitor's configured wallet RPC; no shared server signer.
16
- - Verify the exact local example, public types, meaningful controlled failure cases, requested live network flow and original/retrieved byte equality. Distinguish controlled RPC, packed candidate and registry release. Inspect sample empty/loading/error/recovered states at narrow/medium/wide widths.
16
+ - Verify the exact local example, public types, meaningful controlled failure cases, requested live network flow and original/retrieved byte equality. Distinguish controlled RPC, packed archive and registry release. Inspect sample empty/loading/error/recovered states at narrow/medium/wide widths.
17
17
  - Keep AGENTS.md, CLAUDE.md and verification in the npm publication allowlist. Explicitly provide consumers the sample guides. No new skill, MCP, generator, encryption or media-management features belong here.
18
+
package/CHANGELOG.md CHANGED
@@ -1,6 +1,16 @@
1
1
  # Changelog
2
2
 
3
- ## 1.0.0 — candidate
3
+ ## 1.0.2
4
+
5
+ - Use the long-lived JPEG example, filter expired examples by current block, align VERSION guidance and verify archives using package.json.
6
+
7
+ > Historical version entries below are preserved as recorded; use README.md for the current release.
8
+
9
+ ## 1.0.1 — 2026-10-31
10
+
11
+ - Correct README vocabulary and package installation guidance for MCP importer compatibility. No runtime changes; the exported implementation `VERSION` remains 1.0.0.
12
+
13
+ ## 1.0.0 — 2026-10-31
4
14
 
5
15
  - Breaking: SDK 1.0.0 peer requirement and Rabdi testnet, chain ID 7794095.
6
16
  - Breaking: named `arkiv-images/v2` schema with non-indexed binary data and typed columns. Older image formats are not read by this release.
@@ -10,4 +20,4 @@
10
20
  - Persistent createImageWriteOperation state across UI renders/clicks. Submitted hashes are recorded before receipt rechecks; uncertain, successful and terminal results cannot trigger another send for the same operation.
11
21
  - Sample read proxy keeps its access key server-side; the visitor signs through their own configured wallet RPC. Idempotent synthetic PNG/JPEG seed with a persistent unresolved-write journal.
12
22
 
13
- This candidate is not published. Validation status is documented in docs/verification.md.
23
+ Published from the separately reviewed tarball. Registry and source validation are documented in docs/verification.md.
package/README.md CHANGED
@@ -2,18 +2,18 @@
2
2
 
3
3
  Store a public PNG or JPEG as queryable Arkiv entities, then retrieve its original bytes with size, MIME, dimensions and SHA-256 checks. Small images use one entity with a non-indexed `bytes()` column. Larger images use `arkiv-chunking`: an image entity references a file manifest and ordered immutable chunks.
4
4
 
5
- **1.0.0 is a candidate, pending verification and publication. Intended for Rabdi testnet only.** The published release remains separate from this source candidate. See [verification](docs/verification.md) for actual results and blockers.
5
+ **arkiv-images 1.0.2 targets Rabdi testnet.** It stores PNG/JPEG binary data in `bytes` columns. See [verification](docs/verification.md) for reproducible checks and separately labelled historical observations.
6
6
 
7
7
  ## Install and inspect
8
8
 
9
- ESM, Node 22.10+ with Web Crypto, or a browser on HTTPS/localhost. Candidate dependencies: SDK 1.0.0, viem 2.56.3, arkiv-chunking 1.1.0. Install the packed candidate until 1.0.0 is published:
9
+ ESM, Node 22.10+ with Web Crypto, or a browser on HTTPS/localhost. Tested dependencies: SDK 1.0.0, viem 2.56.3, arkiv-chunking 1.1.0.
10
10
 
11
11
  ```sh
12
12
  mkdir image-consumer
13
13
  cd image-consumer
14
14
  npm init -y
15
15
  npm pkg set type=module
16
- npm install /absolute/path/arkiv-images-1.0.0.tgz @arkiv-network/sdk@1.0.0 viem@2.56.3
16
+ npm install arkiv-images@1.0.2 @arkiv-network/sdk@1.0.0 viem@2.56.3
17
17
  ```
18
18
 
19
19
  Save `inspect.mjs`:
@@ -76,7 +76,7 @@ Run `node roundtrip.mjs` after configuring those environment variables locally.
76
76
  | `ImageSchema`, `IMAGE_TYPE` | SDK 1.0 named schema `arkiv-images/v2`. Binary `data` is stored without an index. Indexed type/mode/mime/sha256/manifest support discovery. Filename, size and dimensions are stored typed columns. |
77
77
  | `ImageStorageError`, `ChunkingError` | Safe code/message; preserve imageKey/manifestKey and transactionHashes on failure. Raw causes can include provider details: never display or log them. |
78
78
  | `TransactionParameterPolicy`, `Progress` | Public TypeScript integration types re-exported from chunking. |
79
- | `VERSION`, `INLINE_MAX_BYTES`, `MAX_IMAGE_BYTES`, `MAX_IMAGE_PIXELS`, `MAX_EXPIRATION_BLOCKS`, `RABDI_MAX_LIFETIME_BLOCKS`, `EXPIRATION_INCLUSION_MARGIN_BLOCKS` | Package version and enforced limits. |
79
+ | `VERSION`, `INLINE_MAX_BYTES`, `MAX_IMAGE_BYTES`, `MAX_IMAGE_PIXELS`, `MAX_EXPIRATION_BLOCKS`, `RABDI_MAX_LIFETIME_BLOCKS`, `EXPIRATION_INCLUSION_MARGIN_BLOCKS` | Implementation version (`1.0.2`) and enforced limits. |
80
80
 
81
81
  Import types such as `ImageInfo`, `ImagePlan`, `StoreImageOptions`, `StoredImage`, `RetrieveImageOptions`, `RetrievedImage`, `ImageContentType` and `ImageErrorCode` directly from `arkiv-images`.
82
82
 
@@ -88,7 +88,7 @@ Entity Expiration is whole blocks, at least `max(64, transactionCount + 32)` and
88
88
 
89
89
  Every part and the final root reuse the public `arkiv-chunking` write policy: an unsigned SDK request is estimated at `latest`; gas is at least `max(1_000_000, 2 × estimate)`, with explicit network gasPrice and a fresh latest nonce. The image API additionally stops before signing if that budget exceeds half the latest block gas limit. Longer expiration can substantially increase gas, so shorten Entity Expiration or choose a smaller image if the estimate exceeds that budget. Admitted byte/lifetime limits do not guarantee every combination fits the network's gas budget. `txParams` can increase gas or change fees; it cannot remove required headroom or override the latest nonce. Wallet account/network are checked before every signature.
90
90
 
91
- Serialize writes from the same account. A retry is permitted only once after an authoritative gas-exhausted reverted receipt and only within the half-block gas ceiling. Successful or uncertain writes are never automatically resent. `CONFIRMATION_PENDING` preserves SDK-success hashes and root/manifest keys if a later receipt lookup is unresolved or disagrees. The operation records submitted before that lookup. Browser consumers must keep a `createImageWriteOperation` object across renders and later clicks; `storeImage` is a one-call convenience for an intentional new upload. Inspect preserved receipts before explicitly creating another operation. The sample resets the operation only when you choose a file again. Other failures can also leave confirmed entities. There is no multi-transaction atomicity, rollback, resumable upload, independent part mutation/transfer/extension or automatic cleanup.
91
+ Serialize writes from the same account. A retry is permitted only once after an authoritative gas-exhausted reverted receipt and only within the half-block gas ceiling. Successful or uncertain writes are never automatically resent. `CONFIRMATION_PENDING` preserves SDK-success hashes and root/manifest keys if a later receipt lookup is unresolved or disagrees. The operation enters `submitted` before that lookup. Browser consumers must keep a `createImageWriteOperation` object across renders and later clicks; `storeImage` is a one-call convenience for an intentional new upload. Inspect preserved receipts before explicitly creating another operation. The sample resets the operation only when you choose a file again. Other failures can also leave confirmed entities. There is no multi-transaction atomicity, rollback, resumable upload, independent part mutation/transfer/extension or automatic cleanup.
92
92
 
93
93
  Retrieval uses latest-state keyset pages and verifies immutable chunks, owner/creator, sequence, lengths, metadata and digest; the manifest is rechecked before return. It does not claim a historical snapshot. An independently trusted digest pins bytes, not the publisher's identity. Missing/corrupt chunks never return a partial image.
94
94
 
@@ -109,7 +109,7 @@ The package checks containers, not full PNG CRC/JPEG entropy decoding or malware
109
109
 
110
110
  ## Sample and development
111
111
 
112
- The [sample README](sample/README.md) explains the existing `arkiv-images-example` project, preview status and visitor-wallet setup. Reads use its own bounded `/api/rpc` endpoint and a server-side `ARKIV_ACCESS_KEY`; the visitor configures their own wallet RPC. No server signer. Candidate previews consume the packed candidate; registry releases must be verified separately.
112
+ The [sample README](sample/README.md) explains the existing `arkiv-images-example` project and visitor-wallet setup. Reads use its own bounded `/api/rpc` endpoint and a server-side `ARKIV_ACCESS_KEY`; the visitor configures their own wallet RPC. No server signer. The sample pins the released registry package `arkiv-images@1.0.0`.
113
113
 
114
114
  Give consumer agents [AGENTS.md](AGENTS.md) and [sample/AGENTS.md](sample/AGENTS.md) explicitly. The corresponding CLAUDE.md files only import those guides.
115
115
 
@@ -123,4 +123,5 @@ npm pack
123
123
 
124
124
  Tests distinguish controlled RPC, live Rabdi, packed installs and npm publication in [verification](docs/verification.md). Seed synthetic data with `node scripts/seed-rabdi.mjs` after build and local key configuration; it discovers matching live entities and never retries unresolved journal entries. Keep `.seed-rabdi-state.json` private and persistent between runs.
125
125
 
126
- Breaking format changes are in [CHANGELOG.md](CHANGELOG.md). Historical evidence under docs stays dated; it is not validation of this candidate.
126
+ Breaking format changes are in [CHANGELOG.md](CHANGELOG.md). Historical evidence under docs stays dated; current checks are specified separately.
127
+
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { type Column, type Schema, type TypeTag } from '@arkiv-network/sdk/schema';
2
2
  import { type TransactionParameterPolicy, type ChunkingPublicClient, type ChunkingWalletClient, type Progress } from 'arkiv-chunking';
3
3
  import { type Hex } from 'viem';
4
- export declare const VERSION = "1.0.0";
4
+ export declare const VERSION = "1.0.2";
5
5
  export declare const IMAGE_TYPE = "arkiv-images/v2";
6
6
  type Stored<T extends TypeTag> = Column<T, false, false, false>;
7
7
  type Indexed<T extends TypeTag> = Column<T, true, false, false>;
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import { bytes as binary, defineSchema, key, str, u64 } from '@arkiv-network/sdk
3
3
  import { eq } from '@arkiv-network/sdk/query';
4
4
  import { uploadFile, downloadFile, hashFile, ChunkingError, DEFAULT_CHUNK_BYTES, MAX_EXPIRATION_BLOCKS, writeWithPolicy, WriteConfirmationPendingError } from 'arkiv-chunking';
5
5
  import { hexToBytes } from 'viem';
6
- export const VERSION = '1.0.0';
6
+ export const VERSION = '1.0.2';
7
7
  export const IMAGE_TYPE = 'arkiv-images/v2';
8
8
  export const ImageSchema = defineSchema(IMAGE_TYPE, {
9
9
  type: str().indexed(), mode: str().indexed(), mime: str().indexed(), sha256: str().indexed(),
@@ -1,6 +1,16 @@
1
- # Rabdi candidate verification
1
+ # Verify arkiv-images 1.0.2
2
2
 
3
- Candidate: **arkiv-images 1.0.0**, SDK **1.0.0**, viem **2.56.3**, exact registry **arkiv-chunking 1.1.0**. This source candidate is not an npm publication or production deployment. Review approval is required before either.
3
+ Use Node 22.10+ on the DGX. From this checkout run `npm ci --no-audit --no-fund`, then `node scripts/verify-candidate.mjs`. The script reads package.json, runs library gates, packs that exact version, installs it in a private clean consumer, checks runtime VERSION and public TypeScript imports, and builds an isolated copy of the sample using the same archive. It preserves the sample registry pin and lockfile.
4
+
5
+ To check a registry installation of the same version, run `node scripts/verify-candidate.mjs --registry`. It verifies registry shasum/integrity and byte equality with this source build. Both modes require the registered DGX job private TMPDIR and perform no chain writes. Run `node scripts/vocabulary-guard.mjs` and `node scripts/vocabulary-build-mutation.mjs` for complete-tree and source-to-bundle checks.
6
+
7
+ The public example selects the longer-lived inline JPEG `0x2989bda8bbadfe7e22a0b1e3a435aa3b266106adbbca3f97c162ee4eccca8488` and filters entries using the current block. The short-lived PNG and chunked examples in the old measurements have expired; those measurements are not an availability promise.
8
+
9
+ > Historical 1.0.0 measurements and procedure below are preserved from 51f4905; use the current procedure above for 1.0.2.
10
+
11
+ # Rabdi release verification
12
+
13
+ Release: **arkiv-images 1.0.0**, SDK **1.0.0**, viem **2.56.3**, exact registry **arkiv-chunking 1.1.0**. The separately approved tarball was published without rebuilding: SHA-256 `c4c5417edb32179f7cc2f39b2e959711103925f019a0bd0ba62e84593826c110`, npm shasum `ff85d022ad0d3e074f002fec06a52cb2914b1d34`. Registry installation is checked independently from the earlier candidate installation.
4
14
 
5
15
  ## Library and operation tests
6
16
 
@@ -39,8 +49,8 @@ Long expiration materially affects estimates: unsigned 120,000/100,000/70,000-by
39
49
 
40
50
  ## Artifacts and sample gate
41
51
 
42
- `node scripts/verify-candidate.mjs` requires live evidence, runs the library gates, packs the publication allowlist, installs that exact tarball in a clean consumer, runs the exact README inspection example and public TypeScript imports, refreshes the sample lock from the registry and builds the sample. Its artifact report records SHA-256/SHA-512 and distinguishes a packed candidate from a registry release. The sample pins chunking 1.1.0 directly and consumes the packed image candidate.
52
+ `node scripts/verify-candidate.mjs --registry` requires the existing live evidence, runs library gates, verifies the registry archive against the approved SHA-256/SHA-512/shasum, installs exact registry 1.0.0 in a clean consumer and runs the exact README inspection example, public TypeScript imports and linked-guide presence checks. It compares installed JavaScript with the built source, performs a clean sample install and builds it. Its registry artifact report distinguishes these checks from the earlier packed-candidate tests. The sample pins registry images 1.0.0 and chunking 1.1.0 directly; no local tarball is used.
43
53
 
44
- The preview uses the existing arkiv-images-example project. Read access is through its bounded server-side endpoint with a server-only access key; browser writes use the visitor's configured Rabdi wallet. Hydrated preview validation and its deployment ID are recorded in the PR's validation report. Live browser retrieval, local input/decode failures and controlled wallet/operation tests are different checks; neither replaces the other. No npm publish, production deploy, tag, merge or release belongs to this candidate review.
54
+ The sample uses the existing arkiv-images-example project. Read access is through its bounded server-side endpoint with a server-only access key; browser writes use the visitor's configured Rabdi wallet. Hydrated deployment validation, production and rollback IDs are recorded separately in the release handoff. Live browser retrieval, local input/decode failures and controlled wallet/operation tests are different checks; neither replaces the other. Browser-wallet signing was not exercised in the migration checks.
45
55
 
46
56
  Historical dated evidence remains under docs and is not validation of this release. The previous chunking 1.0.0 public-export failure was resolved by the separately published 1.1.0; no private dependency import, copied gas policy or relaxed acceptance rule was used.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkiv-images",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Store public PNG and JPEG images as Arkiv entities and retrieve verified original bytes.",
5
5
  "type": "module",
6
6
  "exports": {
package/sample/AGENTS.md CHANGED
@@ -4,7 +4,7 @@ Edit instructions only in AGENTS.md; CLAUDE.md only imports this file.
4
4
 
5
5
  Read README.md here and the package README/AGENTS.md before changing the sample. Preserve its existing visual design and English Arkiv copy.
6
6
 
7
- - Candidate previews consume the root packed candidate; after publication use the verified exact npm release. Never import sibling source or duplicate package storage, chunking or transaction policy.
7
+ - Run `npm ci` in sample; it pins the registry release arkiv-images 1.0.0, SDK 1.0.0 and chunking 1.1.0. Never import sibling source or duplicate package storage, chunking or transaction policy.
8
8
  - Retrieval is read-only through /api/rpc. Set ARKIV_ACCESS_KEY server-side only; no browser access key, arbitrary RPC destination, signing method, batch request, historical-state query or raw provider error may pass the proxy.
9
9
  - Browser writes use MetaMask/Rabby and the visitor's account/Rabdi RPC. Ask the visitor to configure their own key in their wallet if Rabdi is missing. Never request a private key or add a server signer. Guard account/network before each signature; never switch halfway through a write.
10
10
  - Keep the selected file's createImageWriteOperation across clicks/re-renders, including failed or uncertain results. Setup runs after its sending guard is stored. Only an explicit new file choice creates another upload operation. Preserve submitted hashes before receipt rechecks; only an authoritative gas-exhausted revert permits the shared policy's one bounded retry.
package/sample/README.md CHANGED
@@ -1,24 +1,21 @@
1
- # Image sample — Rabdi candidate
1
+ # Image sample — Rabdi
2
2
 
3
- This source candidate keeps the existing image picker, local-date Entity Expiration, byte verification, download, entity inspector, dark/light themes and wallet selection. All copy is English. It targets the existing **arkiv-images-example** Vercel project; production publication is deferred.
3
+ This sample uses the registry release **arkiv-images 1.0.0** and keeps the image picker, local-date Entity Expiration, byte verification, download, entity inspector, dark/light themes and wallet selection. All copy is English. It targets the existing **arkiv-images-example** Vercel project at https://arkiv-images-example.vercel.app.
4
4
 
5
- The UI uses the package public API. Reads go through its own bounded `/api/rpc` function with server-only `ARKIV_ACCESS_KEY`. Only chain ID, block timing and bounded image/chunk queries are accepted; no signer, access key, upstream URL or raw provider error is sent to the browser. Root and manifest reads are latest state; chunks use keyset pages. Set a free [Hub access key](https://hub.arkiv.network/access-keys) in the Vercel preview environment.
5
+ The UI uses the package public API. Reads go through its own bounded `/api/rpc` function with server-only `ARKIV_ACCESS_KEY`. Only chain ID, current block number, block timing and bounded image/chunk queries are accepted; no signer, access key, upstream URL or raw provider error is sent to the browser. Root and manifest reads are latest state; chunks use keyset pages. Set a free [Hub access key](https://hub.arkiv.network/access-keys) in the Vercel preview environment.
6
6
 
7
7
  Writes use the visitor's MetaMask/Rabby account and configured Rabdi RPC, chain 7794095. If Rabdi is missing, configure it in the wallet using your own access key, then connect again. The app switches to an already configured Rabdi network; it never installs a server key in a wallet. Obtain [test funds](https://hub.arkiv.network/faucet). Every actual signature is guarded for account/network changes and uses the package's explicit gas policy.
8
8
 
9
- ## Build this candidate
9
+ ## Build the sample
10
10
 
11
- From the package root, after dependencies are available:
11
+ From the sample directory:
12
12
 
13
13
  ```sh
14
- npm run build
15
- npm pack --pack-destination sample
16
- cd sample
17
- npm install --no-audit --no-fund
14
+ npm ci
18
15
  npm run build
19
16
  ```
20
17
 
21
- The candidate sample dependency is `file:./arkiv-images-1.0.0.tgz`, produced by the root pack in the sample folder, rather than the older registry release. This is an artifact integration test, not registry verification. Deploy the sample folder, including this tarball, to the existing linked project; its publication allowlist includes the candidate and API function.
18
+ The sample pins `arkiv-images` to exact registry version `1.0.0`; its lock verifies the published archive integrity. No local tarball is used or uploaded. Deploy the sample folder to the existing linked project; its publication allowlist includes the application source and API function.
22
19
 
23
20
  The Vite development server alone does not serve Vercel functions. Use a Vercel preview for the complete real-network read flow; controlled browser tests route `/api/rpc` to the in-memory harness. Never put an access key in Vite environment variables.
24
21
 
@@ -26,8 +23,10 @@ Seed non-sensitive PNG/JPEG examples with `node scripts/seed-rabdi.mjs` from the
26
23
 
27
24
  The sample fully decodes images before writes and after retrieval, displays only allowed raster MIME, treats filenames as text and revokes Blob URLs. All original image bytes and metadata, including EXIF/GPS, remain public. Use synthetic images. The entity inspector performs separate latest-state read checks and can fail without hiding an already verified image.
28
25
 
29
- For controlled browser checks, run the project browser script against an isolated app context and save evidence separately. Verify 390/768/1440 widths, both themes, keyboard and 200% zoom plus empty/loading/error/recovered states. Actual candidate results are in [verification](../docs/verification.md); the PR records the hydrated preview and deployment ID. Browser-wallet signing remains a separate check from controlled wallet tests and live Node signatures.
26
+ For controlled browser checks, run the project browser script against an isolated app context and save evidence separately. Verify 390/768/1440 widths, both themes, keyboard and 200% zoom plus empty/loading/error/recovered states. Actual results are in [verification](../docs/verification.md); the release handoff records hydrated deployment checks and IDs. Browser-wallet signing remains a separate check from controlled wallet tests and live Node signatures.
30
27
 
31
28
  The existing layout mirrors the project's Arkiv token/type contract. This migration changes network/data behavior and preserves the design; historical design evidence remains dated under docs.
32
29
 
33
- The locked build tools have two high-severity npm audit findings: `vite` and `source-map-js`, both development dependencies. See the [Windows editor middleware advisory](https://github.com/advisories/GHSA-587h-7wmj-h5pm) and [source-map offset advisory](https://github.com/advisories/GHSA-68fv-2mgg-jv7q). This preview serves built assets and a Node read function, not a Vite development server. These existing tool versions were not upgraded in the migration; the full dependency audit is not clean. Update the affected build tools before exposing a development server or accepting untrusted source maps.
30
+ The locked build tools have two high-severity npm audit findings: `vite` and `source-map-js`, both development dependencies. See the [Windows editor middleware advisory](https://github.com/advisories/GHSA-587h-7wmj-h5pm) and [source-map offset advisory](https://github.com/advisories/GHSA-68fv-2mgg-jv7q). The deployment serves built assets and a Node read function, not a Vite development server. These existing tool versions were not upgraded in the migration; the full dependency audit is not clean. Update the affected build tools before exposing a development server or accepting untrusted source maps.
31
+
32
+ The public example defaults to the longer-lived JPEG, entity `0x2989bda8bbadfe7e22a0b1e3a435aa3b266106adbbca3f97c162ee4eccca8488`. The example list reads the current Rabdi block and skips expired entries. Its button stays unavailable if timing/configuration fails or no active example exists. A second head read rejects expiry before retrieval. No seed or write is performed.