@wenathlan/saddle 1.8.14 → 1.8.16

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 (82) hide show
  1. package/README.md +2 -2
  2. package/dist/apps/registry.d.ts +1 -1
  3. package/dist/binary/archive.d.ts +27 -0
  4. package/dist/binary/archive.d.ts.map +1 -0
  5. package/dist/binary/archive.js +46 -0
  6. package/dist/binary/archive.js.map +1 -0
  7. package/dist/binary/transform.d.ts +70 -0
  8. package/dist/binary/transform.d.ts.map +1 -0
  9. package/dist/binary/transform.js +105 -0
  10. package/dist/binary/transform.js.map +1 -0
  11. package/dist/delivery/manifest.d.ts +35 -0
  12. package/dist/delivery/manifest.d.ts.map +1 -0
  13. package/dist/delivery/manifest.js +68 -0
  14. package/dist/delivery/manifest.js.map +1 -0
  15. package/dist/index.d.ts +8 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +8 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/mcp/server.d.ts +3 -3
  20. package/dist/memory/engine.d.ts +1 -1
  21. package/dist/memory/planner.d.ts +66 -0
  22. package/dist/memory/planner.d.ts.map +1 -0
  23. package/dist/memory/planner.js +108 -0
  24. package/dist/memory/planner.js.map +1 -0
  25. package/dist/release/evidence.d.ts +92 -0
  26. package/dist/release/evidence.d.ts.map +1 -0
  27. package/dist/release/evidence.js +148 -0
  28. package/dist/release/evidence.js.map +1 -0
  29. package/dist/runners/chain.d.ts +125 -0
  30. package/dist/runners/chain.d.ts.map +1 -0
  31. package/dist/runners/chain.js +95 -0
  32. package/dist/runners/chain.js.map +1 -0
  33. package/dist/scrape/robots.js +1 -1
  34. package/dist/storage/index.d.ts +1 -0
  35. package/dist/storage/index.d.ts.map +1 -1
  36. package/dist/storage/index.js +1 -0
  37. package/dist/storage/index.js.map +1 -1
  38. package/dist/storage/memory.js +2 -2
  39. package/dist/storage/memory.js.map +1 -1
  40. package/dist/storage/pool.d.ts +95 -0
  41. package/dist/storage/pool.d.ts.map +1 -0
  42. package/dist/storage/pool.js +202 -0
  43. package/dist/storage/pool.js.map +1 -0
  44. package/dist/surfaces/requirements.d.ts +29 -0
  45. package/dist/surfaces/requirements.d.ts.map +1 -0
  46. package/dist/surfaces/requirements.js +50 -0
  47. package/dist/surfaces/requirements.js.map +1 -0
  48. package/docs/artifactavailability.md +13 -1
  49. package/docs/ecosystemplan.md +1 -1
  50. package/docs/enginearchitecture.md +30 -0
  51. package/docs/libraryapi.md +5 -1
  52. package/docs/plans/00.index.md +2 -2
  53. package/docs/plans/06.dependencies.md +1 -1
  54. package/docs/plans/18.research.content.extraction.md +3 -3
  55. package/docs/plans/22.research.universal.runtime.md +10 -10
  56. package/docs/plans/28.action.plan.md +1 -1
  57. package/docs/plans/35.comparativo.concorrencia.md +10 -10
  58. package/docs/plans/40.npm.publish.md +6 -6
  59. package/docs/plans/41.o.que.falta.md +2 -2
  60. package/docs/plans/42.pesquisa.concorrencia.md +2 -2
  61. package/docs/plans/43.plan.universal.architecture.md +2 -2
  62. package/docs/plans/44.reference.md +1 -1
  63. package/docs/plans/45.robotarchitecture.md +3 -3
  64. package/docs/plans/46.scdnintegration.md +1 -1
  65. package/docs/plans/README.md +2 -2
  66. package/docs/plans/missing-facts.md +1 -1
  67. package/docs/registryresearch.md +3 -3
  68. package/docs/release17notes.md +1 -1
  69. package/docs/releasenotes-1.8.14.md +24 -9
  70. package/docs/releasenotes-1.8.15.md +41 -0
  71. package/docs/releasenotes-1.8.16.md +40 -0
  72. package/docs/repo-research-1.8.16.md +439 -0
  73. package/docs/repo-synthesis-1.8.16.md +56 -0
  74. package/docs/talks9/README (2).md +2 -2
  75. package/docs/talks9/README.md +4 -4
  76. package/docs/talks9/Viabilidade do Saddle_ Uma An/303/241lise T/303/251cnica da Transforma/303/247/303/243o de Armazenamento Remoto em Mem/303/263ria Computacional.md" +4 -4
  77. package/docs/talks9/conversa.txt +4 -4
  78. package/docs/todo-1.8.15.md +483 -0
  79. package/docs/todo-1.8.16.md +651 -0
  80. package/docs/todo.md +708 -0
  81. package/extension/manifest.json +1 -1
  82. package/package.json +10 -2
@@ -117,7 +117,7 @@ Each surface also emits `sha256.*.1.8.13`, `manifest.*.1.8.13.json` and, where e
117
117
 
118
118
  ## 1.8.14 release matrix
119
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.
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 contains 38 verified assets; iOS remains unavailable until caller-owned Apple signing and provisioning are configured.
121
121
 
122
122
  | Surface | Architectures | Artifact naming contract |
123
123
  | --- | --- | --- |
@@ -130,3 +130,15 @@ Version 1.8.14 keeps the release-tag-derived matrix and adds post-push container
130
130
  | Browser extension | Manifest V3 | `saddle.extension.1.8.14.zip` |
131
131
 
132
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.
133
+
134
+ The verified 1.8.14 release contains six Linux assets, six Windows assets, four macOS assets, two Android assets, one container archive, one browser extension, nine manifests and nine checksum files. The release-event mobile job did not bypass missing production credentials; the successful manual rerun used the explicit `ci-test-key` path.
135
+
136
+ ## 1.8.15 verified release matrix
137
+
138
+ The published [v1.8.15 release](https://github.com/wenathlan/saddle/releases/tag/v1.8.15) contains 38 attached assets: six Linux desktop artifacts, six Windows desktop artifacts, four macOS desktop artifacts, two Android artifacts, one container archive, one browser extension, nine manifests, and nine checksum files. The primary artifacts use the dotted lowercase names `saddle.browser.1.8.15.<architecture>.<format>`, `saddle.apk.1.8.15.apk`, `saddle.aab.1.8.15.aab`, `saddle.container.1.8.15.tar.gz`, and `saddle.extension.1.8.15.zip`.
139
+
140
+ The available metadata files are `manifest.android.1.8.15.json`, `manifest.container.1.8.15.json`, the seven desktop `manifest.*.1.8.15.json` files, and the matching nine `sha256.*.1.8.15` files. The release record identifies Android as `ci-test-key`, desktop surfaces as `unsigned`, and the container as `caller-owned`; those declared states do not imply production signing, notarization, or registry trust.
141
+
142
+ ## 1.8.16 candidate release matrix
143
+
144
+ Version 1.8.16 preserves the tag-derived 38-asset contract described in [releasenotes-1.8.16.md](releasenotes-1.8.16.md). Before tag workflows complete, every 1.8.16 entry is an expected output rather than an availability claim. The new release-evidence API can normalize and evaluate results supplied by completed verification adapters, but it cannot generate artifacts, change their signing state, publish them, or validate their registry availability.
@@ -46,7 +46,7 @@ Each block follows the same loop:
46
46
  3. Define the smallest transport-neutral contract.
47
47
  4. Implement grouped logic in the domain folder without adding a vendor dependency unless required.
48
48
  5. Add deterministic tests with fake transports and no real credentials.
49
- 6. Update API docs, README claims, changelog and `todo.md`.
49
+ 6. Update API docs, README claims, changelog and `docs/todo.md`.
50
50
  7. Run format, syntax, tests, package and security checks.
51
51
  8. Commit and push the block before starting the next one.
52
52
 
@@ -32,11 +32,41 @@ The public contract uses plain objects and factory functions. The engine never r
32
32
  | contract | responsibility | open choice |
33
33
  |---|---|---|
34
34
  | `storageadapter` | put, get, head, delete, and list artifacts | local, s3 compatible, webdav, hf, kaggle, or another backend |
35
+ | `storagepool` | read verified replicas, write to an explicit quorum, describe capabilities, and produce a repair plan | caller-authorized adapters with explicit priority and no background replication |
35
36
  | `localmemory` | prepare, sync, and cleanup a working set | tmpfs, mmap, sqlite, r2, or a remote bridge |
37
+ | `workingbudget` / `workingadmission` / `bridgeplan` | plan bounded materialization and host-memory operations | caller-owned host adapter; the transport-neutral core never mounts, swaps, or executes a shell command |
38
+ | `providerchain` / `artifacthandoff` | select a declared eligible runner and prepare immutable transfer evidence | caller-authorized provider reports and a caller-owned dispatch or storage adapter |
39
+ | `deliverymanifest` / `verifydelivery` / `pwaplan` | verify immutable transport chunks and describe offline registration requirements | caller-owned CDN or web host; no dynamic import or service-worker registration from the core |
36
40
  | `scheduler` | select the first available provider by stable priority | github, forgejo, gitea, gitlab, hf, kaggle, or custom |
37
41
  | `engine` | coordinate the lifecycle and emit events | library, cli, browser, desktop, mobile, or service |
38
42
  | `validatesession` | accept a versioned session record | browser capture, replay, or external event source |
39
43
 
44
+ `storagepool` is an additive storage contract. It selects members in stable caller-configured priority order, accepts only caller-owned adapters, verifies a returned digest when one is supplied by the caller or manifest, and returns per-member evidence. A quorum write reports partial outcomes and fails when the requested threshold is not met. `repairplan` is declarative: it identifies a source and candidate targets but never starts a background repair, probes an account, or mutates an adapter.
45
+
46
+ `workingadmission` selects serializable candidates against byte and entry budgets without reading data. `bridgeplan` can describe `temporaryfile`, `mmap`, `tmpfs`, `zram`, or `swap` only when a caller declares the capability. A returned `caller-executes` result contains preconditions and cleanup ownership; an unsupported capability is reported without a probe or side effect.
47
+
48
+ `materializationledger` records only validated materialization transitions and produces a `caller-cleans` plan. It does not unlink a file, unmount a volume, modify swap, or delete a remote replica.
49
+
50
+ `magicbytes`, `wasmplan`, `transformationkey`, `transformationcache`, and `executeisolated` define a separate binary boundary. The module classifies verified byte prefixes, plans bounded WASM work, invalidates cache reuse when source, compiler, key, or policy differ, and calls an injected isolated adapter only. It never creates a process, a container, a filesystem mount, or a network connection by itself.
51
+
52
+ `cacheeligibility` rejects reuse for outputs that are unverified, secret-bearing, private, environment-bound, or partial. It reports normalized reasons and never attempts to inspect, upload, or redact an artifact.
53
+
54
+ `archivelimits` and `archiveinspection` validate a caller-provided archive inventory before extraction. The contract rejects excess entry count, nested depth, output bytes, decompression ratio, absolute paths, and traversal paths. `extractarchive` requires an accepted inspection and an injected adapter, so the core neither opens an archive nor writes an extracted file.
55
+
56
+ `providerchain` consumes only explicit provider reports. It rejects unavailable, under-capacity, or capability-incompatible candidates with evidence, chooses the remaining candidate by stable priority, and emits a `caller-dispatches` plan rather than a remote request. `artifacthandoff` requires an artifact digest, size, provider identity, and retention choice before a caller transfers output to storage.
57
+
58
+ `renderdispatch` can serialize an existing dispatch plan only through an injected adapter. It does not post to a forge, create a workflow run, or own an authentication token.
59
+
60
+ `cancellationplan` represents a caller request to cancel a remote run. It deliberately reports the remote state as `unknown` until the selected provider adapter confirms an outcome, and it leaves any compensation decision to the caller.
61
+
62
+ `deliverymanifest` keeps ordered chunks immutable through content type, size, and SHA-256 metadata. `verifydelivery` checks received bytes without evaluating JavaScript or WASM. `pwaplan` only describes scope, offline intent, update policy, and declared service-worker support; the host decides whether to register anything.
63
+
64
+ `cdncapabilities` records only caller-reported delivery properties such as immutable caching, purge support, range delivery, integrity headers, CORS, and visibility. It never performs a CDN probe, purge, upload, or configuration mutation.
65
+
66
+ `releaseevidence` evaluates caller-supplied supply-chain and release metadata as data. It normalizes a subject digest, producer, workflow, evidence kind, verification method, timestamp and explicit status. `evaluateevidence` produces only `accepted`, `rejected`, or `insufficient` with stable reason codes; it never treats an unchecked declaration as a signature, trust decision, compliance result, or vulnerability assessment. `evidencefromverification` converts an already-completed `verifyassets` result into `checked` checksum evidence, retaining its explicit signing state as metadata and never upgrading an `unsigned` or caller-owned state into a signing claim. `releasereadiness` binds a source tag, observed manifest versions, gates, artifact-plan digest, publication targets, signing state, and evidence result into a serializable receipt. These contracts do not edit versions, create a tag, trigger a workflow, publish, sign, scan, download, or contact a registry.
67
+
68
+ `miniappplan`, `dnsplan`, and `applicationbridge` add deployment-neutral application requirements. Mini App plans reject token-bearing input and require an HTTPS origin plus a caller-selected validation method. DNS records list ownership, DNSSEC and HTTPS requirements but cannot buy a domain, change a zone, or obtain a certificate. Surface bridges only report declared capabilities for browser, desktop, mobile, extension, and Mini App targets.
69
+
40
70
  ## execution lifecycle
41
71
 
42
72
  ```text
@@ -39,6 +39,8 @@ The public API is designed around injected transports. Consumers can use the sam
39
39
  | `commandguard` | enforce caller-defined bot command scopes |
40
40
  | `deliveryqueue` | retry webhook deliveries and retain dead letters |
41
41
  | `nodeserver` | expose a Web Request/Response handler through Node HTTP |
42
+ | `releaseevidence` / `evaluateevidence` | normalize caller-supplied evidence and evaluate it against explicit policy with bounded decision reasons |
43
+ | `evidencefromverification` / `releasereadiness` | map an already-valid local checksum result and assemble a descriptive readiness receipt without performing a release |
42
44
  | `@wenathlan/saddle/browser-playwright` | optional Node-only Playwright session adapter; the peer is caller-installed and the root remains vendor-neutral |
43
45
 
44
46
  ```js
@@ -56,10 +58,12 @@ The `fetcher`, browser adapter, persistence adapter, proxy pool, captcha solver,
56
58
 
57
59
  ## package surfaces
58
60
 
59
- The package exposes explicit subpaths for `./browser`, `./bot`, `./captcha`, `./memory-engine`, and `./deploy`. Desktop, mobile, target-plan and n8n contracts are exported from the root entry; the root entry remains the complete compiled JavaScript API with generated TypeScript declarations for consumers that prefer one import.
61
+ The package exposes explicit subpaths for `./browser`, `./bot`, `./captcha`, `./memory-engine`, `./deploy`, and `./release-evidence`. Desktop, mobile, target-plan and n8n contracts are exported from the root entry; the root entry remains the complete compiled JavaScript API with generated TypeScript declarations for consumers that prefer one import.
60
62
 
61
63
  The `./extension` subpath exposes browser-neutral message, snapshot and service-worker routing contracts. The concrete Manifest V3 files live in `extension/`; they are not imported by the core at runtime and do not require Chrome when the library is used as a Node package. The browser surface also exposes snapshots, tab/frame context, action results, bounded action batches and recording through `./browser`.
62
64
 
63
65
  The current release exposes `desktopmanifest`, `mobilemanifest`, `desktopadapter`, `mobileadapter`, `n8nnode`, `n8nmatch`, `n8nexecute`, `controlsurface`, `controlservice`, and `workerbridge`. These factories describe surface boundaries and invoke caller-owned handlers; they do not install a native toolkit, start an n8n server, create a dashboard, or store credentials.
64
66
 
67
+ `releaseevidence` and `evaluateevidence` retain the status that a caller supplies instead of asserting a security property. `evidencefromverification` accepts only an already-valid `verifyassets` result and maps its checksum inventory to `checked` evidence; its signing field remains metadata, so `unsigned`, `caller-owned`, or `caller-configured` does not become a signature or reputation claim. `releasereadiness` is descriptive: it cannot alter files, create tags, invoke CI, publish artifacts, sign content, or contact registries.
68
+
65
69
  The root entry is cross-runtime safe for the tested core contract. Filesystem, Node HTTP, persistent queue, file sessions, local memory and captcha evidence adapters remain available through explicit Node-only files or subpaths. `runtimecontract` reports the capabilities of the current global scope, while `memorystorage` provides a process-local backend for browser workers, Deno, Bun and deterministic tests.
@@ -1,6 +1,6 @@
1
1
  # Index
2
2
 
3
- Project: **UKA** — computer use agent, sandbox for AI and captcha bypass. Super bot with computational memory. Package `@devthink/saddle`. Domain acquired.
3
+ Project: **UKA** — computer use agent, sandbox for AI and captcha bypass. Super bot with computational memory. Package `@wenathlan/saddle`. Domain acquired.
4
4
 
5
5
  Theme: computer use, bypasses, captcha, sandbox for AI, container for AI, multi-platform bot, storage-to-compute memory transformation.
6
6
 
@@ -30,7 +30,7 @@ Theme: computer use, bypasses, captcha, sandbox for AI, container for AI, multi-
30
30
  | 37 | [deploystrategy.md](./37.deploystrategy.md) | Deploy strategies (Netlify, Vercel, CI/CD, Docker, VM) |
31
31
  | 36 | [computational.memory.md](./36.computational.memory.md) | Storage-to-compute memory transformation system |
32
32
  | 39 | [multi.platform.bot.md](./39.multi.platform.bot.md) | Multi-platform bot (GitHub, GitLab, Forgejo, Gitea, Discord) |
33
- | 40 | [npm.publish.md](./40.npm.publish.md) | NPM package publishing (`@devthink/saddle`) |
33
+ | 40 | [npm.publish.md](./40.npm.publish.md) | NPM package publishing (`@wenathlan/saddle`) |
34
34
  | 46 | [scdnintegration.md](./46.scdnintegration.md) | SCDN integration for assets and deployment |
35
35
  | 44 | [reference.md](./44.reference.md) | Reference index for all saddle documentation |
36
36
  | 33 | [bots.codigo.revisao.md](./33.bots.codigo.revisao.md) | Best AI code review bots (research) |
@@ -1,6 +1,6 @@
1
1
  # 06 Dependencies
2
2
 
3
- Dependency list of the `@devthink/UKA` package, grouped by function. Total: 65 packages (including the dev tooling set). The user asked for "50 to 60, or 60+. Counting 10 more", so this set covers browser automation, ai/vision, sandbox, server, db, storage and validation.
3
+ Dependency list of the `@wenathlan/UKA` package, grouped by function. Total: 65 packages (including the dev tooling set). The user asked for "50 to 60, or 60+. Counting 10 more", so this set covers browser automation, ai/vision, sandbox, server, db, storage and validation.
4
4
 
5
5
  ## Browser automation and mouse (8)
6
6
  1. `playwright` — real brave/chromium automation via cdp.
@@ -396,8 +396,8 @@ OpenGraph (OG) e Twitter Card são metadados usados para social sharing. Menos c
396
396
 
397
397
  <!-- Twitter Card -->
398
398
  <meta name="twitter:card" content="summary_large_image">
399
- <meta name="twitter:site" content="@devthink">
400
- <meta name="twitter:creator" content="@nathlan">
399
+ <meta name="twitter:site" content="@wenathlan">
400
+ <meta name="twitter:creator" content="@nasblor">
401
401
  <meta name="twitter:title" content="Título da Página">
402
402
  <meta name="twitter:description" content="Descrição da Página">
403
403
  <meta name="twitter:image" content="https://example.com/image.jpg">
@@ -868,7 +868,7 @@ console.log(result.siteName);
868
868
 
869
869
  ### turndown 7.2.4 (Padrão)
870
870
 
871
- `turndown` é o conversor HTML→Markdown mais popular. Usado pelo `@devthink/webscrape`.
871
+ `turndown` é o conversor HTML→Markdown mais popular. Usado pelo `@wenathlan/webscrape`.
872
872
 
873
873
  ```ts
874
874
  import TurndownService from 'turndown';
@@ -189,7 +189,7 @@ export async function readFile(path: string): Promise<string | null> {
189
189
 
190
190
  ```json
191
191
  {
192
- "name": "@devthink/webscrape",
192
+ "name": "@wenathlan/webscrape",
193
193
  "exports": {
194
194
  ".": {
195
195
  "types": "./dist/index.d.ts",
@@ -216,16 +216,16 @@ export async function readFile(path: string): Promise<string | null> {
216
216
 
217
217
  ```typescript
218
218
  // Node.js
219
- import { scrape } from '@devthink/webscrape/node';
219
+ import { scrape } from '@wenathlan/webscrape/node';
220
220
 
221
221
  // Browser
222
- import { scrape } from '@devthink/webscrape/browser';
222
+ import { scrape } from '@wenathlan/webscrape/browser';
223
223
 
224
224
  // Deno
225
- import { scrape } from '@devthink/webscrape/deno';
225
+ import { scrape } from '@wenathlan/webscrape/deno';
226
226
 
227
227
  // Universal (só APIs comuns)
228
- import { scrape } from '@devthink/webscrape';
228
+ import { scrape } from '@wenathlan/webscrape';
229
229
  ```
230
230
 
231
231
  ### 4.3. unenv polyfills
@@ -615,10 +615,10 @@ npx @arethetypeswrong/cli
615
615
 
616
616
  **Exemplo de output:**
617
617
  ```
618
- @devthink/webscrape
618
+ @wenathlan/webscrape
619
619
 
620
620
  "import" - ESM
621
- ✅ @devthink/webscrape → ./dist/index.js
621
+ ✅ @wenathlan/webscrape → ./dist/index.js
622
622
  ✅ Types: ./dist/index.d.ts
623
623
 
624
624
  "require" - CJS
@@ -626,7 +626,7 @@ npx @arethetypeswrong/cli
626
626
  💡 Add a "require" condition
627
627
 
628
628
  "browser" - Browser ESM
629
- ✅ @devthink/webscrape → ./dist/browser.js
629
+ ✅ @wenathlan/webscrape → ./dist/browser.js
630
630
  ```
631
631
 
632
632
  ### 9.3. other tools
@@ -636,7 +636,7 @@ npx @arethetypeswrong/cli
636
636
  npx arethetypeswrong --pack
637
637
 
638
638
  # Verificar size do bundle
639
- npx bundlephobia @devthink/webscrape
639
+ npx bundlephobia @wenathlan/webscrape
640
640
 
641
641
  # Verificar dependências circulares
642
642
  npx madge --circular src/
@@ -896,7 +896,7 @@ export async function loadConfig(root = '.'): Promise<Config | null> {
896
896
 
897
897
  ```json
898
898
  {
899
- "name": "@devthink/webscrape",
899
+ "name": "@wenathlan/webscrape",
900
900
  "exports": {
901
901
  ".": {
902
902
  "types": "./dist/index.d.ts",
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Phase: planning + research done
4
4
  - [x] Folder structure (mirrors `cli`/`debonair`): `docs/plans`, `docs/talks`, `docs/logs`, `tests/{examples,output,scripts}`, `web`, `.github/workflows`.
5
- - [x] Config files: `package.json` (`@devthink/saddle`, 65 deps), `tsconfig.json`, `biome.json`, `vitest.config.ts`, `.github/workflows/saddle-tests.yml`, `.gitignore`, `.npmrc`, `.nvmrc`, `README.md`.
5
+ - [x] Config files: `package.json` (`@wenathlan/saddle`, 65 deps), `tsconfig.json`, `biome.json`, `vitest.config.ts`, `.github/workflows/saddle-tests.yml`, `.gitignore`, `.npmrc`, `.nvmrc`, `README.md`.
6
6
  - [x] Research done (computer use, hcaptcha bypass, vercel sandbox, atlas agent browser).
7
7
  - [x] Planning docs in `docs/plans/` (01 to 12 + index).
8
8
  - [x] Applied skill arch: no `src/`, no vercel/netlify functions, mysql2, socket, no localhost, lowercase files, production = `web/`.
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## Sumário Executivo
10
10
 
11
- `@devthink/webscrape` é um toolkit de scraping all-in-one que ocupa um nicho único: combina HTTP scraping, browser automation, serialização multi-formato, formatação para IA e um servidor HTTP — tudo em um único pacote TypeScript, sem depender de serviços em nuvem. A análise técnica revela que, enquanto competitors como Crawlee e Scrapy dominam em infraestrutura de produção (filas persistentes, Docker, anti-detection), webscrape supera em integração com IA, estimativa de tokens e chunking para RAG.
11
+ `@wenathlan/webscrape` é um toolkit de scraping all-in-one que ocupa um nicho único: combina HTTP scraping, browser automation, serialização multi-formato, formatação para IA e um servidor HTTP — tudo em um único pacote TypeScript, sem depender de serviços em nuvem. A análise técnica revela que, enquanto competitors como Crawlee e Scrapy dominam em infraestrutura de produção (filas persistentes, Docker, anti-detection), webscrape supera em integração com IA, estimativa de tokens e chunking para RAG.
12
12
 
13
13
  ---
14
14
 
@@ -226,14 +226,14 @@ Nenhum outro competitor suporta Bun nativamente. Crawlee e Puppeteer são Node-o
226
226
 
227
227
  ```typescript
228
228
  // Um pacote faz TUDO:
229
- import { scrapeUrl } from '@devthink/webscrape/scrape';
230
- import { crawl } from '@devthink/webscrape/crawler';
231
- import { batchScrape } from '@devthink/webscrape/batch';
232
- import { serializeResult } from '@devthink/webscrape/serialize';
233
- import { formatForAgent } from '@devthink/webscrape/agent';
234
- import { chunkMarkdown } from '@devthink/webscrape/chunking';
235
- import { generateLlmsTxt } from '@devthink/webscrape/llms-txt';
236
- import { createServer } from '@devthink/webscrape/server';
229
+ import { scrapeUrl } from '@wenathlan/webscrape/scrape';
230
+ import { crawl } from '@wenathlan/webscrape/crawler';
231
+ import { batchScrape } from '@wenathlan/webscrape/batch';
232
+ import { serializeResult } from '@wenathlan/webscrape/serialize';
233
+ import { formatForAgent } from '@wenathlan/webscrape/agent';
234
+ import { chunkMarkdown } from '@wenathlan/webscrape/chunking';
235
+ import { generateLlmsTxt } from '@wenathlan/webscrape/llms-txt';
236
+ import { createServer } from '@wenathlan/webscrape/server';
237
237
  ```
238
238
 
239
239
  **Nenhum competitor combina:**
@@ -373,7 +373,7 @@ O Redis serialization (`JSON.SET` command) é exclusivo — permite popular Redi
373
373
 
374
374
  ```json
375
375
  // webscrape: 1 package
376
- @devthink/webscrape
376
+ @wenathlan/webscrape
377
377
 
378
378
  // Crawlee: multi-package
379
379
  crawlee
@@ -1,6 +1,6 @@
1
1
  # NPM Package Publishing for Saddle Robot
2
2
 
3
- > Package `@devthink/saddle` published to NPM registry.
3
+ > Package `@wenathlan/saddle` published to NPM registry.
4
4
  > Acts as both library and CLI binary.
5
5
 
6
6
  ## Overview
@@ -16,7 +16,7 @@ bypass, and memory engine capabilities.
16
16
 
17
17
  ```json
18
18
  {
19
- "name": "@devthink/saddle",
19
+ "name": "@wenathlan/saddle",
20
20
  "version": "1.0.0",
21
21
  "description": "Super bot: agent browser, captcha bypass, multi-platform GitHub/GitLab/Forgejo/Gitea automation with computational memory",
22
22
  "main": "lib/index.js",
@@ -129,11 +129,11 @@ git push --follow-tags
129
129
  ### As Library
130
130
 
131
131
  ```bash
132
- npm install @devthink/saddle
132
+ npm install @wenathlan/saddle
133
133
  ```
134
134
 
135
135
  ```javascript
136
- import { SaddleRobot } from '@devthink/saddle'
136
+ import { SaddleRobot } from '@wenathlan/saddle'
137
137
 
138
138
  const robot = new SaddleRobot({
139
139
  platform: 'github',
@@ -146,7 +146,7 @@ await robot.start()
146
146
  ### As CLI
147
147
 
148
148
  ```bash
149
- npm install -g @devthink/saddle
149
+ npm install -g @wenathlan/saddle
150
150
 
151
151
  saddle --help
152
152
  saddle capture --url https://example.com
@@ -200,7 +200,7 @@ main()
200
200
  ## Scoped Package Structure
201
201
 
202
202
  ```
203
- @devthink/saddle/
203
+ @wenathlan/saddle/
204
204
  ├── lib/
205
205
  │ ├── index.js main entry point
206
206
  │ ├── index.cjs CommonJS entry point
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## Sumário
10
10
 
11
- `@devthink/webscrape` é um toolkit all-in-one que combina scraping, serialização multi-formato, AI formatting e chunking para RAG — um posicionamento único no mercado. No entanto, 3 gaps críticos impedem a adoção em produção: ausência de anti-detection real, queue persistente e suporte Docker. Este documento lista tudo que falta, priorizado por impacto.
11
+ `@wenathlan/webscrape` é um toolkit all-in-one que combina scraping, serialização multi-formato, AI formatting e chunking para RAG — um posicionamento único no mercado. No entanto, 3 gaps críticos impedem a adoção em produção: ausência de anti-detection real, queue persistente e suporte Docker. Este documento lista tudo que falta, priorizado por impacto.
12
12
 
13
13
  ---
14
14
 
@@ -146,7 +146,7 @@
146
146
  - Puppeteer: `chrome-devtools-mcp`
147
147
 
148
148
  **Implementação necessária:**
149
- 1. Criar pacote `@devthink/webscrape-mcp`
149
+ 1. Criar pacote `@wenathlan/webscrape-mcp`
150
150
  2. Expor endpoints como MCP tools: `scrape`, `crawl`, `batch`, `extract`, `serialize`
151
151
  3. Usar SDK oficial `@modelcontextprotocol/sdk`
152
152
  4. Adicionar configuração MCP ao `cli.ts`
@@ -1,7 +1,7 @@
1
1
  # Competitive Research: webscrape vs. 7 Competitors
2
2
 
3
3
  > **Date:** 2026-06-08
4
- > **Objective:** Deep analysis of 7 direct/indirect competitors to identify gaps, opportunities, and architectural insights for the `@devthink/webscrape` toolkit.
4
+ > **Objective:** Deep analysis of 7 direct/indirect competitors to identify gaps, opportunities, and architectural insights for the `@wenathlan/webscrape` toolkit.
5
5
 
6
6
  ---
7
7
 
@@ -601,7 +601,7 @@ Request → [Downloader Middlewares] → Downloader → [Spider Middlewares] →
601
601
  **Impact:** Cannot be used by AI agents (Claude, Cursor, Windsurf) natively.
602
602
 
603
603
  **Recommendation:**
604
- - Create `@devthink/webscrape-mcp` package
604
+ - Create `@wenathlan/webscrape-mcp` package
605
605
  - Expose scrape/crawl/batch endpoints as MCP tools
606
606
  - Integrate with Claude Desktop, VS Code, Cursor
607
607
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 1. Visão Geral
4
4
 
5
- A biblioteca `@devthink/webscrape` precisa funcionar em **TODOS os modos**:
5
+ A biblioteca `@wenathlan/webscrape` precisa funcionar em **TODOS os modos**:
6
6
 
7
7
  | Modo | Como funciona |
8
8
  |------|--------------|
@@ -404,7 +404,7 @@ export default defineConfig({
404
404
 
405
405
  ```json
406
406
  {
407
- "name": "@devthink/webscrape",
407
+ "name": "@wenathlan/webscrape",
408
408
  "version": "2.0.0",
409
409
  "type": "module",
410
410
  "main": "./dist/index.js",
@@ -81,7 +81,7 @@ files, and deployment payloads with edge caching.
81
81
 
82
82
  ### NPM Publishing
83
83
 
84
- Package `@devthink/saddle` available as both library and
84
+ Package `@wenathlan/saddle` available as both library and
85
85
  CLI binary.
86
86
 
87
87
  ## Architecture Rules (from arch skill)
@@ -175,13 +175,13 @@ CMD ["node", "server.js"]
175
175
 
176
176
  ## NPM Package Publishing
177
177
 
178
- Saddle can be published as an NPM package `@devthink/saddle` for
178
+ Saddle can be published as an NPM package `@wenathlan/saddle` for
179
179
  distribution as both a library and a CLI tool.
180
180
 
181
181
  ### Package Structure
182
182
 
183
183
  ```
184
- @devthink/saddle/
184
+ @wenathlan/saddle/
185
185
  ├── lib/
186
186
  │ ├── browser.js (agent browser engine)
187
187
  │ ├── bot.js (multi-platform bot engine)
@@ -200,7 +200,7 @@ distribution as both a library and a CLI tool.
200
200
 
201
201
  | Mode | Entry Point | Usage |
202
202
  |------|------------|-------|
203
- | Library | `require('@devthink/saddle')` | Import as Node module |
203
+ | Library | `require('@wenathlan/saddle')` | Import as Node module |
204
204
  | CLI | `saddle --command capture` | Run as terminal command |
205
205
  | Binary | `node_modules/.bin/saddle` | Direct execution |
206
206
 
@@ -144,7 +144,7 @@ class SCDNClient {
144
144
 
145
145
  ```typescript
146
146
  // In browser capture module
147
- import { SCDNClient } from '@devthink/saddle/deploy'
147
+ import { SCDNClient } from '@wenathlan/saddle/deploy'
148
148
 
149
149
  async function uploadCaptureSession(
150
150
  sessionData: SessionData,
@@ -2,7 +2,7 @@
2
2
 
3
3
  Binary computing agent, agent browser, computer-use, scraper and packager.
4
4
 
5
- > **Storage turned into memory.** Saddle runs on other people's computers (GitHub Actions, Forgejo, Gitea, GitLab, Codeberg, free Docker containers) and turns unlimited third-party storage buckets into virtual RAM/GPU/CPU. **Nothing runs on the operator's local machine.** Ships as a library, CLI, binary, n8n node, CRX extension, Android/iOS and Tauri desktop app. Package `@devthink/saddle` — published to npm, GitHub Packages, Maven, NuGet, RubyGems and GitHub Containers (auto-mirrored to jsDelivr). It is simultaneously **sandbox + virtual machine + webhook server + workflow orchestrator (n8n-style) + packager + deployment system + integration platform** — sometimes each *is* the other three; the virtual VMs expose vCPU/VRAM/vGPU/virtual processing to the user, 100% on the internet, 100% virtual.
5
+ > **Storage turned into memory.** Saddle runs on other people's computers (GitHub Actions, Forgejo, Gitea, GitLab, Codeberg, free Docker containers) and turns unlimited third-party storage buckets into virtual RAM/GPU/CPU. **Nothing runs on the operator's local machine.** Ships as a library, CLI, binary, n8n node, CRX extension, Android/iOS and Tauri desktop app. Package `@wenathlan/saddle` — published to npm, GitHub Packages, Maven, NuGet, RubyGems and GitHub Containers (auto-mirrored to jsDelivr). It is simultaneously **sandbox + virtual machine + webhook server + workflow orchestrator (n8n-style) + packager + deployment system + integration platform** — sometimes each *is* the other three; the virtual VMs expose vCPU/VRAM/vGPU/virtual processing to the user, 100% on the internet, 100% virtual.
6
6
 
7
7
  This document is the single source of truth, arranged as a progressive arc: **Foundation (1–6)**, **Engine (7–17)**, **Productization (18–31)**. Nothing here is attributed to external tooling; it is the project's own architecture.
8
8
 
@@ -368,7 +368,7 @@ Where a platform has no formal app portal (Telegram, Matrix), the robot is still
368
368
 
369
369
  Sources: `api.kilo.ai`, `opencode.ai/zen`, `openrouter.ai`. Count with `js-tiktoken` / `gpt-tokenizer`.
370
370
 
371
- 22. **Packaging & Publishing** — `@devthink/saddle` as **lib + CLI** (`saddle`); install `npm install @devthink/saddle` (global for CLI). Package layout: `lib/index.js` + `bin/saddle.js` (`node:util parseArgs{command, platform, token, verbose}`, default `help`), exports map subpaths `./browser, ./bot, ./captcha, ./memory-engine, ./deploy` (import/require dual) + `./index.cjs`. Scripts: `"build":"tsc"`, `"test":"vitest run"`, `"lint":"biome check ."`, `"typecheck":"tsc --noEmit"`, `"prepublishOnly":"npm run build && npm test"`, `"prepare":"husky"`. Version: semver `npm version patch|minor|major` + `git push --follow-tags`. Library API: `import { SaddleRobot } from '@devthink/saddle'; await robot.start(); await robot.executeCommand(cmd)`. `npm publish --access public` → auto-mirror jsDelivr/UNPKG/esm.sh.
371
+ 22. **Packaging & Publishing** — `@wenathlan/saddle` as **lib + CLI** (`saddle`); install `npm install @wenathlan/saddle` (global for CLI). Package layout: `lib/index.js` + `bin/saddle.js` (`node:util parseArgs{command, platform, token, verbose}`, default `help`), exports map subpaths `./browser, ./bot, ./captcha, ./memory-engine, ./deploy` (import/require dual) + `./index.cjs`. Scripts: `"build":"tsc"`, `"test":"vitest run"`, `"lint":"biome check ."`, `"typecheck":"tsc --noEmit"`, `"prepublishOnly":"npm run build && npm test"`, `"prepare":"husky"`. Version: semver `npm version patch|minor|major` + `git push --follow-tags`. Library API: `import { SaddleRobot } from '@wenathlan/saddle'; await robot.start(); await robot.executeCommand(cmd)`. `npm publish --access public` → auto-mirror jsDelivr/UNPKG/esm.sh.
372
372
 
373
373
  | Registry | What |
374
374
  |----------|------|
@@ -118,7 +118,7 @@ FILE: 40.npm.publish.md
118
118
  - Pre-publish checklist
119
119
  - As library (npm install) and CLI (npm install -g, saddle --command)
120
120
  - Binary entry point: saddle.js
121
- - Scoped package structure: @devthinking/saddle/
121
+ - Scoped package structure: @wenathlaning/saddle/
122
122
  - Versioning strategy: semver (patch/minor/major)
123
123
  - 10-step pre-publish checklist
124
124
  - No mention of these npm details
@@ -34,15 +34,15 @@ The live GHCR workflow `31544093172` completed successfully, and the public pack
34
34
 
35
35
  ## live verification
36
36
 
37
- The first `publishgithubnpm.yml` run failed with HTTP 403 because `@devthink/saddle` was not an authorized package namespace for the `iakadion/saddle` workflow. The corrected run `31543249301` completed successfully after rewriting the package name in the CI workspace to `@iakadion/saddle`. However, the repository Packages page still returned an empty listing immediately afterward, and the available GitHub API token could not read the user package namespace. The next verification must query the owner package page directly and inspect the workflow publish logs before treating the successful exit code as visible package availability.
37
+ The first `publishgithubnpm.yml` run failed with HTTP 403 because `@wenathlan/saddle` was not an authorized package namespace for the `iakadion/saddle` workflow. The corrected run `31543249301` completed successfully after rewriting the package name in the CI workspace to `@iakadion/saddle`. However, the repository Packages page still returned an empty listing immediately afterward, and the available GitHub API token could not read the user package namespace. The next verification must query the owner package page directly and inspect the workflow publish logs before treating the successful exit code as visible package availability.
38
38
 
39
39
  The v1.7.0 release verification used workflow logs as the available artifact evidence. GitHub npm run `31549603859` published `@iakadion/saddle@1.7.0`; GHCR run `31549603838` pushed `ghcr.io/iakadion/saddle:1.7.0` and `latest`; Maven retry run `31549802841` uploaded `io.devthink:saddle:1.7.0`; RubyGems retry run `31549804286` registered `saddle (1.7.0)`; and NuGet retry run `31549972311` created and pushed `Saddle.1.7.0.nupkg`. The GitHub package-list API was not readable with the available integration token, so these statements are limited to successful workflow upload evidence rather than an independent package-page listing.
40
40
 
41
- The first public npmjs run `31549603849` used OIDC and returned HTTP 404. Retry `31551708958` used the configured `NPM_TOKEN` secret, and retry `31551771374` confirmed that the masked secret reached the runner after newline normalization; both still returned HTTP 404 for `@devthink/saddle`. The identity-check retry `31552368723` reached `npm whoami` with a masked token but npm returned HTTP 401. The remaining blocker is the token itself or its account/scope permission: the owner must replace `NPM_TOKEN` with a valid raw npm access token authorized to publish `@devthink/saddle`. The exposed token from the prior conversation remains deliberately unused.
41
+ The first public npmjs run `31549603849` used OIDC and returned HTTP 404. Retry `31551708958` used the configured `NPM_TOKEN` secret, and retry `31551771374` confirmed that the masked secret reached the runner after newline normalization; both still returned HTTP 404 for `@wenathlan/saddle`. The identity-check retry `31552368723` reached `npm whoami` with a masked token but npm returned HTTP 401. The remaining blocker is the token itself or its account/scope permission: the owner must replace `NPM_TOKEN` with a valid raw npm access token authorized to publish `@wenathlan/saddle`. The exposed token from the prior conversation remains deliberately unused.
42
42
 
43
43
  The cross-runtime workflow `31552266171` and its manual rerun `31552272176` completed successfully. The matrix ran the root probe on Node, Bun and Deno and the deterministic Node suite. The root entry no longer imports filesystem, Node HTTP, persistent queue, file-session or local-memory adapters; those remain explicit Node-only subpaths.
44
44
 
45
- Release `v1.8.0` was created from commit `9ddfd6c`. GitHub npm run `31556461901`, GHCR run `31556461887`, NuGet run `31556461883` and RubyGems run `31556461991` completed successfully for `1.8.0`. Maven run `31556461885` initially failed because setup-java rejects `latest`; after changing the workflow to JDK 26, manual run `31556549154` completed successfully. Public npmjs run `31556461909` produced the `@devthink/saddle@1.8.0` tarball but the registry rejected the PUT with HTTP 404 `Scope not found`; no public npmjs publication is claimed.
45
+ Release `v1.8.0` was created from commit `9ddfd6c`. GitHub npm run `31556461901`, GHCR run `31556461887`, NuGet run `31556461883` and RubyGems run `31556461991` completed successfully for `1.8.0`. Maven run `31556461885` initially failed because setup-java rejects `latest`; after changing the workflow to JDK 26, manual run `31556549154` completed successfully. Public npmjs run `31556461909` produced the `@wenathlan/saddle@1.8.0` tarball but the registry rejected the PUT with HTTP 404 `Scope not found`; no public npmjs publication is claimed.
46
46
 
47
47
  The active package identity on main is now `@wenathlan/saddle`. The repository has since transferred to `wenathlan`; the authenticated `iakadion` account retains administrator permission. Release `v1.8.2` is the first release prepared against the transferred repository owner for GitHub Packages npm, Maven and GHCR.
48
48
 
@@ -21,4 +21,4 @@ The release was prepared with the deterministic Node test runner, format checks,
21
21
 
22
22
  ## Registry targets
23
23
 
24
- The release workflows target GitHub Packages npm, npmjs through OIDC Trusted Publishing, GHCR, Maven, NuGet and RubyGems. Each package is verified from its workflow result before being reported as published. npmjs publication remains conditional on the one-time Trusted Publisher configuration for `@devthink/saddle`.
24
+ The release workflows target GitHub Packages npm, npmjs through OIDC Trusted Publishing, GHCR, Maven, NuGet and RubyGems. Each package is verified from its workflow result before being reported as published. npmjs publication remains conditional on the one-time Trusted Publisher configuration for `@wenathlan/saddle`.
@@ -14,7 +14,7 @@ Saddle 1.8.14 carries the active code and release-facing manifests forward from
14
14
 
15
15
  ## Artifact contract
16
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.
17
+ The active workflows derive names from the `v1.8.14` release tag. The release was verified with 38 uploaded assets listed below; iOS remains unavailable because Apple signing and provisioning are caller-owned and were not configured.
18
18
 
19
19
  | Surface | Expected artifact family |
20
20
  |---|---|
@@ -28,22 +28,37 @@ The active workflows derive names from the `v1.8.14` release tag. The expected a
28
28
 
29
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
30
 
31
+ ## Verified attached assets
32
+
33
+ The release contains **38 uploaded assets**. Desktop artifacts are unsigned, Android artifacts use the explicitly labeled `ci-test-key`, the container is `caller-owned` and the extension is unsigned.
34
+
35
+ | Surface | Attached assets | Signing |
36
+ |---|---|---|
37
+ | Linux desktop | `saddle.browser.1.8.14.arm64.appimage`, `saddle.browser.1.8.14.arm64.deb`, `saddle.browser.1.8.14.arm64.rpm`, `saddle.browser.1.8.14.x64.appimage`, `saddle.browser.1.8.14.x64.deb`, `saddle.browser.1.8.14.x64.rpm` | `unsigned` |
38
+ | Windows desktop | `saddle.browser.1.8.14.arm64.exe`, `saddle.browser.1.8.14.arm64.msi`, `saddle.browser.1.8.14.x64.exe`, `saddle.browser.1.8.14.x64.msi`, `saddle.browser.1.8.14.x86.exe`, `saddle.browser.1.8.14.x86.msi` | `unsigned` |
39
+ | macOS desktop | `saddle.browser.1.8.14.arm64.app.zip`, `saddle.browser.1.8.14.arm64.dmg`, `saddle.browser.1.8.14.x64.app.zip`, `saddle.browser.1.8.14.x64.dmg` | `unsigned` |
40
+ | Android | `saddle.apk.1.8.14.apk`, `saddle.aab.1.8.14.aab` | `ci-test-key` |
41
+ | Container | `saddle.container.1.8.14.tar.gz` | `caller-owned` |
42
+ | Browser extension | `saddle.extension.1.8.14.zip` | `unsigned` |
43
+ | Manifests | Nine `manifest.*.1.8.14.json` files covering Android, container, Linux, macOS and Windows | metadata |
44
+ | Checksums | Nine `sha256.*.1.8.14` files covering Android, container, Linux, macOS and Windows | integrity metadata |
45
+
31
46
  ## Registry publication
32
47
 
33
48
  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
49
 
35
- | Registry | Workflow | Version | Expected result |
50
+ | Registry | Workflow | Version | Verified result |
36
51
  |---|---|---:|---|
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 |
52
+ | GHCR | `publishghcr.yml` | `1.8.14` | success; run `31806235613` also pulled, inspected and smoke-tested the image |
53
+ | GitHub Packages npm | `publishgithubnpm.yml` | `1.8.14` | success; run `31806235570` |
54
+ | Public npmjs | `publishnpmjs.yml` | `1.8.14` | success; run `31806235515` |
55
+ | Maven GitHub Packages | `publishmaven.yml` | `1.8.14` | success; run `31806235540` |
56
+ | NuGet GitHub Packages | `publishnuget.yml` | `1.8.14` | success; run `31806235606` |
57
+ | RubyGems GitHub Packages | `publishrubygems.yml` | `1.8.14` | success; run `31806235523` |
43
58
 
44
59
  ## Verification policy
45
60
 
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.
61
+ Local gates passed before the tag was created. Desktop run `31806235468` completed successfully. The release-event mobile run `31806235484` correctly refused to claim production signing because the Android secrets were absent; manual run `31806605994` with `allow_test_signing=true` completed successfully and attached the APK/AAB as `ci-test-key`. Production signing remains pending until caller-owned certificates and provider configuration are supplied.
47
62
 
48
63
  ## References
49
64
 
@@ -0,0 +1,41 @@
1
+ # Saddle 1.8.15
2
+
3
+ Saddle 1.8.15 adds transport-neutral contracts for verified storage, bounded working sets, isolated transformations, provider selection and immutable delivery. The shared core remains declarative: it does not create runners, start containers, register service workers, mutate DNS, transfer artifacts or execute binaries without a caller-owned adapter.
4
+
5
+ ## Changes
6
+
7
+ | Area | Change |
8
+ |---|---|
9
+ | Storage | Added verified pool reads, primary/mirror/fan-out writes, quorum evidence, operation budgets, range reads, repair plans and verified-source restore plans. |
10
+ | Memory | Added bounded working-set admission, capability-gated bridge plans, materialization transitions and declarative cleanup plans. |
11
+ | Transformations | Added magic-byte classification, bounded WASM plans, isolated adapters, archive inspection limits and cache eligibility controls. |
12
+ | Providers | Added capability-based selection, caller preferences, dry-run rendering, integrity-bound handoff and cancellation plans with unknown remote state preserved. |
13
+ | Delivery | Added immutable chunk manifests, verification without evaluation, PWA/CDN capability reports, Mini App validation requirements and DNS/application bridge descriptors. |
14
+ | Validation | Active tests increased to 132 while the 69 legacy tests remain green; package, flat native, web and audit gates passed. |
15
+
16
+ ## Artifact contract
17
+
18
+ The release workflows derive artifact names and package versions from `v1.8.15`. The following artifact families are expected from the release pipelines; signing remains explicit and is never inferred from a filename.
19
+
20
+ | Surface | Artifact family |
21
+ |---|---|
22
+ | Linux desktop | `saddle.browser.1.8.15.<architecture>.deb`, `.rpm`, `.appimage` |
23
+ | Windows desktop | `saddle.browser.1.8.15.<architecture>.exe`, `.msi` |
24
+ | macOS desktop | `saddle.browser.1.8.15.<architecture>.dmg`, `.app.zip` |
25
+ | Android | `saddle.apk.1.8.15.apk`, `saddle.aab.1.8.15.aab` |
26
+ | iOS | `saddle.ipa.1.8.15.ipa`, `saddle.app.1.8.15.app.zip` |
27
+ | Container | `saddle.container.1.8.15.tar.gz` |
28
+ | Browser extension | `saddle.extension.1.8.15.zip` |
29
+
30
+ ## Publication and verification policy
31
+
32
+ The six registry workflows publish from the same validated release tag, in container-first order: GHCR, GitHub Packages npm, public npmjs, Maven, NuGet GitHub Packages and RubyGems. GHCR must build, scan, push, pull, inspect its OCI version label and complete a smoke check. Production signing remains caller-owned; the release does not claim SignPath approval, Apple notarization or a production Android signing key unless a workflow reports those states.
33
+
34
+ ## Verified publication results
35
+
36
+ The v1.8.15 release has **38 attached assets** after the desktop rerun completed. GHCR, GitHub Packages npm, npmjs, Maven, NuGet and RubyGems completed successfully from the release event. The initial release-event Android job correctly failed because no production signing secrets were present; manual run `31835215420` completed with the explicitly labeled `ci-test-key` fallback. The desktop rerun completed after a transient macOS asset-attachment failure, without changing the tag or claiming notarization.
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"