Use case: batch sign queue (multi-file, progress, manifest) #9

Closed
opened 2026-10-14 01:14:54 +02:00 by EduarD3V · 22 comments
Owner

Use case: drop N files, queue them, sign sequentially with chosen cert, per-file status (pending/signed/error), zip download of results + manifest.json (filename, sha256, timestamp, format).

Reference: decompiled/sources/es/gob/afirma/signers/batch/ (SignBatch, 9 classes) — mirror its manifest semantics.

Acceptance:

  • sequential processing, no UI freeze (svelte store state machine)
  • resumable: failed file does not abort batch
  • manifest.json matches decompiled batch manifest fields where applicable
  • e2e test: 3-file batch all signed

Depends on #6.

Use case: drop N files, queue them, sign sequentially with chosen cert, per-file status (pending/signed/error), zip download of results + manifest.json (filename, sha256, timestamp, format). Reference: decompiled/sources/es/gob/afirma/signers/batch/ (SignBatch, 9 classes) — mirror its manifest semantics. Acceptance: - sequential processing, no UI freeze (svelte store state machine) - resumable: failed file does not abort batch - manifest.json matches decompiled batch manifest fields where applicable - e2e test: 3-file batch all signed Depends on #6.
Author
Owner

UNBLOCK NOTICE: dependency policy relaxed — do not wait for #5 to merge. Work against this interface contract (web/src/lib/certs.ts, being finalized in #5):

export interface LoadedCert { cert: CryptoCertificate; key: CryptoKey; chain: CryptoCertificate[] }
export async function loadFromP12(buf: ArrayBuffer, pin: string): Promise<LoadedCert[]>

Until #5 lands: mock LoadedCert in your branch (test RSA/EC key + self-signed cert generated at test time via openssl/node:crypto — commit no binaries). Test fixtures for golden vectors come from reference implementations (openssl for CAdES, xmlsec1 for XAdES) or generated by scripts at test setup. Resolve merge conflicts vs bullet-develop at integration; keep web/src/lib/certs.ts imports behind a thin adapter if the API shifts.

UNBLOCK NOTICE: dependency policy relaxed — do not wait for #5 to merge. Work against this interface contract (web/src/lib/certs.ts, being finalized in #5): ```ts export interface LoadedCert { cert: CryptoCertificate; key: CryptoKey; chain: CryptoCertificate[] } export async function loadFromP12(buf: ArrayBuffer, pin: string): Promise<LoadedCert[]> ``` Until #5 lands: mock LoadedCert in your branch (test RSA/EC key + self-signed cert generated at test time via openssl/node:crypto — commit no binaries). Test fixtures for golden vectors come from reference implementations (openssl for CAdES, xmlsec1 for XAdES) or generated by scripts at test setup. Resolve merge conflicts vs bullet-develop at integration; keep web/src/lib/certs.ts imports behind a thin adapter if the API shifts.
Author
Owner

bullet: coder launched on branch issue/9-use-case-batch-sign-queue-mult (model nan/deepseek-v4-flash).

bullet: coder launched on branch `issue/9-use-case-batch-sign-queue-mult` (model `nan/deepseek-v4-flash`).
Author
Owner

bullet: coder session died — relaunched from committed state (branch issue/9-use-case-batch-sign-queue-mult).

bullet: coder session died — relaunched from committed state (branch `issue/9-use-case-batch-sign-queue-mult`).
Author
Owner

Claimed — branch issue/9-use-case-batch-sign-queue-mult, HEAD 62dc44e. Branch already carries the full #9 implementation from earlier sessions; doing: independent re-verification at this HEAD (gates + fresh browser batch run), fix anything found, then report.

Claimed — branch `issue/9-use-case-batch-sign-queue-mult`, HEAD `62dc44e`. Branch already carries the full #9 implementation from earlier sessions; doing: independent re-verification at this HEAD (gates + fresh browser batch run), fix anything found, then report.
Author
Owner

Plan — Issue #9: batch sign queue (multi-file, progress, manifest)

Restated goal

Step 1 of the SPA stops meaning "one file": the user drops N files (drop zone or picker), they
become a queue, and pressing sign processes them one after another with the certificate chosen
in step 2. Each queue entry carries its own status (pending → signing → signed | error), shown
live, and a failing file is recorded as error without aborting the rest. When the run ends the
user downloads a ZIP holding one signed output per signed document plus manifest.json whose fields
mirror AutoFirma's batch manifest.

Done = pnpm test + pnpm check + pnpm build green, the queue provably sequential (one
signature in flight), resumable (file 2 fails ⇒ files 1 and 3 still signed), the manifest fields
traceable to the decompiled reference, and every produced signature + the ZIP independently
verified
(openssl cms -verify, unzip -t, sha256sum) — per AGENTS.md's crypto rule.

Scope decision (this session)

The issue declares a dependency on #6, and this branch was first written against a null
signer seam because #6 had no commits in the base. #6 now exists locally
(issue/6-use-case-cades-sign-in-browser, stacked on #5). To meet the acceptance criterion
"e2e test: 3-file batch all signed" with a real signature engine rather than a stand-in, this
branch is stacked on #5+#6 (merge commit a948238, same convention #6 itself used), and the
queue is wired to signCadesDetached.

New/changed files

File Change
web/src/lib/zip.ts new — ZIP writer (STORE entries, CRC-32, UTF-8 names), no dependency
web/src/lib/batch.ts new — document/status machine, createBatchQueue store, runBatch, buildManifest, buildZip, sha256Hex
web/src/lib/components/BatchQueue.svelte new — per-document statuses, progress, run + ZIP download
web/src/lib/batch.test.ts new — sequential/resume/manifest/ZIP, driven by the real #6 engine, outputs verified with openssl cms -verify
web/scripts/verify-batch-zip.mjs new — standalone unzip -t + sha256sum cross-check of the archive
web/src/lib/App.svelte step 1 holds File[], renders the queue, engine adapter over signCadesDetached (#6)
web/src/lib/sign.ts signingAlgorithmName() (JCA name for the manifest), implemented flag on formats
web/src/lib/components/FileDrop.svelte multiple; hands over every dropped/picked file
web/src/lib/i18n.ts queue + plural step-1 copy; dead keys from the removed single-file UI deleted
web/src/lib/App.test.ts single-file assertions replaced by the 3-file batch flow
web/src/lib/components/{SignButton,ResultCard}.svelte deleted — the queue's run button and per-document status supersede them
web/README.md, web/package.json layout/status rows; pnpm verify:zip script

Not touched: decompiled/** (read-only reference), docs/**, Containerfile, Caddyfile,
web/vite.config.ts, routes, components/{FileDrop,FileCard,CertPicker} (except multiple),
keystore.ts/pkcs12.ts/x509.ts/cms.ts/asn1.ts (#5/#6, taken as-is from the merge).

Ordered tasks (each verified by one command)

  1. zip.ts (ZIP writer) — verified by pnpm verify:zip (unzip -t + sha256sum).
  2. batch.ts (store machine, run loop, manifest, ZIP) — pnpm exec vitest run src/lib/batch.test.ts.
  3. Queue UI + App.svelte adapter over the #6 engine — pnpm check + pnpm test.
  4. batch.test.ts with the real engine (createCadesFixtures → loadSignerSession →
    signCadesDetached) and openssl cms -verify on every output; failure path = a certificate of
    the container that has no private key (a real engine rejection, no fabricated error).
  5. verify-batch-zip.mjs — node web/scripts/verify-batch-zip.mjs (exit 0).
  6. Browser smoke: static build/ served over HTTP, real PKCS#12 generated with openssl, three
    documents dropped, certificates loaded, batch run → live signing → signed statuses,
    downloaded ZIP extracted and every .csig verified with openssl cms -verify -cades.
  7. Gates: test -d decompiled; find decompiled -name '*.java' | grep -q .; git diff --check;
    pnpm test; pnpm check; pnpm build; pnpm verify:zip.

Open questions (assumptions taken — no human to ask)

  • Which AutoFirma JSON shape is "the manifest"? The decompiled client has the definition
    (JSONBatchInfo, singlesigns[] with id/datareference/format/suboperation) and the
    result envelope (JSONBatchInfoParser.buildResult, signs[] with id/result/description).
    Assumption: emit the definition array with results written back into each entry, exactly like
    JSONBatchInfo.updateResults, plus the issue's sha256/timestamp/output name as extra fields.
  • ZIP compression: STORE. CompressionStream is browser-only and no dependency may be added;
    a stored ZIP is a valid ZIP (unzip -t accepts it). ponytail: comment marks the upgrade path.
  • result values: only the client-reachable NOT_STARTED / DONE_AND_SAVED / ERROR_PRE are
    emitted; the rest of BatchDataResult.Result is listed in a comment as the mirror source.
  • signbatch.algorithm: required by BatchSigner.java:205; derived from the certificate's
    WebCrypto parameters by signingAlgorithmName() (e.g. SHA256withRSA).

Risk and boring fallback

Risk Fallback
Stacking #5/#6 collides with the orchestrator's own merge of those branches Identical commits, so the merge is a no-op; conflicts would be the same three files, resolved here already
openssl/unzip missing on the reviewer's machine They are used by tests/scripts, not by the build; the archive is also checked with Node's independent zlib.crc32
Real engine makes the suite slow (openssl keygen in beforeAll) Fixtures are generated once per file, ~5 s, within the suite's default timeout
Rabbit hole: browser ZIP capture Two attempts, then the boring path (CDP download directory) — used, worked

Session 8 addendum (revised 2026-10-14)

The branch arrived at 62dc44e with every task above already implemented and committed. There is
nothing left to build, so this session's work is the plan's own verification column run fresh:

  1. Repo gates at 62dc44e — test -d decompiled, find decompiled -name '*.java' | grep -q .,
    git diff --check, pnpm test, pnpm check, pnpm build, pnpm verify:zip.
  2. Independent browser run — freshly generated PKCS#12 + three freshly generated documents, static
    web/build/ over HTTP, headless Chromium via the harness: drop 3 files, load the container,
    click Firmar, record the data-status paint trace, download the ZIP for real, then verify it
    outside the browser (unzip -t, sha256sum vs manifest.json, openssl cms -verify -cades
    per output).
  3. Scan the diff for one more real defect; fix only if one exists, otherwise leave HEAD untouched.

Forge comments could not be posted from sessions 4–7 (empty BULLET_TOKEN, private repo → 404);
BULLET_BASIC authenticates (GET /api/v1/user 200, id 1 EduarD3V), so claim/plan/done land
this session.

# Plan — Issue #9: batch sign queue (multi-file, progress, manifest) ## Restated goal Step 1 of the SPA stops meaning "one file": the user drops **N files** (drop zone or picker), they become a queue, and pressing sign processes them **one after another** with the certificate chosen in step 2. Each queue entry carries its own status (`pending → signing → signed | error`), shown live, and a failing file is recorded as `error` **without aborting the rest**. When the run ends the user downloads a ZIP holding one signed output per signed document plus `manifest.json` whose fields mirror AutoFirma's batch manifest. **Done** = `pnpm test` + `pnpm check` + `pnpm build` green, the queue provably sequential (one signature in flight), resumable (file 2 fails ⇒ files 1 and 3 still signed), the manifest fields traceable to the decompiled reference, and every produced signature + the ZIP **independently verified** (`openssl cms -verify`, `unzip -t`, `sha256sum`) — per AGENTS.md's crypto rule. ## Scope decision (this session) The issue declares a dependency on **#6**, and this branch was first written against a `null` signer seam because #6 had no commits in the base. #6 now exists locally (`issue/6-use-case-cades-sign-in-browser`, stacked on #5). To meet the acceptance criterion "e2e test: 3-file batch all signed" with a **real** signature engine rather than a stand-in, this branch is **stacked on #5+#6** (merge commit `a948238`, same convention #6 itself used), and the queue is wired to `signCadesDetached`. **New/changed files** | File | Change | |---|---| | `web/src/lib/zip.ts` | new — ZIP writer (STORE entries, CRC-32, UTF-8 names), no dependency | | `web/src/lib/batch.ts` | new — document/status machine, `createBatchQueue` store, `runBatch`, `buildManifest`, `buildZip`, `sha256Hex` | | `web/src/lib/components/BatchQueue.svelte` | new — per-document statuses, progress, run + ZIP download | | `web/src/lib/batch.test.ts` | new — sequential/resume/manifest/ZIP, **driven by the real #6 engine**, outputs verified with `openssl cms -verify` | | `web/scripts/verify-batch-zip.mjs` | new — standalone `unzip -t` + `sha256sum` cross-check of the archive | | `web/src/lib/App.svelte` | step 1 holds `File[]`, renders the queue, engine adapter over `signCadesDetached` (#6) | | `web/src/lib/sign.ts` | `signingAlgorithmName()` (JCA name for the manifest), `implemented` flag on formats | | `web/src/lib/components/FileDrop.svelte` | `multiple`; hands over every dropped/picked file | | `web/src/lib/i18n.ts` | queue + plural step-1 copy; dead keys from the removed single-file UI deleted | | `web/src/lib/App.test.ts` | single-file assertions replaced by the 3-file batch flow | | `web/src/lib/components/{SignButton,ResultCard}.svelte` | **deleted** — the queue's run button and per-document status supersede them | | `web/README.md`, `web/package.json` | layout/status rows; `pnpm verify:zip` script | **Not touched**: `decompiled/**` (read-only reference), `docs/**`, `Containerfile`, `Caddyfile`, `web/vite.config.ts`, routes, `components/{FileDrop,FileCard,CertPicker}` (except `multiple`), `keystore.ts`/`pkcs12.ts`/`x509.ts`/`cms.ts`/`asn1.ts` (#5/#6, taken as-is from the merge). ## Ordered tasks (each verified by one command) 1. `zip.ts` (ZIP writer) — verified by `pnpm verify:zip` (`unzip -t` + `sha256sum`). 2. `batch.ts` (store machine, run loop, manifest, ZIP) — `pnpm exec vitest run src/lib/batch.test.ts`. 3. Queue UI + `App.svelte` adapter over the #6 engine — `pnpm check` + `pnpm test`. 4. `batch.test.ts` with the **real** engine (`createCadesFixtures` → `loadSignerSession` → `signCadesDetached`) and `openssl cms -verify` on every output; failure path = a certificate of the container that has no private key (a real engine rejection, no fabricated error). 5. `verify-batch-zip.mjs` — `node web/scripts/verify-batch-zip.mjs` (exit 0). 6. Browser smoke: static `build/` served over HTTP, real PKCS#12 generated with `openssl`, three documents dropped, certificates loaded, batch run → live `signing` → `signed` statuses, downloaded ZIP extracted and every `.csig` verified with `openssl cms -verify -cades`. 7. Gates: `test -d decompiled`; `find decompiled -name '*.java' | grep -q .`; `git diff --check`; `pnpm test`; `pnpm check`; `pnpm build`; `pnpm verify:zip`. ## Open questions (assumptions taken — no human to ask) - **Which AutoFirma JSON shape is "the manifest"?** The decompiled client has the *definition* (`JSONBatchInfo`, `singlesigns[]` with `id`/`datareference`/`format`/`suboperation`) and the *result* envelope (`JSONBatchInfoParser.buildResult`, `signs[]` with `id`/`result`/`description`). **Assumption**: emit the definition array with results written back into each entry, exactly like `JSONBatchInfo.updateResults`, plus the issue's `sha256`/`timestamp`/output name as extra fields. - **ZIP compression**: STORE. `CompressionStream` is browser-only and no dependency may be added; a stored ZIP is a valid ZIP (`unzip -t` accepts it). `ponytail:` comment marks the upgrade path. - **`result` values**: only the client-reachable `NOT_STARTED` / `DONE_AND_SAVED` / `ERROR_PRE` are emitted; the rest of `BatchDataResult.Result` is listed in a comment as the mirror source. - **`signbatch.algorithm`**: required by `BatchSigner.java:205`; derived from the certificate's WebCrypto parameters by `signingAlgorithmName()` (e.g. `SHA256withRSA`). ## Risk and boring fallback | Risk | Fallback | |---|---| | Stacking #5/#6 collides with the orchestrator's own merge of those branches | Identical commits, so the merge is a no-op; conflicts would be the same three files, resolved here already | | `openssl`/`unzip` missing on the reviewer's machine | They are used by tests/scripts, not by the build; the archive is also checked with Node's independent `zlib.crc32` | | Real engine makes the suite slow (openssl keygen in `beforeAll`) | Fixtures are generated once per file, ~5 s, within the suite's default timeout | | Rabbit hole: browser ZIP capture | Two attempts, then the boring path (CDP download directory) — used, worked | ## Session 8 addendum (revised 2026-10-14) The branch arrived at `62dc44e` with every task above already implemented and committed. There is nothing left to build, so this session's work is the plan's own verification column run **fresh**: 1. Repo gates at `62dc44e` — `test -d decompiled`, `find decompiled -name '*.java' | grep -q .`, `git diff --check`, `pnpm test`, `pnpm check`, `pnpm build`, `pnpm verify:zip`. 2. Independent browser run — freshly generated PKCS#12 + three freshly generated documents, static `web/build/` over HTTP, headless Chromium via the harness: drop 3 files, load the container, click *Firmar*, record the `data-status` paint trace, download the ZIP for real, then verify it outside the browser (`unzip -t`, `sha256sum` vs `manifest.json`, `openssl cms -verify -cades` per output). 3. Scan the diff for one more real defect; fix only if one exists, otherwise leave HEAD untouched. Forge comments could not be posted from sessions 4–7 (empty `BULLET_TOKEN`, private repo → 404); `BULLET_BASIC` authenticates (`GET /api/v1/user` 200, `id` 1 `EduarD3V`), so claim/plan/done land this session.
Author
Owner

DONE — HEAD ee218e6 (session 8). Branch issue/9-use-case-batch-sign-queue-mult, worktree clean, nothing pushed, Refs #9.

Commits: a0b98bd queue+manifest+ZIP writer, efb9352 e2e tests + ZIP cross-check, a948238 stack on #5/#6, edda9eb verified against real CAdES engine, 62dc44e BatchQueue unsubscribe, ee218e6 (this session) abort a run whose document list was replaced mid-flight + test.

Gates (all exit 0 at ee218e6):

  • test -d decompiled — 0
  • find decompiled -name "*.java" | grep -q . — 0 (11 487 files)
  • git diff --check — 0
  • cd web && pnpm test — 0 (4 files, 28 tests)
  • cd web && pnpm check — 0 (377 files, 0 errors 0 warnings)
  • cd web && pnpm build — 0
  • cd web && pnpm verify:zip — 0 (unzip -t clean, digests match manifest)

Evidence this session: fresh PKCS#12 + fresh documents in headless Chromium — 3 files signed one at a time (never two signing rows, Firmar disabled throughout), ZIP downloaded from the browser and verified outside it (unzip -t, sha256sum == manifest digests, openssl cms -verify -cades OK for all three). Defect found and fixed: dropping a file mid-run let the abandoned run record results on the new list (positional ids); now gated by a generation counter — unit test proven red without the fix, and confirmed in the browser (4 rows stay pending). Manifest fields mirror JSONBatchInfo.java (singlesigns[]: id/datareference/format/suboperation + result/description + sha256/timestamp/output).

DONE — HEAD `ee218e6` (session 8). Branch `issue/9-use-case-batch-sign-queue-mult`, worktree clean, nothing pushed, `Refs #9`. Commits: `a0b98bd` queue+manifest+ZIP writer, `efb9352` e2e tests + ZIP cross-check, `a948238` stack on #5/#6, `edda9eb` verified against real CAdES engine, `62dc44e` BatchQueue unsubscribe, `ee218e6` (this session) abort a run whose document list was replaced mid-flight + test. Gates (all exit 0 at `ee218e6`): - `test -d decompiled` — 0 - `find decompiled -name "*.java" | grep -q .` — 0 (11 487 files) - `git diff --check` — 0 - `cd web && pnpm test` — 0 (4 files, 28 tests) - `cd web && pnpm check` — 0 (377 files, 0 errors 0 warnings) - `cd web && pnpm build` — 0 - `cd web && pnpm verify:zip` — 0 (unzip -t clean, digests match manifest) Evidence this session: fresh PKCS#12 + fresh documents in headless Chromium — 3 files signed one at a time (never two `signing` rows, Firmar disabled throughout), ZIP downloaded from the browser and verified outside it (`unzip -t`, sha256sum == manifest digests, `openssl cms -verify -cades` OK for all three). Defect found and fixed: dropping a file mid-run let the abandoned run record results on the new list (positional ids); now gated by a generation counter — unit test proven red without the fix, and confirmed in the browser (4 rows stay `pending`). Manifest fields mirror `JSONBatchInfo.java` (`singlesigns[]`: id/datareference/format/suboperation + result/description + sha256/timestamp/output).
Author
Owner

bullet: coder session died — relaunched from committed state (branch issue/9-use-case-batch-sign-queue-mult).

bullet: coder session died — relaunched from committed state (branch `issue/9-use-case-batch-sign-queue-mult`).
Author
Owner

bullet: implementation finished (DONE — HEAD ee218e6 (session 8). Branch issue/9-use-case-batch-sign-queue-mult, worktree clean, nothing pushed, Refs #9.) — moving to review.

bullet: implementation finished (DONE — HEAD `ee218e6` (session 8). Branch `issue/9-use-case-batch-sign-queue-mult`, worktree clean, nothing pushed, `Refs #9`.) — 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

REVIEW: CLEAN — commit ee218e6: all 4 acceptance criteria met (sequential queue batch.ts:162-193; resume batch.test.ts:168; manifest fields match JSONBatchInfo.java; 3-file e2e batch.test.ts:121 + App.test.ts:132); gates green: pnpm test 28/28, pnpm check 0/0, pnpm build, pnpm verify:zip, git diff --check, decompiled gates; no tests skipped or weakened; findings: none

REVIEW: CLEAN — commit ee218e6: all 4 acceptance criteria met (sequential queue batch.ts:162-193; resume batch.test.ts:168; manifest fields match JSONBatchInfo.java; 3-file e2e batch.test.ts:121 + App.test.ts:132); gates green: pnpm test 28/28, pnpm check 0/0, pnpm build, pnpm verify:zip, git diff --check, decompiled gates; no tests skipped or weakened; findings: none
Author
Owner

bullet: review CLEAN — ready to publish.

bullet: review CLEAN — ready to publish.
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: PR #21 open → bullet-develop (auto-merge follows).

bullet: PR #21 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

Claimed — branch issue/9-use-case-batch-sign-queue-mult. Doing: replay #9 batch-queue branch onto bullet-develop (HEAD 0bbd2bf), resolve conflicts against later #7/#8/#10/#3 web work, run gates.

Claimed — branch `issue/9-use-case-batch-sign-queue-mult`. Doing: replay #9 batch-queue branch onto bullet-develop (HEAD 0bbd2bf), resolve conflicts against later #7/#8/#10/#3 web work, run gates.
Author
Owner

Claimed — branch bullet-develop. Doing: merge origin/main (the already-landed PR #20 merge, tree-identical to bullet-develop) into bullet-develop, run gates, report.

Claimed — branch `bullet-develop`. Doing: merge origin/main (the already-landed PR #20 merge, tree-identical to bullet-develop) into bullet-develop, run gates, report.
Author
Owner

INTEGRATED: #9 merged into bullet-develop (conflicts resolved: App.svelte/App.test.ts/i18n.ts/sign.ts/FileDrop.svelte/README.md rebuilt so the batch queue is the sign flow while #7 XAdES and #8 verify mode keep working) — merge 0e0bb1e, gates exit 0, 86/86 vitest, svelte-check clean, ZIP+openssl+xmlsec1 cross-checks pass.

INTEGRATED: #9 merged into bullet-develop (conflicts resolved: App.svelte/App.test.ts/i18n.ts/sign.ts/FileDrop.svelte/README.md rebuilt so the batch queue is the sign flow while #7 XAdES and #8 verify mode keep working) — merge 0e0bb1e, gates exit 0, 86/86 vitest, svelte-check clean, ZIP+openssl+xmlsec1 cross-checks pass.
Author
Owner

RECONCILED: trunk work merged into bullet-develop (conflicts resolved: none textual — origin/main 159a710 is a merge of 0bbd2bf, so the trunk merge was content-free; the branch now carries the reviewed #9 batch work from the peer conflict-solver merge 0e0bb1e, my merge commit 442624f, gates green) — Refs #9

RECONCILED: trunk work merged into bullet-develop (conflicts resolved: none textual — origin/main `159a710` is a merge of `0bbd2bf`, so the trunk merge was content-free; the branch now carries the reviewed #9 batch work from the peer conflict-solver merge `0e0bb1e`, my merge commit `442624f`, gates green) — Refs #9
Author
Owner

bullet: merged into bullet-develop — integration gates green.

bullet: merged into `bullet-develop` — integration gates green.
Author
Owner

bullet: PR #21 closed — work already merged into bullet-develop.

bullet: PR #21 closed — work already merged into `bullet-develop`.
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#9
No description provided.