@wenathlan/saddle 1.8.11 → 1.8.13

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.
Files changed (92) hide show
  1. package/LICENSE +646 -175
  2. package/README.md +11 -3
  3. package/dist/browser/recorder.d.ts +7 -13
  4. package/dist/browser/recorder.d.ts.map +1 -1
  5. package/dist/browser/recorder.js +42 -6
  6. package/dist/browser/recorder.js.map +1 -1
  7. package/dist/browser/snapshot.d.ts +12 -0
  8. package/dist/browser/snapshot.d.ts.map +1 -1
  9. package/dist/browser/snapshot.js +76 -0
  10. package/dist/browser/snapshot.js.map +1 -1
  11. package/dist/dispatch/resumable.d.ts +18 -1
  12. package/dist/dispatch/resumable.d.ts.map +1 -1
  13. package/dist/dispatch/resumable.js +28 -3
  14. package/dist/dispatch/resumable.js.map +1 -1
  15. package/dist/extension/build.d.ts.map +1 -1
  16. package/dist/extension/build.js +27 -3
  17. package/dist/extension/build.js.map +1 -1
  18. package/dist/index.d.ts +0 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +0 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/memory/engine.d.ts +10 -0
  23. package/dist/memory/engine.d.ts.map +1 -1
  24. package/dist/memory/engine.js +57 -7
  25. package/dist/memory/engine.js.map +1 -1
  26. package/dist/modes/resolve.d.ts +55 -0
  27. package/dist/modes/resolve.d.ts.map +1 -1
  28. package/dist/modes/resolve.js +9 -0
  29. package/dist/modes/resolve.js.map +1 -1
  30. package/dist/packager/manifest.d.ts +15 -0
  31. package/dist/packager/manifest.d.ts.map +1 -1
  32. package/dist/packager/manifest.js +36 -0
  33. package/dist/packager/manifest.js.map +1 -1
  34. package/dist/queue/persistent.d.ts +2 -1
  35. package/dist/queue/persistent.d.ts.map +1 -1
  36. package/dist/queue/persistent.js +27 -10
  37. package/dist/queue/persistent.js.map +1 -1
  38. package/dist/release/assets.d.ts +25 -0
  39. package/dist/release/assets.d.ts.map +1 -1
  40. package/dist/release/assets.js +67 -4
  41. package/dist/release/assets.js.map +1 -1
  42. package/dist/release/verify.d.ts +12 -0
  43. package/dist/release/verify.d.ts.map +1 -0
  44. package/dist/release/verify.js +112 -0
  45. package/dist/release/verify.js.map +1 -0
  46. package/dist/scrape/robots.js +1 -1
  47. package/dist/scrape/schema.d.ts +18 -0
  48. package/dist/scrape/schema.d.ts.map +1 -1
  49. package/dist/scrape/schema.js +67 -0
  50. package/dist/scrape/schema.js.map +1 -1
  51. package/dist/storage/s3compatible.d.ts +1 -0
  52. package/dist/storage/s3compatible.d.ts.map +1 -1
  53. package/dist/storage/s3compatible.js +43 -4
  54. package/dist/storage/s3compatible.js.map +1 -1
  55. package/dist/workflow/manifest.d.ts +1 -0
  56. package/dist/workflow/manifest.d.ts.map +1 -1
  57. package/dist/workflow/manifest.js +1 -0
  58. package/dist/workflow/manifest.js.map +1 -1
  59. package/dist/workflow/triggers.d.ts +30 -2
  60. package/dist/workflow/triggers.d.ts.map +1 -1
  61. package/dist/workflow/triggers.js +67 -1
  62. package/dist/workflow/triggers.js.map +1 -1
  63. package/docs/actionrecorder.md +12 -0
  64. package/docs/artifactavailability.md +52 -1
  65. package/docs/batches-1816-1820.md +13 -0
  66. package/docs/capabilityreport.md +13 -0
  67. package/docs/documentmap-1.8.12.md +17 -0
  68. package/docs/licenseaudit-1.8.12.md +21 -0
  69. package/docs/memoryengine.md +21 -0
  70. package/docs/nativeidentityresearch-1.8.11.md +69 -0
  71. package/docs/releaseassets.md +6 -2
  72. package/docs/releasenotes-1.8.12.md +46 -0
  73. package/docs/releasenotes-1.8.13.md +42 -0
  74. package/docs/repo-analysis-1.8.21.json +2617 -0
  75. package/docs/repo-candidates-1.8.21.jsonl +666 -0
  76. package/docs/repo-research-1.8.21.md +38 -0
  77. package/docs/repo-selected-1.8.21.json +786 -0
  78. package/docs/repo-synthesis-1.8.21.md +112 -0
  79. package/docs/s3compatible.md +12 -0
  80. package/docs/scanningresearch-1.8.11.md +17 -0
  81. package/docs/securityreferences-1.8.11.md +10 -0
  82. package/docs/securityresearch-1.8.11.md +19 -0
  83. package/docs/signingresearch-1.8.12.md +167 -0
  84. package/docs/signingwithoutcertificates.md +54 -0
  85. package/docs/signpathapplication.md +11 -0
  86. package/docs/sitemap.md +14 -0
  87. package/docs/tauri-glib-risk-1.8.11.md +11 -0
  88. package/docs/workflowinputs.md +17 -0
  89. package/extension/manifest.json +15 -2
  90. package/package.json +2 -1
  91. package/license.md +0 -203
  92. package/license.txt +0 -203
@@ -0,0 +1,12 @@
1
+ # Action recorder
2
+
3
+ The browser `actionrecorder` links actions to the snapshot, tab, frame and window context that preceded them. The optional `maxevents` limit keeps long sessions bounded by dropping the oldest events and reporting the number dropped in the manifest.
4
+
5
+ ```ts
6
+ const recorder = actionrecorder({ maxevents: 2000 });
7
+ recorder.snapshot(snapshot);
8
+ recorder.action({ action: "click", payload: { ref: "e1" } });
9
+ const archive = recorder.exportjson();
10
+ ```
11
+
12
+ `manifest()` and `exportjson()` return copies of the recorded payloads. `clear()` resets the event stream and correlation boundary. The recorder remains an in-memory, caller-owned component; it does not select a browser, persistence backend or credential.
@@ -62,4 +62,55 @@ Version 1.8.11 keeps the Tauri browser build flat at `desktop/`, with `Cargo.tom
62
62
 
63
63
  The Android project maps Saddle-owned `AndroidManifest.xml`, `main/`, `res/`, `test/` and `androidtest/` directly from the `android/` root through Gradle `sourceSets`. Capacitor staging under `android/app`, `android/assets` and plugin internals is generated during synchronization, removed or ignored before build, and is not project-owned source. The iOS surface keeps its generated Xcode and Swift Package internals because Capacitor owns those paths; Saddle-owned configuration remains at the `ios/` root and no project-owned `ios/src` directory is added.
64
64
 
65
- The v1.8.11 workflows derive the version from the release tag, run flat-surface validation, reject helper binaries and attach only outputs matching the dotted lowercase contract. The live release asset list must be verified before this section is changed from a source contract to a generated asset inventory.
65
+ The v1.8.11 workflows derive the version from the release tag, run flat-surface validation, reject helper binaries and attach only outputs matching the dotted lowercase contract. The live release asset list below was verified against the published GitHub release.
66
+
67
+ ## Verified 1.8.11 primary assets
68
+
69
+ Sizes are bytes and exclude the separate manifest and checksum files.
70
+
71
+ | Surface | Asset | Size |
72
+ | --------------- | ----------------------------------------------------------------------------------------------------------- | ---------: |
73
+ | Desktop browser | [AppImage](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.browser.1.8.11.appimage) | 79,870,456 |
74
+ | Desktop browser | [Debian](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.browser.1.8.11.deb) | 5,294,158 |
75
+ | Desktop browser | [RPM](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.browser.1.8.11.rpm) | 5,297,619 |
76
+ | Desktop browser | [Windows EXE](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.browser.1.8.11.exe) | 4,343,237 |
77
+ | Desktop browser | [Windows MSI](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.browser.1.8.11.msi) | 5,246,976 |
78
+ | Desktop browser | [macOS DMG](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.browser.1.8.11.dmg) | 5,216,935 |
79
+ | Android | [APK](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.apk.1.8.11.apk) | 3,498,594 |
80
+ | Android | [AAB](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.aab.1.8.11.aab) | 3,893,324 |
81
+ | Container | [OCI tarball](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.container.1.8.11.tar.gz) | 81,722,975 |
82
+ | Extension | [ZIP](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.extension.1.8.11.zip) | 10,760 |
83
+
84
+ The release also contains `manifest.*.1.8.11.json` and `sha256.*.1.8.11` files for Android, container, and each desktop runner. No IPA was attached because caller-owned Apple signing and provisioning were not enabled for this release.
85
+
86
+ ## 1.8.12 release matrix
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.
89
+
90
+ | Surface | Architectures | Artifact naming contract |
91
+ | --- | --- | --- |
92
+ | Linux desktop browser | x64, arm64 | `saddle.browser.1.8.12.<architecture>.deb`, `.rpm`, `.appimage` |
93
+ | Windows desktop browser | x86, x64, arm64 | `saddle.browser.1.8.12.<architecture>.exe`, `.msi` |
94
+ | macOS desktop browser | x64, arm64 | `saddle.browser.1.8.12.<architecture>.dmg`, `.app.zip` |
95
+ | Android | caller-configured signing | `saddle.apk.1.8.12.apk`, `saddle.aab.1.8.12.aab` |
96
+ | iOS | caller-configured signing and provisioning | `saddle.ipa.1.8.12.ipa`, `saddle.app.1.8.12.app.zip` |
97
+ | Container | OCI | `saddle.container.1.8.12.tar.gz` |
98
+ | Browser extension | Manifest V3 | `saddle.extension.1.8.12.zip` |
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.
101
+
102
+ ## 1.8.13 release matrix
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.
105
+
106
+ | Surface | Architectures | Artifact naming contract |
107
+ | --- | --- | --- |
108
+ | Linux desktop browser | x64, arm64 | `saddle.browser.1.8.13.<architecture>.deb`, `.rpm`, `.appimage` |
109
+ | Windows desktop browser | x86, x64, arm64 | `saddle.browser.1.8.13.<architecture>.exe`, `.msi` |
110
+ | macOS desktop browser | x64, arm64 | `saddle.browser.1.8.13.<architecture>.dmg`, `.app.zip` |
111
+ | Android | caller-configured signing | `saddle.apk.1.8.13.apk`, `saddle.aab.1.8.13.aab` |
112
+ | iOS | caller-configured signing and provisioning | `saddle.ipa.1.8.13.ipa`, `saddle.app.1.8.13.app.zip` |
113
+ | Container | OCI | `saddle.container.1.8.13.tar.gz` |
114
+ | Browser extension | Manifest V3 | `saddle.extension.1.8.13.zip` |
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.
@@ -0,0 +1,13 @@
1
+ # Objective driven batches 1.8.16 to 1.8.20
2
+
3
+ The uploaded scope README remains an objective reference. It describes the intended package behavior, runtime independence, storage-to-compute bridge and public target surfaces; it does not prescribe a deterministic file sequence or implementation recipe.
4
+
5
+ | Batch | Selected objective | Acceptance evidence |
6
+ |---|---|---|
7
+ | 1.8.16 | Complete the generic S3-compatible storage surface with caller-signed paginated listing. | XML listing fixtures, prefix and continuation handling, malformed-response errors and adapter contract tests. |
8
+ | 1.8.17 | Make sitemap index traversal bounded, recursive, deduplicated and cycle-safe. | Nested index fixtures, duplicate URLs, cycles, `maxUrls` and network-error tests. |
9
+ | 1.8.18 | Make browser action recording bounded and exportable without losing snapshot correlation. | Event limit, clear/export behavior, immutable manifest copies and correlation tests. |
10
+ | 1.8.19 | Add explicit workflow input validation and deterministic trigger matching for caller-owned CI dispatch. | Strict input fixtures, unknown input rejection, event filtering and registry tests. |
11
+ | 1.8.20 | Add a cross-runtime capability report for library, browser, desktop, mobile, CLI and binary modes. | Stable capability matrix, caller overrides and no host, port or credential ownership. |
12
+
13
+ The batches are deliberately grouped by objective rather than by a fixed folder plan. Each batch must pass focused tests before the next batch is selected. Version bumps, commits, tags and releases remain separate delivery actions and wait for the user's explicit authorization.
@@ -0,0 +1,13 @@
1
+ # Capability report
2
+
3
+ The `capabilityreport` contract produces a stable, serializable view of the execution, runtime, memory, file, dependency, visibility and pairing axes. It resolves every execution mode with caller-selected overrides and exposes the effective boolean capabilities for diagnostics, documentation and adapters.
4
+
5
+ ```ts
6
+ const report = capabilityreport({
7
+ runtime: "unknown",
8
+ memory: "external",
9
+ pair: "with",
10
+ });
11
+ ```
12
+
13
+ The report explicitly labels host, port, credentials and provider as caller-owned. It does not start a process, open a socket, select a cloud service or promise that every target has an installed toolchain. It describes the library contract and preserves user choice across browser, desktop, mobile, CLI, binary and application modes.
@@ -0,0 +1,17 @@
1
+ # Document map for 1.8.12
2
+
3
+ ## Canonical root documents
4
+
5
+ Project policies, notices and contribution guidance remain at the repository root so package consumers and forge interfaces can discover them without entering `docs`. The canonical license is the extensionless `LICENSE` file containing the official unmodified GNU GPL v3.0 text. Human-readable project policies use one Markdown file per context: `acceptable-use-policy.md`, `authors.md`, `bug-report.md`, `cla.md`, `code-of-conduct.md`, `contributing.md`, `copyright.md`, `disclaimer.md`, `eula.md`, `export-control.md`, `governance.md`, `notice.md`, `privacy-policy.md`, `pull-request-template.md`, `security.md`, `support.md`, `terms-and-conditions.md`, `terms-of-use.md`, `third-party-notices.md` and `trademark-policy.md`.
6
+
7
+ The public scope README remains `/home/ubuntu/upload/README.md` and was not modified. The repository's own `README.md` remains a public project document and can receive release or signing-policy updates separately from the immutable scope reference.
8
+
9
+ ## Removed exact duplicates
10
+
11
+ The following root `.txt` files were byte-identical copies of their Markdown counterparts and were removed: `authors.txt`, `code-of-conduct.txt`, `contributing.txt`, `copyright.txt`, `disclaimer.txt`, `notice.txt`, `privacy-policy.txt`, `security.txt`, `terms-and-conditions.txt`, `terms-of-use.txt` and `trademark-policy.txt`. The old `license.md` and `license.txt` were also removed because they duplicated a now-canonical root license context while carrying the obsolete proprietary view-only text.
12
+
13
+ The README files under `docs/plans` and `docs/talks9` were not treated as root policy duplicates. They preserve plan or conversation context and are intentionally outside the root legal-document set.
14
+
15
+ ## Policy rule
16
+
17
+ A policy document may describe repository operations, hosted-service behavior, privacy, security, trademarks or community conduct, but it must not revoke rights granted by GPL-3.0-only. Third-party component licenses remain separate and are recorded through package manifests, lockfiles and release inventories.
@@ -0,0 +1,21 @@
1
+ # License audit for 1.8.12
2
+
3
+ ## Current repository state
4
+
5
+ The repository contains three project license copies: `LICENSE`, `license.md` and `license.txt`. All three describe a custom Proprietary Source-Available License, View Only. They explicitly state that the software is not open source and prohibit copying, execution, modification, distribution and internal business use without written permission. `license.md` and `license.txt` contain minor author and link differences from `LICENSE`.
6
+
7
+ The package manifests do not match those documents. `package.json` declares `GPL-3.0-only`, `pom.xml` declares GNU GPL v3.0, `saddle.csproj` declares `GPL-3.0-only`, and `saddle.gemspec` declares `GPL-3.0`. This is a material licensing contradiction that must be resolved before a new release is tagged.
8
+
9
+ ## Verified policy distinction
10
+
11
+ The Open Source Initiative requires an open source license to allow free redistribution, source distribution, derived works, and use in any field of endeavor, including business use [1]. The GNU GPL v3 grants permission to run and modify covered works and allows private works that are not conveyed without additional conditions; distribution activates the license obligations [2].
12
+
13
+ Therefore, “open source but only for our private use” is not one coherent license policy. A private or internal deployment is compatible with GPL use, but a license that prohibits other people from using, copying, modifying or distributing the software is source-available/proprietary, not OSI open source. The repository must choose one policy and express it consistently across the three license files, manifests, package metadata, README references and provider applications.
14
+
15
+ SignPath Foundation requires an OSI-approved open source license without commercial dual licensing for all components. It also requires active maintenance, an existing release, documented functionality, a public code-signing policy, verifiable builds and manual approval for every signed release [3]. The current view-only license would therefore be incompatible with the free SignPath Foundation route until the repository adopts and consistently declares an OSI-approved license.
16
+
17
+ ## References
18
+
19
+ [1]: https://opensource.org/osd "Open Source Initiative: The Open Source Definition"
20
+ [2]: https://www.gnu.org/licenses/gpl-3.0.html "Free Software Foundation: GNU General Public License version 3"
21
+ [3]: https://signpath.org/terms.html "SignPath Foundation: Conditions for Open Source projects"
@@ -0,0 +1,21 @@
1
+ # Memory engine
2
+
3
+ The `memoryengine` contract keeps a hot working set in process memory while using caller-owned storage backends as the durable side of the bridge. With no limits, the engine preserves its historical behavior. With `maxentries` or `maxbytes`, it evicts the least recently used object after a load or persist operation exceeds the selected bound.
4
+
5
+ ```ts
6
+ import { memoryengine } from "@wenathlan/saddle";
7
+
8
+ const memory = memoryengine({
9
+ backends: [storage],
10
+ maxentries: 128,
11
+ maxbytes: 64 * 1024 * 1024,
12
+ });
13
+
14
+ await memory.persist("job-output", payload, { mimetype: "application/json" });
15
+ const object = await memory.load("job-output");
16
+ console.log(memory.stats());
17
+ ```
18
+
19
+ Eviction affects only the hot in-process cache. The engine persists data to every configured backend before updating the cache, and a later load can rehydrate an evicted object from the first backend that returns it. `stats()` reports entries, bytes, cache hits, cache misses, evictions and configured limits so a caller can tune the working set without treating storage as physical RAM.
20
+
21
+ The limits are optional non-negative integers. A payload larger than `maxbytes` remains persisted but is not retained in the hot cache. The engine does not create a host, port, credential, storage account or provider binding on behalf of the caller.
@@ -0,0 +1,69 @@
1
+ # Saddle native identity research
2
+
3
+ ## OpenCode comparison
4
+
5
+ The public OpenCode repository documents a desktop distribution alongside its CLI and package-manager routes. Its documented desktop matrix includes macOS Apple Silicon and Intel DMG installers, a Windows x64 executable, and Linux DEB, RPM and AppImage outputs. The comparison supports explicit platform and architecture naming in Saddle release assets, but it does not justify copying OpenCode branding, icons or implementation.
6
+
7
+ Source: [OpenCode repository and README](https://github.com/anomalyco/opencode)
8
+
9
+ ## ZCode comparison
10
+
11
+ The public ZCode installation guide presents separate downloads for macOS Apple Silicon, macOS Intel, Windows x64, Windows ARM64 and Linux x64. Its Linux guidance uses an AppImage, while macOS uses a DMG to install an `.app` bundle and Windows uses an installer. This supports adding architecture-aware artifact labels and an explicit `.app` packaging path where the Apple runner supports it.
12
+
13
+ Source: [ZCode official installation guide](https://zcode.z.ai/en/docs/install)
14
+
15
+ ## Saddle decisions
16
+
17
+ Saddle keeps one shared TypeScript library-first engine and uses flat, surface-owned build roots. The release matrix should distinguish architecture from package format, for example `saddle.browser.1.8.11.windows.x64.exe` and `saddle.browser.1.8.11.windows.arm64.exe`, instead of hiding architecture in a generic filename. The workflow must publish only artifacts actually built by the runner and must not claim a valid signature when signing credentials are absent.
18
+
19
+ Windows Authenticode, macOS Developer ID signing and notarization, Android release signing, and Apple provisioning remain caller-owned secret contracts. Public workflows can validate certificate presence, signer identity, timestamping and notarization status without embedding keys or manufacturing trust signals.
20
+
21
+ ## Official signing constraints
22
+
23
+ Microsoft documents that Smart App Control accepts RSA-based code-signing certificates and does not currently support ECC signatures for this check. Trusted Signing is the preferred Microsoft route, while `signtool.exe` remains the command-line path for certificate-backed signing. An unsigned or locally signed binary cannot honestly be presented as trusted by the Saddle workflow.
24
+
25
+ Apple documents that macOS software distributed with Developer ID must be notarized, and that notarization scans for malicious components and code-signing issues. A production workflow therefore needs Developer ID signing, hardened runtime, a secure timestamp, notarization through `notarytool` or an equivalent service, and ticket stapling before the artifact is labeled notarized.
26
+
27
+ Sources: [Microsoft Smart App Control code signing](https://learn.microsoft.com/en-us/windows/apps/develop/smart-app-control/code-signing-for-smart-app-control) and [Apple notarizing macOS software](https://developer.apple.com/documentation/security/notarizing-macos-software-before-distribution).
28
+
29
+ ## Windows without a private certificate
30
+
31
+ Microsoft's current comparison states that an MSIX package submitted through the Microsoft Store is re-signed by Microsoft at no certificate cost to the publisher. The same free treatment does not apply to an MSI or EXE submitted through the Store: those installers must already chain to a certificate trusted by Microsoft's root program. For direct distribution, Microsoft lists Azure Artifact Signing, traditional OV certificates, self-signed certificates and unsigned binaries as different trust levels; self-signed and unsigned outputs are for development or testing, not public trust. The page also identifies the SignPath Foundation as an open-source route worth evaluating rather than pretending that a generated self-signed key removes SmartScreen warnings.
32
+
33
+ Source: [Microsoft code signing options for Windows app developers](https://learn.microsoft.com/en-us/windows/apps/package-and-deploy/code-signing-options).
34
+
35
+ ## Apple distribution without an owned certificate
36
+
37
+ Apple's Developer ID guidance states that Gatekeeper checks for a Developer ID certificate when software is distributed outside the Mac App Store. The Developer ID certificate is generated from an Apple Developer account by the Account Holder, and notarization scans Developer ID-signed software before Apple issues the ticket used by Gatekeeper. There is no public framework that manufactures an Apple-trusted Developer ID certificate for an unrelated project. An open-source project must either distribute through the Mac App Store, use an authorized organization account, or publish an unsigned/test artifact with an explicit warning.
38
+
39
+ Source: [Apple Developer ID signing and notarization](https://developer.apple.com/developer-id/).
40
+
41
+ ## Android distribution without owning the Play signing key
42
+
43
+ Android still requires every installable APK to be digitally signed. Google Play App Signing changes who protects the production app-signing key: the publisher keeps an upload key, while Google signs the distributed APKs. This helps an open-source project avoid operating the final Play signing key, but it does not remove the need for a Play Console account, an upload key and a release identity. Direct APK distribution outside Google Play still requires Saddle to sign the APK itself.
44
+
45
+ Source: [Android app signing and Play App Signing](https://developer.android.com/studio/publish/app-signing).
46
+
47
+ ## Open-source Windows certificate route
48
+
49
+ The SignPath Foundation states that it can provide code-signing certificates for eligible open-source projects, keeps the private key in its hardware security module and verifies that the binary came from the project's public repository. This is a real external approval program, not a library that generates a universally trusted certificate locally. Saddle can apply to the program, but the workflow must remain disabled or unsigned until the project is accepted and the provider-specific integration is configured.
50
+
51
+ Source: [SignPath Foundation](https://signpath.org/).
52
+
53
+ ## What the OpenCode workflow actually does
54
+
55
+ The public OpenCode publish workflow invokes `azure/artifact-signing-action` with an Azure Trusted Signing endpoint, account name and certificate profile. This explains how a visible open-source project can distribute signed Windows binaries: the project has access to an external signing service and repository or organization secrets. It is not evidence that OpenCode generates a universally trusted certificate from source code. Saddle can follow the same pattern after an Azure Artifact Signing or SignPath application is approved, but must keep its unsigned mode until then.
56
+
57
+ Source: [OpenCode publish workflow](https://raw.githubusercontent.com/anomalyco/opencode/dev/.github/workflows/publish.yml).
58
+
59
+ ## What the Zed workflow demonstrates
60
+
61
+ The public Zed post-release workflow focuses on refreshing release pages, publishing a WinGet manifest and deploying documentation. It references organization secrets for those integrations and does not expose a locally generated signing certificate. This is consistent with the broader pattern: open-source projects can publish broadly, but platform trust comes from a store, a managed signing provider or a certificate held by the project organization.
62
+
63
+ Source: [Zed post-release workflow](https://raw.githubusercontent.com/zed-industries/zed/main/.github/workflows/after_release.yml).
64
+
65
+ ## Safe GitHub Actions secret handling
66
+
67
+ GitHub's documentation says repository or environment secrets are created from the repository Settings page and injected through the `secrets` context. Secrets are not passed to fork-triggered workflows or Dependabot events, and GitHub recommends OIDC for cloud providers that support it so long-lived credentials can be avoided. Saddle must therefore configure signing only on trusted release events, never expose values in command arguments or logs, and keep manual test keys separate from production signing credentials.
68
+
69
+ Source: [Using secrets in GitHub Actions](https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).
@@ -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.11`, it writes dotted surface-specific names such as `sha256.desktop.1.8.11`, `manifest.desktop.1.8.11.json`, `sbom.desktop.1.8.11.cdx.json` and `provenance.desktop.1.8.11.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.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.
4
4
 
5
5
  ```bash
6
6
  npm run release:assets -- \
7
- --version 1.8.11 \
7
+ --version 1.8.12 \
8
8
  --surface desktop \
9
9
  --output build/release \
10
10
  --artifact build/saddle.tgz \
@@ -15,3 +15,7 @@ npm run release:assets -- \
15
15
  The artifact paths are supplied by the caller and are sorted before the checksum, manifest, SBOM and provenance files are written. Package dependencies are read from the root lockfile to build a compact component list. The output can be attached to a release or checked by a registry-specific workflow without adding credentials to the library.
16
16
 
17
17
  The package also exports the adapter as `@wenathlan/saddle/release-assets`. It is intentionally Node-only because release metadata reads files and uses the Node crypto implementation; the transport-neutral root remains free of Node imports.
18
+
19
+ ## Release matrix
20
+
21
+ The `releaseartifactmatrix(version, options)` contract in `packager/manifest.ts` describes the supported desktop, Android, iOS, container and browser-extension outputs in one deterministic structure. Each entry includes platform, architecture, dotted artifact names, checksum name, manifest name and the actual signing label supplied by the caller. It is descriptive only: it does not invoke a vendor toolchain, select a registry or imply that a platform trusts an unsigned artifact.
@@ -0,0 +1,46 @@
1
+ # Saddle 1.8.12
2
+
3
+ Saddle 1.8.12 consolidates the root-first native surfaces, the GPL-3.0-only project policy, release provenance and the cross-platform artifact contract. The package manifest and active native manifests remain at `1.8.12`. The uploaded scope README is not an execution script and was not rewritten.
4
+
5
+ ## Highlights
6
+
7
+ | Area | Change |
8
+ |---|---|
9
+ | Licensing | Canonical GPL-3.0-only license, aligned package metadata and consolidated root legal documents. |
10
+ | Release verification | Independent checksum, manifest and explicit signing-state verification. |
11
+ | Storage | Paginated S3-compatible listing with prefix, continuation token, XML entity decoding and caller-owned limits. |
12
+ | Scraping | Bounded recursive sitemap traversal with deduplication, cycle protection and injected fetcher. |
13
+ | Browser | Bounded action recorder with immutable manifests, JSON export and explicit clearing. |
14
+ | Workflows | Strict typed inputs, defaults, choices and deterministic trigger identities. |
15
+ | Modes | Cross-runtime capability report with caller-owned host, port, credentials and provider boundaries. |
16
+ | Security | Existing CodeQL, OSV, npm audit, cargo audit, Trivy, SBOM and provenance gates remain active. |
17
+
18
+ ## Artifact matrix
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.
21
+
22
+ | Surface | Architectures or mode | Expected artifact |
23
+ |---|---|---|
24
+ | Linux desktop browser | x64, arm64 | `saddle.browser.1.8.12.<architecture>.deb`, `.rpm`, `.appimage` |
25
+ | Windows desktop browser | x86, x64, arm64 | `saddle.browser.1.8.12.<architecture>.exe`, `.msi` |
26
+ | macOS desktop browser | x64, arm64 | `saddle.browser.1.8.12.<architecture>.dmg`, `.app.zip` |
27
+ | Android | caller-configured signing | `saddle.apk.1.8.12.apk`, `saddle.aab.1.8.12.aab` |
28
+ | iOS | caller-configured signing and provisioning | `saddle.ipa.1.8.12.ipa`, `saddle.app.1.8.12.app.zip` |
29
+ | Container | OCI | `saddle.container.1.8.12.tar.gz` |
30
+ | Browser extension | Manifest V3 | `saddle.extension.1.8.12.zip` |
31
+
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
+
34
+ ## Compatibility and upgrade notes
35
+
36
+ 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
+
38
+ ## Verification
39
+
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.
41
+
42
+ ## References
43
+
44
+ [1]: https://github.com/wenathlan/saddle "Saddle source repository"
45
+ [2]: https://github.com/wenathlan/saddle/releases "Saddle release archive"
46
+ [3]: https://github.com/wenathlan/saddle/blob/main/LICENSE "Saddle GPL-3.0-only license"
@@ -0,0 +1,42 @@
1
+ # Saddle 1.8.13
2
+
3
+ Saddle 1.8.13 carries the active code and release-facing manifests forward from 1.8.12. The previous [1.8.12 release notes](releasenotes-1.8.12.md) remain the canonical record for the licensing and artifact baseline. The comparative 1.8.21 research is planning material and is not presented as a shipped feature.
4
+
5
+ ## Changes
6
+
7
+ | Area | Change |
8
+ |---|---|
9
+ | Persistent queue | Added caller-owned leases, visibility timeout, deterministic clock injection, renewals, attempt accounting and idempotency-key deduplication. Existing crash recovery and retry behavior remain compatible. |
10
+ | Version identity | Aligned npm, lockfile, Maven, NuGet, RubyGems, browser extension, Tauri, iOS, crawler and Capacitor metadata to `1.8.13`. The iOS marketing version is `1.8.13` with build `1008013`. |
11
+ | Structured extraction | Added a schema-neutral result with field-level source URL, selector, extraction timestamp, bounded UTF-8 payload and caller-injected parser support. |
12
+ | Browser context | Added allowlisted snapshot projection with stable snapshot and element references, deterministic UTF-8 byte budgets and truncation metadata. |
13
+ | Workflow lifecycle | Extended resumable runs with explicit cancellation reasons and caller-owned, idempotent compensation callbacks. Compensation failures are surfaced as `COMPENSATION_FAILED`. |
14
+ | Artifact retention | Added deterministic keep/prune decisions by maximum age, count or bytes. Manifest generation records policy and decisions and never deletes caller files. |
15
+ | Documentation | Added the 1.8.13 release notes and retained the 1.8.12 artifact and signing policy documents. |
16
+ | Architecture | Kept the root-first layout, no project-owned `src` directory, transport-neutral exports and caller-owned infrastructure. |
17
+
18
+ ## Artifact contract
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.
21
+
22
+ | Surface | Expected artifact family |
23
+ |---|---|
24
+ | Linux desktop | `saddle.browser.1.8.13.<architecture>.deb`, `.rpm`, `.appimage` |
25
+ | Windows desktop | `saddle.browser.1.8.13.<architecture>.exe`, `.msi` |
26
+ | macOS desktop | `saddle.browser.1.8.13.<architecture>.dmg`, `.app.zip` |
27
+ | Android | `saddle.apk.1.8.13.apk`, `saddle.aab.1.8.13.aab` |
28
+ | iOS | `saddle.ipa.1.8.13.ipa`, `saddle.app.1.8.13.app.zip` |
29
+ | Container | `saddle.container.1.8.13.tar.gz` |
30
+ | Browser extension | `saddle.extension.1.8.13.zip` |
31
+
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
+
34
+ ## Verification
35
+
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.
37
+
38
+ ## References
39
+
40
+ [1]: https://github.com/wenathlan/saddle "Saddle source repository"
41
+ [2]: https://github.com/wenathlan/saddle/releases "Saddle release archive"
42
+ [3]: https://github.com/wenathlan/saddle/blob/main/docs/releasenotes-1.8.12.md "Saddle 1.8.12 release notes"