Repository navigation
merge: upstream 4401b0e (#431 cap images, #436 lightweight context mode) - #112
Open
tournierjc wants to merge 39 commits into
Open
tournierjc wants to merge 39 commits into
tournierjc wants to merge 39 commits into
Conversation
Co-authored-by: minimax <adhere@minimaxi.com>
Preserve public privacy defaults and distribution boundaries while porting compaction, Bash timeout, memory output and update-proxy improvements. Record selective provenance without advancing the full source baseline. Assisted-by: codex-cli reason:public-source-sync-0.5.5
…-AI#360) * docs: publish feedback and private security contact channels * docs: correct MiniMax Agent X contact link
…-AI#375) Include context window and effort controls in the first-run catalog while preserving existing managed snapshots. Docs-Impact: Existing model selection workflow is unchanged. Assisted-by: codex-cli reason:m31-flash-fallback-sync
* chore: bump version to 0.5.7 * test: drain stderr before nonzero Bash fixture exit
…x-AI#381) Port the reviewed shared runtime behavior while retaining standalone composition. Keep conversation leave separate from explicit stop, suppress canceled task delivery, and track append activations through teardown. Assisted-by: codex-cli reason:selective-runtime-port Docs-Impact: document stop and session-leave behavior in docs/tui-capabilities.md Co-authored-by: chenhao <chenhao@minimaxi.com>
…niMax-AI#385) * feat(examples): add reproducible Pocket Pet demo and refresh onboarding * feat(examples): polish Pocket Pet interaction and demo
…x-AI#389) * fix(tui): preserve native scrollback during projection updates * fix(tui): isolate transient overlays from native scrollback
…I#390) * fix(tui): prevent idle transcript replay and diff overlay frames * fix(tui): retain prompt identity and deferred main-buffer geometry
…budget (MiniMax-AI#397) * test(sandbox): pin the probe PATH instead of inheriting the ambient one The real sandbox-exec probes resolve their command through PATH, so inheriting the caller's let any wrapper ahead of /bin decide what `rm` means. On a machine that has run the agent, that is the recoverable-delete shim MCode installs into agent shells: `rm` resolves to the shim, the shim execs mavis-trash, the sandbox denies that trash move as a write outside the policy under test, and a correct allow-probe exits 1. The suite then reports a sandbox regression where the sandbox behaved correctly. Pin all three probe environments to the system binaries the probes actually use, matching the wrapper-argument test above them. This also drops the unguarded `process.env.PATH` in wrapProfile, which had no fallback and could hand a real sandbox spawn an undefined PATH. Fixes MiniMax-AI#394. * test(byok): scale the serial BYOK budget by platform The first case is 30+ serial CLI spawns, each booting the whole runtime, so its wall-clock cost tracks machine speed rather than the transport it asserts. The flat 90s budget only held with roughly 1.5x headroom on an idle machine, so a parallel build, a laptop under load, or a shared CI runner turned a passing transport into a `testTimeoutFailure` that named a product failure no assertion had actually observed. Budget it the way smoke.test.mjs already budgets runtime startup: a base allowance plus a Windows multiplier for slower process spawn. The test is not slowed down by a larger ceiling; it only stops failing for reasons unrelated to what it checks. Fixes MiniMax-AI#395.
TUI - Report active root-session background tasks as `background=N` in the `[V]` build-mode status line. Bash still owned by its foreground tool call is excluded, and the count holds at 1 after a turn settles until a fresh task list arrives. The documented minimum width is now 102 columns. Runtime - The MiniMax API-key route now shares the official model catalog with the managed route; the first-run catalog moves to `minimax-model-catalog.ts` with unchanged model definitions. - Apply byte limits to large media and accumulated history for BYOK requests. - Send the M3 thinking toggle as a thinking setting rather than a generic reasoning effort. - Allow edit and rewind after an interrupt that left only a background reminder in canonical history. - Read less data when listing session files and navigating long histories. - Measure token output rate from the time events are observed. - Add `worktreeRefreshBeforeCreate` (default on) to fetch the selected upstream before creating a worktree, and exclude nested roots from fork worktree fingerprints. - Add Ghostty to the external editor catalog. - Enable the Codex OAuth model settings entry by default. Prompts - Cron guidance now lives only in tool definitions; the legacy feature template is empty. Memory edits use the `memory` tool's `edit` operation. - Clarify multimodal tool discovery in the mcode-tools reminder.
…seline (MiniMax-AI#396) * Revert "fix(tui): stabilize native history and diff overlay frames (MiniMax-AI#390)" This reverts commit 1e136bf. * Revert "fix(tui): preserve native scrollback during automatic updates (MiniMax-AI#389)" This reverts commit 9b9c07b.
* fix: include hidden thinking in TPS timing * docs: note thinking_start in first token timing comment * test(windows): allow the NTFS source check to exceed the default timeout --------- Co-authored-by: hetaoBackend <hetao7@pku.edu.cn>
* fix: omit empty tools on OpenAI compaction requests * fix: negotiate missing tools with bounded compatibility recovery * fix: simplify empty tools handling to omit absent definitions
…AI#416) Regular mode wrote rows into native scrollback as soon as they scrolled off screen. When such a row later changed (a parallel tool finishing, a streamed table widening, a list turning loose, a turn growing past the projection fold, the welcome status badge flipping, or a stopped prompt gaining its cancelled marker), the renderer cleared scrollback and replayed the whole session from the welcome logo. Only final rows now reach native history: - The transcript reports how many leading rows later updates cannot change, including the committed blocks of a streaming Markdown reply. - The chat layout keeps rows that may still change within one screen above the footer, showing their latest rows under a one-line notice when they do not fit. - The regular-mode projection only appends; established turns are not re-folded or dropped. - The welcome banner above a conversation is static; account notices that need action appear above the Composer. - Stopping a run no longer marks its delivered prompt as cancelled; the marker stays reserved for prompts returned to the Composer. To keep long sessions responsive, the transcript drops final rows far above the screen and the engine rebases its retained state (takeDiscardedRows) instead of rewriting history.
Port the reviewed 0.6.0 runtime and TUI behavior into the standalone distribution and bump the release version to 0.6.0. - Allow /retry inside a /btw side conversation to resend its last message. - Default to MiniMax-M3.1-Flash-Preview when no model has been selected. - After an accepted Goal completion, keep the Turn open for one final reply that summarizes the result and deliverables; blocked proposals still end the Turn. - Do not retry provider safety refusals, including on BYOK, and classify them as content_filter; keep Anthropic refusal details in the error. - Retry TLS record verification failures before output like other transient network errors. - Keep a post-compaction reminder at the tail of a continuation instead of aborting the provider call and recompacting on every retry.
Allow /doctor and /feedback in a /btw side conversation so a failed side response can be diagnosed or reported without leaving it. Neither command mutates the parent or side Session. /quit stays blocked in the side view, because leaving from there aborts only the side Turn and skips side Session cleanup. Bump the root and TUI source versions to 0.6.1.
…x-AI#423) In a /btw side conversation, an empty Escape no longer arms the double-Escape /edit shortcut or shows its "Press Esc again to edit" hint, since /edit is unavailable in side conversations. Escape still interrupts a live side response. Switching between the side and main views re-adopted the main Session's live Turn at the switch time, which reset the Running/Loading timer and shortened the settled Turn duration. A Turn start ledger now records the earliest observed start (submission, session.start events including hidden Sessions, and adoption), and both re-adoption and the activity line use it. Bump the root and TUI source versions to 0.6.2.
…y with 6 updates (MiniMax-AI#363) Bumps the tooling-minor-patch group with 6 updates in the / directory: | Package | From | To | | --- | --- | --- | | [prettier](https://github.com/prettier/prettier) | `3.9.6` | `3.9.9` | | [tsx](https://github.com/privatenumber/tsx) | `4.23.13` | `4.23.15` | | [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) | `5.5.5` | `5.5.6` | | [dependency-cruiser](https://github.com/sverweij/dependency-cruiser) | `18.3.1` | `18.4.0` | | [jscpd](https://github.com/kucherenko/jscpd/tree/HEAD/rust/jscpd) | `5.2.1` | `5.3.3` | | [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) | `6.35.1` | `6.38.0` | Updates `prettier` from 3.9.6 to 3.9.9 - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](prettier/prettier@3.9.6...3.9.9) Updates `tsx` from 4.23.13 to 4.23.15 - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs) - [Commits](privatenumber/tsx@v4.23.13...v4.23.15) Updates `eslint-plugin-prettier` from 5.5.5 to 5.5.6 - [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases) - [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/main/CHANGELOG.md) - [Commits](prettier/eslint-plugin-prettier@v5.5.5...v5.5.6) Updates `dependency-cruiser` from 18.3.1 to 18.4.0 - [Release notes](https://github.com/sverweij/dependency-cruiser/releases) - [Changelog](https://github.com/sverweij/dependency-cruiser/blob/main/CHANGELOG.md) - [Commits](sverweij/dependency-cruiser@v18.3.1...v18.4.0) Updates `jscpd` from 5.2.1 to 5.3.3 - [Release notes](https://github.com/kucherenko/jscpd/releases) - [Commits](https://github.com/kucherenko/jscpd/commits/v5.3.3/rust/jscpd) Updates `knip` from 6.35.1 to 6.38.0 - [Release notes](https://github.com/webpro-nl/knip/releases) - [Commits](https://github.com/webpro-nl/knip/commits/knip@6.38.0/packages/knip) --- updated-dependencies: - dependency-name: dependency-cruiser dependency-version: 18.4.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: tooling-minor-patch - dependency-name: eslint-plugin-prettier dependency-version: 5.5.6 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: tooling-minor-patch - dependency-name: jscpd dependency-version: 5.3.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: tooling-minor-patch - dependency-name: knip dependency-version: 6.37.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: tooling-minor-patch - dependency-name: prettier dependency-version: 3.9.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: tooling-minor-patch - dependency-name: tsx dependency-version: 4.23.15 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: tooling-minor-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…timeouts (MiniMax-AI#428) * fix: bound hung model requests so the retry path runs (MiniMax-AI#425) A provider that accepts a request but never sends a response held the turn for the transport default (undici headers timeout, ~300 s) before the existing retry path ran. During that window the TUI showed Loading, queued follow-ups, and /retry and /goal clear appeared to do nothing. - agent-core: wrap every physical model request (each withLLMRetry attempt, agent and compaction scopes) in a stream watchdog. No first event within 120 s, or no event for 300 s after the first, aborts the attempt and ends the stream with a retryable "LLM request timed out" error (stopReason "error", not "aborted"), so BYOK and managed providers retry it. Caller aborts pass through unchanged. Bounds are configurable via LLMModelConfig.firstEventTimeoutMs / streamIdleTimeoutMs or MCODE_LLM_FIRST_EVENT_TIMEOUT_MS / MCODE_LLM_STREAM_IDLE_TIMEOUT_MS (0 disables). - tui: /retry during a live run now says "Stop the running turn before using /retry." instead of "There is no failed response to retry"; /goal clear and /goal pause during a live run say the current response keeps running and that Esc interrupts it. - Tests: never-responding fake provider and real HTTP server that accepts but never answers; the attempt fails within the bound, retries and recovers, a fully hung turn fails and the next turn on the same runner completes. Document the bounds in docs/tui-capabilities.md. * fix: keep prior first-response wait and stop reading abandoned streams (MiniMax-AI#425) Review follow-up for the model request timeouts: - Default the first-event bound to 300 s, matching undici's headers timeout that was the effective previous wait, so no request that used to succeed now times out. The idle bound stays at 300 s. - Timeout errors name the setting that fired (MCODE_LLM_FIRST_EVENT_TIMEOUT_MS or MCODE_LLM_STREAM_IDLE_TIMEOUT_MS, or the host's per-model firstEventTimeoutMs/streamIdleTimeoutMs). - When a bound fires, the wrapper stops waiting on the inner stream even if the provider ignores the abort: the pending read races a stop signal, and the inner iterator is released without being awaited. Refs MiniMax-AI#425 --------- Co-authored-by: Tao He <hetaoBackend@users.noreply.github.com>
…#429) * fix(tui): keep scrolled-up readers in place on output-driven redraws (MiniMax-AI#426) The regular-mode history reconstruction (L034) clears scrollback with ED 3 and replays the document. xterm.js keeps its scrolled state while the scrollback is rebuilt, so a reader who had scrolled up was moved to line 0 whenever a resize settled (for example a fit addon reacting to a layout change) or a transient layout shrank while a reply streamed. Output-driven reconstructions now wait for the next user input, when terminals scroll back to the bottom: - TuiBase reports key and paste input through a protected onUserInput() hook; focus, size, mode and kitty-flag reports and key releases do not count. - A settled resize replays history only if input arrived after the resize notification; otherwise it finishes as an in-place viewport redraw and the replay is deferred. - A shrink in an unknown or changed layout pads like L038 unless input arrived within the last second (input-driven closes still restore rows immediately), and the replay is deferred. - The next input after the deferral, or stop(), runs the deferred replay, so native history ends up exact and unique as before. Changed historical text and size changes without a resize notification still reconstruct immediately. Recorded as L047 in LOCAL_CHANGES. * fix(tui): limit scroll preservation to output-driven layout shrink (MiniMax-AI#426) Review follow-up: - Resize again replays history as soon as it settles, as on main. The resize deferral is split out until the reporter's fit/resize behaviour is known; only the output-driven layout-shrink deferral remains (pad with blank rows, reconstruct on the next user input, immediately within one second of input). - User input detection splits each chunk into control sequences instead of matching the whole chunk. Cursor position reports, OSC/DCS/APC strings and SGR mouse reports join focus, window, device and mode reports and key releases as non-input, and a key or paste that shares a chunk with reports still counts. - Tests cover a tailing reader when output ends and the task list collapses, recent input reconstructing immediately, resize keeping its replay, each report kind, report-only and mixed chunks, and the replay before stop. L047 is updated accordingly. Refs MiniMax-AI#426 --------- Co-authored-by: Tao He <hetaoBackend@users.noreply.github.com>
… provider image limit (MiniMax-AI#431) * fix(images): cap images per request and recover sessions over the provider limit Inline images stay in persisted history and every request re-sends the whole provider-visible history, so a long session eventually exceeded the provider's per-request image limit ("Too many images in request: 31 > 30"). Every later request, /retry, /compact and a restarted session then failed the same way, each after the full BYOK retry window, behind a generic "temporarily unavailable / Run /retry" message. - Request-time image ceiling: projectAgentMessagesForModel keeps the newest N images across user messages and tool results and replaces older ones with a short placeholder naming the original file. Stored history is never rewritten. N comes from capabilities.max_images_per_request (default 20; api.mistral.ai defaults to its documented 8). Agent turns, checkpoint requests and footprint estimates share the projection. - Deterministic rejections are terminal: an image-count rejection, or an HTTP 400 invalid_request_error, is no longer retried by the BYOK retry-all path (timeouts, network, 408/429/5xx stay retryable). The TUI shows the upstream reason and suggests /compact or /new instead of /retry. - Compaction fallback: when the checkpoint Provider rejects a candidate for too many images, compaction retries the same history with media replaced by text (Hvideo) and continues down the attachment-free ladder. Refs MiniMax-AI#425 * fix(images): parse attachment reminder paths with a linear scan CodeQL flagged the attribute regular expression as polynomial on user-controlled message text (js/polynomial-redos). Parse the attachment tags with indexOf instead and cover escaped paths and adversarial input. Refs MiniMax-AI#425 --------- Co-authored-by: Tao He <hetaoBackend@users.noreply.github.com>
… provider image limit (MiniMax-AI#431) * fix(images): cap images per request and recover sessions over the provider limit Inline images stay in persisted history and every request re-sends the whole provider-visible history, so a long session eventually exceeded the provider's per-request image limit ("Too many images in request: 31 > 30"). Every later request, /retry, /compact and a restarted session then failed the same way, each after the full BYOK retry window, behind a generic "temporarily unavailable / Run /retry" message. - Request-time image ceiling: projectAgentMessagesForModel keeps the newest N images across user messages and tool results and replaces older ones with a short placeholder naming the original file. Stored history is never rewritten. N comes from capabilities.max_images_per_request (default 20; api.mistral.ai defaults to its documented 8). Agent turns, checkpoint requests and footprint estimates share the projection. - Deterministic rejections are terminal: an image-count rejection, or an HTTP 400 invalid_request_error, is no longer retried by the BYOK retry-all path (timeouts, network, 408/429/5xx stay retryable). The TUI shows the upstream reason and suggests /compact or /new instead of /retry. - Compaction fallback: when the checkpoint Provider rejects a candidate for too many images, compaction retries the same history with media replaced by text (Hvideo) and continues down the attachment-free ladder. Refs MiniMax-AI#425 * fix(images): parse attachment reminder paths with a linear scan CodeQL flagged the attribute regular expression as polynomial on user-controlled message text (js/polynomial-redos). Parse the attachment tags with indexOf instead and cover escaped paths and adversarial input. Refs MiniMax-AI#425 --------- Co-authored-by: Tao He <hetaoBackend@users.noreply.github.com> (cherry picked from commit 1852771)
* feat: add opt-in lightweight context mode Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> * docs: clarify lightweight context boundary Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> * fix: harden lightweight session behavior Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> * fix: type lightweight turn guard and localize indicator Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> * fix: import lightweight turn callback contract Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> * fix: stop lightweight turns after unoffered tool calls Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> * test: snapshot standard footer and forward tool guard Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> * fix: forward lightweight stop policy to agent loop Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> * fix: normalize unexpected lightweight tool calls Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> * test: require clear lightweight tool fallback Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> * test: cover resumed mode indicator in TUI Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> * test: hydrate resumed session purpose in TUI Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> * fix: preserve failed unexpected tool responses Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>
…iMax-AI#431 image cap) into fork sync branch
…release gates) over upstream version
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Sync upstream
4401b0e(tip 2026-10-06)Fetched
MiniMax-AI/minimax-codemain. Tip4401b0edb0e6ad753d3952b75a31ec87807b6aab. La PR rolling #112 est passée de1852771à4401b0e(merge complet, pas cherry-pick : l'historique upstream est absorbé via un merge commit699e937, adapté au squash-history du fork).Commits pris (delta depuis la sync #111
1b054eb)1852771fix(agent-core): cap images per request and recover sessions over the provider image limit (fix(agent-core): cap images per request and recover sessions over the provider image limit MiniMax-AI/minimax-code#431) — 23 fichiers, +13744401b0eAdd opt-in lightweight context mode (Add opt-in lightweight context mode MiniMax-AI/minimax-code#436) — 32 fichiers, +873Commits bloqués / skippés
Aucun. Écran télémétrie : zéro endpoint outbound dans le delta. Refs externes ajoutées = fixtures (
example.invalid,draft.example,gateway.example,127.0.0.1) + hostname-onlyapi.mistral.aidans la table de limites connues (request-image-limit.ts), aucun appel.Garde-fous
business-telemetry-privacy,metrics-telemetry-privacy,error-reporting-privacy,incident-reporter-privacy,daily-checkin-*,update-serviceNE SONT PAS réintroduites danstest/vitest-suites.json;packages/tui/src/update/service.tset son test restent supprimés (fork = default-deny egress).docs/telemetry.mdabsent.packages/tui/src/analytics/absent. Egress guard intact (check:egressOK,installTuiEgressGuarddanssrc/index.ts).TuiDailyCheckin*revenus via Add opt-in lightweight context mode MiniMax-AI/minimax-code#436 dansruntime/lifecycle.tsetruntime/adapter.tsont été retirés (modulecheckin/supprimé par le fork).kinetick-code 0.6.9préservée (package.json + packages/tui@mavis/code) ; les exemples README de Add opt-in lightweight context mode MiniMax-AI/minimax-code#436 (mcode --mode …) adaptés enkcode --mode ….1852771était cherry-pické (b8bfb4c) ; le merge amène le contenu identique (blobrequest-image-limit.tsvérifié égal), le cherry-pick précédent est absorbé proprement.Conflits et résolutions (38 fichiers)
main==tipou auto-merge simple ;README.md/docs 3-waygit merge-file(base = tip précédent56221c1) sans perte fork.packages/tui/src/cli/contract.ts: union manuelleparseServerPort(fork) +parseContextMode(Add opt-in lightweight context mode MiniMax-AI/minimax-code#436).runtime/lifecycle.ts+runtime/adapter.ts:createKcodeSharedAuthSession(fork) +McodeContextMode(Add opt-in lightweight context mode MiniMax-AI/minimax-code#436) ; imports checkin supprimés.LOCAL_CHANGES.json: manifeste reconstruit programmatiquement — union des changeIds/reason/behaviorImpact,currentSha256recalculés sur l'arbre mergé (26 entrées,tui-engine-local-deltasOK).test/vitest-suites.json: union fork+upstream, moins les 7 suites télémétrie/checkin/update-service amont ; toutes les entrées pointent sur des fichiers existants.release/public-source.json: régénéré (node scripts/source-inventory.mjs --write, 4367 fichiers,check:sourceOK).test/source-sync.test.mjs: version FORK MAIN conservée (la version tip attendbin.mcode+ infra pré-fork → 5 échecs locaux, pattern connu PR merge: upstream 5f3240b (scrollback natif, erreurs terminal, volume Windows, cascade stop) #96).update/service.ts+update-service.test.ts: suppression fork conservée (UD → delete).Vérifications locales (branche
581cc7c)typecheck: RC=0 (un marker de conflit résiduel danslifecycle.tsa été détecté par le typecheck et corrigé — commit amendé).build: RC=0 (6409 fichiers).--config vitest.oss.config.mjs: theme+tui-app 429/429 ; 22 suites fork-critical 852/852 (tabs, session-cost, provider-manager, command/feature-flow, egress-guard, request-image-limit, literal-text, stale-run, compact-context, checkpoint-provider, executor, agent-loop, headless, status-line…) ; catalog+resolver+llm-retry 155/155 ; transcript+onboarding 112/112 ; acp+headless 152/152.node --test test/smoke.test.mjs: 20 pass / 0 fail.test:byok: 5 pass / 0 fail.source-sync(fork) : 56 pass / 0 fail.windows-contract: MODULE_NOT_FOUNDwsl-path.js— préexistant sur origin/main (comparé dans un worktree main, même échec), hors scope.check:egressOK,check:sourceOK, identitékinetick-code 0.6.9OK, arbre sansnode_modulesni markers.