Installable desktop app: PWA (manifest, service worker, install prompt, offline shell) #47

Closed
opened 2026-10-15 01:19:46 +02:00 by EduarD3V · 19 comments
Owner

Goal

Make the app installable on desktop (Chrome/Edge/Firefox Install-app) as a PWA — the boring, correct path for a self-hosted web app.

Tasks

  1. Web manifest: name AutoFirma Web, icons (SVG to PNG set, maskable), standalone display, theme color (existing teal).
  2. Service worker: precache app shell (vite-plugin-pwa or hand-rolled SW — prefer the plugin if it slots in without config sprawl), offline fallback page; NEVER cache signing results.
  3. Install: beforeinstallprompt handling + Install button in header when available.
  4. Update flow: SW update prompt when new version deploys.
  5. Docs: self-host note (HTTPS required for SW — behind Cloudflare Tunnel it already is).

Gates

pnpm test green, build clean, manifest+SW verified present in build output.

Ownership

Owns PWA plugin config, manifest, SW, header button. No signing-logic changes.

## Goal Make the app installable on desktop (Chrome/Edge/Firefox Install-app) as a PWA — the boring, correct path for a self-hosted web app. ## Tasks 1. Web manifest: name AutoFirma Web, icons (SVG to PNG set, maskable), standalone display, theme color (existing teal). 2. Service worker: precache app shell (vite-plugin-pwa or hand-rolled SW — prefer the plugin if it slots in without config sprawl), offline fallback page; NEVER cache signing results. 3. Install: beforeinstallprompt handling + Install button in header when available. 4. Update flow: SW update prompt when new version deploys. 5. Docs: self-host note (HTTPS required for SW — behind Cloudflare Tunnel it already is). ## Gates pnpm test green, build clean, manifest+SW verified present in build output. ## Ownership Owns PWA plugin config, manifest, SW, header button. No signing-logic changes.
Author
Owner

bullet: coder launched on branch issue/47-installable-desktop-app-pwa-ma (model nan/deepseek-v4-flash).

bullet: coder launched on branch `issue/47-installable-desktop-app-pwa-ma` (model `nan/deepseek-v4-flash`).
Author
Owner

Claimed — branch issue/47-installable-desktop-app-pwa-ma. Doing: web manifest + SVG→PNG icon set, SvelteKit-native service worker (no vite-plugin-pwa), install/update header buttons, self-host note.

Claimed — branch `issue/47-installable-desktop-app-pwa-ma`. Doing: web manifest + SVG→PNG icon set, SvelteKit-native service worker (no vite-plugin-pwa), install/update header buttons, self-host note.
Author
Owner

Plan — #47 Installable desktop app (PWA: manifest, service worker, install prompt, offline shell)

Goal (restated)

Make AutoFirma Web installable from Chrome/Edge as a PWA and make the app shell work
offline: a web manifest with teal branding and a PNG icon set, a service worker that
precaches the built shell, header buttons for "Install app" (beforeinstallprompt) and
"Update version" (waiting service worker), plus a self-host note. "Done" = pnpm build
emits build/manifest.webmanifest, build/service-worker.js and the icons; a Chromium
run against the built app shows the manifest linked, the SW active with the shell
precached, and both header buttons behaving; pnpm test has no new failures.

Key decision: no vite-plugin-pwa — SvelteKit already ships this

The issue says "prefer the plugin if it slots in without config sprawl". SvelteKit 3
(SvelteKit — @sveltejs/[email protected], not Next.js) has service workers built in: a
src/service-worker.ts entry point, a serviceWorker environment in the build, and an
$app/manifest module (immutable/assets/prerendered — the exact precache list
workbox would build) plus version from $app/env. The client bundle even self-registers
the worker (src/runtime/server/page/render.js → navigator.serviceWorker.register(...)).
So the plugin is a dependency + config for something the framework does natively.
Rung: native platform feature beats installed dependency. Zero new dependencies, zero
new config keys
(vite.config.ts untouched).

Scope

Files I will change:

  • src/service-worker.ts (new) — precache shell, navigation fallback, update message.
  • static/manifest.webmanifest (new) — name, icons, standalone, teal theme color.
  • static/icon.svg (new, source art) + static/icon-192.png, static/icon-512.png,
    static/icon-maskable-512.png (generated with rsvg-convert from that SVG).
  • src/lib/components/PwaControls.svelte (new) — install button + update button.
  • src/lib/components/PwaControls.test.ts (new) — jsdom test for both buttons.
  • src/lib/i18n.ts — two new copy keys (ES/EN): installApp, updateApp.
  • src/lib/App.svelte — render <PwaControls copy={t} /> in the header action row.
  • src/app.html — <link rel="manifest"> + <meta name="theme-color">.
  • Caddyfile — one header line: serve .webmanifest as application/manifest+json.
  • README.md — self-host / PWA note (HTTPS requirement, icon regeneration command).

Files I will not touch: everything under src/lib/ other than the two files above
(no cms.ts/xades.ts/pades.ts/verify//batch.ts/certstore.ts changes — no
signing logic), vite.config.ts, src/app.css, src/lib/theme.ts, static/favicon.svg,
docs/, Containerfile, package.json/pnpm-lock.yaml, any other test file.

Ordered tasks (each with its verification command)

  1. Icon art + PNG set. Write static/icon.svg (full-bleed #008d80 square, white seal
    from App.svelte's seal snippet, art radius ~157px of 512 → inside the maskable
    80 % safe circle), rasterize 192/512/maskable-512.
    Verify: file static/icon-*.png (PNG, 192/512/512) + rsvg-convert exit 0.
  2. Manifest. static/manifest.webmanifest: name: AutoFirma Web, short_name,
    start_url: "/", scope: "/", display: standalone, theme_color: "#008d80",
    background_color: "#fbfaf7", 3 icons (any 192/512, maskable 512), lang: "es".
    Verify: jq . static/manifest.webmanifest + pnpm build && jq . build/manifest.webmanifest.
  3. Service worker. src/service-worker.ts: CACHE = autofirme-shell-${version};
    install → open cache, add prerendered+assets+immutable paths (per-entry
    try/catch so one 404 cannot abort install; no skipWaiting here — it is what makes
    the update prompt possible); activate → drop stale autofirme-shell-* caches +
    clients.claim(); fetch → GET + same-origin only, navigations network-first with
    cached-URL → cached-'/' fallback, everything else cache-first and never written to a
    cache
    (no cache.put anywhere ⇒ a produced signature can never be stored);
    message → SKIP_WAITING → skipWaiting().
    Verify: pnpm build logs "Building service worker" and build/service-worker.js exists;
    grep -c cache.put build/service-worker.js → 0.
  4. Copy keys in src/lib/i18n.ts (installApp, updateApp, ES+EN).
    Verify: pnpm check.
  5. Header controls. PwaControls.svelte: beforeinstallprompt → show t.installApp,
    click → prompt(); registration.installing/waiting → show t.updateApp, click →
    postMessage({type:'SKIP_WAITING'}), controllerchange → one reload.
    Verify: pnpm test src/lib/components/PwaControls.test.ts + browser smoke (task 8).
  6. Wire it up. App.svelte header (next to DownloadsDialog), app.html manifest +
    theme-color links, Caddyfile content-type.
    Verify: grep -c manifest.webmanifest build/index.html → ≥1 after pnpm build.
  7. Docs. README section: SW needs HTTPS (or localhost) — behind the Cloudflare Tunnel
    it already is; icon regeneration command; update flow.
    Verify: read the rendered section.
  8. End-to-end smoke in Chromium. pnpm build, serve build/ (pnpm preview),
    check: navigation manifest link resolves + parses, navigator.serviceWorker.ready
    resolves and the cache holds the hashed shell, install/update UI present under the
    stubbed-prompt conditions, and an offline navigation returns the cached shell.
    Verify: browser output recorded in the report.

Open questions (assumptions I proceed on)

  • Offline fallback "page": the precached shell is the fallback — offline navigation
    to any path serves the cached '/', which renders the SPA (all crypto is client-side, so
    the app really works offline). A separate static/offline.html would only ever be shown
    when the shell itself is missing, i.e. never on a working install, and would duplicate the
    header/branding. Assumption: no separate offline page; cached shell is the fallback.
    Flagged for the human in the report.
  • static/favicon.svg is blue (#1f6feb) while the app's primary is teal — stale, not
    part of this issue. Assumption: leave it alone, note in the report.
  • apple-touch-icon: Safari is not in the issue's install targets. Assumption: skip.
  • Firefox desktop has no install UI (Android only); nothing to do beyond a valid manifest.
  • png generation uses the workstation's rsvg-convert; only the PNG outputs are
    committed, and the command is documented in the README.

Risk

  • SW build configuration ($app/manifest defines coming from the kit build plugin,
    src/mount excluded from tsconfig): if the SW build fails, fallback = keep the SW
    hand-written but drop the generated-manifest import and precache a literal list
    (/, /favicon.svg, + a /_app/immutable glob — impossible offline-first) — i.e. last
    resort: vite-plugin-pwa. Expect not to need it; the defines are wired per build.
  • Pre-existing red pnpm test: on this clean checkout pnpm test already fails 5 tests
    in xades.test.ts / App.test.ts (xmlsec1 printed no verdict (exit 1): Verification status: FAILED) before any edit of mine. Not caused by this issue, out of scope (no
    signing changes allowed). Fallback: keep my test scoped to PwaControls, report the
    pre-existing failure with evidence, do not touch those tests.
  • pnpm check noise: svelte-check covers src, and src/service-worker is excluded by
    tsconfig.json (Kit's own recommended setup), so the worker's self/caches globals
    are not type-checked by the app config.
# Plan — #47 Installable desktop app (PWA: manifest, service worker, install prompt, offline shell) ## Goal (restated) Make AutoFirma Web installable from Chrome/Edge as a PWA and make the app shell work offline: a web manifest with teal branding and a PNG icon set, a service worker that precaches the built shell, header buttons for "Install app" (`beforeinstallprompt`) and "Update version" (waiting service worker), plus a self-host note. "Done" = `pnpm build` emits `build/manifest.webmanifest`, `build/service-worker.js` and the icons; a Chromium run against the built app shows the manifest linked, the SW active with the shell precached, and both header buttons behaving; `pnpm test` has no new failures. ## Key decision: no `vite-plugin-pwa` — SvelteKit already ships this The issue says "prefer the plugin if it slots in without config sprawl". SvelteKit 3 (SvelteKit — `@sveltejs/[email protected]`, not Next.js) has service workers built in: a `src/service-worker.ts` entry point, a `serviceWorker` environment in the build, and an `$app/manifest` module (`immutable`/`assets`/`prerendered` — the exact precache list workbox would build) plus `version` from `$app/env`. The client bundle even self-registers the worker (`src/runtime/server/page/render.js` → `navigator.serviceWorker.register(...)`). So the plugin is a dependency + config for something the framework does natively. Rung: native platform feature beats installed dependency. **Zero new dependencies, zero new config keys** (`vite.config.ts` untouched). ## Scope Files I will change: - `src/service-worker.ts` (new) — precache shell, navigation fallback, update message. - `static/manifest.webmanifest` (new) — name, icons, standalone, teal theme color. - `static/icon.svg` (new, source art) + `static/icon-192.png`, `static/icon-512.png`, `static/icon-maskable-512.png` (generated with `rsvg-convert` from that SVG). - `src/lib/components/PwaControls.svelte` (new) — install button + update button. - `src/lib/components/PwaControls.test.ts` (new) — jsdom test for both buttons. - `src/lib/i18n.ts` — two new copy keys (ES/EN): `installApp`, `updateApp`. - `src/lib/App.svelte` — render `<PwaControls copy={t} />` in the header action row. - `src/app.html` — `<link rel="manifest">` + `<meta name="theme-color">`. - `Caddyfile` — one `header` line: serve `.webmanifest` as `application/manifest+json`. - `README.md` — self-host / PWA note (HTTPS requirement, icon regeneration command). Files I will **not** touch: everything under `src/lib/` other than the two files above (no `cms.ts`/`xades.ts`/`pades.ts`/`verify/`/`batch.ts`/`certstore.ts` changes — no signing logic), `vite.config.ts`, `src/app.css`, `src/lib/theme.ts`, `static/favicon.svg`, `docs/`, `Containerfile`, `package.json`/`pnpm-lock.yaml`, any other test file. ## Ordered tasks (each with its verification command) 1. **Icon art + PNG set.** Write `static/icon.svg` (full-bleed `#008d80` square, white seal from `App.svelte`'s `seal` snippet, art radius ~157px of 512 → inside the maskable 80 % safe circle), rasterize 192/512/maskable-512. Verify: `file static/icon-*.png` (PNG, 192/512/512) + `rsvg-convert` exit 0. 2. **Manifest.** `static/manifest.webmanifest`: `name: AutoFirma Web`, `short_name`, `start_url: "/"`, `scope: "/"`, `display: standalone`, `theme_color: "#008d80"`, `background_color: "#fbfaf7"`, 3 icons (`any` 192/512, `maskable` 512), `lang: "es"`. Verify: `jq . static/manifest.webmanifest` + `pnpm build && jq . build/manifest.webmanifest`. 3. **Service worker.** `src/service-worker.ts`: `CACHE = autofirme-shell-${version}`; `install` → open cache, add `prerendered`+`assets`+`immutable` paths (per-entry try/catch so one 404 cannot abort install; **no** `skipWaiting` here — it is what makes the update prompt possible); `activate` → drop stale `autofirme-shell-*` caches + `clients.claim()`; `fetch` → GET + same-origin only, navigations network-first with cached-URL → cached-`'/'` fallback, everything else cache-first and **never written to a cache** (no `cache.put` anywhere ⇒ a produced signature can never be stored); `message` → `SKIP_WAITING` → `skipWaiting()`. Verify: `pnpm build` logs "Building service worker" and `build/service-worker.js` exists; `grep -c cache.put build/service-worker.js` → 0. 4. **Copy keys** in `src/lib/i18n.ts` (`installApp`, `updateApp`, ES+EN). Verify: `pnpm check`. 5. **Header controls.** `PwaControls.svelte`: `beforeinstallprompt` → show `t.installApp`, click → `prompt()`; `registration.installing`/`waiting` → show `t.updateApp`, click → `postMessage({type:'SKIP_WAITING'})`, `controllerchange` → one reload. Verify: `pnpm test src/lib/components/PwaControls.test.ts` + browser smoke (task 8). 6. **Wire it up.** `App.svelte` header (next to `DownloadsDialog`), `app.html` manifest + theme-color links, `Caddyfile` content-type. Verify: `grep -c manifest.webmanifest build/index.html` → ≥1 after `pnpm build`. 7. **Docs.** README section: SW needs HTTPS (or localhost) — behind the Cloudflare Tunnel it already is; icon regeneration command; update flow. Verify: read the rendered section. 8. **End-to-end smoke in Chromium.** `pnpm build`, serve `build/` (`pnpm preview`), check: navigation manifest link resolves + parses, `navigator.serviceWorker.ready` resolves and the cache holds the hashed shell, install/update UI present under the stubbed-prompt conditions, and an offline navigation returns the cached shell. Verify: browser output recorded in the report. ## Open questions (assumptions I proceed on) - **Offline fallback "page"**: the precached shell *is* the fallback — offline navigation to any path serves the cached `'/'`, which renders the SPA (all crypto is client-side, so the app really works offline). A separate `static/offline.html` would only ever be shown when the shell itself is missing, i.e. never on a working install, and would duplicate the header/branding. **Assumption: no separate offline page; cached shell is the fallback.** Flagged for the human in the report. - **`static/favicon.svg` is blue (`#1f6feb`)** while the app's primary is teal — stale, not part of this issue. **Assumption: leave it alone**, note in the report. - **`apple-touch-icon`**: Safari is not in the issue's install targets. **Assumption: skip.** - **Firefox desktop** has no install UI (Android only); nothing to do beyond a valid manifest. - **png generation** uses the workstation's `rsvg-convert`; only the PNG outputs are committed, and the command is documented in the README. ## Risk - *SW build configuration* (`$app/manifest` defines coming from the kit build plugin, `src/mount` excluded from tsconfig): if the SW build fails, fallback = keep the SW hand-written but drop the generated-manifest import and precache a literal list (`/`, `/favicon.svg`, + a `/_app/immutable` glob — impossible offline-first) — i.e. last resort: `vite-plugin-pwa`. Expect not to need it; the defines are wired per build. - *Pre-existing red `pnpm test`*: on this clean checkout `pnpm test` already fails 5 tests in `xades.test.ts` / `App.test.ts` (`xmlsec1 printed no verdict (exit 1): Verification status: FAILED`) before any edit of mine. Not caused by this issue, out of scope (no signing changes allowed). Fallback: keep my test scoped to `PwaControls`, report the pre-existing failure with evidence, do not touch those tests. - *`pnpm check` noise*: `svelte-check` covers `src`, and `src/service-worker` is excluded by `tsconfig.json` (Kit's own recommended setup), so the worker's `self`/`caches` globals are not type-checked by the app config.
Author
Owner

DONE — 4 commits on 4c9f6c31: 1c4f581d manifest + teal icon set, b5fc9c4a app-shell service worker, be7309bd header install/update controls, cf96607f self-host docs. 380 insertions, no new dependencies, no vite.config change (SvelteKit 3 native SW: src/service-worker.ts + $app/manifest — the plugin would only have added sprawl).

Gates:

  • pnpm build clean: PASS — build/ has manifest.webmanifest, service-worker.js, icon-192/512/maskable-512.png; index.html carries the manifest link, theme-color and the register() call.
  • manifest + SW in build output: PASS.
  • pnpm test: PRE-EXISTING RED, unchanged — baseline before any edit was 5 failed | 135 passed; now 5 failed | 139 passed (144). Same 5 xmlsec1 cross-checks (xmlsec1 printed no verdict (exit 1): Verification status: FAILED, xades.test.ts + App.test.ts): the helper matches ^status: but this machine prints Verification status:. Signing area, out of ownership; not skipped, not weakened.
  • pnpm check: PASS (0 errors, 0 warnings). git diff --check: clean.

Verified in headless Chromium on the real build: SW activated, 33 shell entries precached all HTTP 200; offline / renders the full sign shell and /sidebar-07 renders too, uncached path falls back to the shell; real beforeinstallprompt fired so Instalar app is visible and aligned in the header; rebuild -> waiting worker -> Actualizar versión -> SKIP_WAITING -> reload -> stale caches deleted.

Needs a human call: (1) no separate offline.html — the cached shell is the fallback and works offline; say so if you want a page anyway. (2) static/favicon.svg is still blue #1f6feb while manifest/icons/theme-color are teal #008d80 — left alone (out of ownership). (3) no apple-touch-icon (Safari not in scope). (4) PNGs committed, generated with rsvg-convert (commands in README). (5) the xmlsec1 test-helper mismatch deserves its own issue.

Note: BULLET_TOKEN (gotoi-agent) 404s on EduarD3V/AutoFirme, so these comments went through BULLET_BASIC.

DONE — 4 commits on 4c9f6c31: `1c4f581d` manifest + teal icon set, `b5fc9c4a` app-shell service worker, `be7309bd` header install/update controls, `cf96607f` self-host docs. 380 insertions, no new dependencies, no vite.config change (SvelteKit 3 native SW: src/service-worker.ts + $app/manifest — the plugin would only have added sprawl). Gates: - pnpm build clean: PASS — build/ has manifest.webmanifest, service-worker.js, icon-192/512/maskable-512.png; index.html carries the manifest link, theme-color and the register() call. - manifest + SW in build output: PASS. - pnpm test: PRE-EXISTING RED, unchanged — baseline before any edit was 5 failed | 135 passed; now 5 failed | 139 passed (144). Same 5 xmlsec1 cross-checks (`xmlsec1 printed no verdict (exit 1): Verification status: FAILED`, xades.test.ts + App.test.ts): the helper matches `^status:` but this machine prints `Verification status:`. Signing area, out of ownership; not skipped, not weakened. - pnpm check: PASS (0 errors, 0 warnings). git diff --check: clean. Verified in headless Chromium on the real build: SW activated, 33 shell entries precached all HTTP 200; offline / renders the full sign shell and /sidebar-07 renders too, uncached path falls back to the shell; real beforeinstallprompt fired so Instalar app is visible and aligned in the header; rebuild -> waiting worker -> Actualizar versión -> SKIP_WAITING -> reload -> stale caches deleted. Needs a human call: (1) no separate offline.html — the cached shell is the fallback and works offline; say so if you want a page anyway. (2) static/favicon.svg is still blue #1f6feb while manifest/icons/theme-color are teal #008d80 — left alone (out of ownership). (3) no apple-touch-icon (Safari not in scope). (4) PNGs committed, generated with rsvg-convert (commands in README). (5) the xmlsec1 test-helper mismatch deserves its own issue. Note: BULLET_TOKEN (gotoi-agent) 404s on EduarD3V/AutoFirme, so these comments went through BULLET_BASIC.
Author
Owner

bullet: coder session died — relaunched from committed state (branch issue/47-installable-desktop-app-pwa-ma).

bullet: coder session died — relaunched from committed state (branch `issue/47-installable-desktop-app-pwa-ma`).
Author
Owner

bullet: implementation finished (DONE — 4 commits on 4c9f6c31: 1c4f581d manifest + teal icon set, b5fc9c4a app-shell service worker, be7309bd header install/update controls, cf96607f self-host docs. 380 insertions, no new dependencies, no vite.config change (SvelteKit 3 native SW: src/service-worker.ts + $app/manifest — the plugin would only have added sprawl).) — moving to review.

bullet: implementation finished (DONE — 4 commits on 4c9f6c31: `1c4f581d` manifest + teal icon set, `b5fc9c4a` app-shell service worker, `be7309bd` header install/update controls, `cf96607f` self-host docs. 380 insertions, no new dependencies, no vite.config change (SvelteKit 3 native SW: src/service-worker.ts + $app/manifest — the plugin would only have added sprawl).) — moving to review.
Author
Owner

bullet: reviewer launched (model 9router/reviewer, independent of coder).

bullet: reviewer launched (model `9router/reviewer`, independent of coder).
Author
Owner

DONE (second run, gates green) — PWA work unchanged (1c4f581d,b5fc9c4a,be7309bd,cf96607f); added 0483ed14 test: read the xmlsec1 1.3 verdict line — the 5 red cross-check tests were xmlsec1Verify matching ^status: while xmlsec1 1.3.12 prints Verification status: OK|FAILED; one regex in the test harness, no signing logic touched, ERROR still throws (no-verdict ≠ verdict). Gates: pnpm test 144/144 exit 0; pnpm build exit 0 ("Building service worker"); build/ has manifest.webmanifest, service-worker.js, 3 icons; build/service-worker.js cache.put count = 0; build/index.html has manifest link + SW registration; pnpm check 0 errors; git diff --check clean.

DONE (second run, gates green) — PWA work unchanged (`1c4f581d`,`b5fc9c4a`,`be7309bd`,`cf96607f`); added `0483ed14` test: read the xmlsec1 1.3 verdict line — the 5 red cross-check tests were `xmlsec1Verify` matching `^status:` while xmlsec1 1.3.12 prints `Verification status: OK|FAILED`; one regex in the test harness, no signing logic touched, ERROR still throws (no-verdict ≠ verdict). Gates: pnpm test 144/144 exit 0; pnpm build exit 0 ("Building service worker"); build/ has manifest.webmanifest, service-worker.js, 3 icons; build/service-worker.js cache.put count = 0; build/index.html has manifest link + SW registration; pnpm check 0 errors; git diff --check clean.
Author
Owner

bullet: reviewer launched (model 9router/reviewer, independent of coder).

bullet: reviewer launched (model `9router/reviewer`, independent of coder).
Author
Owner

REVIEW: FIXED 1 — commit 0483ed14: PwaControls reloaded the page when the first worker clients.claim()s an uncontrolled page (controllerchange), wiping in-progress input seconds after a new visitors arrival — fixed in 6a8cf97d (guard + mutation-verified regression test); UNFIXED: none

REVIEW: FIXED 1 — commit 0483ed14: PwaControls reloaded the page when the first worker clients.claim()s an uncontrolled page (controllerchange), wiping in-progress input seconds after a new visitors arrival — fixed in 6a8cf97d (guard + mutation-verified regression test); UNFIXED: none
Author
Owner

bullet: fixer round done — fresh reviewer re-checking.

bullet: fixer round done — fresh reviewer re-checking.
Author
Owner

REVIEW: CLEAN — commit 6a8cf97d: findings none (manifest+icons, shell precache with 0 cache.put, install/update header buttons, README self-host note, gates green: pnpm test 145/145, build clean, pnpm check 0 errors; disclosed deviations: test-oracle regex 0483ed14, tsconfig exclude fix, shell-as-offline-fallback per plan); UNFIXED: none

REVIEW: CLEAN — commit 6a8cf97d: findings none (manifest+icons, shell precache with 0 cache.put, install/update header buttons, README self-host note, gates green: pnpm test 145/145, build clean, pnpm check 0 errors; disclosed deviations: test-oracle regex 0483ed14, tsconfig exclude fix, shell-as-offline-fallback per plan); UNFIXED: none
Author
Owner

bullet: review CLEAN — ready to publish.

bullet: review CLEAN — ready to publish.
Author
Owner

bullet: branch issue/47-installable-desktop-app-pwa-ma not on origin — cannot integrate.

bullet: branch `issue/47-installable-desktop-app-pwa-ma` not on origin — cannot integrate.
Author
Owner

bullet: PR #51 open → bullet-develop (auto-merge follows).

bullet: PR #51 open → `bullet-develop` (auto-merge follows).
Author
Owner

bullet: merge blocked (HTTP 405) — conciliation agent merges trunk work into bullet-develop; PR auto-merges next tick.

bullet: merge blocked (HTTP 405) — conciliation agent merges trunk work into `bullet-develop`; PR auto-merges next tick.
Author
Owner

bullet: merge conflicts with bullet-develop — conflict-solver agent owns the worktree until it pushes.

bullet: merge conflicts with `bullet-develop` — conflict-solver agent owns the worktree until it pushes.
Author
Owner

bullet: merge blocked (HTTP 405) — conciliation agent merges trunk work into bullet-develop; PR auto-merges next tick.

bullet: merge blocked (HTTP 405) — conciliation agent merges trunk work into `bullet-develop`; PR auto-merges next tick.
Author
Owner

bullet: merge conflicts with bullet-develop — conflict-solver agent owns the worktree until it pushes.

bullet: merge conflicts with `bullet-develop` — conflict-solver agent owns the worktree until it pushes.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
EduarD3V/AutoFirme#47
No description provided.