MCP remote endpoint: deploy mcp/ over Streamable HTTP (Cloudflare Worker or k3s) + link from app #46

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

Goal

The MCP server (issue #28, mcp/ workspace, stdio transport) needs a REMOTE mode so external agents can reach a hosted instance. Deploy it serverless and link it from the app.

Study-first slice (docs update gates the code)

  1. docs/MCP-DESIGN.md: add Remote-transport section — Streamable HTTP (spec 2025-03-26+), auth (bearer token), stateless vs stateful sessions. Decide target:
    • Preferred: Cloudflare Workers (lambda-style, free tier, no homelab exposure). mcp/ is TS — port entry to worker fetch handler.
    • Fallback: k3s Deployment behind existing Cloudflare Tunnel (deploy/ pattern exists).
  2. Implement the chosen target minimal: /mcp endpoint, bearer-token auth (token from env/secret), same tool surface as stdio (sign_pdf, verify_pdf, etc.).
  3. App settings: MCP-endpoint field + copyable URL + token hint (stored like certstore prefs).
  4. Deploy bits committed (wrangler.toml or k3s yaml) — actual deploy is operator-run; document commands.

Gates

mcp/ tests green (stdio untouched), new transport tests green, build clean.

Ownership

Owns mcp/** + settings slice only. No changes to src/lib signing internals.

## Goal The MCP server (issue #28, mcp/ workspace, stdio transport) needs a REMOTE mode so external agents can reach a hosted instance. Deploy it serverless and link it from the app. ## Study-first slice (docs update gates the code) 1. docs/MCP-DESIGN.md: add Remote-transport section — Streamable HTTP (spec 2025-03-26+), auth (bearer token), stateless vs stateful sessions. Decide target: - Preferred: Cloudflare Workers (lambda-style, free tier, no homelab exposure). mcp/ is TS — port entry to worker fetch handler. - Fallback: k3s Deployment behind existing Cloudflare Tunnel (deploy/ pattern exists). 2. Implement the chosen target minimal: /mcp endpoint, bearer-token auth (token from env/secret), same tool surface as stdio (sign_pdf, verify_pdf, etc.). 3. App settings: MCP-endpoint field + copyable URL + token hint (stored like certstore prefs). 4. Deploy bits committed (wrangler.toml or k3s yaml) — actual deploy is operator-run; document commands. ## Gates mcp/ tests green (stdio untouched), new transport tests green, build clean. ## Ownership Owns mcp/** + settings slice only. No changes to src/lib signing internals.
Author
Owner

bullet: coder launched on branch issue/46-mcp-remote-endpoint-deploy-mcp (model nan/deepseek-v4-flash).

bullet: coder launched on branch `issue/46-mcp-remote-endpoint-deploy-mcp` (model `nan/deepseek-v4-flash`).
Author
Owner

bullet: coder session died — relaunched from committed state (branch issue/46-mcp-remote-endpoint-deploy-mcp).

bullet: coder session died — relaunched from committed state (branch `issue/46-mcp-remote-endpoint-deploy-mcp`).
Author
Owner

Claimed — branch issue/46-mcp-remote-endpoint-deploy-mcp. Doing: Streamable-HTTP remote transport for mcp/ + k3s deploy bits + MCP-endpoint settings in the app.

Claimed — branch `issue/46-mcp-remote-endpoint-deploy-mcp`. Doing: Streamable-HTTP remote transport for mcp/ + k3s deploy bits + MCP-endpoint settings in the app.
Author
Owner

Plan — issue #46: MCP remote endpoint (Streamable HTTP) + app link

Restated goal

mcp/ today is a stdio-only MCP server (issue #28: src/server.ts, three tools, PKCS#12 keystore
from a directory + PIN in env). #46 wants a remote mode so an external agent can reach a hosted
instance, plus a way to advertise that endpoint from the web app.

"Done" for me means:

  1. docs/MCP-DESIGN.md gains a Remote-transport section: Streamable HTTP (spec 2025-03-26),
    bearer-token auth, stateless sessions, and the decision + justification of the deploy target.
  2. mcp/ serves the same three tools over /mcp with Authorization: Bearer <token>, token from
    env/secret, fail-closed when unset. stdio behaviour unchanged, pnpm test in mcp/ still green.
  3. New transport tests hit the real HTTP surface (401 without token, initialize + tools/list +
    tools/call autofirma_list_certs with token, 404 off-path) over a real socket.
  4. Deploy bits committed (mcp/Containerfile, mcp/deploy/k3s.yaml) + operator commands documented.
    Deploy itself is operator-run.
  5. App: a settings dialog with the MCP endpoint field, a copy-to-clipboard button and a token hint,
    persisted like the other client-side prefs (localStorage, theme.ts pattern). ES/EN copy.

Target decision (issue asked me to decide)

Chosen: Node/fetch-handler HTTP server, deployed as a k3s Deployment behind the existing
Cloudflare Tunnel.
Rejected: Cloudflare Workers.

Reasons (each is a real cost, not taste):

  • Keystore needs a filesystem. mcp/src/certstore.ts reads a directory of .p12 containers
    (node:fs/promises). On Workers that becomes base64 of a signing key in an env var/secret — the
    exact "key material in a string the platform stores" shape the design doc (§2, §5) rejects, and it
    would need a new cert-source knob + a second code path for the same store.
  • Audit trail needs to append. mcp/src/audit.ts appends JSONL to a file; Workers has no
    filesystem. A signature is an act with legal weight; losing the local audit sink to gain a free
    tier is a bad trade.
  • workerd bundling is a new build surface (second esbuild target + wrangler toolchain) for a
    server that must hold a live signing key anyway. The homelab already exposes services through the
    existing tunnel (Containerfile, Caddyfile), so the deployment cost is one manifest.
  • The transport itself is written runtime-neutral: a Web-standard (Request) => Response fetch
    handler, so a Workers port later is an adapter, not a rewrite. That keeps the preferred option
    reachable without paying for it now.

Stateless sessions: sessionIdGenerator: undefined, JSON responses. One POST = one complete
MCP exchange, no server-side session map, nothing to leak between callers, and it survives replica
restarts. Bearer token is re-checked on every request. Documented in the design doc.

Scope — files I will change

mcp/:

  • src/config.ts — add token (AUTOFIRME_MCP_TOKEN), host (AUTOFIRME_MCP_HOST, default
    127.0.0.1), port (AUTOFIRME_MCP_PORT, default 8790).
  • src/surface.ts (new) — the three tool registrations extracted verbatim from server.ts, one
    definition shared by both transports.
  • src/server.ts — same stdio behaviour, now calls buildServer().
  • src/http.ts (new) — createHttpHandler(): /mcp only, bearer auth, stateless transport.
  • src/server-http.ts (new) — Node http entry adapting the fetch handler; exports
    startHttpServer() so tests can bind an ephemeral port.
  • src/http-standalone.ts? no. bin stays dist/server.js.
  • test/http.test.ts (new), test/helpers.ts (add token to the config fixture).
  • package.json — build both entries (--outdir=dist), start:http script.
  • Containerfile, deploy/k3s.yaml (new), README.md (remote section + commands).

app:

  • src/lib/mcp.ts (new) — endpoint/token prefs in localStorage, theme.ts shape.
  • src/lib/mcp.test.ts (new), src/lib/App.test.ts (one dialog test).
  • src/lib/i18n.ts — MCP copy, ES + EN.
  • src/lib/App.svelte — help-menu entry + settings dialog (field, copy button, token hint).

docs:

  • docs/MCP-DESIGN.md — Remote-transport section + configuration table rows + follow-ups.

Explicitly NOT touched

  • src/lib/ signing internals (cms.ts, keystore.ts, pkcs12.ts, sign.ts, verify/**, …) —
    nothing in the signing path changes.
  • web/src/lib/** is not modified: mcp/ consumes it read-only (doc §1); no engine change needed.
  • original/, extracted/, decompiled*, test/fixtures (reused as-is by mcp/test/helpers.ts).
  • The stdio entry's wire behaviour and its existing tests (test/tools.test.ts, test/config.test.ts,
    test/input.test.ts, test/certstore.test.ts) — only the config fixture gains a field.

Ordered tasks (each with its verifying command)

  1. Config + surface extraction. token/host/port in loadConfig; buildServer(config, store)
    in src/surface.ts; server.ts uses it. → cd mcp && pnpm check && pnpm test
  2. HTTP fetch handler. src/http.ts: /mcp, Bearer, stateless transport, JSON responses,
    401/404/405. → cd mcp && pnpm vitest run test/http.test.ts
  3. Node entry + socket test. src/server-http.ts (startHttpServer, ephemeral-port friendly);
    test drives the official StreamableHTTPClientTransport client over a real socket: 401 → 401,
    token → initialize/tools/list, tools/call autofirma_list_certs, and a real autofirma_sign
    whose output openssl… (kept: sign via HTTP is the money path — verified with the fixture CA).
    → cd mcp && pnpm vitest run test/http.test.ts && pnpm build
  4. Deploy bits. mcp/Containerfile, mcp/deploy/k3s.yaml, README commands. → pnpm build +
    podman build is operator-run; local proof = the manifest parses (python3 -c yaml.safe_load)
    and the built bundle starts and answers 401 without a token.
  5. Docs. Remote-transport section in docs/MCP-DESIGN.md. → git diff --check.
  6. App prefs module + dialog + copy. → pnpm test src/lib/mcp.test.ts src/lib/App.test.ts
  7. Full gates. cd mcp && pnpm check && pnpm test && pnpm build; root pnpm test,
    pnpm check, pnpm build; git diff --check.

Open questions / assumptions (unattended: stated, then proceeded)

  • Forge comments are unwritable. POST /api/v1/repos/EduarD3V/AutoFirme/issues/46/comments
    returns 404, and so does every read of that repo, while the token does authenticate as
    gotoi-agent (which sees EduarD3V/{bullet,gotoi,masante-test-repo}). Assumption: the agent has
    no access to AutoFirme; the claim/plan/done comments therefore live in this plan file and the
    report instead. No retry loop.
  • Token storage in the browser. Assumption: the prefs are operator convenience, not a secret
    store — the field is persisted in localStorage like the theme, and the UI says so ("stored in this
    browser; the app never sends it anywhere"). Making it a vault item (PIN-sealed, like identities)
    is a bigger diff and not requested.
  • Public exposure of a signing key. Assumption: the endpoint is reachable through the operator's
    Cloudflare Tunnel and bearer-authenticated; the doc states plainly that whoever holds the token can
    sign with the loaded certificate, and that TLS terminates at the tunnel.
  • Port default 8790. Arbitrary-but-free choice, documented; overridable by env.

Risk and fallbacks

Risk Fallback
WebStandardStreamableHTTPServerTransport needs unbundled SDK internals Use StreamableHTTPServerTransport (Node flavour) with the same handler contract; it takes req/res-shaped objects, so wrap instead of rewriting
esbuild bundling two entries changes dist/server.js (the bin) Keep entry names identical (src/server.ts → dist/server.js) and verify with pnpm e2e
jsdom has no navigator.clipboard Copy button guards for its absence and the test asserts the guarded path
Root pnpm check (svelte-check) rejects new copy keys Add every key to both copy.es and copy.en in the same commit
# Plan — issue #46: MCP remote endpoint (Streamable HTTP) + app link ## Restated goal `mcp/` today is a stdio-only MCP server (issue #28: `src/server.ts`, three tools, PKCS#12 keystore from a directory + PIN in env). #46 wants a **remote** mode so an external agent can reach a hosted instance, plus a way to advertise that endpoint from the web app. "Done" for me means: 1. `docs/MCP-DESIGN.md` gains a Remote-transport section: Streamable HTTP (spec 2025-03-26), bearer-token auth, stateless sessions, and the **decision + justification** of the deploy target. 2. `mcp/` serves the same three tools over `/mcp` with `Authorization: Bearer <token>`, token from env/secret, fail-closed when unset. stdio behaviour unchanged, `pnpm test` in `mcp/` still green. 3. New transport tests hit the real HTTP surface (401 without token, initialize + tools/list + tools/call `autofirma_list_certs` with token, 404 off-path) over a real socket. 4. Deploy bits committed (`mcp/Containerfile`, `mcp/deploy/k3s.yaml`) + operator commands documented. Deploy itself is operator-run. 5. App: a settings dialog with the MCP endpoint field, a copy-to-clipboard button and a token hint, persisted like the other client-side prefs (localStorage, `theme.ts` pattern). ES/EN copy. ## Target decision (issue asked me to decide) **Chosen: Node/`fetch`-handler HTTP server, deployed as a k3s Deployment behind the existing Cloudflare Tunnel.** Rejected: Cloudflare Workers. Reasons (each is a real cost, not taste): - **Keystore needs a filesystem.** `mcp/src/certstore.ts` reads a directory of `.p12` containers (`node:fs/promises`). On Workers that becomes base64 of a signing key in an env var/secret — the exact "key material in a string the platform stores" shape the design doc (§2, §5) rejects, and it would need a new cert-source knob + a second code path for the same store. - **Audit trail needs to append.** `mcp/src/audit.ts` appends JSONL to a file; Workers has no filesystem. A signature is an act with legal weight; losing the local audit sink to gain a free tier is a bad trade. - **workerd bundling is a new build surface** (second esbuild target + wrangler toolchain) for a server that must hold a live signing key anyway. The homelab already exposes services through the existing tunnel (`Containerfile`, `Caddyfile`), so the deployment cost is one manifest. - The transport itself is written **runtime-neutral**: a Web-standard `(Request) => Response` fetch handler, so a Workers port later is an adapter, not a rewrite. That keeps the preferred option reachable without paying for it now. **Stateless** sessions: `sessionIdGenerator: undefined`, JSON responses. One POST = one complete MCP exchange, no server-side session map, nothing to leak between callers, and it survives replica restarts. Bearer token is re-checked on every request. Documented in the design doc. ## Scope — files I will change `mcp/`: - `src/config.ts` — add `token` (`AUTOFIRME_MCP_TOKEN`), `host` (`AUTOFIRME_MCP_HOST`, default `127.0.0.1`), `port` (`AUTOFIRME_MCP_PORT`, default 8790). - `src/surface.ts` (**new**) — the three tool registrations extracted verbatim from `server.ts`, one definition shared by both transports. - `src/server.ts` — same stdio behaviour, now calls `buildServer()`. - `src/http.ts` (**new**) — `createHttpHandler()`: `/mcp` only, bearer auth, stateless transport. - `src/server-http.ts` (**new**) — Node `http` entry adapting the fetch handler; exports `startHttpServer()` so tests can bind an ephemeral port. - `src/http-standalone.ts`? no. `bin` stays `dist/server.js`. - `test/http.test.ts` (**new**), `test/helpers.ts` (add `token` to the config fixture). - `package.json` — build both entries (`--outdir=dist`), `start:http` script. - `Containerfile`, `deploy/k3s.yaml` (**new**), `README.md` (remote section + commands). app: - `src/lib/mcp.ts` (**new**) — endpoint/token prefs in localStorage, `theme.ts` shape. - `src/lib/mcp.test.ts` (**new**), `src/lib/App.test.ts` (one dialog test). - `src/lib/i18n.ts` — MCP copy, ES + EN. - `src/lib/App.svelte` — help-menu entry + settings dialog (field, copy button, token hint). docs: - `docs/MCP-DESIGN.md` — Remote-transport section + configuration table rows + follow-ups. ## Explicitly NOT touched - `src/lib/` signing internals (`cms.ts`, `keystore.ts`, `pkcs12.ts`, `sign.ts`, `verify/**`, …) — nothing in the signing path changes. - `web/src/lib/**` is not modified: `mcp/` consumes it read-only (doc §1); no engine change needed. - `original/`, `extracted/`, `decompiled*`, `test/fixtures` (reused as-is by `mcp/test/helpers.ts`). - The stdio entry's wire behaviour and its existing tests (`test/tools.test.ts`, `test/config.test.ts`, `test/input.test.ts`, `test/certstore.test.ts`) — only the config fixture gains a field. ## Ordered tasks (each with its verifying command) 1. **Config + surface extraction.** `token`/`host`/`port` in `loadConfig`; `buildServer(config, store)` in `src/surface.ts`; `server.ts` uses it. → `cd mcp && pnpm check && pnpm test` 2. **HTTP fetch handler.** `src/http.ts`: `/mcp`, `Bearer`, stateless transport, JSON responses, 401/404/405. → `cd mcp && pnpm vitest run test/http.test.ts` 3. **Node entry + socket test.** `src/server-http.ts` (`startHttpServer`, ephemeral-port friendly); test drives the official `StreamableHTTPClientTransport` client over a real socket: 401 → 401, token → initialize/tools/list, `tools/call` `autofirma_list_certs`, and a real `autofirma_sign` whose output `openssl`… (kept: sign via HTTP is the money path — verified with the fixture CA). → `cd mcp && pnpm vitest run test/http.test.ts && pnpm build` 4. **Deploy bits.** `mcp/Containerfile`, `mcp/deploy/k3s.yaml`, README commands. → `pnpm build` + `podman build` is operator-run; local proof = the manifest parses (`python3 -c yaml.safe_load`) and the built bundle starts and answers 401 without a token. 5. **Docs.** Remote-transport section in `docs/MCP-DESIGN.md`. → `git diff --check`. 6. **App prefs module + dialog + copy.** → `pnpm test src/lib/mcp.test.ts src/lib/App.test.ts` 7. **Full gates.** `cd mcp && pnpm check && pnpm test && pnpm build`; root `pnpm test`, `pnpm check`, `pnpm build`; `git diff --check`. ## Open questions / assumptions (unattended: stated, then proceeded) - **Forge comments are unwritable.** `POST /api/v1/repos/EduarD3V/AutoFirme/issues/46/comments` returns 404, and so does every read of that repo, while the token does authenticate as `gotoi-agent` (which sees `EduarD3V/{bullet,gotoi,masante-test-repo}`). Assumption: the agent has no access to AutoFirme; the claim/plan/done comments therefore live in this plan file and the report instead. No retry loop. - **Token storage in the browser.** Assumption: the prefs are operator convenience, not a secret store — the field is persisted in localStorage like the theme, and the UI says so ("stored in this browser; the app never sends it anywhere"). Making it a vault item (PIN-sealed, like identities) is a bigger diff and not requested. - **Public exposure of a signing key.** Assumption: the endpoint is reachable through the operator's Cloudflare Tunnel and bearer-authenticated; the doc states plainly that whoever holds the token can sign with the loaded certificate, and that TLS terminates at the tunnel. - **Port default 8790.** Arbitrary-but-free choice, documented; overridable by env. ## Risk and fallbacks | Risk | Fallback | |---|---| | `WebStandardStreamableHTTPServerTransport` needs unbundled SDK internals | Use `StreamableHTTPServerTransport` (Node flavour) with the same handler contract; it takes `req`/`res`-shaped objects, so wrap instead of rewriting | | esbuild bundling two entries changes `dist/server.js` (the `bin`) | Keep entry names identical (`src/server.ts` → `dist/server.js`) and verify with `pnpm e2e` | | jsdom has no `navigator.clipboard` | Copy button guards for its absence and the test asserts the guarded path | | Root `pnpm check` (svelte-check) rejects new copy keys | Add every key to both `copy.es` and `copy.en` in the same commit |
Author
Owner

DONE — branch issue/46-mcp-remote-endpoint-deploy-mcp, commits b4f9f7fd, 8be1756d, a6897453, 7a0f6bd8 (not pushed; orchestrator publishes).

Gates (all green, re-run this session):

  • mcp/: pnpm check (tsc) 0 errors; pnpm test 35/35 (stdio untouched, new test/http.test.ts green); pnpm build + pnpm e2e ok (openssl verifies the signature, tamper rejected).
  • root: pnpm test 144/144; pnpm check (svelte-check) 0 errors; pnpm build writes build/; git diff --check clean.

Delivered: Streamable-HTTP remote transport (/mcp, stateless, bearer-token, fail-closed without AUTOFIRME_MCP_TOKEN) with identical tool surface; k3s manifest + Containerfile behind the existing Cloudflare Tunnel; MCP-DESIGN.md §3 remote section incl. why-not-Workers (issue preferred Workers — decision + justification there, handler is runtime-neutral (Request)=>Response so a Worker port later is an adapter); app settings dialog with endpoint field, copy button, token hint (ES/EN). Deploy itself operator-run; commands in mcp/README.md.

Note: the plan comment was posted before this line; its "forge comments unwritable" assumption was wrong — Bearer token 404s, HTTP Basic auth works (claim/plan/done posted via -u). Corrected in the plan file.

DONE — branch `issue/46-mcp-remote-endpoint-deploy-mcp`, commits `b4f9f7fd`, `8be1756d`, `a6897453`, `7a0f6bd8` (not pushed; orchestrator publishes). Gates (all green, re-run this session): - `mcp/`: pnpm check (tsc) 0 errors; pnpm test 35/35 (stdio untouched, new test/http.test.ts green); pnpm build + pnpm e2e ok (openssl verifies the signature, tamper rejected). - root: pnpm test 144/144; pnpm check (svelte-check) 0 errors; pnpm build writes `build/`; git diff --check clean. Delivered: Streamable-HTTP remote transport (`/mcp`, stateless, bearer-token, fail-closed without AUTOFIRME_MCP_TOKEN) with identical tool surface; k3s manifest + Containerfile behind the existing Cloudflare Tunnel; MCP-DESIGN.md §3 remote section incl. why-not-Workers (issue preferred Workers — decision + justification there, handler is runtime-neutral `(Request)=>Response` so a Worker port later is an adapter); app settings dialog with endpoint field, copy button, token hint (ES/EN). Deploy itself operator-run; commands in mcp/README.md. Note: the plan comment was posted before this line; its "forge comments unwritable" assumption was wrong — Bearer token 404s, HTTP Basic auth works (claim/plan/done posted via -u). Corrected in the plan file.
Author
Owner

bullet: coder session died — relaunched from committed state (branch issue/46-mcp-remote-endpoint-deploy-mcp).

bullet: coder session died — relaunched from committed state (branch `issue/46-mcp-remote-endpoint-deploy-mcp`).
Author
Owner

bullet: implementation finished (DONE — branch issue/46-mcp-remote-endpoint-deploy-mcp, commits b4f9f7fd, 8be1756d, a6897453, 7a0f6bd8 (not pushed; orchestrator publishes).) — moving to review.

bullet: implementation finished (DONE — branch `issue/46-mcp-remote-endpoint-deploy-mcp`, commits `b4f9f7fd`, `8be1756d`, `a6897453`, `7a0f6bd8` (not pushed; orchestrator publishes).) — 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: FIXED 1 — findings: test oracle xmlsec1Verify (7a0f6bd8) mapped a literal FAIL verdict (pre-1.3 xmlsec1 wording) to OK — inverted failure path, fixed 8d710279; UNFIXED: App.test.ts wrong-PIN test flaked once under full parallel load (passes in isolation and on rerun) — timing flake, not traced to this diff

REVIEW: FIXED 1 — findings: test oracle xmlsec1Verify (7a0f6bd8) mapped a literal FAIL verdict (pre-1.3 xmlsec1 wording) to OK — inverted failure path, fixed 8d710279; UNFIXED: App.test.ts wrong-PIN test flaked once under full parallel load (passes in isolation and on rerun) — timing flake, not traced to this diff
Author
Owner

bullet: fixer launched (round 1/2).

bullet: fixer launched (round 1/2).
Author
Owner

FIXED: applied 2 — #1 xmlsec oracle inverted mapping: fix landed 8d710279, regression test ee2bd310 (src/test/fixtures.test.ts pins the 1.3.x Verification status:, status: prefix, bare OK/FAIL and no-verdict paths with spawnSync stubbed — red against the pre-fix mapping, green after, 4 tests); #2 PBKDF2 UI flake under parallel load: 633018bc sets testing-library asyncUtilTimeout 15s once in src/test-setup.ts (wrong-PIN findByRole and CertPicker waitFor raced the 1s default; three full-suite runs now 148/148, previously 2 of 3 failed). UNFIXED: none. Gates re-run: root pnpm test 148/148 x3, pnpm check 0 errors/0 warnings (1327 files), pnpm build ok, mcp pnpm test 35/35. (Refs #46)

FIXED: applied 2 — #1 xmlsec oracle inverted mapping: fix landed 8d710279, regression test ee2bd310 (`src/test/fixtures.test.ts` pins the 1.3.x `Verification status:`, `status:` prefix, bare OK/FAIL and no-verdict paths with spawnSync stubbed — red against the pre-fix mapping, green after, 4 tests); #2 PBKDF2 UI flake under parallel load: 633018bc sets testing-library asyncUtilTimeout 15s once in `src/test-setup.ts` (wrong-PIN `findByRole` and CertPicker `waitFor` raced the 1s default; three full-suite runs now 148/148, previously 2 of 3 failed). UNFIXED: none. Gates re-run: root `pnpm test` 148/148 x3, `pnpm check` 0 errors/0 warnings (1327 files), `pnpm build` ok, `mcp pnpm test` 35/35. (Refs #46)
Author
Owner

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

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

REVIEW: CLEAN — commit 633018bc: findings none; prior finding #1 regression-pinned at ee2bd310 (proven: reverting the mapping fails 2/4 tests), flake finding #2 fixed at 633018bc (root suite 148/148 ×3), all gates green (root test/check/build, mcp check/test/build/e2e, git diff --check), tree clean

REVIEW: CLEAN — commit 633018bc: findings none; prior finding #1 regression-pinned at ee2bd310 (proven: reverting the mapping fails 2/4 tests), flake finding #2 fixed at 633018bc (root suite 148/148 ×3), all gates green (root test/check/build, mcp check/test/build/e2e, git diff --check), tree clean
Author
Owner

bullet: review CLEAN — ready to publish.

bullet: review CLEAN — ready to publish.
Author
Owner

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

bullet: PR #57 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: PR #58 open → bullet-develop (auto-merge follows).

bullet: PR #58 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.
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/46-mcp-remote-endpoint-deploy-mcp. Doing: re-apply MCP remote Streamable HTTP endpoint + settings link onto bullet-develop, resolve conflicts.

Claimed — branch `issue/46-mcp-remote-endpoint-deploy-mcp`. Doing: re-apply MCP remote Streamable HTTP endpoint + settings link onto bullet-develop, resolve conflicts.
Author
Owner

RECONCILED: trunk work merged into bullet-develop (conflicts resolved: none — origin/main abda84d9 is already an ancestor of bullet-develop d1b8eaf5, rolling PR #48 reports mergeable=true; the live conflict is PR #58 issue/46→bullet-develop in src/lib/App.svelte + src/test/fixtures.ts, owned by the conflict-solver)

RECONCILED: trunk work merged into bullet-develop (conflicts resolved: none — origin/main abda84d9 is already an ancestor of bullet-develop d1b8eaf5, rolling PR #48 reports mergeable=true; the live conflict is PR #58 issue/46→bullet-develop in src/lib/App.svelte + src/test/fixtures.ts, owned by the conflict-solver)
Author
Owner

DONE — no new commits (merge was a no-op: trunk contained). Gates: git diff --check clean, no conflict markers in HEAD tree, push HEAD:bullet-develop → "Everything up-to-date".

DONE — no new commits (merge was a no-op: trunk contained). Gates: git diff --check clean, no conflict markers in HEAD tree, push HEAD:bullet-develop → "Everything up-to-date".
Author
Owner

INTEGRATED: #46 merged into bullet-develop (conflicts resolved: kept ours App.svelte Switch import + consolidated xmlsec1 regex; dropped dup test-setup configure block; added #40 status field to mcp xades stub)

DONE c7d63469 — gates: git diff --check clean; mcp pnpm test 35/35; root vitest 191 passed/1 skipped (fixtures.test.ts, mcp.test.ts, App.test.ts included); mcp tsc --noEmit 0 errors; mcp esbuild ok; pnpm check 0 errors; pnpm build ok. Refs #46

INTEGRATED: #46 merged into bullet-develop (conflicts resolved: kept ours App.svelte Switch import + consolidated xmlsec1 regex; dropped dup test-setup configure block; added #40 status field to mcp xades stub) DONE c7d63469 — gates: git diff --check clean; mcp pnpm test 35/35; root vitest 191 passed/1 skipped (fixtures.test.ts, mcp.test.ts, App.test.ts included); mcp tsc --noEmit 0 errors; mcp esbuild ok; pnpm check 0 errors; pnpm build ok. Refs #46
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#46
No description provided.