@wenathlan/saddle 1.8.13 → 1.8.14

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/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  <strong>Storage-backed jobs, scraping contracts and portable runners for Node.js.</strong><br/>
7
7
  <strong>Binary computing engine, agent browser, scraper and packager.</strong><br/>
8
8
  <a href="https://github.com/wenathlan/saddle/actions/workflows/ci.yml"><img src="https://github.com/wenathlan/saddle/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
9
- <a href="https://github.com/wenathlan/saddle/releases/tag/v1.8.12"><img src="https://img.shields.io/badge/release-v1.8.12-d35d3d" alt="Release 1.8.12" /></a>
9
+ <a href="https://github.com/wenathlan/saddle/releases/tag/v1.8.14"><img src="https://img.shields.io/badge/release-v1.8.14-d35d3d" alt="Release 1.8.14" /></a>
10
10
  <a href="https://github.com/wenathlan/saddle/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-GPL--3.0--only-202a2f" alt="GPL 3.0 only license" /></a>
11
11
  </p>
12
12
 
@@ -59,6 +59,21 @@ repository or bucket -> runner working set -> process -> durable artifact
59
59
 
60
60
  The repository may act as a disk, a CI workflow may act as a function call, Pages may act as a static bus and a release artifact may act as the durable boundary. `workflow_dispatch`, `repository_dispatch` and HTTP adapters remain caller-configured interfaces.
61
61
 
62
+ ### Runtime modes and physical boundaries
63
+
64
+ The historical design treats the repository and its runner as a **virtual processor**, not as a claim that remote storage is physical VRAM. The storage-to-compute bridge stages a bounded working set through memory, filesystem, tmpfs, mmap or a caller-owned adapter; network latency, bandwidth and provider quotas remain real limits. The same library contracts are available with or without their paired surface, so a caller can use fetch or browser, visible or headless, internal or external storage, physical or vectorized memory, and library or binary packaging without being locked to one mode.
65
+
66
+ | Mode | Boundary | Typical use |
67
+ | --- | --- | --- |
68
+ | Fetch | no browser | Static HTML, APIs and deterministic extraction. |
69
+ | Browser | caller-owned transport | Interactive pages, snapshots, tabs and actions. |
70
+ | Auto | adaptive selection | Fetch first, then browser when the caller permits it. |
71
+ | Headless | no visible UI | CI runners, servers and scheduled jobs. |
72
+ | CLI or binary | packaged entry point | Operator tools or third-party compute jobs. |
73
+ | Computer | storage-to-compute bridge | Bounded binary and memory processing. |
74
+
75
+ The engine keeps these boundaries explicit. It does not silently install a browser, mount a bucket as VRAM, create a database, choose a proxy, or transfer credentials to a provider.
76
+
62
77
  ### Engine: contracts instead of vendor lock-in
63
78
 
64
79
  | Area | Contracts shipped | Result |
@@ -74,12 +89,30 @@ The repository may act as a disk, a CI workflow may act as a function call, Page
74
89
  | Delivery | manifests, workflow registry, extension packaging and release assets | repeatable package and runner surfaces |
75
90
  | Integrations | GitHub, GitLab, Forgejo, app lifecycle, command scopes and delivery adapters | caller-owned provider connectivity |
76
91
 
92
+ The protocol layer accepts JSON request/response envelopes, NDJSON append-only events, SSE progress streams, structured text and raw binary chunks. Retryable operations use bounded backoff, idempotency keys and caller-owned persistence; multi-step operations expose saga compensation instead of assuming that a partial remote action can be rolled back automatically.
93
+
94
+ | Reliability concern | Contract | Default boundary |
95
+ | --- | --- | --- |
96
+ | Retry | transient HTTP and network failures only | bounded attempts with caller-selected delay |
97
+ | Idempotency | request or delivery identity | at-least-once dispatch without duplicate effects |
98
+ | Circuit breaker | `closed -> open -> half-open` | caller-owned recovery threshold and timeout |
99
+ | Concurrency | queue, frontier or pool budget | explicit limits instead of unbounded fan-out |
100
+ | Compensation | workflow or saga callback | caller-owned cleanup after cancellation |
101
+
77
102
  The root entry point is transport-neutral. Node filesystem, HTTP server, persistent sessions and Playwright are explicit subpaths or optional adapters. The library accepts caller-provided fetchers, browser transports, storage adapters, persistence, proxy pools, captcha evidence handlers, webhook secrets and remote credentials.
78
103
 
79
104
  ### Productization: one engine, many shells
80
105
 
81
106
  The same contracts can be surfaced as an npm library, application archive, computer runtime, desktop installer, Android APK/AAB, iOS IPA, CLI, binary, browser package, Manifest V3 extension, web/PWA artifact, LibreOffice OXT, VSIX, webhook server, MCP transport, workflow action, container image, Maven package, NuGet package or RubyGem. These surfaces are declarative target plans and caller-owned adapters around the engine; they are not separate sources of truth.
82
107
 
108
+ ### Agent context and structured output
109
+
110
+ The extraction path is **structured-first**: metadata and schema facts are selected before free-form text, then serialized to bounded Markdown, JSON or XML. Heading-aware chunks preserve source URL, content hash, heading path and token estimates for downstream retrieval. `generateLlmsTxt` and `generateLlmsFullTxt` expose concise agent indexes with absolute links, while `estimateTokens`, `fitsInContext` and the browser context budget prevent a caller from silently exceeding its chosen model or transport limit. No model provider is mandatory; parsing and context policies remain injectable.
111
+
112
+ ### Third-party compute identity
113
+
114
+ Saddle can be connected to GitHub, GitLab, Forgejo, Gitea, Codeberg, Docker or another caller-owned runner. The operator owns the application identity, repository permissions, webhook secret and provider token; Saddle supplies transport-neutral contracts and never assumes that a hosted service account, database or runner exists. This is the operational meaning of the original multi-forge design: the runner is replaceable and the artifact is the durable boundary.
115
+
83
116
  ## Public API
84
117
 
85
118
  | Export | Purpose |
@@ -90,6 +123,11 @@ The same contracts can be surfaced as an npm library, application archive, compu
90
123
  | `extractcontent` | structured extraction |
91
124
  | `serializeresult` | serialize JSON, Markdown or XML results |
92
125
  | `formatforagent` | summary, chunks and token count |
126
+ | `chunkMarkdown` / `formatChunksForRAG` | heading-aware bounded chunks for downstream context |
127
+ | `generateLlmsTxt` / `generateLlmsFullTxt` | agent-readable documentation indexes |
128
+ | `estimateTokens` / `fitsInContext` | model-neutral context and cost estimates |
129
+ | `withRetry` | bounded retry and abort handling |
130
+ | `createServer` | caller-owned HTTP surface |
93
131
  | `batchscrape` | bounded URL groups |
94
132
  | `crawlurl` | crawl contract with domain and budget controls |
95
133
  | `browseragent` | caller-owned navigation, click, type and screenshot actions |
@@ -112,7 +150,7 @@ npm run extension:build -- --output build/extension
112
150
  ls build/extension/manifest.json build/extension/worker.js build/extension/content.js build/extension/popup.html
113
151
  ```
114
152
 
115
- The base permission set is `activeTab`, `scripting` and `storage`. It does not request broad host permissions, cookies, `webRequest`, debugger access or arbitrary page code execution. Optional host escalation remains caller-owned. Releases attach `saddle-extension-<version>.zip`; cross-browser profiles remain adapter work.
153
+ The base permission set is `activeTab`, `scripting` and `storage`. It does not request broad host permissions, cookies, `webRequest`, debugger access or arbitrary page code execution. Optional host escalation remains caller-owned. Releases attach `saddle.extension.<version>.zip`; cross-browser profiles remain adapter work.
116
154
 
117
155
  ## Security boundaries
118
156
 
@@ -127,17 +165,17 @@ The base permission set is `activeTab`, `scripting` and `storage`. It does not r
127
165
  | Failure | retry, circuit breaker, idempotency and resume are configurable |
128
166
  | Releases | version comes from the `vX.Y.Z` tag and must match `package.json` |
129
167
 
130
- Version 1.8.9 makes the active source TypeScript-first, compiles it into ignored `dist/`, and keeps public JavaScript package paths stable. It also adds declarative target plans for mobile, desktop, browser, binary and document-extension formats. The dynamic debug collector is intentionally an unchecked browser boundary because it monkey-patches browser APIs; the rest of the web surface remains strictly typechecked. See [`docs/reorganization-1.8.9.md`](docs/reorganization-1.8.9.md), [`docs/toolchainresearch-1.8.9.md`](docs/toolchainresearch-1.8.9.md) and [`docs/securityaudit-1.8.7.md`](docs/securityaudit-1.8.7.md).
168
+ Version 1.8.14 carries the TypeScript-first source into the current release and keeps public JavaScript package paths stable. It includes release-derived package metadata, queue leases, bounded structured extraction with provenance, browser context budgets, explicit workflow cancellation with caller-owned compensation, deterministic artifact retention decisions and a post-push container pull/smoke validation. The dynamic debug collector is intentionally an unchecked browser boundary because it monkey-patches browser APIs; the rest of the web surface remains strictly typechecked. See [`docs/reorganization-1.8.9.md`](docs/reorganization-1.8.9.md), [`docs/toolchainresearch-1.8.9.md`](docs/toolchainresearch-1.8.9.md), [`docs/releasenotes-1.8.12.md`](docs/releasenotes-1.8.12.md), [`docs/releasenotes-1.8.13.md`](docs/releasenotes-1.8.13.md) and [`docs/releasenotes-1.8.14.md`](docs/releasenotes-1.8.14.md).
131
169
 
132
170
  ## Package surfaces and release automation
133
171
 
134
- Workflows use the release tag and the local `releaseversion` action. They do not contain a manually edited version number. The action fetches the tag, checks out its commit and rejects a release when the tag version does not match the root `package.json`.
172
+ Workflows use the release tag and the local `releaseversion` action. They do not contain a manually edited version number. The action fetches the tag, checks out its commit and rejects a release when the tag version does not match the root `package.json`. The `created` release event fans out to the six registry workflows, so NuGet, Maven, RubyGems, GitHub Packages npm, public npmjs and GHCR receive the same validated version from one source of truth.
135
173
 
136
174
  | Registry | Artifact | Workflow |
137
175
  | --- | --- | --- |
176
+ | GHCR | `ghcr.io/wenathlan/saddle:<version>` | `publishghcr.yml` |
138
177
  | GitHub Packages npm | `@wenathlan/saddle@<version>` | `publishgithubnpm.yml` |
139
178
  | Public npmjs | `@wenathlan/saddle@<version>` | `publishnpmjs.yml` |
140
- | GHCR | `ghcr.io/wenathlan/saddle:<version>` | `publishghcr.yml` |
141
179
  | Maven | `io.wenathlan:saddle:<version>` | `publishmaven.yml` |
142
180
  | NuGet | `Saddle.<version>.nupkg` | `publishnuget.yml` |
143
181
  | RubyGems | `saddle <version>` | `publishrubygems.yml` |
@@ -176,7 +214,7 @@ npm run web:check
176
214
  VITE_BASE_PATH=/saddle npm run web:build:pages
177
215
  ```
178
216
 
179
- The engine test suite is deterministic and does not require real credentials or network access. The release path is: update `package.json` and the manifest files, update `changelog.md`, run all gates, create `v<package-version>`, push the tag and create the GitHub release. Registry workflows then derive the same version from that release tag.
217
+ The engine test suite is deterministic and does not require real credentials or network access. The release path is: update `package.json` and the manifest files, update `changelog.md` and release notes, run all gates, create `v<package-version>`, push the tag and create the GitHub release. Registry workflows then derive the same version from that release tag. A package metadata change alone does not publish anything; the release tag is the intentional publication boundary.
180
218
 
181
219
  ## Repository map
182
220
 
@@ -207,11 +245,11 @@ The engine is TypeScript-first ESM with English JSDoc comments and a generated J
207
245
 
208
246
  ## Historical documentation
209
247
 
210
- Earlier README snapshots remain in `docs/plans/README.md`, `docs/talks9/README.md` and `docs/talks9/README (2).md` as archival evidence. Their useful architecture ideas were consolidated here, while stale `@devthink`, `@iakadion`, `io.devthink`, Node 20/22, `client/src` and speculative provider quotas were not copied into the canonical contract.
248
+ Earlier root README snapshots and platform READMEs remain in `docs/plans/README.md`, `docs/talks9/README.md`, `docs/talks9/README (2).md`, `android/README.md`, `browser/README.md`, `desktop/README.md`, `extension/README.md` and `ios/README.md` as archival or surface-specific evidence. Their useful architecture ideas were consolidated here, while stale `@devthink`, `@iakadion`, `io.devthink`, Node 20/22, `client/src`, speculative provider quotas and unimplemented hosted services were not copied into the canonical contract.
211
249
 
212
250
  ## Current scope
213
251
 
214
- Version 1.8.11 extends the TypeScript-first engine with flat project-owned desktop, Android and iOS build surfaces, explicit Capacitor staging boundaries, dotted release asset naming and helper-binary rejection. Browser binaries, provider credentials, n8n host registration, persistent databases, captcha solvers and production deployment remain caller-selected adapters. Future work should extend contracts without coupling the core to one forge, registry, browser or storage vendor.
252
+ Version 1.8.14 extends the TypeScript-first engine with flat project-owned desktop, Android and iOS build surfaces, explicit Capacitor staging boundaries, dotted release asset naming, helper-binary rejection, structured extraction provenance, browser context budgets, resumable workflow compensation, retention metadata and a container image that is pulled and smoke-tested after publication. Browser binaries, provider credentials, n8n host registration, persistent databases, captcha solvers and production deployment remain caller-selected adapters. Future work should extend contracts without coupling the core to one forge, registry, browser or storage vendor.
215
253
 
216
254
  ## License
217
255
 
@@ -22,10 +22,10 @@ export declare function appregistry(options?: {}): {
22
22
  missing?: undefined;
23
23
  appid?: undefined;
24
24
  } | {
25
+ reason?: undefined;
25
26
  allowed: boolean;
26
27
  missing: any[];
27
28
  appid: any;
28
- reason?: undefined;
29
29
  };
30
30
  get: (id: any) => any;
31
31
  list: () => any[];
@@ -7,8 +7,8 @@ export declare function mcpserver(options?: {}): {
7
7
  jsonrpc: string;
8
8
  id: any;
9
9
  result: {
10
- tools: any;
11
10
  content?: undefined;
11
+ tools: any;
12
12
  };
13
13
  error?: undefined;
14
14
  } | {
@@ -16,9 +16,9 @@ export declare function memoryengine(options?: {}): {
16
16
  data: any;
17
17
  error?: undefined;
18
18
  } | {
19
- data?: undefined;
20
19
  success: boolean;
21
20
  error: any;
21
+ data?: undefined;
22
22
  }>;
23
23
  sync: (key: any, options?: {}) => Promise<any[]>;
24
24
  capabilities: () => any;
@@ -43,7 +43,7 @@ export function robotsrules(text = "") { const directives = []; const groups = [
43
43
  /** Fetches and caches a site's robots policy without failing the caller's scrape. */
44
44
  export async function fetchRobotsTxt(siteUrl, options = {}) { const base = siteUrl.replace(/\/$/, ""); const robotsUrl = `${base}/robots.txt`; const cached = cache.get(robotsUrl); if (cached && Date.now() - cached.fetchedAt < cachettl)
45
45
  return cached.robots; try {
46
- const response = await fetch(robotsUrl, { headers: { "User-Agent": options.userAgent ?? "Saddle/1.8.13" }, signal: AbortSignal.timeout(options.timeout ?? 5000) });
46
+ const response = await fetch(robotsUrl, { headers: { "User-Agent": options.userAgent ?? "Saddle/1.8.14" }, signal: AbortSignal.timeout(options.timeout ?? 5000) });
47
47
  const robots = response.ok ? robotsrules(await response.text()) : robotsrules();
48
48
  cache.set(robotsUrl, { robots, fetchedAt: Date.now() });
49
49
  return robots;
@@ -85,7 +85,7 @@ The release also contains `manifest.*.1.8.11.json` and `sha256.*.1.8.11` files f
85
85
 
86
86
  ## 1.8.12 release matrix
87
87
 
88
- Version 1.8.12 is prepared to publish the expanded matrix below. The release workflows derive the version from the `v1.8.12` tag and generate the checksum and manifest files beside each surface artifact. Sizes and final signing states remain pending until the release workflows complete; this section does not claim that an artifact exists before CI attaches it.
88
+ Version 1.8.12 was published with the expanded matrix below. The release workflows derived the version from the `v1.8.12` tag and attached the generated checksum and manifest files beside each available surface artifact. The release contains 38 assets; iOS was not attached because caller-owned Apple signing and provisioning were not configured.
89
89
 
90
90
  | Surface | Architectures | Artifact naming contract |
91
91
  | --- | --- | --- |
@@ -97,11 +97,11 @@ Version 1.8.12 is prepared to publish the expanded matrix below. The release wor
97
97
  | Container | OCI | `saddle.container.1.8.12.tar.gz` |
98
98
  | Browser extension | Manifest V3 | `saddle.extension.1.8.12.zip` |
99
99
 
100
- Each surface also emits `sha256.*.1.8.12`, `manifest.*.1.8.12.json` and, where enabled by the release path, SBOM and provenance metadata. The manifest must state `unsigned`, `ci-test-key`, `caller-owned`, `notarized` or the verified provider status actually produced by CI.
100
+ Each surface also emits `sha256.*.1.8.12`, `manifest.*.1.8.12.json` and, where enabled by the release path, SBOM and provenance metadata. The Android manifest records `ci-test-key`, desktop manifests record `unsigned` and the container manifest records `caller-owned`. No state implies production trust.
101
101
 
102
102
  ## 1.8.13 release matrix
103
103
 
104
- Version 1.8.13 keeps the release-tag-derived matrix and adds deterministic retention metadata to generated artifact manifests. The implementation records retention policy and keep/prune decisions but never removes caller-owned files. Final URLs, checksums, sizes and signing states remain pending until the corresponding release workflow completes.
104
+ Version 1.8.13 keeps the release-tag-derived matrix and adds deterministic retention metadata to generated artifact manifests. The implementation records retention policy and keep/prune decisions but never removes caller-owned files. The release contains 38 assets; iOS was not attached because caller-owned Apple signing and provisioning were not configured.
105
105
 
106
106
  | Surface | Architectures | Artifact naming contract |
107
107
  | --- | --- | --- |
@@ -113,4 +113,20 @@ Version 1.8.13 keeps the release-tag-derived matrix and adds deterministic reten
113
113
  | Container | OCI | `saddle.container.1.8.13.tar.gz` |
114
114
  | Browser extension | Manifest V3 | `saddle.extension.1.8.13.zip` |
115
115
 
116
- Each surface also emits `sha256.*.1.8.13`, `manifest.*.1.8.13.json` and, where enabled by the release path, SBOM and provenance metadata. The manifest may additionally carry `retention`, `retentionplan` and `retentionevaluatedat`; these fields are advisory execution decisions and do not imply deletion or publication.
116
+ Each surface also emits `sha256.*.1.8.13`, `manifest.*.1.8.13.json` and, where enabled by the release path, SBOM and provenance metadata. The Android manifest records `ci-test-key`, desktop manifests record `unsigned` and the container manifest records `caller-owned`. The manifest may additionally carry `retention`, `retentionplan` and `retentionevaluatedat`; these fields are advisory execution decisions and do not imply deletion or publication.
117
+
118
+ ## 1.8.14 release matrix
119
+
120
+ Version 1.8.14 keeps the release-tag-derived matrix and adds post-push container pull and smoke validation. The implementation records retention policy and keep/prune decisions but never removes caller-owned files. The release is expected to contain the same 38-asset family; iOS remains unavailable until caller-owned Apple signing and provisioning are configured.
121
+
122
+ | Surface | Architectures | Artifact naming contract |
123
+ | --- | --- | --- |
124
+ | Linux desktop browser | x64, arm64 | `saddle.browser.1.8.14.<architecture>.deb`, `.rpm`, `.appimage` |
125
+ | Windows desktop browser | x86, x64, arm64 | `saddle.browser.1.8.14.<architecture>.exe`, `.msi` |
126
+ | macOS desktop browser | x64, arm64 | `saddle.browser.1.8.14.<architecture>.dmg`, `.app.zip` |
127
+ | Android | caller-configured signing | `saddle.apk.1.8.14.apk`, `saddle.aab.1.8.14.aab` |
128
+ | iOS | caller-configured signing and provisioning | `saddle.ipa.1.8.14.ipa`, `saddle.app.1.8.14.app.zip` |
129
+ | Container | OCI | `saddle.container.1.8.14.tar.gz` |
130
+ | Browser extension | Manifest V3 | `saddle.extension.1.8.14.zip` |
131
+
132
+ Each surface also emits `sha256.*.1.8.14`, `manifest.*.1.8.14.json` and, where enabled by the release path, SBOM and provenance metadata. The Android manifest records `ci-test-key`, desktop manifests record `unsigned` and the container manifest records `caller-owned`. The container image additionally records `org.opencontainers.image.version=1.8.14`; the post-push workflow pulls that exact version and runs the CLI help smoke test.
@@ -1,10 +1,10 @@
1
1
  # Release assets
2
2
 
3
- The Node-only release adapter creates deterministic metadata for caller-selected artifacts. For version `1.8.12`, it writes dotted surface-specific names such as `sha256.desktop.1.8.12`, `manifest.desktop.1.8.12.json`, `sbom.desktop.1.8.12.cdx.json` and `provenance.desktop.1.8.12.intoto.jsonl`. The adapter rejects underscore-based public names and Rust build-helper executables. It never publishes, authenticates or selects a registry.
3
+ The Node-only release adapter creates deterministic metadata for caller-selected artifacts. For version `1.8.14`, it writes dotted surface-specific names such as `sha256.desktop.1.8.14`, `manifest.desktop.1.8.14.json`, `sbom.desktop.1.8.14.cdx.json` and `provenance.desktop.1.8.14.intoto.jsonl`. The adapter rejects underscore-based public names and Rust build-helper executables. It never publishes, authenticates or selects a registry.
4
4
 
5
5
  ```bash
6
6
  npm run release:assets -- \
7
- --version 1.8.12 \
7
+ --version 1.8.14 \
8
8
  --surface desktop \
9
9
  --output build/release \
10
10
  --artifact build/saddle.tgz \
@@ -17,7 +17,7 @@ Saddle 1.8.12 consolidates the root-first native surfaces, the GPL-3.0-only proj
17
17
 
18
18
  ## Artifact matrix
19
19
 
20
- The release workflows derive the version from the release tag and use these lowercase dotted names. This table is the contract expected from CI; it does not claim that an asset exists until the corresponding workflow attaches it.
20
+ The release workflows derive the version from the release tag and use these lowercase dotted names. The `v1.8.12` release was published and contains the generated assets listed below; iOS remains unavailable because Apple signing and provisioning were not configured.
21
21
 
22
22
  | Surface | Architectures or mode | Expected artifact |
23
23
  |---|---|---|
@@ -31,13 +31,28 @@ The release workflows derive the version from the release tag and use these lowe
31
31
 
32
32
  Each generated surface must carry its checksum and manifest companion. Where enabled, CI also emits SBOM and provenance metadata. The signing state must be one of `unsigned`, `ci-test-key`, `caller-owned`, `notarized` or the exact provider status produced by CI. No unsigned artifact is described as trusted or production-signed.
33
33
 
34
+ ## Verified attached assets
35
+
36
+ The release contains **38 attached assets**. Desktop binaries are unsigned, Android APK/AAB files use the explicitly labeled `ci-test-key`, and the container is marked `caller-owned`.
37
+
38
+ | Surface | Attached assets | Signing |
39
+ |---|---|---|
40
+ | Linux desktop | `saddle.browser.1.8.12.x64.deb`, `saddle.browser.1.8.12.x64.rpm`, `saddle.browser.1.8.12.x64.appimage`, `saddle.browser.1.8.12.arm64.deb`, `saddle.browser.1.8.12.arm64.rpm`, `saddle.browser.1.8.12.arm64.appimage` | `unsigned` |
41
+ | Windows desktop | `saddle.browser.1.8.12.x86.exe`, `saddle.browser.1.8.12.x86.msi`, `saddle.browser.1.8.12.x64.exe`, `saddle.browser.1.8.12.x64.msi`, `saddle.browser.1.8.12.arm64.exe`, `saddle.browser.1.8.12.arm64.msi` | `unsigned` |
42
+ | macOS desktop | `saddle.browser.1.8.12.x64.dmg`, `saddle.browser.1.8.12.x64.app.zip`, `saddle.browser.1.8.12.arm64.dmg`, `saddle.browser.1.8.12.arm64.app.zip` | `unsigned` |
43
+ | Android | `saddle.apk.1.8.12.apk`, `saddle.aab.1.8.12.aab` | `ci-test-key` |
44
+ | Container | `saddle.container.1.8.12.tar.gz` | `caller-owned` |
45
+ | Browser extension | `saddle.extension.1.8.12.zip` | `unsigned` |
46
+ | Manifests | `manifest.android.1.8.12.json`, `manifest.container.1.8.12.json`, `manifest.desktop.linux.arm64.1.8.12.json`, `manifest.desktop.linux.x64.1.8.12.json`, `manifest.desktop.macos.arm64.1.8.12.json`, `manifest.desktop.macos.x64.1.8.12.json`, `manifest.desktop.windows.arm64.1.8.12.json`, `manifest.desktop.windows.x64.1.8.12.json`, `manifest.desktop.windows.x86.1.8.12.json` | metadata |
47
+ | Checksums | `sha256.android.1.8.12`, `sha256.container.1.8.12`, `sha256.desktop.linux.arm64.1.8.12`, `sha256.desktop.linux.x64.1.8.12`, `sha256.desktop.macos.arm64.1.8.12`, `sha256.desktop.macos.x64.1.8.12`, `sha256.desktop.windows.arm64.1.8.12`, `sha256.desktop.windows.x64.1.8.12`, `sha256.desktop.windows.x86.1.8.12` | integrity metadata |
48
+
34
49
  ## Compatibility and upgrade notes
35
50
 
36
51
  The public package remains `@wenathlan/saddle`. The release does not downgrade the package to `1.8.3`; the active version is `1.8.12`. Version `1.8.21` is reserved for the next objective-driven research and implementation cycle. SignPath Foundation approval and production code-signing credentials remain caller-owned and are not implied by this release note.
37
52
 
38
53
  ## Verification
39
54
 
40
- The prepared state passed 107 active tests, 69 legacy tests, engine build and syntax checks, formatting checks, web TypeScript and Pages build checks, npm pack dry-run, npm audit, flat-native validation and diff hygiene. Final artifact sizes and live download URLs must be filled from the actual GitHub Actions release run rather than estimated in advance.
55
+ The release validation workflow passed, and the live release contains the 38 assets listed above. The original release-event security and mobile jobs were superseded by successful, explicitly labeled manual reruns; no production signing claim is made.
41
56
 
42
57
  ## References
43
58
 
@@ -17,7 +17,7 @@ Saddle 1.8.13 carries the active code and release-facing manifests forward from
17
17
 
18
18
  ## Artifact contract
19
19
 
20
- The active workflows derive names from the release tag. The following names are expected for a 1.8.13 run; actual URLs, checksums and sizes must come from the completed CI run.
20
+ The active workflows derive names from the release tag. The `v1.8.13` release was published and contains the generated assets listed below; iOS remains unavailable because Apple signing and provisioning were not configured.
21
21
 
22
22
  | Surface | Expected artifact family |
23
23
  |---|---|
@@ -31,9 +31,37 @@ The active workflows derive names from the release tag. The following names are
31
31
 
32
32
  Signing remains explicit. `unsigned`, `ci-test-key`, `caller-owned`, `notarized` and a provider-reported status are distinct states. This release note does not claim SignPath approval or production signing.
33
33
 
34
+ ## Verified attached assets
35
+
36
+ The release contains **38 attached assets**. Desktop binaries are unsigned, Android APK/AAB files use the explicitly labeled `ci-test-key`, and the container is marked `caller-owned`.
37
+
38
+ | Surface | Attached assets | Signing |
39
+ |---|---|---|
40
+ | Linux desktop | `saddle.browser.1.8.13.x64.deb`, `saddle.browser.1.8.13.x64.rpm`, `saddle.browser.1.8.13.x64.appimage`, `saddle.browser.1.8.13.arm64.deb`, `saddle.browser.1.8.13.arm64.rpm`, `saddle.browser.1.8.13.arm64.appimage` | `unsigned` |
41
+ | Windows desktop | `saddle.browser.1.8.13.x86.exe`, `saddle.browser.1.8.13.x86.msi`, `saddle.browser.1.8.13.x64.exe`, `saddle.browser.1.8.13.x64.msi`, `saddle.browser.1.8.13.arm64.exe`, `saddle.browser.1.8.13.arm64.msi` | `unsigned` |
42
+ | macOS desktop | `saddle.browser.1.8.13.x64.dmg`, `saddle.browser.1.8.13.x64.app.zip`, `saddle.browser.1.8.13.arm64.dmg`, `saddle.browser.1.8.13.arm64.app.zip` | `unsigned` |
43
+ | Android | `saddle.apk.1.8.13.apk`, `saddle.aab.1.8.13.aab` | `ci-test-key` |
44
+ | Container | `saddle.container.1.8.13.tar.gz` | `caller-owned` |
45
+ | Browser extension | `saddle.extension.1.8.13.zip` | `unsigned` |
46
+ | Manifests | `manifest.android.1.8.13.json`, `manifest.container.1.8.13.json`, `manifest.desktop.linux.arm64.1.8.13.json`, `manifest.desktop.linux.x64.1.8.13.json`, `manifest.desktop.macos.arm64.1.8.13.json`, `manifest.desktop.macos.x64.1.8.13.json`, `manifest.desktop.windows.arm64.1.8.13.json`, `manifest.desktop.windows.x64.1.8.13.json`, `manifest.desktop.windows.x86.1.8.13.json` | metadata |
47
+ | Checksums | `sha256.android.1.8.13`, `sha256.container.1.8.13`, `sha256.desktop.linux.arm64.1.8.13`, `sha256.desktop.linux.x64.1.8.13`, `sha256.desktop.macos.arm64.1.8.13`, `sha256.desktop.macos.x64.1.8.13`, `sha256.desktop.windows.arm64.1.8.13`, `sha256.desktop.windows.x64.1.8.13`, `sha256.desktop.windows.x86.1.8.13` | integrity metadata |
48
+
49
+ ## Registry publication
50
+
51
+ The six registry workflows derive the version from the same `v1.8.13` release tag through `.github/actions/releaseversion`. The release-event jobs completed successfully for GitHub Packages npm, public npmjs, Maven and RubyGems. GHCR completed successfully after the corrected Buildx and image-hardening rerun. NuGet was rerun manually from `main` and completed successfully with `Saddle.1.8.13.nupkg`; the package is published to GitHub Packages NuGet under the `wenathlan` owner. Public `nuget.org` was not targeted by the repository workflow and is not claimed here.
52
+
53
+ | Registry | Workflow | Verified version | Result |
54
+ |---|---|---:|---|
55
+ | GHCR | `publishghcr.yml` | `1.8.13` | success after corrected rerun |
56
+ | GitHub Packages npm | `publishgithubnpm.yml` | `1.8.13` | success |
57
+ | Public npmjs | `publishnpmjs.yml` | `1.8.13` | success |
58
+ | Maven GitHub Packages | `publishmaven.yml` | `1.8.13` | success |
59
+ | NuGet GitHub Packages | `publishnuget.yml` | `1.8.13` | success after explicit rerun |
60
+ | RubyGems GitHub Packages | `publishrubygems.yml` | `1.8.13` | success |
61
+
34
62
  ## Verification
35
63
 
36
- The queue, structured extraction, browser context, workflow compensation and retention features passed the active engine and release test suites. The complete release gate must be rerun after the implementation commit before a tag or release is created. The 1.8.21 research set remains the planning label for this feature batch and is not presented as a separate published version.
64
+ The queue, structured extraction, browser context, workflow compensation and retention features passed the active engine and release test suites. The release validation workflow passed, and the live release contains the 38 assets listed above. The original release-event security, GHCR and mobile failures were superseded by successful corrected reruns; production signing remains pending.
37
65
 
38
66
  ## References
39
67
 
@@ -0,0 +1,52 @@
1
+ # Saddle 1.8.14 release notes
2
+
3
+ Saddle 1.8.14 carries the active code and release-facing manifests forward from 1.8.13. The 1.8.13 release notes remain the canonical record for the previous artifact set. The comparative 1.8.21 research remains planning material and is not presented as a separate shipped version.
4
+
5
+ ## Changes
6
+
7
+ | Area | Change |
8
+ |---|---|
9
+ | Version identity | Aligned npm, lockfile, Maven, NuGet, RubyGems, browser extension, Tauri, Capacitor, iOS and crawler metadata to `1.8.14`. The iOS marketing version is `1.8.14` with build `1008014`. |
10
+ | Container | Added a build-stage TypeScript engine compilation, runtime-only `dist` copy, `org.opencontainers.image.version` label and post-push pull/label/CLI smoke validation. |
11
+ | Registry order | Documented GHCR as the first package surface, followed by GitHub Packages npm, public npmjs, Maven, NuGet and RubyGems. |
12
+ | Release automation | Kept the shared release-tag resolver as the only version source; workflows reject tag/package mismatches and do not contain per-release manual versions. |
13
+ | Architecture | Kept the root-first layout, no project-owned `src` directory, transport-neutral exports and caller-owned infrastructure. |
14
+
15
+ ## Artifact contract
16
+
17
+ The active workflows derive names from the `v1.8.14` release tag. The expected artifact family is listed below; attached-asset counts and registry conclusions must be updated only after the release workflows finish.
18
+
19
+ | Surface | Expected artifact family |
20
+ |---|---|
21
+ | Linux desktop | `saddle.browser.1.8.14.<architecture>.deb`, `.rpm`, `.appimage` |
22
+ | Windows desktop | `saddle.browser.1.8.14.<architecture>.exe`, `.msi` |
23
+ | macOS desktop | `saddle.browser.1.8.14.<architecture>.dmg`, `.app.zip` |
24
+ | Android | `saddle.apk.1.8.14.apk`, `saddle.aab.1.8.14.aab` |
25
+ | iOS | `saddle.ipa.1.8.14.ipa`, `saddle.app.1.8.14.app.zip` |
26
+ | Container | `saddle.container.1.8.14.tar.gz` |
27
+ | Browser extension | `saddle.extension.1.8.14.zip` |
28
+
29
+ Signing remains explicit. `unsigned`, `ci-test-key`, `caller-owned`, `notarized` and a provider-reported status are distinct states. These notes do not claim SignPath approval or production signing.
30
+
31
+ ## Registry publication
32
+
33
+ The six registry workflows derive the version from the same `v1.8.14` release tag through `.github/actions/releaseversion`. GHCR is listed first in the package order and must build, scan, push, pull and smoke-test the published image before the job is successful. The remaining workflows publish GitHub Packages npm, public npmjs, Maven, NuGet GitHub Packages and RubyGems from the same validated version. Public `nuget.org` is not targeted by the current repository workflow.
34
+
35
+ | Registry | Workflow | Version | Expected result |
36
+ |---|---|---:|---|
37
+ | GHCR | `publishghcr.yml` | `1.8.14` | build, scan, push, pull and smoke test |
38
+ | GitHub Packages npm | `publishgithubnpm.yml` | `1.8.14` | tag-derived package |
39
+ | Public npmjs | `publishnpmjs.yml` | `1.8.14` | tag-derived package |
40
+ | Maven GitHub Packages | `publishmaven.yml` | `1.8.14` | tag-derived package |
41
+ | NuGet GitHub Packages | `publishnuget.yml` | `1.8.14` | tag-derived package |
42
+ | RubyGems GitHub Packages | `publishrubygems.yml` | `1.8.14` | tag-derived package |
43
+
44
+ ## Verification policy
45
+
46
+ Local gates must pass before the tag is created. The release notes must be amended with effective asset names and workflow conclusions only after remote verification. Production signing remains pending until caller-owned certificates and provider configuration are supplied.
47
+
48
+ ## References
49
+
50
+ [1]: https://github.com/wenathlan/saddle "Saddle source repository"
51
+ [2]: https://github.com/wenathlan/saddle/releases "Saddle release archive"
52
+ [3]: https://github.com/wenathlan/saddle/blob/main/docs/releasenotes-1.8.13.md "Saddle 1.8.13 release notes"
@@ -20,7 +20,7 @@ The content bridge runs in Chrome's isolated world. It exposes bounded page meta
20
20
 
21
21
  ## deterministic release artifact
22
22
 
23
- The Node-only build adapter creates an isolated unpacked artifact with the release version in its manifest. A caller can run `npm run extension:build -- --version 1.8.2 --output build/extension` and package that directory with the archive tool available in the host environment. The release workflow derives the version from the published tag and attaches `saddle-extension-<version>.zip` without changing the source manifest.
23
+ The Node-only build adapter creates an isolated unpacked artifact with the release version in its manifest. A caller can run `npm run extension:build -- --version 1.8.14 --output build/extension` and package that directory with the archive tool available in the host environment. The release workflow derives the version from the published tag and attaches `saddle.extension.<version>.zip` without changing the source manifest.
24
24
 
25
25
  ## next slices
26
26
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "Saddle browser bridge",
4
- "version": "1.8.13",
4
+ "version": "1.8.14",
5
5
  "description": "User initiated page snapshots through the Saddle browser contract.",
6
6
  "minimum_chrome_version": "110",
7
7
  "permissions": ["activeTab", "scripting", "storage"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wenathlan/saddle",
3
- "version": "1.8.13",
3
+ "version": "1.8.14",
4
4
  "description": "binary computing engine that turns distributed storage into a publishable working set",
5
5
  "type": "module",
6
6
  "private": false,