Repository navigation
Releases
Cockpit v0.0.0-rolling.41
Preserve bounded module diagnostic history without implying current failure
Summary
Closes #304.
- Aggregate module diagnostics by module, stage and error code with first/last observation timestamps and counts. Keep at most 100 records globally (least-recently-observed eviction), expose eviction totals and process-local history identity, and explicitly report historical/unknown-health semantics.
- Stop replaying bootstrap history as current-failure toasts. Provide one neutral, dismissible complete-history disclosure plus a persistent Settings > About entry with explicit refresh. Four or more diagnostics remain reachable; ordinary local-error notifications and HTTP request error ownership stay unchanged.
- Preserve legacy backend records without inventing timestamps, counts, recovery or health. No SDK bump, module domain logic, deployment or unrelated route-limit changes.
Evidence
- Independent read-only code review: no significant findings.
- Targeted Web tests: 72 passed (module runtime/history, notifications, About, Settings).
- Module host tests: 20 passed, including counts/timestamps, multi-code bounded retention, eviction, defensive snapshots and successful/request-only calls not resolving history.
- Web typecheck and server test typecheck passed; targeted ESLint/Stylelint and documentation links passed.
- Isolated Chat Lab: desktop/narrow history and existing Settings smoke, 4 passed. Initial cold Vite startup exceeded the existing 5-second root readiness assertion once; unchanged rerun passed. No startup timeout or test gate was weakened.
Boundary
Normal protected merge and automatic Rolling publication only. No deployment, manual tag, version bump or milestone promotion.
PR: #305
Source: 3346081
Rolling sequence: 41
Build: https://github.com/waksana/cockpit/actions/runs/42932636466
runtime.tar.gz:sha256:74dcad94a8f0b2c306fe8d02c4eb40f7a0b9fbe2e5a98953c54d67929368dc1fruntime.tar.gz.sha256:sha256:eaece4dd4b93de2cd864bd0e4e14f8f6df5f25f0bbac3ce61de848c2ba72d969cockpit-deployment.json:sha256:4764b71683f9a5ad82500a524acc3c69e9c626a5737b793b1139442679ac5391cockpit-deployment.json.sha256:sha256:e19e0e7560844fdcb0e3177e42d2d176abb8e5b8dadc395b06a6ea0b8317134f
Cockpit v0.0.0-rolling.40
Support validated acceptance of MCP elicitation forms
Problem and scope
Fixes #302.
Cockpit currently removes Accept whenever a native MCP elicitation includes a schema. This prevents even simple structured confirmations from being answered.
- Expose supported flat SDK form schemas and typed response content through the shared protocol, HTTP, MCP, generated module wire types, and Web UI.
- Render string/enum, number/integer, boolean and string-choice-array fields with labels, descriptions and defaults. Keep explicit false, zero and empty enum strings intact; optional fields can be explicitly omitted.
- Validate before consuming the native pending callback. Invalid answers remain pending; decline/cancel send no content. Keep drafts in memory across decision tabs and preserve them after submission failure.
- Preserve simple confirmations. URL flows, missing form schemas and unknown constraints stay decline/cancel-only with an explicit explanation. Tool permission policy remains allow-all without automatically accepting business confirmations.
Validation
Commands ran with Node 24.20.0 and pnpm 10.34.5 (via corepack/local shim), using bounded execution and memory for builds/tests:
pnpm install --frozen-lockfile: passed.pnpm build,pnpm typecheck:test,pnpm lint,pnpm sdk:check: passed.pnpm --filter @cockpit/core exec node --import tsx --test ../../packages/protocol/src/elicitation.test.ts src/engine-controls.test.ts: 32 passed.pnpm --filter @cockpit/web exec tsx --tsconfig tsconfig.app.json --test src/components/ElicitationForm.test.ts src/components/PendingDecision.markdown.test.ts src/components/Thread.process.test.ts src/net/client.test.ts src/net/store.test.ts: 509 passed.pnpm --filter @cockpit/server exec node --import tsx --test src/intents.test.ts: 173 passed.pnpm --filter @cockpit/mcp exec node --import tsx --test src/index.test.ts: 77 passed.node --test scripts/check-docs.test.mjs: 5 passed.pnpm --filter @cockpit/web exec playwright test --grep "structured elicitation": desktop and narrow synthetic Chat Lab cases passed (2 tests), with no backend/external requests or horizontal overflow.
Independent read-only review identified JSON Schema string-semantics mismatches and inability to omit an edited optional string. Both were corrected with Unicode codepoint lengths, the MCP-compatible ajv-formats rules, an explicit omit action and regression coverage. A follow-up type-narrowing issue was also corrected; final build/type checks passed.
Initial local validation failures were resolved: Web tests require the existing tsconfig-aware runner, and Chromium needed browser/system dependencies. Browser libraries were extracted into an isolated local directory rather than installed system-wide. Local CJK fonts were unavailable, so screenshots are not a typography baseline. The normal existing Vite chunk-size advisory remains. No real MCP business write or installed native runtime acceptance was exercised; current-head CI also passed full required checks, isolated native smoke and runtime packaging. CI run covers head 140a7b11a81b880a920846878d68938d33d99239; Chat Lab completed with 78 passed and 2 existing skips. The Rolling-only descriptor step is not run for PR builds.
CI initially stopped at the independent SDK-version gate; added the required additive source-version record. node scripts/check-sdk-changes.mjs 558b23e7ecf4dd0ce88d0efa1cca482745791b91 now passes, and pnpm --filter @waksana/cockpit-module-sdk test passes all 7 standalone consumer/package cases.
Compatibility and documentation
Adds optional requestedSchema/unsupportedReason to elicitation requests and optional typed content to acceptance. Regenerates the public module wire projection. Adds a direct ajv-formats dependency already present transitively in the lockfile. Documents support and boundaries in native-chat.md and the MCP guide. The additive generated wire contract requires source SDK version 0.18.0 and its change record; the host version stays unchanged. No SDK publication, merge, release, restart or deployment is part of this PR.
- The change stays within the agreed scope; affected tests/docs are updated.
- Evidence uses synthetic data and contains no credentials or real session history.
- I have described failures, skips and remaining limitations truthfully.
PR: #303
Source: c7f4681
Rolling sequence: 40
Build: https://github.com/waksana/cockpit/actions/runs/37791620389
runtime.tar.gz:sha256:9902e5e5a3048873c5d6442ffefe68c7a93f14de676f50d63ee582490e8ef0c1runtime.tar.gz.sha256:sha256:08ad3c426b00a2db305d3664fb5c43f1d4dd8d4b6e0c9770566890acfa673cfacockpit-deployment.json:sha256:f63e77d649aee4bc9d070202e34d2042922a89ea82baf3050e9f4dfa537bc2e7cockpit-deployment.json.sha256:sha256:f42ebae9bdf30e28378cbe5e54d7f460bbeaca8e94ea75d5619c2eca4bcba912
Cockpit v0.0.0-rolling.39
Bound native tool-scope fixture cancellation and retain phase diagnostics
Problem
Rolling38 for #299 timed out in native tool-scope smoke at90 seconds, then its worker stayed alive until the35-minute job cap. No tag or Release was created and publication was skipped. The original pending RPC is unknown; seven isolated normal groups did not reproduce it. This is not evidence of a production observer regression or proof of a transient runner fault.
Controlled native MCP starvation reproduced the separate cleanup defect: node:test cancellation does not unwind pending awaits, so finally cleanup is delayed. SDK stop also relinquishes its process reference before waiting for SIGTERM; forceStop alone is insufficient then.
Change
Test-only NativeTestLifecycle retains owned clients and actual children captured in the startup async context, independently terminates them on deadline, closes synthetic HTTP resources, and waits for closure before fixture removal. Kill/cleanup failures are visible; directories are retained if child termination cannot be established. Normal successful cleanup disarms completion abort. Diagnostic labels exclude request bodies/configuration.
Adds synthetic lifecycle tests including SDK-detached SIGTERM-ignoring child, late spawn, teardown failure and opt-in real unresponsive MCP subprocess. Single-process nested test isolation prevents an extra orphan worker. No production Engine code, timeout increase, check bypass or change to tool access semantics.
Evidence
Final lifecycle suite11/11 including opt-in timeout regression; exact native defaults/tool-scope/chat-text group3/3; core/server test typechecks, changed-file ESLint and docs checks pass. Independent review findings were corrected; final independent review found no significant issues.
Delivery
Owner explicitly authorized this real test defect correction, normal protected merge and automatic Rolling publication. It is not a release-only PR or rerun of Rolling38. #299 remains in source; eventual external deployment must also include Assistant Rolling23 (both waksana/cockpit-assistant#43 and waksana/cockpit-assistant#45). No deployment, production role edits, unknown-notice replay or Milestone promotion here.
Closes #300
PR: #301
Source: 558b23e
Rolling sequence: 39
Build: https://github.com/waksana/cockpit/actions/runs/37269892868
runtime.tar.gz:sha256:ccda480c4c991f0bef5c290cdae768b9b9f0681a37820c93b7d0bdffb9c8a777runtime.tar.gz.sha256:sha256:761205a944ac483e3cb894f3976a5ac9e816304909c587bb187cb102b95eabe6cockpit-deployment.json:sha256:d9b6c400e00bc2af350ccf6760a7c7a4a887d1de85e45462b1cc775bf4824a7ccockpit-deployment.json.sha256:sha256:fa18930dc8fddc3229d7c91fa11dcea8b0ddacfbb50d1cffc86a200faa2c3392
Cockpit v0.0.0-rolling.37
Make caller-owned chat positions survive Host restarts
Outcome
Fixes #295. Follow-up correction to #296: ordinary Host process restarts no longer invalidate caller-owned text checkpoints or continuation positions. The agent decides when to advance; Assistant or another caller persists the position. No Host read table, per-caller state, signing key service, chat index, cache, or mirror is added.
Contract
- Keep
session/chat/textandcockpit_read_session_text, raw/Web APIs, and the independently published module SDK unchanged. - Emit versioned
ct2position descriptions, strictly validating shapes, query/session/source/direction binding, native cursor bounds, page fingerprints, indexes and UTF-16 offsets. Positions are coordinates, not authorization credentials; existing request access controls still apply. - Recover a genuinely expired native cursor or changed partial page explicitly from the original
since, within per-call budgets, reconciling duplicate/overlapping eventId/offset fragments. Never silently reset to recent-only history. Missing/changed anchors reject. - A legacy random signing key cannot be recovered: import v1 payloads only as caller-owned coordinates under identical native validation, without claiming signature authentication. Successful reads emit v2; retain the original since until that range completes.
- Document caller ownership, native mutation limitations, and the output/RPC versus upstream materialization boundary.
Evidence
- 266 combined core/raw/MCP/protocol/docs tests passed before the additional legacy-partial test; final dedicated text suite: 16 passed.
- Backend test typechecks and targeted ESLint passed; canonical documentation checks passed.
- Independent read-only reviews of portable-position logic and full-process fixture: no significant issues.
- Opt-in real SDK/HTTP fixture passed: Host PID 517237 exited normally before Host PID 517277 opened the same isolated persistence. Caller file preserved the checkpoint and partial Chinese/emoji cursor; the partial native cursor resumed, exact multi-page bodies reconstructed, original boundary read post-restart appends, passive unloaded state preserved, concurrent append reconciled, and real rewind rejected the removed checkpoint. Added to Required checks native CI.
- Native command:
COCKPIT_NATIVE_CHAT_TEXT=1 pnpm --filter @cockpit/server exec node --import tsx --test src/chat-text-native.test.ts(resource-bounded locally).
Normal protected merge and its automatic Rolling release only; no production deployment/restart, manual tag/version bump, milestone promotion, or independent SDK publication.
PR: #297
Source: af5bad8
Rolling sequence: 37
Build: https://github.com/waksana/cockpit/actions/runs/37030194536
runtime.tar.gz:sha256:f236ffcfec32926a12de70160bc7573cfca3f5723e28d3bddb1674761d503476runtime.tar.gz.sha256:sha256:34342a80559b575488b05ec4142de7ccb5ff159028698f6167c2b2cf52b417e1cockpit-deployment.json:sha256:398a0b96d2849a41d2c46e864cdb10b1c9a3cb6fd90d51a49346b09be29ff884cockpit-deployment.json.sha256:sha256:78d8e3e310653a725149850deb967007817b577b24be09762bcdea56d541da3b
Cockpit v0.0.0-rolling.36
Add bounded native chat text and passive incremental checkpoints
Summary
Closes #295.
- Add opt-in
session/chat/textand raw MCPcockpit_read_session_text; raw event readers, Web Chat and the independent module SDK remain unchanged. - Return primary user/assistant bodies only, bounded compact JSON UTF-8 bytes and explicit large-message fragments. Native reads are limited to 16 events/page and at most 16 pages; actual returned-event/page/RPC counters include replays.
- Authenticate query-bound continuation and version-check partial pages.
checkpoint/sinceprovide bounded backward incremental ranges for loaded or unloaded persisted sources without cursor conversion, private history indexes or auto-load. - Document newest-first versus forward ordering, safe attachment omissions, bootstrap overlap, native cursor/mutation errors, and the upstream large-event memory/time limitation. Host-process restart expires text tokens and requires explicit resynchronization; native-child restart remains supported.
Validation
All resource-sensitive commands ran with MemoryMax=3G, no swap and timeouts.
- Core text/native/engine chat regressions: 47 tests (12 dedicated text cases after review fix).
- MCP transcript and index suites: 127 passed.
- HTTP intents and capability discovery: 386 passed.
- Protocol suite: 160 passed.
- Web client/native-store regressions: 174 passed.
pnpm typecheck:test, Web typecheck, targeted ESLint and documentation link checks passed.- Isolated
COCKPIT_NATIVE_SMOKE=1runtime fixture: 15 tests passed, including exact large Chinese/emoji text reconstruction under 8192-byte output in live and unloaded persisted reads, and checkpoint continuation after native runtime restart. Synthetic loopback BYOK only; no production history or credentials. - Independent read-only review found a page-completion cursor-growth budget issue. Fixed by sizing against both fragment and actual page-end cursor, with a 6600-character body / 500-character cursor regression.
Delivery boundary
Normal protected merge triggers the automatic Rolling attempt. No manual tags, version bumps, SDK publication, milestone promotion or production deployment.
PR: #296
Source: 5d9191a
Rolling sequence: 36
Build: https://github.com/waksana/cockpit/actions/runs/37022452298
runtime.tar.gz:sha256:ebd157eb65b42c913323be6345b7469b06c9b5d515e3dcb9abca4eb6fb0a7fd1runtime.tar.gz.sha256:sha256:cf9fa0fa221f33cd690841d3f25fcf23eaca836f259eb470ec759ea755504fe7cockpit-deployment.json:sha256:624790adc4f7a69069c04c7f12b0cfaa7eddfcf33c5c8c897222c25ea69660f9cockpit-deployment.json.sha256:sha256:61835d853e2f35e8e34c4ae511cf37eec779bef62a1e515bc2be1e9f6c25583f
Cockpit v0.0.0-rolling.35
Wait for native idle before stopping modules
Summary
Fixes #293.
- Keep module observers, file capture and existing role tools alive while native work and protected Host calls settle.
- Revalidate native idleness under the Engine mutation gate before invoking module stopping/onStop/drain; keep native settlement reads available until drain completes.
- Only a pre-drain busy race may return to waiting. Post-drain busy/uncertain outcomes fail closed without forcing, replaying or cancelling work.
- Distinguish ordinary startup errors from confirmed native death, including a native death during successful module drain.
- Keep the public shutdown.v1 SDK contract and legacy cleanup semantics; update canonical lifecycle documentation.
Validation
- 280 targeted tests passed: shutdown controller, HTTP intent admission, module drain, middleware/real Engine composition and core lifecycle.
- Independently published cockpit-file v0.0.0-rolling.18 archive checksum verified; real ModuleHost/Files integration passed, including late file capture while shutdown waits.
pnpm --filter @cockpit/server... buildpassed.pnpm --filter @cockpit/core --filter @cockpit/server typecheck:testpassed.- ESLint for all changed TypeScript files and
git diff --checkpassed. - Two independent read-only review passes: first identified confirmed native death during drain; fixed with real Engine/Host integration regression. Final review found no significant issues.
- Initial missing runner/dependency-build and old-order regression failures were corrected before the final runs. Full Required checks remain the merge gate.
Delivery boundary
Normal protected merge and its automatic Rolling only. No production deployment/restart, data changes, SDK publication or Files reload feature.
PR: #294
Source: 85251aa
Rolling sequence: 35
Build: https://github.com/waksana/cockpit/actions/runs/36999916164
runtime.tar.gz:sha256:229ea305316d4ad90afac8748f4c4dd6f045a49586f313a5e6421f1662243085runtime.tar.gz.sha256:sha256:bd972a0b6216c7f96734db7c4f0626a4385980f90c000ba50c72bc0504b634eccockpit-deployment.json:sha256:63944fbb6911fef95598c70408fb9b7618c96dd163e53c2e5f2839b2bf6bfc1ecockpit-deployment.json.sha256:sha256:bd473e7ef033162dfd681dd97ef620dd76c7d2d029d52ee0904f15dc637d7ddb
Cockpit v0.0.0-rolling.34
Add transparent typed public interface middleware
Summary
Closes #291.
Add declarative, capability-gated backend middleware for the existing public module Host-call allowlist. All Web/API/MCP and module calls share the validated dispatcher; the original prompt implementation knows nothing about Files or connectors.
Wrappers compose by module ID, accept typed business-input patches and use single-use next. Target/operation identities, mode and trusted origin remain fixed. Host owns the validated native result, preserves receipts/queue semantics, rejects short circuits and recursive/late continuations, joins started downstream work, and never retries uncertain sends. SDK 0.17.0 is source preparation only, not publication.
Require onStop for middleware and reuse ModuleLifetime drain accounting. Shutdown and Stop fence delayed prompt preparation; already-started native work and subsequent persistence remain joined. Existing native admission and role-hook restrictions are retained. No production deployment, SDK tag/publish, file management or connector protocol changes.
Evidence
- Bounded isolated regression run: 259 middleware, intent, activation, shutdown, readiness, role-assignment and availability tests passed; final middleware-only rerun: 16 passed.
- Server typecheck and build passed; protocol suite: 159 passed.
- Standalone SDK pack/consumer matrix: 7 passed, including Node 22/current types and both TypeScript resolution modes; input identity/private-intent negative type cases included.
- Targeted lint, documentation/descriptor checks and exact-base SDK semver gate passed.
- Independent read-only review found one detached microtask continuation race. Fixed with deferred admission/closed-state check and regression tests; follow-up review reported no significant issues. Input snapshots are captured synchronously before deferred admission.
- Tests use synthetic modules and fake native runtime in isolated homes, bounded systemd scopes and timeouts; no real user sessions or production service touched.
Compatibility
Require interfaceMiddleware.v1 and shutdown.v1 on the actual Host. Backend API remains v1. Consumers must await separately authorized SDK registry publication before changing pinned dependencies. Normal main merge triggers automatic Host Rolling release only.
PR: #292
Source: f520eb5
Rolling sequence: 34
Build: https://github.com/waksana/cockpit/actions/runs/36976322092
runtime.tar.gz:sha256:dcb8df0f08ff6f80668628e2893532f3864a2d7e07df5ac4175ed3b9bdfa4b30runtime.tar.gz.sha256:sha256:101fedcb3341dec51c63cad66b13be59fcd35f2e1e5bb7c1f0e998836ebaf318cockpit-deployment.json:sha256:bd8cb9f44806e56211da124707869acf9ef70817054920a03f555f222137d003cockpit-deployment.json.sha256:sha256:7882b7759397f0adfe1c4dcf9bccda8085a3152e6eada7ce4571ed55e73adea3
Cockpit v0.0.0-rolling.33
feat: expose semantic session list item descriptions
Summary
- Expose the actual session row as
sessionListItem, preserving native button semantics and optional noninteractive description content. - Advertise
sessionListItemVersion: 1in Web v2/v3 andsessionListItem.v1in Rolling descriptors. - Prepare SDK 0.16.0 source and public docs; no independent SDK publication or deployment.
Closes #289. Paired consumer: waksana/cockpit-task#130.
Evidence
- 55 focused row/sidebar/runtime tests and 19 public-component/style tests passed.
- SDK build, 7 consumer tests, Web typecheck, changed-file ESLint/Stylelint, documentation checks and SDK version gate passed.
- Desktop and narrow Chat Lab description regressions passed.
- Real host + Task module source integration in isolated Chat Lab/Chrome passed at 1320px and 390px: bounded summary batching, no nested interactive controls, no empty Task row, fixed dialog target, menu dismissal, Escape/focus return, failure retry, module removal and target-session removal. Synthetic data only.
- Independent read-only review covered both complete diffs. No host findings; the Task-side query scaling finding was fixed in its own change.
Normal protected merge is authorized and triggers the existing automatic Rolling attempt. No deployment, restart or production migration is included.
PR: #290
Source: 171a4dc
Rolling sequence: 33
Build: https://github.com/waksana/cockpit/actions/runs/36966548559
runtime.tar.gz:sha256:e0f8ca55bf601efc110822c3fba8f8377492a75b2c8902a709f660571276ccbbruntime.tar.gz.sha256:sha256:35279c34ad80140ae02544e309628dd770a0d05b55c37a9d64564369b1a83028cockpit-deployment.json:sha256:832a12c00593109f5d351df85684f8f690d67eb0e67c997e604ea316b4fe59bfcockpit-deployment.json.sha256:sha256:38c8364bf7d325fe2b978adec4b5ce034ab0dbb76aad1edefbb89732b1a3bb7e
Cockpit v0.0.0-rolling.32
Add opt-in awaited module shutdown before native teardown
Result
Closes #287.
Add context.shutdownVersion: 1, context.stopping, and optional onStop(): void | Promise<void>, advertised as shutdown.v1. Opted-in modules stop ingress and drain started sends/persistence before native cleanup or final resource revocation. The host joins activation (including late results), onReady, handlers, role hooks and host calls. During drain only documented passive reads and respondAsk remain available. Legacy modules retain best-effort disposal and native-serving routes until transport close.
The user-selected deadline is 60 seconds. Rejection/timeout is sticky failed: preserve necessary resources and the process, no forced exit, retry or late-success teardown. A referenced MessageChannel covers shutdown before native/HTTP startup. Final opted-in disposal is also awaited and fail-closed.
Prepare independent SDK 0.15.0, including the previously unpublished role-availability contract. This PR does not itself publish the SDK: the separately authorized canonical tag/workflow and real registry consumer verification follow merge. No production deployment/restart or real WeChat traffic.
Evidence
- Independent read-only review found premature activation-timeout revocation and startup-failure natural exit; both fixed with regression coverage.
- Six real subprocess lifecycle cases use unreferenced IPC to avoid masking liveness; controller suite 36/36.
pnpm test: 3,510 passed, 16 existing opt-in skips, zero failures; includes test typechecks and SDK tarball consumer matrix. An initial full run exposed two stale synchronous-close assertions; direct test callers now await the new close contract.pnpm lint,pnpm build, final server build, and exact-base SDK change gate passed.- Synthetic fixtures only. Real packaged native/file integration opt-ins are not claimed by skipped local cases; required CI performs its canonical smoke/packaging checks.
Compatibility
Require actual Host shutdown.v1 plus context.shutdownVersion === 1; SDK installation alone does not establish capability. Canonical lifecycle, failure, legacy and settlement boundaries are in docs/module-contract.md. Host product versions remain 0.0.0-dev; merge triggers its independent automatic Rolling attempt.
PR: #288
Source: a4b4742
Rolling sequence: 32
Build: https://github.com/waksana/cockpit/actions/runs/36961622719
runtime.tar.gz:sha256:302c16aa7b234248c4c7b1799dbc14ecc63f9063e73cb530d44da9cae24e84efruntime.tar.gz.sha256:sha256:afebba97a8831b7a758cc59cd681b0256c61e3708314c892d759344e14bb8574cockpit-deployment.json:sha256:d573b8127f2dd686c8bda281d6516a66787277cf0698e892a984e883e8286dc8cockpit-deployment.json.sha256:sha256:d9ff4cc3ce1529dd9ecb8c5de4fe1eff982cee80d018f40480d507c7c75fcb51
Cockpit v0.0.0-rolling.31
Add role compatibility and selection-time availability checks
Summary
- Share deterministic declaration-based compatibility across preflight, creation, additions, persistence and cold assembly. Neutral service-binding roles can coexist with exclusive roles without adding model instructions or weakening isolation.
- Add roles/availability, module roleAssignments.availability, roleAvailabilityVersion: 1, deployment capability roleAvailability.v1 and a semantic MCP tool. Preserve all confirmed denials and unknown checks; sanitize module exceptions and retain existing serialized permit/save/notification semantics.
- Connect new-session and existing-session pickers with explicit refresh, accessible complete reasons, stale-response isolation and authoritative save checks. Prepare additive SDK source 0.14.0; this does not publish it.
Closes #285
Verification
- Independent read-only review completed. Fixed both findings: metadata failures retain already-known saved-role conflicts; MCP request-count/routing expectations cover the added query.
- 631 targeted Web interaction/transport/fixture tests; 41 core role tests; targeted server module/assignment/availability/intent tests; protocol suite and MCP routing suite passed.
- Actual SDK tarball consumer matrix passed (node --test scripts/module-sdk-pack.test.mjs).
- pnpm build, pnpm typecheck:test, pnpm lint passed. Documentation, SDK policy and Rolling descriptor regression tests passed.
- COCKPIT_NATIVE_TOOL_SCOPE=1 native smoke passed using isolated homes, synthetic provider and MCP. Exercises exclusive + neutral creation, cold load and reload while preserving tool/skill/MCP exclusion.
- Tests ran in bounded systemd user scopes (4G, no swap, timeouts).
Boundaries
No deployment, restart, production data, WeChat business logic or independent SDK publication. Existing module dispose is not awaited by Host shutdown; async drain is a separately reported follow-up, not silently claimed here. Normal merge automatically attempts the host Rolling release.
CI reading-anchor repair
The narrow Chat Lab baseline was sampled while native Home scrolling still had 14px remaining (confirmed in the failed CI trace), then compared against a correctly settled topic layout. Commit f11332f waits for the actual Home endpoint before recording the baseline; it retains native input, all assertions and the 2px threshold, with no sleep or production scrolling change. The focused correction received independent read-only review. Latest head f11332f passed both Required checks and Chat Lab smoke in CI run 36956240028. Full local pnpm test passed; focused browser/type results and one separately observed local startup timeout are recorded in the PR discussion.
PR: #286
Source: 627270a
Rolling sequence: 31
Build: https://github.com/waksana/cockpit/actions/runs/36956723827
runtime.tar.gz:sha256:455b9d1b9567a3fe442eb734a7e08e5dbfb98ce8a7a8282e1342742fc0b1e8ecruntime.tar.gz.sha256:sha256:6b10e21a68870b109b55aab6cb4ac65d83a10b798bf678f376a25bc23c0cb581cockpit-deployment.json:sha256:b03c82dfc9a87dd7a8e2128d11943c0bb4ee21c77e7bb40e3ea78b3c3ac4cedacockpit-deployment.json.sha256:sha256:70bc8e046cf9c8fff6cbb79e7fe74b68b677a5f343d4eea86d7f58dc8853982c