Flat, reverse-chronological log for cross-AI collaboration (Claude / Codex / Gemini / etc.).
Format: ## YYYY-MM-DD — author — headline followed by bullets.
Separate from docs/release.md (release-focused) and docs/archive/session-memory-*.md (single handoff snapshot).
- Added complete Simplified Chinese and Japanese v0.6.31 release notes, connected all three language editions, and changed each root README to lead readers to the release notes in its own language.
- Reconciled the current-release references in
docs/release.mdanddocs/roadmap.mdso the English, Simplified Chinese, and Japanese evidence surfaces are discoverable from the canonical release and open-work documents. - Preserved the release boundary: the immutable
v0.6.31tag still points at the published release commit; these post-publication documentation translations live onmainand are linked from the GitHub release body.
- Published and registry-verified
@bbingz/polycli@0.6.31(latest, registry time2026-07-15T14:37:53.706Z, shasum57d0f77811767c4310623af03f27af82375abae8),@bbingz/polycli-utils@1.0.5(2026-07-15T14:37:22.557Z,99df508a6bffe601e79569927bedf4016d3d471f), and@bbingz/polycli-opencode@0.6.31(2026-07-15T14:38:07.324Z,65c990f89df099bb0a1a95104a0a8400abb0f6ca).@bbingz/polycli-timing@1.0.2was unchanged and not republished. - Created lightweight tag
v0.6.31ata70eb093bc7892e2f6b653ed29ca8bba5d66489band published https://github.com/bbingz/polycli/releases/tag/v0.6.31 (publishedAt2026-07-15T14:39:17Z; non-draft, non-prerelease). - Pre-publication
npm run release:checkpassed (906/906 tests plus strict fixture freshness, source-derived bundle/manifest/host/Codex/review-drift/Claude-plugin checks and npm dry-runs); PR CI run29421881033and main CI run29422037687passed. Clean registry installation exercised terminal offlineagent-context --json(schema 1, build0.6.31, 20 commands, utils1.0.5) and imported the OpenCodePolycliPluginpackage. Native Windows execution remains unverified and is disclosed in the release notes.
- Closed all 14 confirmed findings from the v0.6.30 comprehensive review: truthful no-diff/background JSON v2 results, strict provider target disambiguation, accurate TUI effects, active-job visibility, ledger preview redaction, safe prompt transport, structured session identity, and canonical typed failures.
- Hardened provider process lifecycle with bounded stdout/stderr capture, POSIX process-group termination and escalation, simulated deadline-aware Windows
taskkillcoverage, and exactly-once settlement even whencloseis missing or termination fails. Native Windows execution was not available; streaming paths retain a direct-child fallback there. - Made background cancellation and SessionEnd recoverable: cancellation intent remains active until a verified stop, start failures use a private recovery sidecar, terminal ledger/state publication is ordered, and worker/cancel races cannot publish late provider material.
- Added a source-derived, read-only generated-artifact freshness gate that runs before any in-place bundle rebuild in CI and
release:check; rebuilt all five companion bundles from current source. - Prepared host/OpenCode/terminal
0.6.31and@bbingz/polycli-utils1.0.5;@bbingz/polycli-timingremains1.0.2and@bbingz/polycli-runtimeremains private.
- Published and registry-verified
@bbingz/polycli@0.6.30(latest, registry time2026-07-15T08:55:13.583Z, shasum882e134363d70545c15e060a8da6c1274a2aa1e7),@bbingz/polycli-utils@1.0.4(2026-07-15T08:51:16.560Z,f89c94947199f4d9d61ec6eddca889bb83a95ec4), and@bbingz/polycli-opencode@0.6.30(2026-07-15T08:55:44.359Z,9f71767156d2278f3f9bbe0cadc3fd1c90ae289f).@bbingz/polycli-timing@1.0.2was unchanged and not republished. - Created annotated tag
v0.6.30atc7e6a278542e9761f55c964ef15236417ed81a25and published https://github.com/bbingz/polycli/releases/tag/v0.6.30 (publishedAt2026-07-15T09:02:11Z; non-draft, non-prerelease). - Pre-publication
npm run release:checkpassed (771/771 tests plus strict fixture freshness, bundle/manifest/host/Codex/review-drift/Claude-plugin checks and npm dry-runs); tag-target CI run29402849982passed; post-publication registry hashes matched dry-run artifacts, and clean registry installs exercised terminalagent-contextplus the OpenCodePolycliPlugin. Seedocs/release-notes-v0.6.30.md.
- Added one declarative command registry as the source for strict parsing, generated help, host-map validation, terminal metadata, typed errors/output schemas, and the offline
agent-context --jsondiscovery contract. Unknown option-looking tokens on registered commands now fail with bounded suggestions; pass--before prompt text that intentionally begins with an option-like token. - Split host, provider, invocation, and attempt identities in state and ledger records; made foreground/background/health terminal pairs recoverable and attempt-correct; decoder overflow now terminates the provider process tree before settling once.
- Added opt-in
--json-v2, explicit--job id:...|prefix:...|latest*selectors with typed waits, and the redacted cursor-baseddebug tailsurface. Existing--jsonpayloads and compatible positional job references remain unchanged. - Prepared host/OpenCode/terminal
0.6.30and@bbingz/polycli-utils1.0.4; publication evidence is recorded in the subsequent release closeout.
- Published and registry-verified all four public packages as
latest:@bbingz/polycli@0.6.29(registry time2026-07-15T02:09:46.979Z, shasumc63a5135d77417da46e0b16ef9592d4e74ca5e5b),@bbingz/polycli-utils@1.0.3(2026-07-15T02:10:38.964Z,94791ca68cb00f1740f5af540da0f8e29541cb5c),@bbingz/polycli-timing@1.0.2(2026-07-15T02:10:59.440Z,bd305c872ecd50e0abef6b6bd4abefcc1240e15a), and@bbingz/polycli-opencode@0.6.29(2026-07-15T02:11:18.658Z,cdf927ecc557602800e18b5feb5f0d3d2e88c0bb). - Created annotated tag
v0.6.29at8f9603480c036b910bc9942195a897037006a6f8and published https://github.com/bbingz/polycli/releases/tag/v0.6.29 (publishedAt2026-07-15T02:12:20Z). - Pre-publication
npm run release:checkpassed (618/618 tests, strict fixture freshness, bundle/manifest/host/Codex/review-drift/Claude-plugin checks, and all npm dry-runs); post-publication registry tarball hashes matched those dry-runs. Seedocs/release-notes-v0.6.29.md.
- Prepared the full current release batch: durable background-job terminal transactions and session-artifact handling, status-only default setup auth probes, current provider invocation/parser contracts, and review-safety drift checks. The release keeps the runtime flat and
@bbingz/polycli-runtimeprivate. - Refreshed parser fixtures from authorized local CLI captures, pinned Claude at
2.1.210, added OpenCode2 preview fixture coverage, marked the Gemini individual sign-in capture routeretired, and marked the temporarily unavailable Copilot subscription capture routearchivedwithout removing its runtime provider or host plugin. - Bumped host/OpenCode/terminal packages to
0.6.29,@bbingz/polycli-utilsto1.0.3, and@bbingz/polycli-timingto1.0.2; the release gate and registry verification are recorded in the subsequent published closeout.
- Published v0.6.28 to npm:
@bbingz/polycli@0.6.28(shasum6ab1bc8e4f8f241ac529058ef325c41f80983e6f) and@bbingz/polycli-opencode@0.6.28(shasum0cb4db0ee36d9463122533bf1906ceea954222df), bothlatest. GitHub releasev0.6.28(publishedAt2026-06-26T15:21:35Z) + tagv0.6.28. Utility packages unchanged. - Closed PR #15 after review and release-prep: main CI green on
5f2cdde8cae50bd02cc6c25eac0c77f858a93d2a;npm run release:checkrerun on mergedmainpassed (npm test559/559, bundle/fixture/manifest/host-map/Codex adapter/review-drift/Claude plugin validation, npm publish dry-runs).@bbingz/polycli@0.6.28was published by the maintainer during npm 2FA handoff; Codex published the missing@bbingz/polycli-opencode@0.6.28, created the GitHub release, and updated release docs.
2026-06-26 — Claude — provider-state review: live re-verify all 11 CLIs + drift fixes (PR #15, v0.6.28 release candidate)
- Ran a
provider-state-reviewWorkflow (11 read-only probe agents → per-provider adversarial verify → synthesis, 23 agents) to re-check every provider CLI's live install + upstream + adapter contract on top ofv0.6.27. Headline: no version gaps, no breaking CLI drift — all 11 locals == upstream where comparable (claude 2.1.193 / gemini 0.49.0 / qwen 0.19.2 / copilot 1.0.65 / opencode 1.17.11 / pi 0.80.2 / cmd 0.40.8 / mmx 1.0.16 / kimi-code 0.19.1 / grok 0.2.64 / agy 1.0.12); every flag/auth/argv assumption verified intact against live--help. - (code) copilot resume contract —
buildCopilotInvocationnow emits--session-id <id>instead of--resume <id>for resume-by-exact-id. copilot 1.0.65's-r, --resume[=value]takes an OPTIONAL=-attached value (or opens the session picker), so the prior space-separated form would not resume by id;--session-id <id>is the documented by-id flag. Reachable viaask/rescue --provider copilot --resume <id>(the companion setsresumeSessionId). Regression updated incopilot.test.js; all 5 companion bundles regenerated. - (code) minimax finish-reason —
extractMiniMaxResponseFromMmxJsonnow honours Anthropic-stylestop_reasonin thefinishReasonfallback (mmx speaks both the OpenAIfinish_reasonand Anthropic Messagesstop_reasonshapes, and the parser already handles Anthropiccontent[]blocks). Pure additive, zero regression;minimax.test.jsnow assertsfinishReasonfrom the existingstop_reasonfixture. - (docs/comments) kimi version-label refresh —
kimi-code v0.6.0→kimi-code 0.19.1indocs/provider-paths.md+docs/polycli-v1-public-surface.md; dropped the re-driftingv0.6.0pin from behavioural code comments (kimi.js,review.mjs,prompt-runtime.mjs) since the behaviour is version-general. Bumped theprovider-paths.mdsnapshot to 2026-06-26 and replaced the stalev0.6.21clause in theroadmap.mdCurrent-state section with the 2026-06-26 re-verification note. (Project memoryreference_cli_provider_versions.mdrewritten to the 11-provider reality: pi@mariozechner→@earendil-works; kimi spawns kimi-code not the shadowed PyPIkimi-cli; minimax=mmx-clinotmini-agent; self-updating kimi/grok/agy have no read-only latest channel.) - Deferred / FLAGGED (not changed) per minimum-diff + the AGENTS.md "flag pre-existing dead code, don't delete" rule:
pi.jsdeadagent_end.result.text/resultEvent.errorbranches (liveagent_endcarries onlymessages[]/willRetry, verified vs pi-agent-core.d.ts; harmless); theopencode.jsbilledrun "ping"auth probe could use non-billingopencode auth listbut auth-list proves CONFIGURED-not-WORKING, so folding it in would weaken status honesty / risk the four-state; and the JSON/stream-json event schema for ~7 providers stays unverified (read-only/cost constraint — needs an execution-allowed run or fixture recapture; gemini/grok fixture meta versions also lag, already tracked bycheck:fixture-freshness). - Validation:
npm test559/559,npm run release:checkexit 0. Respects the Path B boundary (no shared runtime base, no parser promoted into polycli-utils, timing four-state untouched, cold/retry still unimplemented).
- Published v0.6.27 to npm:
@bbingz/polycli@0.6.27(shasum397b2349bd3c952c2b612c7f762a9db48e09cb09) and@bbingz/polycli-opencode@0.6.27(shasume38d544a851ad67302aa50b7f75d028b80cb6100), bothlatest. GitHub releasev0.6.27(publishedAt2026-06-19T09:29:35Z) + tagv0.6.27. Utility packages unchanged. - Cleared the remaining v0.6.26-review residuals via PR #13 (Node 20 CI green, rebase-merged): fixed a background-job disk leak (
saveStatenow reclaims the result/config/log artifacts of terminal jobs pruned pastMAX_JOBS, wiring the previously-deadremoveJobFile+ a newremoveJobLogFile); enforced thedocs/capture-fixtures.mdpath/meta contract invalidate-fixture-metadata.mjs(provider==dir, name==stem); added OpenCode exit-2 execution-path coverage (runCompanionexported with an injectable spawn); and synced thedocs/roadmap.mdCurrent-state section that still said the latest release was v0.6.24. A repo-wide scan confirmed no other release-state claim was stale. Seedocs/release-notes-v0.6.27.md.
- Published v0.6.26 to npm:
@bbingz/polycli@0.6.26(shasumb1ec2bcf366f1974e6850c42ca8c3ee81695999a) and@bbingz/polycli-opencode@0.6.26(shasumf1e86227af994c281d0fe860c59809b04c103470), bothlatest. GitHub releasev0.6.26(publishedAt2026-06-19T09:03:11Z) + tagv0.6.26. Utility packages unchanged. - Addresses an external review of v0.6.25 via PR #12 (Node 20 CI green, rebase-merged): (High) fixed
extractTerminalErrormissing a nested error object ({error:{message:...}}) so visible partial text was wronglyok:true— coversparseGrokJsonResult+parseGrokStreamText, with json/streaming/empty-object regressions; (Medium) constrained the cc-X validatorstatustoverified/marketplace-unstableand clarified roadmap Q10 that the validator guards structure + source-anchoring, not current-truth; (Medium) synced release-state docs (README en/zh/ja + roadmap snapshot) that still said v0.6.24; (Low) added arunQwenPrompt--modelargv regression. Seedocs/release-notes-v0.6.26.md. - Deferred (declared):
validate-fixture-metadata.mjspath/meta consistency is a pre-existing Low gap, flagged for a separate change.
- Published v0.6.25 to npm:
@bbingz/polycli@0.6.25(shasumf243987016b6b89d536aadb83314a9416acd52e8) and@bbingz/polycli-opencode@0.6.25(shasum387fbf0347c5abc498d632c654b29783613240d5), bothlatest. GitHub releasev0.6.25(publishedAt2026-06-19T08:09:43Z) + tagv0.6.25. Utility packages unchanged (@bbingz/polycli-utils@1.0.2,@bbingz/polycli-timing@1.0.1). - Bundles the three entries below (re-verification remediation + tmux test stabilization + cc-X endpoint recipes). Landed via PR #11 (Node 20 CI green; the previously-flaky tmux test passed on CI), merged to
mainvia rebase. Seedocs/release-notes-v0.6.25.md.
- Added
docs/cc-x-endpoints.md(human reference) +docs/cc-x-recipes.json(machine-readable source of truth) encoding the cc-X pattern: point the EXISTINGclauderuntime (BYOK) oropencode(OpenAI-compatible) at a domestic vendor's Anthropic-compatible endpoint viaANTHROPIC_BASE_URL+ANTHROPIC_AUTH_TOKEN+ANTHROPIC_MODEL. Covers 9 entries across 7 PRC core labs (MiniMax, Moonshot Kimi, Zhipu GLM, Alibaba Qwen, DeepSeek, ByteDance Doubao, StepFun, Baidu Qianfan, Tencent) with per-vendor base URL, model-id family, native-CLI grouping, context-window (autoCompactWindow), caching note, and asourceURL+date per entry. - Encoded the operational gotchas: silent prompt-cache degradation on shim endpoints (dual cache-breakpoint; DeepSeek is the auto-prefix-caching exception), pin a known-good Claude Code version +
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1, sizeCLAUDE_CODE_AUTO_COMPACT_WINDOWto the model's context, marketplace (Baidu/Tencent) model-identity instability, and the PRC data-sovereignty/Entity-List gate as SEPARATE from harness choice. - Honest-default: marketplace/resale endpoints carry
status: "marketplace-unstable"andautoCompactWindow: null(no fabricated model/version pin), mirroring the gemini attempted-vs-used-model caveat indocs/model-fallback-policy.md. Enforced byscripts/validate-cc-x-recipes.mjs(a pure validator modeled onvalidate-fixture-metadata.mjs) +scripts/tests/validate-cc-x-recipes.test.mjs(auto-joined by the npm-test glob); addednpm run validate:cc-x-recipesfor standalone use. - Documented that cc-X is NOT a polycli provider/adapter/runtime — it rides the existing runtimes via standard env vars; the
claude -ppath forwards them via fullprocess.envinheritance, while the tmux allowlist (CLAUDE_TMUX_ENV_EXACT) forwards theANTHROPIC_*trio but NOT theCLAUDE_CODE_*knobs (documented, not fixed). Clarified that the polycliminimax/mmx-cliprovider is a stateless text/media call, not the MiniMax cc-X coding path. - Cross-linked from
docs/provider-paths.md(new subsection + Official-references bullet) anddocs/polycli-v1-public-surface.md(one out-of-contract sentence). Recorded the no-adapter decision indocs/roadmap.mdas closed Q10 + an Explicit-non-goals bullet. Zero runtime/production-path code change;claude.jsenv behavior left untouched by design. Verification:node scripts/validate-cc-x-recipes.mjsok (9 entries),node --test scripts/tests/validate-cc-x-recipes.test.mjs5/5,npm test+npm run release:checkgreen. Snapshot facts are 2026-06-19; the validator guards structure + source-anchoring, not current-truth.
- Independently re-verified the committed remediation sweep (d272042 + 03ae92d) with a Workflow fan-out (9 adversarial auditors -> double-refutation -> completeness critic). 18 raw findings -> 7 confirmed + 1 critic-confirmed; 11 refuted. Confirmed the prior fixes are sound and re-ran full validation (the prior round's open residual #1):
npm test544/544,npm run release:checkexit 0. - Closed residual #3 (state-root permissions) with real-filesystem evidence: under permissive umask 000, stateRoot/stateDir/jobsDir resolve to 0700 and state.json/job-config to 0600, enforced by explicit chmod (not umask). Characterized residual #4 (orphan
<jobId>.jsonresult files leak after MAX_JOBS pruning) as a PRE-EXISTING latent issue —removeJobFileis a dead export and the old code pruned identically — so it is out of scope for this remediation and left flagged, not fixed. - Fixed 2 confirmed regressions introduced by the remediation: (1) the opencode host adapter threw on exit code 2, but 2 is the companion's documented soft signal (
healthwith no healthy provider,status --waittimeout) that still emits a valid JSON envelope on stdout — extractedisHardCompanionFailure(status)so exit 2 returns the envelope while exit 1/4/5/crash still reject; (2)cancelJobrancleanupRuntimePaths(which deletes a review job's live cwd via cleanupPaths) BEFORE killing the worker — reordered to kill first, then clean up, and skip the runtime-path deletion entirely when the kill fails (worker may still be alive). - Fixed 2 confirmed incomplete fixes: (1) Grok
SUCCESS_STOP_REASONSomittedMaxTokens, so a truncated-but-visible answer was wrongly marked ok=false — added maxtokens/max_tokens/length (grok-build's real StopReason enum is {EndTurn, MaxTokens, MaxTurnRequests, Refusal, ToolUse, Cancelled}, verified against the installed binary); refusal/cancelled/tool_use/max_turn_requests stay non-success; (2) the run-ledger append path created~/.polycli/state/<slug>world-traversable (0o755) via the mode-less ensureParentDir on the run_started event that fires before any other state write —appendRunLedgerEventnow callsensureStateDirfirst to land it 0o700. - Closed 4 confirmed test gaps (all mutation/RED-proven): pre-existing-0755 dir hardening test for
ensureStateDir(state-1); state-dir-0700-after-append-only test for the run-ledger path (pwp-2, RED-proven); Grok non-success-stopReason-ALONE failure tests for both parseGrokJsonResult and runGrokPromptStreaming plus a MaxTokens-success test (test-1 + grok-1, RED-proven); syncrunProviderPromptexplicit-model-before-default fallback test mirroring the streaming case (qwen-model-1); newscripts/tests/opencode-host.test.mjspinning the exit-2 soft-signal contract (oc-status-1). - All changes respect the Path B architecture boundary: no shared runtime base class, no provider parser promotion into polycli-utils, timing four-state untouched, cleanupPaths still sourced only from internal review temp dirs.
- Verification: focused RED/GREEN proofs for grok-1 and pwp-1 (reverting each fix turns its new test red); focused suite 66/66;
npm test544/544 (535 + 9 new tests);npm run release:checkexit 0 (plugin bundles 5, fixture metadata 17, codex adapter 5; one tmux.jsonl ENOENT flake on the first run was the known full-suite-parallel-load flake — claude.test.js passes 28/28 in isolation, and the re-run was clean). Not published; current unreleased workspace work after v0.6.24.
- Closed the remaining workflow-review residual risk by capturing a real Grok streaming fixture with
grok 0.2.51 (f4f85a6492e) [stable]:grok -p 'Reply with exactly HELLO_GROK_FIXTURE and nothing else.' --output-format streaming-json -m grok-build --permission-mode plan --disable-web-search --max-turns 1. - Added
packages/polycli-runtime/test/fixtures/grok/stream-success.*and wired Grok into the table-driven fixture replay test, so Grok's realthought/text/endstreaming shape is now parser-checked in CI. - Removed the default Grok missing-success allowlist from
validate:fixtures; the command now checks 17 fixture metadata files and prints no missing-success allowlist rows. - Updated the hardcoded Grok fallback/default-model guidance from stale
grok-composer-2.5-fastto current local defaultgrok-build, and aligned the Grok plugin guidance skills plus fixture-capture docs. - Verification:
node --test packages/polycli-runtime/test/grok.test.js packages/polycli-runtime/test/fixture-replay-all.test.js scripts/tests/validate-fixture-metadata.test.mjs && node scripts/validate-fixture-metadata.mjspassed;node --test packages/polycli-runtime/test/*.test.js scripts/tests/validate-fixture-metadata.test.mjs && node scripts/validate-fixture-metadata.mjs && node scripts/check-fixture-freshness.mjspassed with Grok fresh and older provider fixture-staleness warnings remaining warn-only;npm testpassed 535/535;npm run release:checkexit 0, includingvalidate:fixturesat 17 checked and no allowlist output. Not published.
- Remediated the confirmed medium/low findings from the workflow deep review batch without changing the Path B architecture: no shared provider base class, no provider parser promotion into
polycli-utils, and no timing-state collapse. - Hardened local privacy defaults: terminal fallback state now uses
~/.polycli/stateinstead of shared OS temp; state/workspace/job dirs are created private; state, job config/result, ledger, timing, preview, and provider model cache writes use private modes where applicable. - Fixed background job lifecycle gaps: cancellation now records cancelled terminal ledger events, removes per-job config, cleans runtime
cleanupPaths, andMAX_JOBSpruning preserves queued/running jobs. The queued-to-running parent write now uses a stale-write guard so an already-terminal worker result is not overwritten. - Fixed host/provider semantics: OpenCode host adapter treats every non-zero companion exit as failure even with stdout; Qwen forwards explicit
--model; registry model fallback now prefers provider output, then explicit model, then cached/default model; Grok marks terminal error metadata or non-success stop reasons as failed while preserving partial text. - Closed observability/test/doc gaps: TUI recognizes
provider_decision:passed, all captured runtime fixtures are replayed through provider parsers, fixture metadata requires success fixtures for parser-backed providers, sessions list/purge has companion wiring integration coverage, README/public-surface/host-map/docs drift was aligned, and CI now dry-runs the terminal package tarball. - Stabilized the Claude tmux TUI fake-bin tests under full-suite parallel load by widening the test-only tmux timeout budget; this fixes the
tmux.jsonlENOENT flake seen during full-suite verification. - Verification: focused RED/GREEN tests for permissions, cancel cleanup, active job pruning, OpenCode non-zero exits, Qwen model forwarding, Grok terminal errors, TUI passed status, fixture replay/metadata, sessions CLI wiring, and queued-to-running stale writes;
node --test packages/polycli-runtime/test/claude.test.jspassed 28/28 after test stabilization;npm testpassed 535/535;npm run release:checkexit 0, including bundle/fixture/manifest/host-map/Codex adapter/review-drift checks, Claude plugin validation, and npm pack dry-runs for opencode/utils/timing/terminal. - Follow-up note: the remaining Grok real-fixture gap was closed in the later
Grok fixture residual cleanupentry above. Not published; this is current unreleased workspace work after v0.6.24.
- Ran
@bbingz/polycli@0.6.24from npm against thev0.6.23..HEADrelease diff:health --jsonfound gemini, qwen, minimax, claude, copilot, opencode, pi, cmd, agy, and grok healthy; kimi remained quota-blocked with 403. - Dispatched independent background reviews through claude, copilot, opencode, pi, cmd, gemini, qwen, minimax, and grok. All 9 completed;
agy reviewcorrectly rejected because agy cannot enforce non-interactive read-only plan mode. Five providers reported no issues; four raised low/medium candidates. - Adjudication: overturned package-lock drift because root workspaces are only
packages/*, soplugins/polycli-opencodehas no lockfile package entry; overturned staledocs/release-notes-v0.6.23.mdlatestwording as historical release-note state, not current release state. - Fixed the confirmed compatibility regression where
status --all --timeout-ms abc --jsonfailed without--wait; timeout values are now parsed only for wait paths, preserving the previous no-wait status behavior. - Hardened regression coverage: single-job
status <jobId> --wait --timeout-ms 1 --jsonnow asserts exit code 2 andwaitTimedOut:true; invalid timeout coverage now checks both all-job and single-job wait paths; the fake delayed job timeout test uses a wider 3000ms delay to avoid slow-runner flakes. - Verification: focused RED/GREEN test for status wait timeout cases;
node --test plugins/polycli/scripts/tests/integration.test.mjspassed 60/60;npm testpassed 516/516;npm run release:checkexit 0, including bundle/fixture/manifest/host-map/Codex adapter/review-drift checks, Claude plugin validation, and npm pack dry-runs. Not published; this is current unreleased workspace work after v0.6.24.
- Ran a second real multi-provider review of the v0.6.23 release surface. Reviews completed through claude, copilot, opencode, pi, cmd, gemini, qwen, minimax, and grok; kimi remained quota-blocked; agy correctly rejected
/reviewbecause it cannot enforce a read-only non-interactive plan mode. - Fixed confirmed
status --all --waittimeout findings: JSON mode now exits 2 on timeout, text mode printsTimed out waiting for all jobs., invalid--timeout-msvalues are rejected as positive-integer errors, and the all-job waiter no longer performs an unused initial snapshot read. - Applied the same timeout parser and timeout exit-code handling to the existing single-job
status --waitpath. - Hardened the explicit Claude tmux TUI worker regression assertion against missing
timing.meta. - Verification: focused red/green regressions;
node --test plugins/polycli/scripts/tests/integration.test.mjspassed 60/60;npm testpassed 516/516;npm run release:checkexit 0, including bundle/fixture/manifest/host-map/Codex adapter/review-drift checks, Claude plugin validation, and npm pack dry-runs. - Published GitHub release
v0.6.24: https://github.com/bbingz/polycli/releases/tag/v0.6.24 (publishedAt2026-06-16T07:26:49Z). - npm
latestverified as0.6.24for both public host packages:@bbingz/polycli-opencode@0.6.24(time.modified2026-06-16T07:28:01.606Z, shasum5da8640b1bba6b3da6309bd87692596c9cc8fb34) and@bbingz/polycli@0.6.24(time.modified2026-06-16T07:28:13.403Z, shasum8a766b320a3f5ed18b6e083ab98b87c6fc753b9e).
- Ran a real Polycli full-provider smoke review of the v0.6.22 diff (
--base v0.6.21 --scope branch) and adjudicated provider reports against source. The release diff itself had no confirmed correctness/security regression; the smoke exposed two Polycli control-plane bugs. - Fixed
health --provider opencode: health probes now hydrate provider runtime env before callingrunProviderPromptStreaming, preservingPATHwhen prompt constraints injectOPENCODE_CONFIG_CONTENT. This removes the falsespawn opencode ENOENTresult while keeping the deny-all opencode config in place. - Fixed
status --all --wait: the command now waits for every active job and returns an all-job status snapshot instead of waiting only for the latest active job and returning a single-job envelope. - Added companion-level coverage for the explicitly retained Claude
executionMode: "tmux-tui"worker path, plus regressions for opencode health env hydration andstatus --all --wait. - Verification: focused red/green regressions; live
polycli health --provider opencode --jsonreturned healthy;node --test plugins/polycli/scripts/tests/integration.test.mjspassed 58/58;npm testpassed 514/514;npm run release:checkexit 0, including bundle/fixture/manifest/host-map/Codex adapter/review-drift checks, Claude plugin validation, and npm pack dry-runs. - Published GitHub release
v0.6.23: https://github.com/bbingz/polycli/releases/tag/v0.6.23 (publishedAt2026-06-16T06:44:46Z). - npm
latestverified as0.6.23for both public host packages:@bbingz/polycli-opencode@0.6.23(time.modified2026-06-16T06:49:58.445Z, shasum96a99bb18f69fd40dd8a3c78506311fc89b0d0d7) and@bbingz/polycli@0.6.23(time.modified2026-06-16T06:50:22.282Z, shasum02d016850b5998eabb2bb3faefa6c12ca7e4bfcc).
- Anthropic paused the Agent SDK /
claude -pdedicated-credit change, so the previous default tradeoff no longer holds for ordinary Claudeask/review. - Restored Claude
ask/reviewdefaults to headlessclaude -pwhile preserving plan/no-tools/no-MCP constraints (--permission-mode plan --tools "" --mcp-config '{"mcpServers":{}}' --strict-mcp-config). - Kept the detached tmux TUI runtime path intact for explicit/internal callers, especially workflow cases that need an interactive Claude Code runtime.
- Updated focused tests and current docs to separate the historical v0.6.21 tmux-default release from the current main behavior.
- Live smoke:
POLYCLI_TMUX_BIN=/tmp/polycli-no-tmux-for-print-smoke node plugins/polycli/scripts/polycli-companion.mjs ask --provider claude --json ...returnedok:true, responsePOLYCLI_CLAUDE_PRINT_SMOKE_20260616, measuredttft/gen/tail, sessione639c2cb-320f-4226-b521-ed5b608851b9, and Claude-reportedtotal_cost_usd:0.11984500000000001. - Published GitHub release
v0.6.22: https://github.com/bbingz/polycli/releases/tag/v0.6.22 (publishedAt2026-06-16T02:52:57Z). - npm
latestverified as0.6.22for both public host packages:@bbingz/polycli-opencode@0.6.22(time.modified2026-06-16T02:51:05.698Z, shasum09e36dbd10d2bc72257f3c27ed3b6b910809901e) and@bbingz/polycli@0.6.22(time.modified2026-06-16T02:51:14.262Z, shasum28b00344f743ec0b37342242c80b81867b293c73).
- Researched the current Claude Code Dynamic Workflow surface, Codex xhigh planning options, and local Claude/Qwen/Minimax/Kimi/MiMo workflow run artifacts to choose an implementation path for multi-level subagent workflows.
- Added
docs/superpowers/specs/2026-06-15-claude-workflow-orchestration-design.md. The design keeps Codex xhigh as a planner/compiler for workflow JS, uses Claude Code Dynamic Workflows as the actual subagent runtime, and launches Claude through the existing tmux TUI path so the default does not fall back toclaude -por Agent SDK credit usage. - Scoped polycli to a thin control/observability surface (
workflow plan/start/list/status/result) instead of a new agent framework. Workflow artifact readers must treat Claude'sworkflows/wf_*.jsonandsubagents/workflows/<id>/*.jsonlformat as observed local evidence, not a guaranteed public API.
- Released v0.6.21 after the third-party review remediation closeout. GitHub release/tag to be created from this release commit; npm publication is already visible on the registry.
- npm
latestverified vianpm view:@bbingz/polycli@0.6.21and@bbingz/polycli-opencode@0.6.21. Utility packages remain on their independent v1 line:@bbingz/polycli-utils@1.0.2,@bbingz/polycli-timing@1.0.1. - Release content: Claude
ask/reviewdefault to detached tmux TUI mode instead ofclaude -p; tmux launch responses exposetmuxSession/attachCommandand startup-only timing; review gate sentinel parsing, auth probing, fixture freshness, state cleanup, tempfile cleanup, unsafe pid guards, and docs parity are hardened. - Verification:
npm run release:checkexit 0 (npm test511/511 + bundle/fixture/manifest/host-map/Codex adapter/review-drift/Claude plugin validation + npm dry-runs).npm whoamiauthenticated asbbingz; npm publish completed for the two v0.6.21 public host packages.
- Re-ran a source-grounded adjudication over the remaining non-Qwen review findings after PR #9 landed. One additional behavior bug was confirmed still-present: the stop-time review gate scanned all response lines for bare
ALLOW:/BLOCK:sentinels, so a provider echo of the previous Claude response could be misread as the gate verdict. - Fixed the stop-review gate by generating a per-run
POLYCLI_STOP_REVIEW_*token, requiringALLOW <token>:/BLOCK <token>:in the provider response, and ignoring stale bare sentinels when the token is active. Added parser andrunStopReviewregressions. - Rechecked the old
isTerminalSummaryEventfinding. It is not a live MiniMax/cmd/agy/kimi bug in the current runtime: MiniMax declaresttft/tailunsupported, cmd/agy stream only text-delta events, and Kimi's meta event carries no visible text. No code change kept for that claim. - Remaining non-bug findings are tracked as design/maintenance items, not release blockers: Claude ask/review stays detached tmux TUI by product requirement; Claude health stays auth-only; provider env filtering and duplicated transient-pattern helpers are future hardening/refactor candidates.
- Consolidated the Qwen third-party review batch into
docs/audit/third-party-review-followup-2026-06-15.md, then verified all 11 claims with independent subagents against the current worktree before editing. All 11 were confirmed still-present before remediation. - Fixed the three behavior/security issues with regressions:
writeFileAtomicSyncnow removes its temp file on failed rename/write paths; no-diff review cleanup now runs in afinallyso Gemini isolated tempdirs are removed; unsafe pid values (<=1/ non-integers) are rejected before process-group termination. - Added the missing Claude health logged-out integration coverage by making the fake Claude auth fixture emit
loggedIn:falsevia env, and asserting the companion reports Claude unhealthy with a populated probe error. - Closed the docs/parity findings: plugin README lists
debug/sessionsand terminal TUI ownership; root and translated READMEs describe Claude health as auth-only, add the terminal package badge, outcome diagnostics, andminimax(mmx-cli) alias; timing/runtime package READMEs document v1cold/retryandREVIEW_FLAG_EXPECTATIONS. - Verification: focused regressions pass;
npm testexit 0 (508/508);npm run release:checkexit 0 including bundle, fixture, manifest, host-map, Codex adapter, review-drift, Claude plugin validation, and npm pack dry-runs.
- Adjudicated the Minimax/Kimi/MiMo review batch against the current source after the Claude tmux TUI remediation. Kept the user-requested Claude tmux TUI default instead of reverting
ask/reviewtoclaude -p; treated "restore synchronous LLM answer" findings as a product-semantics conflict, not a fix to apply. - Fixed two confirmed issues: Claude legacy
auth statusnon-JSON success output is now parsed or marked inconclusive instead of treated as logout, andsession-lifecycle-hook.mjsnow removes session jobs through lockedupdateStaterather than naked load/save. - Closed release-safety/doc drift found in the review batch: fixture freshness probes now cover the 11-provider runtime surface (
cmd,agy,grokincluded); README capability notes,docs/provider-paths.md,docs/polycli-v1-public-surface.md,CLAUDE.md, anddocs/roadmap.mddescribe Claude tmux TUI startup-only timing and thetmuxSession/attachCommandresponse shape. - Added draft
docs/release-notes-v0.6.21.mdfor the current unreleased patch rather than rewriting the already-published v0.6.20 notes.
- Adjudicated the Claude/DeepSeek review findings against the current code and the user requirement that Claude subagent calls avoid the upcoming
claude -ppay-as-you-go path. Confirmed the ask/review semantic drift, timing ambiguity, missing signal cleanup, tmux environment propagation gap, and auth-only health ambiguity; intentionally did not revert Claude ask/review defaults to-p. - Hardened Claude tmux TUI mode:
tmux new-sessionnow receives an explicit allowlist of Claude/Anthropic/proxy/cert env vars via-e; SIGINT/SIGTERM during orchestration kill the created tmux session before process shutdown; missing tmux gets a direct install/config error; successful tmux launches returndetached:true,responseKind:"tmux_tui_session_started",warnings, andtimingMetathat says timing covers onlytmux_startupandllmCompletionObserved:false. - Runtime timing now merges provider
timingMetaand uses the run-level timing support for Claude tmux TUI, sottft/gen/tailstayunsupported,totalremains schema-validmeasured, and the record explicitly markstmuxDetached:true/ startup-only timing. Claude health remains no-model-call/auth-only by design and now reportsprobe.kind:"auth_status"plusauthOnly:trueinstead of looking like a sentinel LLM probe. - Tests added/updated for tmux env propagation, detached payload semantics, startup-only timing metadata, signal cleanup, Claude health auth-only reporting, and companion ask/review integration. Bundles regenerated for all host surfaces.
- Verification:
npm testexit 0 (500/500);node --test packages/polycli-runtime/test/claude.test.js;node --test packages/polycli-runtime/test/registry.test.js;node --test plugins/polycli/scripts/tests/integration.test.mjs;npm run validate:bundles;npm run validate:manifests;npm run validate:host-map.
- After the v0.6.20 release, deleted the merged
release/v0.6.19branch and the 3 abandonedworktree-agent-*git worktrees + their branches (all local-only — none on origin). Verified safe first: each branch had 0 commits not inmain(sogit branch -dsucceeded, git-confirming they were merged); the worktrees' only uncommitted content was an identical, obsolete 2026-04-24 path-rewrite (/home/user/…→<local-home>/…) on a snapshot ~41k lines behindmain, locked by a dead pid (96484). - The single (identical across all 3) staged diff was saved to
/tmp/r8-worktree-staged-pathrewrite.patchas insurance, but applying it is NOT advised: active files (README/docs) no longer carry those paths, and the remaining/home/user/references onmainare historical records (CHANGELOG,docs/archive/*,release-notes-v0.6.1) that should not be rewritten. - Repo now has a single
mainbranch, synced with origin, at v0.6.20.
- Closed the doc-debt deferred through v0.6.20 (merged via PR #8). The kimi skill prose + reference docs still described the legacy Python kimi-cli, contradicting the kimi-code v0.6.0 adapter: rewrote
kimi-cli-runtime/SKILL.md(-pone-shot, structuredsession.resume_hintid,--session/-Cresume,~/.kimi-code/, prompt-only review); fixedkimi-prompting/SKILL.mdrule 4 (--max-steps-per-turnis config-level now), and the kimi rows indocs/provider-paths.md+docs/polycli-v1-public-surface.md. - README (GitHub-rendered) provider prose list, Hosts/providers table, and capability matrix now list all 11 providers — added the previously-missing
agy(since v0.6.18) andgrok(v0.6.20);readme-header.svg"ten"→"eleven". - Docs-only (no code/bundle change).
npm test483/483;validate:codex-adapter/host-map/manifestsgreen.
- Released the merged grok / kimi-code / deep-review work as v0.6.20. GitHub release: https://github.com/bbingz/polycli/releases/tag/v0.6.20.
- npm
latest(verified vianpm view):@bbingz/polycli@0.6.20,@bbingz/polycli-opencode@0.6.20,@bbingz/polycli-utils@1.0.2(bumped for the atomic-save/process/stream fixes);@bbingz/polycli-timing@1.0.1unchanged. - Gate:
npm run release:checkexit 0 (npm test483/483 + validate:bundles/fixtures/manifests/host-map/codex-adapter + check:review-drift +claude plugin validate×2 + publish dry-runs). See the gate/merge entry below for the substantive changes.
- Configured minimal default-branch protection for all
bbingzpublic, non-fork repositories that currently have a default branch:polycli,engram,Rules,kimi-plugin-cc,gemini-plugin-cc,minimax-plugin-cc,qwen-plugin-cc,tech-microgpt-cn,ZhaoShengList,feishu-chatgpt,bbingz.github.io, andgfw. - The protection baseline blocks force pushes and branch deletion, and applies to admins (
protected=true,allow_force_pushes=false,allow_deletions=false,enforce_admins=true). It intentionally does not require status checks or PR reviews, so normal push/merge behavior is not gated by this change. - Verification: listed public repos with
gh repo list bbingz --visibility public --limit 1000, wrote branch protection withgh api --method PUT repos/{repo}/branches/{default}/protection, and read back each default branch plus protection object.bbingz/bingzhas no default branch, so it was not applicable; public forks were not modified.
2026-06-02 — Claude — Codex review-gate on PRs #5/#6/#7, then merge all three to main (11th provider grok; unreleased)
Three independent PRs (deep-review hardening, kimi→kimi-code v0.6.0 migration, grok provider) went through a pre-merge Codex review gate, were fixed where findings were real, and were merged to main in order #5→#6→#7. NOT released — latest published release is still v0.6.19; this work accumulates for a future release.
Gate adjudication (Codex is not ground truth — every finding was checked against the real code):
- PR #7 (grok) — Codex CHANGES_REQUESTED, all 3 real: (a) auth-probe ordering bug —
/\blogged in\b/ibanner check ran before the explicit auth-error regex, so a logged-outnot logged in(which contains the substringlogged in) was misread asloggedIn:true; reordered + regression test. (b) grok was half-wired — added it everywhereagyis advertised (polycli-codex + polycli-copilot skill descriptions/arg-hints, polycli-codex README + plugin.json, root README, host-command-map, andvalidate-codex-adapterPROVIDERS). (c)grok-cli-runtimeSKILL over-claimed--effortmapping (polycli--effortis gemini-only, dropped for grok). - PR #6 (kimi-code) — Codex CHANGES_REQUESTED; 1 real, reframed: buildKimiInvocation emitted
-r <id>for resume-by-id, but kimi-code v0.6.0 has no-r(kimi --help: resume-by-id is-S, --session [id], continue-last-C); the path is reachable viarescue --resume <id>, so-rwould be rejected at runtime — switched to--session. Also tightened the session-id parse to requiretype==='session.resume_hint'. Fixed a fragile review integration test exposed by committing the migration (doesNotMatch(argv.join())also matched the reviewed diff text embedded in the-pprompt → false positive; now checks flags as discrete argv tokens). Codex false-positives (verified, not changed): the-p+--plan/--auto/--yolocombination is latent-only (no caller injects those), and the~/.kimi/literal is an intentional migration-history comment. - PR #5 (deep-review) — Codex review stalled (~20 min, no output) on the 1249-line diff, so the gate ran a Claude-driven 6-dimension adversarial workflow (20 reviewers): auth-probe transient cluster, atomic-save locking, signal-kill, stream limit, job-control concurrency, state dedup, companion sessionId, test adequacy. 14 raw findings → 0 survived adversarial verification (the 25 hardening fixes are correctly implemented, no regressions). Only actionable item: untracked an accidentally-committed
.codegraph/.gitignoreand added.codegraph/to root.gitignore.
Merge mechanics: source 3-way merges were clean (provider entries from kimi + grok both preserved; PROVIDERS includes grok). The 5 polycli-companion.bundle.mjs files conflicted/auto-merged textually but git's textual bundle merge did NOT match the source — regenerated all bundles via npm run build:plugins so they are byte-identical to the merged source.
Verification on merged main: npm test exit 0 (483/483, up from 453); validate:host-map (12 capabilities), validate:codex-adapter (5 files, now includes grok), check:review-drift (no drift) all exit 0; PROVIDER_IDS = 11. docs/roadmap.md updated to 11-providers-in-main / unreleased. NOT run: release:check + npm publish (no release this round).
- Reviewed the v0.6.19 upgrade range (
v0.6.18..HEAD) after Claude's maintenance/session-pollution increment. No code-level regressions were found in the new review-flag, session-artifact, bundle, or release-check paths under current verification. - Fixed two durable documentation facts that had drifted after the release closeout:
docs/roadmap.mdnow reports v0.6.19 / 10 providers as current state and lists the new fixture-freshness guardrail;docs/archive/session-memory-2026-05-30.mdnow records84621b1as the publish closeout commit instead of a permanently currentmain HEAD. - Verification:
npm testexit 0 (453/453); focused new-area tests exit 0 (69/69);npm run validate:bundles,validate:fixtures,validate:manifests,validate:host-map, andvalidate:codex-adapterexit 0;npm run check:review-driftexit 0 (all installed CLI flag probes ok);npm run check:fixture-freshnessexit 0 with 16 expected STALE warnings;claude plugin validatepassed for both Claude manifests;git diff --check v0.6.18..HEADexit 0.
2026-05-29 — Claude — v0.6.19: Q8a/b/c maintenance hardening + Q9a/b upstream session-pollution control
Spec-driven increment (docs/superpowers/specs/2026-05-29-maintenance-and-pollution-design.md) from the 2026-05-29 strategy recon (memory project_competitive_landscape_and_moat, roadmap Q8/Q9). Two Codex review gates: spec → CHANGES_REQUESTED → rev2 (review 019e73b4); implementation → CHANGES_REQUESTED → fixes → APPROVE (aeec4314). Implemented by parallel sub-agent waves, integrated + verified by Claude. Published 2026-05-29: GitHub release v0.6.19 (https://github.com/bbingz/polycli/releases/tag/v0.6.19) + npm @bbingz/polycli-opencode@0.6.19 and @bbingz/polycli@0.6.19 (both latest, verified via npm view).
Q9a/Q9b — upstream session-pollution control (the user's #3 pain: spawned-CLI session files accumulate under ~/.claude, ~/.gemini, …):
- run-ledger events now carry
sessionId(betweenmodelanddefaultModel) and a verifiedsessionArtifactPath(aftersessionId), threaded at the companion foreground + worker run sites and the job-control recovery path where result/cwd/provider are in scope;null(never fabricated) where not (run-ledger.mjs,polycli-companion.mjs,job-control.mjs). plugins/polycli/scripts/lib/sessions.mjs(NEW):deriveSessionArtifactCandidate(ONE exact path per provider, NO glob — claude~/.claude/projects/<cwd '/'→'-'>/<id>.jsonlverified against the live store; kimi~/.kimi/sessions/<md5(cwd)>/<id>/dir; pi/gemini/codex/minimax/cmd → null+reason),recordArtifactPath(records only if exists + not a symlink + realpath under the provider store root),collectRecordedArtifacts,collectNonPurgeableSessions,planPurge(re-validates lstat/realpath/basename),executePurge(dry-run default; deletes only with--confirm).- new
polycli sessions [list | purge --confirm]command +plugins/polycli/commands/sessions.md, registered across all host surfaces (validate-host-command-map+docs/host-command-map+ Codex/Copilot skills + OpenCode index): 12 capabilities. Deletion is driven ONLY by recorded + re-validated realpaths — never path-guessing or globbing. Non-purgeable tracked sessions (gemini per-project dir, pi timestamp-prefixed filenames, ephemeral providers) are reported with a reason, never silently dropped.
Q8a/Q8b/Q8c — provider-drift maintenance hardening (root cause: ecosystem heterogeneity + duplication + version-pinned fixtures giving false confidence):
- Q8a
scripts/check-fixture-freshness.mjs(NEW;npm run check:fixture-freshness): warns when a fixture's pinned CLI version ≠ the locally-installed CLI (-v/-V/--versionper provider), skips absent CLIs, exit 0 default /--strictnon-zero on real staleness. On this machine all 16 fixtures are STALE (real upstream drift, e.g. claude 2.1.117→2.1.156, gemini 0.38.2→0.43.0) — exactly the silent false-confidence this catches. - Q8b single frozen
REVIEW_FLAG_EXPECTATIONSmap (packages/polycli-runtime/src/review-flags.js, NEW) is the sole declaration of each provider's driftexpectFlags/forbidFlags/probes, read-only option key/value, and exactextraArgTokens.check-review-cli-drift.mjsderives its CHECKS from it;review.mjssources read-only keys from it; a consistency test assertsextraArgTokensEXACTLY equals the--flagsREVIEW_HARD_CONSTRAINTSemits (catches a token ADDED or REMOVED — the original subset check missed gemini/kimi entirely). Data co-location, NOT aBaseProvider(non-goal #1 intact). - Q8c
check:review-driftwired intorelease:check(self-skips absent CLIs; blocks a release only on genuine flag drift) + a LOCAL regex-anchor sanity check reading theGEMINI_EXPLICIT_AUTH_ERROR_RE/KIMI_EXPLICIT_AUTH_ERROR_REsource (guards a polycli-side refactor from dropping theinvalid api keyanchor; does NOT detect upstream wording — a real upstream auth-wording probe stays an open follow-up).
Verification: npm test 453/453 (from 399); npm run release:check exit 0 (5 bundles byte-identical; fixture metadata 16; host-map 12 capabilities; codex-adapter; no CLI drift; npm pack/publish dry-runs). Deferred to roadmap, NOT shipped: Q8d (migrate churn-heavy providers to JSON/SDK — multi-release) and Q9c (opt-in env session isolation — a naive HOME/XDG override breaks auth + --resume; needs per-provider design).
- Ran 5 review rounds on the agy provider (
a836fa1..HEAD). Fixed the confirmed and clearly-actionable findings:- No fabricated session id (headline):
agy.jsno longer feedsresult.stdouttoresolveSessionId. agy stdout is pure assistant prose, so the UUID scan would capture any UUID in an answer (e.g. "give me a uuid") as a fakesessionId, violating the spec ("sessionId always null / do not fabricate") and suppressingbuildTimingMeta'ssessionIdMissing:true.sessionIdis now hard-nullon both sync and streaming paths; dropped the unusedresolveSessionIdimport. - Hardened auth probe:
buildAgyAuthStatusnow inspects combinederror+responsetext (catches a logged-out agy that prints sign-in guidance to stdout and exits 0 →loggedIn:false) and treats a cleanstatus:0with no auth signal as authenticated even when the probe produced no visible text (fixes the empty-output false-negative where thehasVisibleTextgate leaked into auth classification). Transient→inconclusive-authenticated behavior preserved. - Review hints corrected: removed
agyfrom the--providerargument-hint incommands/review.mdandcommands/adversarial-review.md; the runtime rejects agy review (host-command-map already marked it unsupported), so the hints no longer advertise an unsupported choice. - Drift watcher actually watches:
check-review-cli-drift.mjsagy row hadexpect:[], a no-op that could only detect expected flags disappearing — never a new plan flag appearing, which is the row's whole purpose. Added aforbidlist (--approval-mode/--permission-mode/--policy/--plan/--agent); the checker now reports DRIFT if any appear so /review support can be re-evaluated. - Tests: added 5 agy regression cases (UUID-in-output→null sessionId; empty-output→no_visible_text; authed-empty→loggedIn; logged-out-to-stdout-exit0→loggedOut; streaming non-zero→auth failure).
- No fabricated session id (headline):
- Verification:
node --test packages/polycli-runtime/test/agy.test.jsexit 0 (18/18);npm testexit 0 (399/399, up from 392);npm run release:checkexit 0;node scripts/check-review-cli-drift.mjsruns clean ([ ok ] agy); all 5 companion bundles rebuilt and byte-identical (validatePluginBundles green). Published: tagv0.6.18, GitHub release, npm@bbingz/polycli-opencode@0.6.18and@bbingz/polycli@0.6.18(bothlatest, verified vianpm view). - Deferred (not fixed, with rationale): signal-kill
status:null→0misclassification is a repo-widerunCommandpattern (all providers) — fix cross-cutting, not agy-only; stdout banner/notice pollution of response+ttft and the internal---print-timeout-beats-outer-timeout classification both depend on agy's actual print-mode output shape, which upstream has not been verified; response-vs-events blank-line divergence only affects preview events (compacted away). The v0.6.16 release notes'--add-dir/--sandboxmention describes runtime params with no companion CLI surface (historical, left as-is).validate-codex-adapterprompts≤3/≤128 is an intentional Codex limit, not a bug.
- Fixed the Codex host manifest noise found in
codex-tui.log:plugins/polycli-codex/.codex-plugin/plugin.jsonhad 4interface.defaultPromptentries, while Codex currently supports a maximum of 3. The manifest now keeps health, ask, review, and timing coverage in 3 supported prompt entries. - Hardened
scripts/validate-codex-adapter.mjsso release validation rejects more than 3 Codex default prompts and rejects any default prompt entry over 128 characters. Added focused regression tests for both limits. - Verification before release prep:
node --test scripts/tests/validate-codex-adapter.test.mjsexit 0 (4/4);node scripts/validate-codex-adapter.mjsexit 0;node --test scripts/tests/*.test.mjsexit 0 (45/45). Release verification:npm run release:checkexit 0 (394/394 tests; bundles 5; fixtures 16; manifests 0.6.17; host-map 11x4+terminal; codex-adapter 5; claude plugin validate ×2; npm dry-runs/pack checks passed). Post-publish: tagv0.6.17, GitHub release (not draft, not prerelease), and both npm packages observable at 0.6.17 (@bbingz/polycli-opencode@0.6.17at 2026-05-25T12:01:21Z,@bbingz/polycli@0.6.17at 2026-05-25T12:01:32Z).
- Added
agyas the tenth polycli-managed provider CLI. Adapter mirrors the text-onlycmdpattern with claude-style session flags (--continue/--conversation <id>/--add-dir/--sandbox) and YOLO via--dangerously-skip-permissions. agy emits plain stdout (no JSON envelope, no session id, no model field); the adapter honors the four-state timing semantics by returningnullmodel and the resolver'snullsessionId rather than fabricating values. - TIMING_SUPPORT:
ttft/gen/tailtrue (line-buffered stdout),toolfalse,runtimePersistence: "session". The session id is always missing, sobuildTimingMetawill correctly stampsessionIdMissing: trueon every agy run — honest, not folded intounsupported. /review --provider agyis rejected upfront via a newREVIEW_UNSUPPORTED_PROVIDERSset andassertReviewProviderSupportedinplugins/polycli/scripts/lib/review.mjs. Rationale: agy has no plan-mode / approval-mode flag, so the review hard constraint cannot enforce read-only execution. Drift watcher (scripts/check-review-cli-drift.mjs) carries the agy row withexpect: []so future plan-mode additions are picked up.- ask/rescue auto-YOLO for agy (matches the
project_yolo_standard.mdrule), provider listings in companion dispatcher / Claude commands / Codex+Copilot skills / README SVG header updated from "nine providers" to "ten providers". - Verification:
node --test packages/polycli-runtime/test/agy.test.jsexit 0 (13/13);npm testexit 0 (392/392, up from 374);npm run check:provider-pathsexit 0 (8 ok + agy ok + pi skipped on local timeout);npm run release:checkexit 0 (bundles 5; fixtures 16; manifests 0.6.16; host-map 11x4+terminal; codex-adapter 5; claude plugin validate ×2; npm pack/publish dry-runs passed). agy itself reviewed commita836fa1and returnedVERDICT: PASSagainst four-state-timing / YOLO / Path B / review-refusal / plain-text-stdout invariants. Post-publish: tagv0.6.16, GitHub release (not draft, not prerelease), and both npm packages observable at 0.6.16 (@bbingz/polycli-opencode@0.6.16at 2026-05-20T14:44:18Z,@bbingz/polycli@0.6.16at 2026-05-20T14:44:33Z).
- Fixed the observability split found after several days of real polycli use:
POLYCLI_STATE_ROOTnow overridesCLAUDE_PLUGIN_DATA/state,timing --all/--history allcan read full history, andtiming --jsonreports store metadata (stateRoot,stateRootSource, workspace slug/root, history limit, record count). - Extended timing records with outcome diagnostics (
outcome,exitCode,terminationReason,responseMatched,errorCode) so aggregates no longer mix successful health/ask runs with provider failures without explanation. - Added run-ledger failure classification and explanation output for failed attempts, including structured counts for qwen max-session-turns, timeouts, terminated/cancelled runs, missing binaries, auth failures, and no-visible-text failures.
- Hardened provider adapters around observed failure modes: qwen max-session-turns becomes
qwen_max_session_turns, kimi resume footer exits with visible assistant text no longer fail, and qwen/kimi/opencode/cmd attacherrorCodeclassifications used by timing and ledger. - Updated README/release docs and bumped host/terminal release manifests to
0.6.15; regenerated all five companion bundles. - Verification: focused TDD red/green slices for timing, run-ledger, qwen/kimi/opencode/cmd, plus
npm testexit 0 (374/374 tests) andnpm run release:checkexit 0 (full tests, bundle/fixture/manifest/host-map/Codex adapter checks, Claude plugin validation, npm dry-run/pack checks).
- Confirmed npm
@bbingz/polycli-opencode@0.6.14and@bbingz/polycli@0.6.14are observable on the registry, then updated the GitHub release notes and release docs from "pending npm auth" to published. - Verified Codex marketplace refresh behavior:
codex plugin marketplace add bbingz/polycliis idempotent and does not refresh an existing local cache; usecodex plugin marketplace upgrade polycli-hoststo pull the latest marketplace revision. Local Codex marketplace cache now points at6e550b3andpolycli-codex@0.6.14. - Committed and pushed the post-publish docs closeout as
6e550b3 docs: mark v0.6.14 npm packages published.
- Recorded the current best-provider path table in
docs/provider-paths.md, including the corrected OpenCode finding: local auth/model discovery is the source of truth, so an emptyopencode.jsonprovider object does not mean OpenCode has no configured providers. - Hardened prompt/review defaults away from broad YOLO for stateless calls: qwen ask is now bounded at 20 turns with plan mode and tool exclusion instead of the failing one-turn cap; Claude uses no-tools plus empty strict MCP config; Gemini/OpenCode/Pi/Kimi/Cmd/Copilot get conservative provider-specific ask constraints.
- Kept Copilot as a fallback provider but removed allow-all tool/path/url defaults for ask/review.
- Replaced MiniMax
mini-agentlog scraping with officialmmx-clitext-chat JSON non-interactive invocation and updated tests/docs/skills around the new path. - Verification:
npm run check:provider-pathsexit 0 with localmmx1.0.12 included in the drift probe; livepolycli ask --provider minimaxsmoke returnedok: true;release:checkexit 0 (367/367 tests; bundles 5; fixtures 16; manifests 0.6.14; host-map 11x4+terminal; codex-adapter 5; claude plugin validate ×2; npm dry-runs/pack checks passed). Post-publish: tag, GitHub release (not draft, not prerelease), and both npm packages observable at 0.6.14.
- Published artifacts: GitHub release https://github.com/bbingz/polycli/releases/tag/v0.6.13, npm
@bbingz/polycli-opencode@0.6.13, npm@bbingz/polycli@0.6.13. Utility packages stay on independent v1.x cadence (@bbingz/polycli-utils@1.0.1,@bbingz/polycli-timing@1.0.1);@bbingz/polycli-runtimeremains internal. - Default
GEMINI_CLI_TRUST_WORKSPACE=truefor every gemini spawn. gemini-cli prompts on first run in a new workspace for trust; under polycli's non-interactive ask/rescue/review pipeline that prompt has nowhere to go and the call hangs/fails. NewbuildGeminiEnv(parentEnv)helper defaults the env var to"true"but preserves any caller-set value (GEMINI_CLI_TRUST_WORKSPACE=false ./script.shstill wins). Consistent with the v0.6.12 YOLO stance: workspace trust is one more interactive prompt that polycli auto-approves. - Verification:
release:checkexit 0 (366/366 tests; bundles 5; fixtures 16; manifests 0.6.13; host-map 11x4+terminal; codex-adapter 5; claude plugin validate ×2; 4 npm pack/publish dry-runs). Post-publish: tag, GitHub release (not draft, not prerelease), and both npm packages observable at 0.6.13.
- Published artifacts: GitHub release https://github.com/bbingz/polycli/releases/tag/v0.6.12, npm
@bbingz/polycli-opencode@0.6.12, npm@bbingz/polycli@0.6.12. Utility packages stay on independent v1.x cadence (@bbingz/polycli-utils@1.0.1,@bbingz/polycli-timing@1.0.1);@bbingz/polycli-runtimeremains internal. - Standardize
ask/rescuepermission default to YOLO across all 9 providers. Path B principle: surface real provider capabilities, don't fake uniformity by mixing tiers across providers. Until v0.6.11 polycli's permission stance was an asymmetric mix (copilot/opencode already YOLO; claudeacceptEdits; qwenauto-edit; geminiplan; kimi/cmd no flag at all; pi/mini-agent no permission gate). v0.6.12 makes every provider that has a YOLO-equivalent flag pass it by default: claude--permission-mode bypassPermissions, gemini--approval-mode yolo, qwen--approval-mode yolo(also dropped legacyunsafeFlag/backgroundguard), kimi--yolo, cmd--yolo. Callers can opt out via runtime parameters (permissionMode,approvalMode,yolo,skipPermissions). Documented as part of the v1 public surface. review/adversarial-reviewremain locked to conservative / read-only / plan mode regardless of the new YOLO defaults: review override now addspermissionMode: "plan"for claude,approvalMode: "plan"for qwen (matching the existing gemini override),yolo: falsefor kimi and cmd.assertNoReviewConstraintOverrideextended to refuse downstream callers re-introducing those YOLO flags into a review invocation.- Verification:
release:checkexit 0 (364/364 tests; bundles 5; fixtures 16; manifests 0.6.12; host-map 11x4+terminal; codex-adapter 5; claude plugin validate ×2; 4 npm pack/publish dry-runs). Post-publish: tag, GitHub release (not draft, not prerelease), and both npm packages observable at 0.6.12.
- Published artifacts: GitHub release https://github.com/bbingz/polycli/releases/tag/v0.6.11, npm
@bbingz/polycli-opencode@0.6.11, npm@bbingz/polycli@0.6.11. Utility packages stay on independent v1.x cadence (@bbingz/polycli-utils@1.0.1,@bbingz/polycli-timing@1.0.1);@bbingz/polycli-runtimeremains internal. - Drop the unilateral 200 KB diff cap on
review/adversarial-review:DEFAULT_MAX_DIFF_BYTESflipped from200_000tonull. With provider context windows now routinely 1M-2M tokens, the hardcoded cap was an artificial cost ceiling that contradicted the Path B "no fake unification" stance. By default the full git diff goes to the provider; callers can still opt into truncation by passing a positive numericmaxDiffBytestocollectReviewContextor--max-diff-bytes <n>on the wrapper. - Add
--max-diff-bytes <n>CLI flag onreviewandadversarial-review(validated like--history;invalid_max_diff_bytesstructured error code on bad input). Help text, public-surface doc, host-plugin command files (commands/review.md,commands/adversarial-review.md), and codex/copilot SKILL grammar updated to surface the flag. - Verification:
release:checkexit 0 (362/362 tests; bundles 5; fixtures 16; manifests 0.6.11; host-map 11x4+terminal; codex-adapter 5; claude plugin validate ×2; 4 npm pack/publish dry-runs). Post-publish: tag, GitHub release (not draft, not prerelease), and both npm packages observable at 0.6.11.
- Published artifacts: GitHub release https://github.com/bbingz/polycli/releases/tag/v0.6.10, npm
@bbingz/polycli-opencode@0.6.10, npm@bbingz/polycli@0.6.10. Utility packages stay on independent v1.x cadence (@bbingz/polycli-utils@1.0.1,@bbingz/polycli-timing@1.0.1);@bbingz/polycli-runtimeremains internal. - Pi probe fixes:
DEFAULT_PI_MODELwas a hardcoded"openai-codex/gpt-5.4"always injected into the pi command line viabuildPiInvocation, breaking probes for any user whose pi was authenticated against a different backend (Xiaomi etc.) — set tonullso pi auto-routes to its configured backend.parsePiStreamTextnow extractsevent.message.errorMessageandevent.message.stopReason==="error"into a newproviderErrorfield;runPiPrompt/runPiPromptStreamingsurface that asresult.errorinstead of the generic"pi produced no visible text".event.message.modeladded to the model extraction paths so reporting reflects the model pi actually used (e.g.mimo-v2.5-pro). - Live verification before publish:
node packages/polycli-terminal/bin/polycli.mjs health --provider pi --jsonagainst a Xiaomi-backed pi flips fromok=false, model="openai-codex/gpt-5.4", error="pi produced no visible text"took=true, model="mimo-v2.5-pro", error=null. - Verification:
release:checkexit 0 (359/359 tests; bundles 5; fixtures 16; manifests 0.6.10; host-map 11x4+terminal; codex-adapter 5; claude plugin validate ×2; 4 npm pack/publish dry-runs). Post-publish: tag, GitHub release (not draft, not prerelease), and both npm packages observable at 0.6.10;@bbingz/polyclibin still mapsbin/polycli.mjs.
- Published artifacts: GitHub release https://github.com/bbingz/polycli/releases/tag/v0.6.9, npm
@bbingz/polycli-opencode@0.6.9, npm@bbingz/polycli@0.6.9. Utility packages stay on independent v1.x cadence (@bbingz/polycli-utils@1.0.1,@bbingz/polycli-timing@1.0.1);@bbingz/polycli-runtimeremains internal. - Patch on top of v0.6.8 closing the post-Q6 hardening: dead-worker scan-on-read terminal event recovery in
debug runs/show/explain(idempotentattempt_result+provider_decisionappend;worker_exitedclassification for no-envelope deaths), TUI log file pointer rendering (read-only — never reads or prints log contents), host-map guardrail extended to Terminal CLI cells / side-by-side examples / terminal-onlypolycli tuidocs, and README command-surface drift cleanup across en/zh/ja so the front matter matches the v0.6.7 + v0.6.8 surface. - Verification:
release:checkexit 0 (354/354 tests; bundles 5; fixtures 16; manifests 0.6.9; host-map 11x4+terminal; codex-adapter 5; claude plugin validate ×2; 4 npm pack/publish dry-runs). Post-publish: tag, GitHub release (not draft, not prerelease), and both npm packages observable at 0.6.9;@bbingz/polyclibin still mapsbin/polycli.mjs.
- Added project memory for the Q6 terminal CLI/TUI observability track, including v0.6.7/v0.6.8 shipped surfaces, post-v0.6.8 hardening, and the next
v0.6.9release-prep handoff. - Added and pushed
docs/superpowers/plans/2026-05-07-claude-remaining-work-handoff.mdso Claude can fully take over remaining P0/P1/P2 work without reopening completed Q6 implementation scope.
- Added scan-on-read dead-worker recovery for background runs with residual
runContext;debug runs/show/explainrefresh job state before reading the ledger and append missing terminalattempt_result/provider_decisionevents idempotently. - Added TUI rendering for local job
logFilepointers without reading or printing log contents. - Tightened host-map validation so Terminal CLI command cells, side-by-side examples, and terminal-only
polycli tuidocumentation stay in sync. - Updated README variants, roadmap, release docs, v0.6.8 notes, and Q6 task state to reflect the shipped
@bbingz/polycliterminal package, TUI inspector, and completed post-v0.6.8 hardening.
- Published artifacts: GitHub release https://github.com/bbingz/polycli/releases/tag/v0.6.8, npm
@bbingz/polycli-opencode@0.6.8, npm@bbingz/polycli@0.6.8. Utility packages stay on independent v1.x cadence (@bbingz/polycli-utils@1.0.1,@bbingz/polycli-timing@1.0.1). - Includes Q6 Spec 2 — background-job ledger plumbing (
runContextpersisted into per-job config; parent writesjob_started;_job-workerwritesattempt_started/attempt_result/provider_decisionagainst the originatingrunId; worker-observed cancellation producesattempt_result status=cancelled+provider_decision status=cancelled reason=job_cancelled). - Includes Q6 Spec 3 — read-only
polycli tuiinspector (terminal-only; navigationup/down/k/j+enter/b+tab+?+rrefresh +qquit; rendersstarted/attempt_startedevents without a terminal result asunfinished/unknown;--history <count>validated and applied; raw-mode try/finally with idempotent restore). - Real-pty
q-exit fix: explicitprocess.stdin.resume()aftersetRawMode(true)plusprocess.stdin.pause()inrestoreRawMode(). Previously, in some real-PTY sessions theqkeypress never reached the handler and only Ctrl-C escaped (with exit 1). - Run-ledger debug examples doc surface (
docs/polycli-v1-public-surface.md) walks through the original Q6 narrative (cmdhealth passed but twoaskattempts failed → not adopted;pihealth failed → skipped before prompt-bearing work) usingpolycli debug runs / show / explain.
- Bumped 7 release manifests from
0.6.7to0.6.8(9 occurrences):.claude-plugin/marketplace.json,.github/plugin/marketplace.json,plugins/polycli/.claude-plugin/plugin.json,plugins/polycli-codex/.codex-plugin/plugin.json,plugins/polycli-copilot/plugin.json,plugins/polycli-opencode/package.json,packages/polycli-terminal/package.json. Utility packages unchanged on independent v1.x cadence. - Added
docs/release-notes-v0.6.8.mdcovering Q6 Spec 2 (background-job ledger plumbing) + Q6 Spec 3 (read-only TUI inspector MVP) + run-ledger debug examples. - Updated
docs/release.mdCurrent Release State to "prepared for v0.6.8" (last published release stillv0.6.7); updateddocs/roadmap.mdsnapshot + Current state to mention prepared-but-not-published status. - Recorded automated TUI smoke results in the release notes (script-keys + non-TTY error path against the real wrapper binary). Real-TTY items (
qquits + raw-mode restoration, interactiverrefresh) explicitly listed as still-needed user-side smoke before tagging. - Local
npm test348/348,release:checkexit 0 (bundles 5 / fixtures 16 / manifests 0.6.8 / host-map 11×4 / codex-adapter 5 / claude plugin validate ×2 / 4 npm pack dry-runs). No tag, no GitHub release, no npm publish in this slice.
- Added terminal-only
polycli tuias a read-only inspector over existing debug/run-ledger data. - Renders run list, provider states, event timeline, detail/reproduction command panel, and explicit
unfinished/unknownstates for non-terminal background jobs. - New view-model layer (
packages/polycli-terminal/lib/tui/view-model.mjs): pureclassifyProviderStates/formatReproductionCommand/truncateMiddle/buildTuiModel/renderTuiFrameso behavior is testable without a real TTY. - New runtime (
packages/polycli-terminal/bin/polycli-tui.mjs): interactiveq/rkeypress loop overprocess.stdinraw mode plus a--smoke --fixture-dir <dir>mode for one-frame snapshots used by tests. - Terminal wrapper now routes
polycli tuito the TUI runtime; all other commands still delegate to the bundled companion.POLYCLI_HOST_SURFACEdefaults toterminalfor both targets. - Packaging:
packages/polycli-terminal/package.jsonnow shipsbin/polycli-tui.mjsandlib/**/*.mjs; new packaging test assertsbin/polycli-tui.mjsandlib/tui/view-model.mjsare in the published tarball. - Docs: terminal README adds a TUI section, host command map adds a terminal-only
polycli tuinote (no host plugin slash command), public-surface doc adds apolycli tuientry. - No provider execution, retry, cancel, daemon, watch mode, full log viewer, version bump, tag, or publish in this slice.
- Added
docs/superpowers/specs/2026-05-07-tui-inspector-mvp-design.mdfor a read-only terminal TUI inspector over existingdebug runs/show/explainand run-ledger data. - Added
docs/superpowers/plans/2026-05-07-tui-inspector-mvp.mdwith a task-by-task implementation plan covering view-model tests, terminal runtime, wrapper routing, package files, docs, and release checks. - Updated the Q6 roadmap wording to name the read-only TUI inspector MVP as the next implementation slice; no source change, no rebuild, no version bump, no tag, no publish.
- Added "Run ledger debug examples" section to
docs/polycli-v1-public-surface.md, covering the original Q6 narrative:cmdhealth passed but twoaskattempts failed (not adopted);pihealth failed and was skipped before any prompt-bearing work. Examples usepolycli debug runs / show / explainand reference event-schema slots, not invented live provider output. - Closed the "Add docs examples for the concrete failure case" item in
tasks/terminal-cli-tui-observability.md. - Docs-only; no source change, no rebuild, no version bump, no tag, no publish.
- Parent process now persists a top-level
runContext(runId / command / hostSurface / argv / jobId / provider / kind / model / defaultModel / logFile) into the per-job config when--run-id(orPOLYCLI_RUN_ID) is in scope. - After spawning the worker, the parent writes a
job_startedledger event; noprovider_decisionfrom the parent. _job-workerreadsrunContext, writesattempt_startedbefore the streaming call, and on completion writesattempt_result(statuscompleted/failed) plusprovider_decision(adoptedon success,failed reason=<kind>_failedon not-ok). Worker-observed cancellation producesattempt_result status=cancelled+provider_decision status=cancelled reason=job_cancelled.- Added shared
recordRunEventForContext(workspaceRoot, runContext, base)writer; existingrecordRunEventdelegates viabuildCurrentRunContext(). Worker code never mutates the parent-sideRUN_CONTEXTglobal. createRunLedgerEventschema gains nullablepid/durationMsslots; foreground events round-trip with the existing fields and addnulldefaults for the new ones.- Tests: 3 new background integration tests (success with
--run-id, failedcmd askwithout full prompt leakage, explicitPOLYCLI_HOST_SURFACE=codex-skillpropagation). All 61 plugin-level tests pass; fullnpm testandnpm run release:checkgreen. - Killed-worker (
kill -9after provider returns but before the ledger write) perfect recovery is open ledger-side hardening (reaper or scan-on-read step), not a TUI gate; the first TUI inspector can proceed and must render anystarted/attempt_startedevent without a terminalattempt_result/provider_decisionasunfinished/unknown. - No version bump, no tag, no publish — main only. Roadmap Q6 status updated;
tasks/terminal-cli-tui-observability.mdbackground-worker checkbox flipped.
- Shipped standalone terminal CLI
@bbingz/polycli(PATH-callable wrapper around the bundled companion); first-time npm publish. - Added shared
debugcompanion vocabulary (debug runs / show <run-id> / explain <run-id>) surfaced through Claude / Codex / Copilot / OpenCode / terminal. - Added redacted append-only run ledger (NDJSON per workspace) with stable
runId/workspaceSlug/hostSurface; foregroundhealth,ask,rescue,review,adversarial-reviewwritehealth_result/attempt_started/attempt_result/provider_decision/run_summaryevents. Background-worker ledger plumbing is the next follow-up. - Added global
--run-id <id>(orPOLYCLI_RUN_ID) to join multi-command flows under one ledger run; stripped before provider/positional parsing. - Bundle / release guards now cover a fifth byte-identical companion bundle (
packages/polycli-terminal/bin/polycli-companion.bundle.mjs) and assert the terminal tarball shipsLICENSE. - Published artifacts: GitHub release https://github.com/bbingz/polycli/releases/tag/v0.6.7, npm
@bbingz/polycli-opencode@0.6.7, npm@bbingz/polycli@0.6.7. Utility packages remain on independent v1.x cadence (@bbingz/polycli-utils@1.0.1,@bbingz/polycli-timing@1.0.1).
- Corrected the Codex adapter docs and manifest after real Codex TUI verification showed
/polycli-codex:polycli ...is not a registered slash command. - Documented the actual Codex flow:
codex plugin marketplace add bbingz/polycli, then installPolyclifrom TUI/plugins, then start a new thread so thepolycliskill appears. - Reworked the Codex skill invocation guidance to resolve the plugin root from the installed
SKILL.mdpath instead of requiring a manually exportedPLUGIN_ROOT. - Tightened
npm run validate:codex-adapterandnpm run validate:host-mapso future releases reject fake Codex slash-command examples and require Codex skill examples forhealth,ask,review, andtiming. - Prepared release notes and host package metadata for
v0.6.4; OpenCode package moves to@bbingz/polycli-opencode@0.6.4, while utils/timing stay on1.0.1.
- Strengthened the
polycli-codexmanifest and skill so Codex is explicitly told to prefer/polycli-codex:polycli ...over direct official CLI shell calls forclaude,copilot,opencode,pi,gemini,kimi,qwen, andminimax; raw shell is now documented as an explicit-user-intent or unavailable-plugin fallback only. - Updated the root README, Codex plugin README, and host command map with Codex slash examples for
health,ask,review,status,result, andtiming, so daily examples no longer look like a generic shell command. - Added
docs/codex-adapter-operability.mdas the routing, fallback, first-run, and observability contract for Codex sessions. - Added
scripts/validate-codex-adapter.mjs,npm run validate:codex-adapter, unit coverage, CI wiring, andrelease:checkwiring so Codex provider triggers, fallback language, and health/status/result/timing guidance cannot drift silently. - Prepared release notes and host package metadata for
v0.6.3; OpenCode package moves to@bbingz/polycli-opencode@0.6.3, while utils/timing stay on1.0.1.
Triggered by a second 5-round multiway run using real HuggingFace dataset rows (offsets 5/1000/130/400/0 from MMLU college_math / GSM8K / HumanEval/130 / TruthfulQA / BBH), as opposed to the first run which used benchmark-flavored re-creations.
Multiplier extended to opencode:
plugins/polycli/scripts/polycli-companion.mjs:PROVIDER_TIMEOUT_MULTIPLIERS.opencode = { "kimi-for-coding/k2p6": 2 }. Same pattern as gemini — model-scoped, only the reasoning variant gets ×2; other opencode models stay at base.- Trigger: HumanEval/130 (Tribonacci with awkward forward-reference recurrence) made opencode hit
timedOut: true, signal: "SIGTERM"at exactly 120021 ms — the 120saskceiling. Verified post-fix that opencode background job timeout is 240000ms (gemini still 240000ms, qwen unchanged at 120000ms). gemini-cli-runtime/SKILL.mdLatency expectations section updated to show the multiplier is a registry, not gemini-only — the same pattern can be extended as new reasoning model ids appear.
Benchmark doc persisted:
docs/benchmarks/multiway-validation-2026-05-02.mdcaptures: exact dataset offsets and prompt verbatim text, full result matrix for both rounds (40/40 easy + 37/40 hard), per-provider behavior notes (kimi misreads complex prompts, minimax reasons shallowly on puzzle-class, opencode is a code-reasoning model), and 3 grader bugs that bit me during the run (.strip()ate Python indent, prefix-only negation regex missed kimi's "not because" answer, single-language regex misclassified claude's Chinese reply). The grader-lessons section is the durable artifact — future benchmark scripts should not repeat these.
What we did NOT do:
- Did not write a reusable benchmark grader utility module (
tasks/benchmark-grader.mjsstyle). polycli is not a benchmark suite; persisting the lessons in a doc is sufficient. - Did not extend the multiplier to other providers preemptively — opencode addition was driven by a real timeout observation, not speculation.
Followups discovered during a 5-round 9-way validation (8 polycli providers + codex via subagent, prompts from MMLU / GSM8K / HumanEval / TruthfulQA / open-ended).
Fix: kimi & minimax model field was null in ask result
packages/polycli-runtime/src/kimi.js:347and:404— fall back toreadKimiDefaultModel()(already existed but was unused) whenparsed.model ?? model ?? defaultModelis all null. Reads~/.kimi/config.tomldefault_modelscalar.packages/polycli-runtime/src/minimax.js:238— fall back toreadMiniMaxConfig().model(reads~/.mini-agent/config/config.yaml) under the same condition.- Root cause:
cacheProviderModelonly writes whenresult.modelis non-empty. kimi stream-json and mini-agent log don't carry a model id, so cache stayed empty, so subsequent runs got nulldefaultModel, so model stayed null. Chicken-and-egg. Direct config read breaks the loop. - Verified post-fix:
kimireturnskimi-code/kimi-for-coding,minimaxreturnsMiniMax-M2.7-highspeed. Resolves the "null for kimi/mini-agent" caveat inreference_default_model_extraction_caveats.md.
Stress test: gemini timeout multiplier
Goal: prove the gemini-3.1-pro-preview ×2 multiplier was actually necessary, not just defensive.
| prompt class | gemini wall | gemini ttft | observation |
|---|---|---|---|
| Standard 5-round (MMLU / GSM8K / HumanEval / TruthfulQA / open-ended) | 7-22s | (mostly < total) | far below 120s base — multiplier irrelevant |
| GPQA-style physics reasoning + algebra (453 byte prompt, ask) | 55s | 44s | half the base 120s — comfortable headroom but base would have worked |
| Heavy structured output: 800-byte rate-limit design prompt (rescue) | 55s | 37s + 18s gen | far below 600s rescue base |
Result: under prompts I could construct, gemini-3.1-pro-preview peaks around 55s — never approaches even the 120s ask base, much less the 240s multiplier ceiling. The multiplier is defensive headroom for the original observation (user reported gemini "self-admitted long thinking time" on review of large diffs), not a tight fit. Documented this honestly: the multiplier provides safety margin for the worst case rather than reacting to a routine ceiling breach. No timeout tuning change.
Side observations from the 5-round validation (no fixes needed, recorded for posterity):
- All 9 entities (8 polycli + codex) returned correct answers on R1/R2/R4. Code-completion (R3) instruction-following varied: 7/8 polycli wrapped the function in markdown despite "no extra commentary" — only
minimaxandcodexgave a true one-liner. This is upstream LLM behavior, not polycli routing. claudeprovider answered the English R4 prompt in Chinese because the user's globalCLAUDE.mdsays "Always respond in Chinese". CLAUDE.md inheritance only reaches theclaudeprovider; other providers respect prompt language. Documented in memory as expected behavior.- 5 rounds × 8 providers wall time: 113s (parallel start per round, sequential rounds). Codex reference run (subagent
a48de540074220012): all 5 prompts correct, 7-9s latency each.
2026-05-02 — Claude — multi-way self-review: 4 doc fixes + 1 verified bug + multiplier scope tightening
Ran a 4-way self-review where each provider audited polycli's claims about itself (gemini / qwen / kimi / minimax each reading their own *-cli-runtime/SKILL.md). Triaged findings into red (true defects, fix), yellow (LLM claims to verify against real CLIs), and green (engineering choices).
Red — 4 doc defects fixed:
minimax-cli-runtime/SKILL.mdP0.5: removed self-contradiction. Section claimed Layer 1/3 sentinels were "跨 locale 稳定" while the same paragraph noted OSError messages may be i18n'd by glibc. Reworded as "纯 ASCII 字面量, 未观察到 i18n" and clarified the i18n caveat is OS-layer (outside Mini-Agent's control).minimax-cli-runtime/SKILL.mdP0.9: scoped the "0 次os.environ" claim to first-party Mini-Agent code (excludes transitive deps like httpx / pydantic) and clarified the implication is auth-purpose only.qwen-cli-runtime/SKILL.md: documented--unsafevs--approval-modeprecedence with source-verified semantics. Initial draft said "--unsafe wins", but readingbuildQwenInvocationinpackages/polycli-runtime/src/qwen.js:73-76showed the opposite: an explicit--approval-modewins;--unsafeis only a shortcut toyolowhen--approval-modeis omitted. Background-modeyolostill requires--unsafeas an independent safety guard.kimi-cli-runtime/SKILL.md: "Auth ping" was misleading —--max-steps-per-turn 1 + 30sis a liveness probe (verifies binary launches and reaches the model) but does not validate token freshness. Renamed to "Liveness probe" and pointed tosetup --jsonauthenticatedfield for true auth state.
Yellow — 6 claims verified against real CLIs (gemini 0.40.1, kimi 1.40.0, qwen 0.15.6):
| # | Claim | Verdict |
|---|---|---|
| 5 | gemini --write → --approval-mode auto_edit |
✅ help confirms auto_edit is a valid enum |
| 6 | kimi -V and -v flags |
-V and --version both work, but -v returns a click usage error in 1.40.0+, not verbose. Doc updated. |
| 7 | kimi stream-json role set |
✅ live probe shows only assistant (kimi's self-claim of "user/system" was a hallucination) |
| 8 | kimi --approval-mode acceptance |
✅ kimi 1.40 has no --approval-mode (only --yolo/--plan/--afk/--print); doc was correct |
| 9 | --print ≈ --yolo |
✅ kimi --help 1.40 says "Print mode auto-dismisses AskUserQuestion and auto-approves tool calls"; doc was correct |
| 10 | kimi auth paths | ✅ subcommand list is login/logout/term/acp/info/export/mcp/plugin/vis/web — no API-key/SSO subcommands; doc was correct |
Net: kimi's self-review hallucinated 5 of 6 — LLMs are unreliable narrators about their own CLI surfaces. Real probes are necessary. Only Q6 produced a doc edit (-v wording in kimi-cli-runtime/SKILL.md lines 36 and 97).
Green — multiplier tightened to model scope:
- Refactored
PROVIDER_TIMEOUT_MULTIPLIERS = { gemini: 2 }→{ gemini: { "gemini-3.1-pro-preview": 2 } }. RefactoredresolveTimeoutMssignature to(provider, kind, { model, defaultModel }). Resolution: explicit--modelwins; falls back to cached upstream-default model only if caller did not pass one. So--model gemini-flash-2.5stays at base 120s/600s/300s even though the cached default is a reasoning model — addresses gemini self-review's complaint that the multiplier was over-broad. gemini-cli-runtime/SKILL.md: Latency expectations rewritten with explicit resolution rules and a note that adding new reasoning model ids (when upstream releases them) is the maintenance path — do not blanket-multiply the whole provider.qwen-cli-runtime/SKILL.md: Safety rule "If Bash call fails, return nothing" gets a Rationale clarifying this is a forwarder contract — the companion already encodes failure inerror/exit code, the subagent re-emitting prose would only duplicate or paraphrase. (Addresses qwen self-review #2.)
Side check — mini-agent upstream: verified via GitHub API (/repos/MiniMax-AI/Mini-Agent): no releases, no tags, latest commit d76a4f63 2026-02-14 (cosmetic fix). Still 0.1.0; minimax self-review's hint about "possibly newer version" was unsupported. Memory entry stays accurate.
- Triggered by a real Codex session that grepped the user's
PATHdirectories for apolyclibinary, found nothing, concluded "polycli has no callable entry point", and fell back to invokingqwendirectly — defeating the routing purpose of polycli. Codex-rescue review (agentafee5f7a594387551) confirmed the misleading signals: hero SVG showed$ polycli health --json(shell prompt), and README L25/L36/L108 used cross-host vocabulary phrasing that read as ifpolycliwere a portable shell command. docs/assets/readme-header.svg:54:$ polycli health --json→/polycli:health --json. Removes the shell-prompt visual cue from the first thing every reader sees.README.md"What is polycli?" gets a callout: polycli is an in-host plugin, nopolyclibinary onPATH, each host adapter exposes the same vocabulary in its own invocation style. Quick-start Copilot row annotated as "skill word — NOT a PATH binary; only inside the copilot prompt" so that line cannot be screenshot-grepped out of context.README.mdadds## Outside a supported hostsection listing three honest options for non-Claude-Code/Codex/Copilot/OpenCode agents: (1) install the host adapter for the environment, (2) call the underlying provider CLI directly with explicit trade-offs, (3) escape hatch —PLUGIN_ROOT=... node scripts/polycli-companion.bundle.mjs ...marked unstable and internal. Verified againstplugins/polycli-codex/skills/polycli/SKILL.md:11(uses${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-}}).README.zh-CN.mdandREADME.ja.mdget the in-host callout + Quick-start row clarification, but link back to the EnglishOutside a supported hostsection instead of duplicating the full block (translation drift > terse cross-link).- Docs only — no code, no test changes.
plugins/polycli/scripts/polycli-companion.mjsintroducesPROVIDER_TIMEOUT_MULTIPLIERS = { gemini: 2 }and aresolveTimeoutMs(provider, kind)helper. Applied to the two prompt-execution code paths (parsePromptExecutionfor ask/rescue,runReviewfor review/adversarial-review).healthretains the universal 60s budget — gemini's health probe is sentinel-only and does not exercise reasoning.- Effective ceilings for gemini:
ask240s (was 120s),rescue1200s (was 600s),review/adversarial-review600s (was 300s). All other providers unchanged. - Motivation: gemini is a deep-reasoning model that routinely spends 30s–several minutes thinking before emitting visible text (live observation across 2026-04-29 bench + this session: rescue PONG took 44.7s vs qwen 2.9s on identical prompt). Hard-coded 300s
reviewceiling was the closest one to silently masquerade as "polycli broken". plugins/polycli/skills/gemini-cli-runtime/SKILL.mdadds a## Latency expectationssection explaining the multiplier, listing the new vs old ceilings per kind, and recommending--background+/polycli:statuspolling for prompts of unknown duration. Subcommand table updated to reflect the gemini-specific timeouts.- Background worker (
runJobWorker) reusesexecution.timeout, so the multiplier propagates to background jobs as well — no separate code path needed.
plugins/polycli/skills/{qwen,gemini,kimi,minimax}-cli-runtime/SKILL.mdreferenced ataskcompanion subcommand that does not exist on the unified surface (companion exposessetup,health,ask,rescue,review,adversarial-review,status,result,cancel,timing). The references were inherited verbatim from the legacy*-plugin-ccrepos in R8c (commit 193078f) where each plugin had its own companion with ataskcommand; on the unified surface that role split intoask(120s, one-shot) andrescue(600s, multi-step). Apolycli:polycli-provider-agentsubagent that read the SKILL literally would have invokedtaskand crashed withUnknown subcommand 'task'.- Same edit also dropped non-existent
task-resume-candidate(resumable state lives behind--resume-last) and the legacywrite-keyhelper from minimax (no longer on the unified surface). - End-to-end smoke:
polycli-companion.bundle.mjs rescue --provider qwenreturnsok=true,kind=rescue, response present (real qwen-cli 0.15.6, qwen3.6-plus).ask --provider qwenalready worked. - Docs only — no companion / runtime / bundle changes.
- Verified
openai/codex-plugin-cc(the only LLM-provider-official Claude Code plugin) is at v1.0.4 /807e03aand matches the locally installed marketplace clone — no upstream updates since 2026-04-18. - Surveyed 25+ AI-provider GitHub orgs, the
*-plugin-ccnaming convention, and Anthropic'sclaude-plugins-official(171) +claude-plugins-community(1921) marketplaces. Result: as of 2026-04-30, OpenAI is still the only LLM provider with an official Claude Code plugin. Google / xAI / Mistral / DeepSeek / Qwen / Kimi / MiniMax / Cohere / Meta / Groq / Zhipu / 01-ai / Perplexity / OpenRouter — all absent. Microsoft has platform skills (skills-for-fabric,power-platform-skills,skills-for-copilot-studio) but no LLM-provider bridge. - Created daily-running remote routine
trig_01RLU5aqzYkuPFA8LMQKcnzo(https://claude.ai/code/routines/trig_01RLU5aqzYkuPFA8LMQKcnzo) to watch this signal: 02:00 UTC every day, sonnet-4-6, scans the same orgs/marketplaces and is loud only when a new official provider plugin appears. - No code changes in polycli itself.
- Added
docs/benchmarks/capability-matrix.mdlisting workflows where bare-shell has no meaningful equivalent: adversarial-review, background job control, session resume, stop-review-gate hook, 4-state timing, multi-host consistency (Claude Code / Codex / Copilot / OpenCode), providerhealthprobe, probing-cost amortization. Companion tobench-vs-bare-cli-spec.md. These are presence/absence claims, not byte ratios — forcing them into a token comparison would be dishonest because there's nothing to compare against. - README "Cost vs raw shell calls" section gets a one-line pointer to the capability matrix.
- Spec followup #3 (Path b disciplined-bare-shell) closed as permanent deferral: the (a) vs (c) data already gives a clear directional answer (69–98% reduction across cells, advantage from probing-cost amortization). Cost-benefit (Anthropic SDK dep + ~18 paid API calls per re-run) does not justify the refinement.
- Investigated the CLAUDE.md inheritance question raised in pilot (parent answered in Chinese, polycli claude in English on the same review task). Not a bug. CLAUDE.md inheritance works at the CLI layer (
claude -p) and the polycliaskcommand — both respect the user's language preference. The English output observed in pilot came frombuildReviewPrompt(plugins/polycli/scripts/lib/review.mjs), whose template is hardcoded English ("You are acting as inside polycli.", etc.); combined with the English diff payload, models default to English forreview/rescue/adversarial-review. Treated as feature, not bug — multi-provider review benefits from a consistent prompt baseline. Spec followup updated. - README: clarified "Bare-shell + probing" column meaning with a footnote pointing to
probing-cost.json. The previous header could read as raw response bytes; clarification follows Codex review feedback. docs/benchmarks/results-2026-04-29.md: added a caveat noting thatqwenreviewrun #2 returned 1 byte atexitCode: 0(treated as success because exit code, not body, gates the bench's failure count). Median is unaffected; flagged for transparency.
- Added
plugins/polycli/skills/claude-prompting/SKILL.md. Polycli previously hadgemini-prompting/kimi-prompting/qwen-prompting/minimax-promptingbut no per-provider prompt scaffolding for theclaudeprovider. The new skill encodes claude-specific prompting guidance (CLAUDE.md does not propagate, same model family, stateless by default, error-surface notes). - Hardened
scripts/bench-vs-bare-cli.mjswith path sanitization: replaces$HOMEwith~in all stored stdout/stderr/parsedJson before writing results JSON. Earlier run leaked maintainer-local paths intoresults-2026-04-29.jsonbecause qwen rescue output hallucinated absolute paths under the bench cwd;scripts/tests/open-source-hygiene.test.mjscaught it. - Re-sanitized the published
docs/benchmarks/results-2026-04-29.jsonretroactively.npm testnow passes 287/287.
- Added
scripts/bench-vs-bare-cli.mjs: N=3 live bench comparing path (a)Bash(<provider> -p)and path (c)polycli-companionforgemini/qwen×ask/review/rescue. Outputsdocs/benchmarks/results-<date>.{json,md}. - Collected
docs/benchmarks/probing-cost.json(lower bound:which+--helponly): gemini 3843 B, qwen 8077 B. - Headline: with probing cost amortized, polycli reduces parent-context bytes by 69-98% across all six scenario × provider cells. Without probing cost, boundary bytes vary by cell with no consistent direction. polycli's token advantage comes from invocation-knowledge encapsulation, not output compression.
- Added README "Cost vs raw shell calls" section pointing at the results.
- Spec lifecycle (
tasks/bench-vs-bare-cli-spec.md): two rounds of Codex sign-off, post-pilot amendment switching from fixture replay to live CLI calls (fixture replay was erasing probing cost), and a final Codex round-3 review that surfaced three blocks (missingrescuescenario, raw stdout not preserved for diagnosis, ±15% noise claim incorrect) — all fixed before publish. - Path (b) disciplined-bare-shell deferred — needs Anthropic SDK to drive Claude programmatically; pilot data suggests (b) and (c) are close on boundary bytes.
- Followups noted in spec: add
claude-promptingskill (no per-provider scaffolding for theclaudeprovider in polycli today); investigate global CLAUDE.md inheritance into polycli subagent.
- Merged all open Dependabot PRs after the v0.6.2 publication:
actions/setup-node4 -> 6,actions/checkout4 -> 6, andzod4.1.8 -> 4.3.6. - Confirmed the public repo has no open PRs,
mainis clean atfe4c6d6, the latest release remainsv0.6.2, and the published npm packages remain aligned with the release notes. - Re-ran
npm test,npm run release:check, andnpm audit --audit-level=moderate; all passed, with 287/287 tests and 0 vulnerabilities. - Confirmed GitHub Actions CI succeeded on the three post-release
mainpush runs. GitHub social preview remains a repository settings UI upload usingdocs/assets/social-preview.png; GitHub CLI exposes no social preview image option.
- Added GitHub Actions CI, README release/OpenCode badges, and a social preview PNG derived from the README header SVG.
- Tightened public package metadata for
@bbingz/polycli-opencode,@bbingz/polycli-utils, and@bbingz/polycli-timing. - Replaced the long
release:checkshell command withscripts/check-release.mjs. - Expanded open-source hygiene scanning to all tracked files and archived historical review/session docs under
docs/archive/.
- Prepared host plugin manifests and OpenCode package for
0.6.2; prepared@bbingz/polycli-utilsand@bbingz/polycli-timingfor1.0.1. - Fixed the timing package tarball so
@bbingz/polycli-timing/schemaresolves to a packedtiming.schema.json. - Added package-local MIT
LICENSEfiles for all public npm packages and open-source packaging tests that verify export targets and license inclusion from realnpm pack --dry-run --jsonoutput. - Removed the OpenCode adapter dependency on
@opencode-ai/plugin, replacing it with a tiny local wrapper pluszod;npm audit --audit-level=moderatenow reports 0 vulnerabilities. - Scrubbed public fixtures and package AGENTS files of maintainer-local paths, host auth metadata, local memory metadata, and provider reasoning signatures; added a hygiene regression test for those patterns.
- Replaced the flaky wall-clock concurrency assertion in the health integration test with fake-provider start/end event overlap verification.
npm run release:checkpasses end-to-end with 286/286 tests and publish dry-runs for@bbingz/polycli-opencode@0.6.2,@bbingz/polycli-utils@1.0.1, and@bbingz/polycli-timing@1.0.1.
- Bumped 6 manifest/package versions from
0.6.0to0.6.1:plugins/polycli-opencode/package.json,.claude-plugin/marketplace.json(× 2 entries),.github/plugin/marketplace.json(× 2 entries),plugins/polycli-codex/.codex-plugin/plugin.json,plugins/polycli/.claude-plugin/plugin.json,plugins/polycli-copilot/plugin.json.@bbingz/polycli-utilsand@bbingz/polycli-timingstay at1.0.0(no source changes). - Drafted
docs/release-notes-v0.6.1.md— docs/legal patch only: README rewrite + i18n (en/zh-CN/ja), rootLICENSE, dead-absolute-path fix, latent fix specs filed intasks/. - Updated
docs/release.md"Current Release State" to v0.6.1.
- Rewrote
README.mdfrom scratch as international-standard, English-default. Added clear hero pitch, "Why polycli" differentiation (4-state timing honesty, no fake unification, direct CLI passthrough), badges (npm version × 2, MIT license, Node ≥20), and a language switcher. - Added translations:
README.zh-CN.md(Simplified Chinese) andREADME.ja.md(Japanese). All three are full peers — not abbreviated versions. Technical terms (runtime,streaming,session resume,Path B,monorepo) kept in English by convention; Japanese version uses です・ます style. - Added root
LICENSEfile (MIT,Copyright (c) 2025 bbingz) — the sub-packages already declared MIT, the root file was missing. GitHublicenseInfowas previouslynull; this fixes the License badge target and makes the project legally complete by community standards. - Fixed dead links: previous README contained absolute paths like
/home/user/-Code-/polycli/...that did not work on GitHub. All internal links are now repo-relative. Verified every referenced path exists. - Restructured: hero → why → hosts/providers → install → quick start → core commands → capability matrix → timing semantics → packages → development → release → contributing → license. Old structure (Who This Is For, Background Jobs, Current Scope) removed or merged.
- Upgraded local provider CLIs to upstream latest:
copilot1.0.35 → 1.0.39,kimi-cli1.37.0 → 1.40.0,mini-agent(git+main) refreshed to 2026-02-14 commit (deps: pydantic 2.13.2 → 2.13.3, uvicorn 0.44 → 0.46, sse-starlette 3.3 → 3.4). Five other CLIs (claude, gemini, qwen, opencode, pi) already at upstream latest. - Verified kimi 1.40 and refreshed mini-agent stream-json compatibility via live probes.
kimi.test.js13/13 still pass; liverunKimiPromptStreamingextracts response and sessionId correctly. mini-agent live probe parses 48 progress events, strips ANSI, extracts response. - Ran 8-CLI default-model audit by spawning each provider with a "what model are you" prompt and reading polycli's
result.model. Surfaced two latent bugs:gemini.js:135takesObject.keys(parsed.stats?.models ?? {})[0]— first attempted model, not actually-used. Misleads when gemini-cli auto-falls-back from a 429-throttled preview (e.g.gemini-3.1-pro-preview→gemini-2.5-produe to Google server-side preview capacity).kimi.js:174/:264hasreadKimiDefaultModel()reading~/.kimi/config.toml, but it's only consumed bygetKimiAuthStatus, never threaded intorunKimiPromptStreaming/runKimiPromptresults — soresult.modelis null even when config has a default.
- Both fixes drafted as specs in
tasks/model-extraction-fixes.mdfor Codex implementation. Non-breaking; target v0.6.x patch or v0.7. - Memory: added
reference_cli_provider_versions.md(per-CLI version-check + upgrade commands + gotchas),reference_default_model_extraction_caveats.md(which providers'result.modelis unreliable and why), andfeedback_no_ask_for_nondestructive.md(skip confirmation gates for sandboxed/read-only ops).
- Relaxed the CLAUDE.md legacy-repo constraint to a permanent "allow grep, no edits" form (dropped the "R8 期间" conditional now that R8 is complete and R8g was cancelled).
- Updated
project_legacy_repos_reference.mdmemory from "R8 convergence targets" to "permanent references; v0.6.0 absorbed their functionality". - Added two new feedback memory entries: codex-rescue operational quirks (fire-and-forget wrapper, sandbox git-commit block, branch-name misreport) and release-ops gotchas (claude plugin validate Node 25 crash, npm 2FA TTY requirement).
- Pushed
mainand tagv0.6.0(tag ata95e3d8). - GitHub release live at https://github.com/bbingz/polycli/releases/tag/v0.6.0 with notes from
docs/release-notes-v0.6.0.md; no tarball asset attached (OpenCode users install from npm). - Published
@bbingz/polycli-opencode@0.6.0to npm; confirmed vianpm view @bbingz/polycli-opencode versions. - Closes roadmap R8a-R8f. R8g (legacy repo archival) deliberately skipped per user direction ("不用 archive"); four legacy plugin repos remain as read-only references on GitHub without archival status.
@bbingz/polycli-utils@1.0.0and@bbingz/polycli-timing@1.0.0unchanged from v0.5.0; runtime stays private.
- Added
docs/release-notes-v0.6.0.mdcovering R8a-R8e deliverables with a full legacy → polycli migration table (slash commands, kimi session flags, gemini approval/effort flags, subagent types, guidance skills, hooks). - Flagged R8f as done; R8g (legacy repo archival + CLAUDE.md relaxation) still pending.
- Status: draft. Release date and version-bump execution held until user kicks off release prep.
- Added Claude Code SessionStart / SessionEnd / Stop hook registration for the polycli host plugin, with lifecycle state cleanup and the optional stop-review gate.
- Recorded the last-used ask/rescue provider in workspace state so the gate honors the user's current provider selection, with health-probe fallback when no provider is recorded.
- Added hook tests for lifecycle cleanup, multi-line ALLOW/BLOCK sentinel parsing, timeout skip behavior, and unresolvable-provider skip behavior.
- Added Kimi-only
--resume-last/--resume <uuid>/--freshhandling on/polycli:askand/polycli:rescue, including wrapper-side session validation and resume-mismatch warnings. - Added Gemini-only
--writeand--effort low|medium|highhandling on the unified ask/rescue surface. - Documented and tested unsupported-provider silent-drop notes for the new provider-specific flags.
- Reversed the prior non-goal "No migration of legacy sibling repos into this monorepo" after a capability gap audit against
gemini-plugin-cc/kimi-plugin-cc/qwen-plugin-cc/minimax-plugin-cc. - Added R8 to
docs/roadmap.mdwith sub-items R8a–R8g: kimi session continuation; session-lifecycle + stop-time review gate hooks; per-provider guidance skills; rescue flag semantics; per-provider subagent types; namespace UX; legacy repo retirement. - Updated
project_legacy_repos_reference.mdmemory to flip the stance from "reference-only, never migrate" to "convergence targets under R8; grep-for-port OK, no edits." - Narrowed the CLAUDE.md architecture-boundary constraint on legacy repos from "不要 grep、不要编辑" to "不要编辑; R8 期间允许 grep-for-port" (user-confirmed in same session).
- Pushed
mainand tagv0.5.1(tag at0b79c86). - GitHub release live at https://github.com/bbingz/polycli/releases/tag/v0.5.1 with notes from
docs/release-notes-v0.5.1.md; no tarball asset attached because OpenCode users install from npm. - Published
@bbingz/polycli-opencode@0.5.1to npm and confirmed it appears innpm view @bbingz/polycli-opencode versions.
- Bumped the four host plugin manifests and Claude/Copilot marketplace metadata from
0.5.0to0.5.1. - Drafted
docs/release-notes-v0.5.1.mdfor the Q2/Q3 guardrail patch release. - Release scope is host/plugin line only: publish
@bbingz/polycli-opencode@0.5.1; keep utils/timing at1.0.0and runtime private.
- Closed Q2 by documenting the model fallback policy and adding a host integration test that proves cached setup model metadata is used only as the final
defaultModelfallback when a provider stream omits model fields. - Closed Q3 by accepting host-surface asymmetry as the durable design and adding
npm run validate:host-mapto keepdocs/host-command-map.md, Claude commands, Codex/Copilot skills, OpenCode tools, and the companion dispatcher aligned. - Refreshed
docs/roadmap.mdto mark R1-R7 and Q1-Q3 closed after v0.5.0.
- Pushed
main+ tagv0.5.0(tag at 306c703 — R5 fixture replay pilot commit). - GitHub release live at https://github.com/bbingz/polycli/releases/tag/v0.5.0 (notes from
docs/release-notes-v0.5.0.md). - npm: first public publishes of
@bbingz/polycli-utils@1.0.0and@bbingz/polycli-timing@1.0.0;@bbingz/polycli-opencode@0.5.0also published. All three confirmed vianpm search '@bbingz/'. - Closes roadmap R5 (Claude host fixture pilot), R6 (auth-probe transient-error regex named contracts), and Q1 (utils + timing published). Q2 and Q3 remain in "observing" state. Runtime stays private. 256/256 tests pass at release tag.
- Bumped the four host plugin release manifests and both host marketplace metadata entries from
0.4.2to0.5.0. - Drafted
docs/release-notes-v0.5.0.mdcovering R6 (auth-probe regex contracts), P1/Q1 (utils + timing first public npm publish), and R5 (Claude fixture replay pilot). release:checkpasses end-to-end: 256/256 tests, manifest validation, plugin validation,@bbingz/polycli-opencode@0.5.0/@bbingz/polycli-utils@1.0.0/@bbingz/polycli-timing@1.0.0dry-run publishes all succeed.
- Added captured real Claude CLI stream fixtures for host-level
/askand/healthsuccess coverage. - Added a host integration replay helper that surfaces missing fixture files explicitly and replays captured stream output through the bundled companion without changing other provider tests.
- Converted the Claude
/asksuccess path to fixture replay and added a Claude/healthsuccess integration test that records timing from the replayed stream.
- Made
@bbingz/polycli-utilsand@bbingz/polycli-timingpublishable by removingprivate: trueand adding npm metadata, package file lists, and public publish config while leaving@bbingz/polycli-runtimeprivate. - Refreshed both package READMEs and rewrote
docs/polycli-v1-public-surface.mdas the live v1 contract for utils + timing only. - Added
pack:utils/pack:timingscripts, updated manifest validation to require only runtime to stay private, and maderelease:checkvalidate publishable packages repeatably: unpublished versions usenpm publish --dry-run, already-published versions fall back tonpm pack --dry-run.
- Extracted the transient auth-probe regexes in gemini / qwen / kimi / opencode / pi into provider-local
TRANSIENT_PROBE_ERROR_PATTERNSexports without changing the existing match behavior. - Added provider tests that assert the named patterns keep timeout-like probe failures in the
loggedIn=true/ inconclusive path while still treating explicit401 Unauthorizederrors as genuine auth failures.
- User directive on 2026-04-24: publish
@bbingz/polycli-utilsand@bbingz/polycli-timingto npm ("能用就应该发"). Extendeddocs/archive/review-2026-04-24-v0.5.0-spec.mdwith a P1 (Q1) section covering manifest fields, README refresh, v1-public-surface rewrite,pack:utils/pack:timingscripts, andrelease:checkextension with dry-run publishes. - Q2 (model fallback sustainability) and Q3 (four-host surface convergence) marked "observing" in
docs/roadmap.mdper user direction: record the concern, do not act until a signal accumulates. - Runtime (
@bbingz/polycli-runtime) stays"private": true; this decision applies only to utils + timing.
- Added
docs/host-command-map.md— capability × host mapping for all 10 polycli commands across Claude Code / Codex / Copilot / OpenCode plus side-by-side invocation examples. Closes roadmap R4. - Added
scripts/check-review-cli-drift.mjsthat probes installed provider CLIs and asserts the flags/reviewhard constraints depend on (--tools/--approval-mode/--policy/--excluded-tools/--agent/--no-tools) still exist. Env-var based constraints (MiniMaxMINI_AGENT_CONFIG_PATH, OpenCodeOPENCODE_CONFIG_CONTENT) are listed as manual-watch reminders. Wired asnpm run check:review-drift. Closes roadmap R7. - Refreshed
docs/roadmap.md: removed the completed R1 / R2 / R3 / R4 / R7 entries, updated Current state to v0.4.2 / 250 tests, narrowed v0.5.0 scope to R5 + R6 + optional Q1/Q2/Q3 decisions.
- Pushed
main+ tagv0.4.2(tag at 5c7f709 — R2 runtime fix commit). - GitHub release live at https://github.com/bbingz/polycli/releases/tag/v0.4.2 (notes from
docs/release-notes-v0.4.2.md). - npm:
@bbingz/polycli-opencode@0.4.2published. - Closes roadmap R1 (p2-p3-backlog merged; 511fceb dropped as superseded by 12d9ca9), R2 (minimax capability matrix + review.mjs YAML hardening + tmp cleanup), and R3 (v1 surface doc superseded). 250/250 tests pass at release tag.
- Bumped the four host plugin release manifests and both host marketplace metadata entries from
0.4.1to0.4.2. - Drafted
docs/release-notes-v0.4.2.mdcovering the R1 (spawn cancellation / arg parsing / stream JSON scalars / performance.now timing) and R2 (review.mjs YAML scalar + tmp cleanup) roadmap closures. release:checkpasses end-to-end: 250/250 tests, manifest validation, plugin validation,@bbingz/polycli-opencode@0.4.2dry-run publish.
- Replaced MiniMax review config scalar extraction with a small private parser that supports plain, single-quoted, and double-quoted scalars while rejecting unsupported block/folded and malformed YAML forms.
- Registered review temp files for best-effort cleanup on process exit so generated per-review config directories do not accumulate across long-running hosts.
- Added regression coverage for supported scalar forms, unsupported block scalars, malformed config lines, comment handling, and child-process exit cleanup.
- Landed the surviving
p2-p3-backlogruntime commits as one squash:spawnStreamingCommandnow supports AbortSignal cancellation, stdout decoder overflow protection, stdin drain handling, and post-settle output suppression. - Hardened runtime reliability around MiniMax log-read failures, provider exit error formatting, and registry timing by switching prompt duration measurement to monotonic
performance.now(). - Tightened shared utility and timing edge cases: argument parsing rejects malformed empty booleans / unterminated quotes, stream JSON parsing recognizes arrays and bare scalar values, and timing validation rejects invalid numeric bounds.
- Added a provider capability matrix to root
README.md(streaming / sessionResume / structuredOutput / ttft / gen / tail / tool) sourced frompackages/polycli-runtime/src/registry.js. Surfacesminimax's session-resume / structured-output / streaming-timing limits in the root doc instead of only inplugins/polycli-opencode/README.md, and explains whyqwen'stool: "missing"is semantically distinct from the other seven providers'tool: "unsupported". - Prepended a Superseded banner to
docs/polycli-v1-public-surface.md(v0.3 snapshot) pointing to the live surface sources (README.md,registry.js,timing.js,CHANGELOG.md,docs/roadmap.md). Content below the banner is preserved as historical reference. - Updated
CLAUDE.mdMust-read list: addeddocs/roadmap.md, relabeled the v1 surface doc as a v0.3 snapshot / not a live constraint. Closes roadmap R3 (Path B) and R2 (minimax matrix).
- Pushed
main+ tagv0.4.1(HEAD at eaddbbd). - GitHub release live at https://github.com/bbingz/polycli/releases/tag/v0.4.1 (notes from
docs/release-notes-v0.4.1.md). - npm:
@bbingz/polycli-opencode@0.4.1published. Earlier suspicion that v0.4.0 had never reached npm was a token-expired false positive;npm viewconfirms 0.3.0 / 0.4.0 / 0.4.1 all present. - Closes the review loop that began with
docs/archive/review-2026-04-24.md. All 8 bugs fromdocs/archive/review-2026-04-24-bugs.md(B1–B8) plus FU1–FU3 release-prep follow-ups landed. 221/221 tests pass at release tag.
- Six provider runtimes (claude / gemini / kimi / minimax / opencode / pi) now populate the top-level
modelfield on ask results, matching qwen and copilot. - Added a
defaultModelpass-through in the registry so the host companion can supply a cachedgetAuthStatusvalue as a final fallback when the provider's own events do not carry a model. - Per-provider fixture and fallback assertions lock the new contract; integration smoke tests assert non-null
modelfor all 8 providers.
- Normalized provider CLI availability details to the first non-empty line so multi-line version banners no longer break
setuptext rendering. - Made
--jsonerrors structured for argument and lookup failures, added subcommand--helpshort-circuiting, and validatedtiming --provider/--historyinputs. - Aligned
cancelno-op exit behavior and flattenedresult --jsonso completed job payloads exposeresponse,ok,sessionId, andtimingat the top level while retainingjobmetadata.
- Bumped the four host plugin release manifests and host marketplace metadata from
0.4.0to0.4.1, while keeping internal workspace packages on the1.0.0line. - Marked
@bbingz/polycli-utilsand@bbingz/polycli-timingas private internal bundler inputs, matching@bbingz/polycli-runtime. - Removed the Copilot adapter from the Claude marketplace now that Copilot has its own marketplace, and kept release manifest validation wired into
release:check.
- Fixed the pi JSON stream parser so visible assistant text is sourced from
text_deltawhen present, with terminalmessage_end/turn_end/agent_endtext only used as a fallback; this removes the repeated final-answer concatenation seen in live pi runs and saved fixtures. - Pinned the default pi model to
openai-codex/gpt-5.4so host-drivenaskcalls no longer depend on whatever ambient pi config happens to select. - Updated pi fixture expectations and added focused regression coverage for both the duplicate-terminal-summary case and the default-model invocation contract.
- Added prompt-runtime constraints for prompt-bearing commands so
asknow applies the missing host-level visibility guards:kimigets--no-thinking --max-steps-per-turn 1;qwengets--max-session-turns 1plus a forced visible-final-answer system prompt. - Added focused regression coverage for those ask-path constraints and the shared helper that computes them, closing the gap where
/reviewwas hardened but/askwas still unconstrained. - Extended fake provider integration fixtures so qwen/kimi can simulate thought-only output when constraints are absent; this makes the failure mode observable in CI instead of only via live session history.
- Verification on
main:npm testpassed191/191; live non-Claude smoke (gemini,kimi,qwen,minimax,copilot,opencode,pi) all returned successfulsetup+ask, withqwen/kiminow producing visible finalOKthroughpolycli.
- Pushed
main+ tagv0.4.0(HEAD at 08f84c3). - GitHub release live at https://github.com/bbingz/polycli/releases/tag/v0.4.0 (notes from
docs/release-notes-v0.4.0.md). - npm:
@bbingz/polycli-opencode@0.4.0published;npm viewconfirms no propagation lag. - Closes the review loop that began with
docs/archive/review-2026-04-22.md. All P0/P1 from that review plus P3 fixture migration landed. 185/185 tests pass at release tag.
- Appended three spec sections to docs/archive/review-fb64b1e.md:
- Group 4: P2 host-plugin hygiene (appendPreview O(n²), previewText emoji, auto-scope shallow-clone diagnostics) — one-commit batch.
- Group 5: real-CLI saved-stdout fixture migration (per-provider capture list, replay helper design, scope guards against running capture in CI).
- Release checklist: v0.4.0 step-by-step with explicit Codex / user / Claude role split for each step.
- Created tasks/lessons.md with the "stay in reviewer role" correction — do not slip into implementation mode when the division of labor is Claude-reviews-Codex-implements.
- Appended verdict A to docs/archive/review-fb64b1e.md: atomic-save durability +
/reviewCLI hard constraints both landed;npm test171/171. - Codex's Phase 1 research (docs/archive/review-cli-flags.md) corrected 4 of 6 CLI-flag hypotheses from the original review against locally installed CLIs + primary sources.
- Non-overridable review constraint decision documented and enforced via
assertNoReviewConstraintOverride. - Original review P0/P1 scope now 100% closed. P2/P3 move to release backlog.
- Appended verdict to docs/archive/review-fb64b1e.md: Group 1 landed cleanly (P1-C / P1-D / P1-E / registry gemini branch), 152/152 tests passing.
- Group 2 (atomic-save durability) and Group 3 (/review CLI hard constraints) now have concrete per-file fix specs appended to the same doc, including test plans and scope guards.
- Group 3 requires a Phase 1 research pass (per-provider CLI flag verification) before Phase 2 code changes; suggested output is a short memo at
docs/archive/review-cli-flags.md.
- Authored docs/archive/review-fb64b1e.md: verdict A- on Codex's fix batch.
- All 6 P0 items fixed with correct semantics + 23 new regression tests (npm test: 146/146).
- P1 fixed: A (transient probe), B (session-id fall-through), G (jobs/.json locking), H (stdout-as-error paths).
- P1 deferred for next batch: C (generic event.text fallback), D (copilot/opencode type:"error" capture), E (gemini hasVisibleText), F (atomic-save fsync), I (/review CLI hard constraints), plus registry
isTerminalSummaryEventgemini branch. - Recommended next-commit grouping: Group 1 (streaming parser consistency = C+D+E+registry); Group 2 (atomic-save durability = F); Group 3 (/review constraints = I).
- Authored docs/archive/review-2026-04-22.md: 4-agent parallel review across utils+timing, runtime core, 8 provider adapters, and host plugin (~5,200 LoC source, ~117 raw findings).
- Report is structured as P0 (6 ship blockers) → P1 (9 high-risk themes) → P2 (parser / timing / process / host grouped) → P3 (gaps and nits).
- Flagged one runtime-core agent recommendation to REJECT:
timing.js:66, 73hardcodingcold/retryasunsupportedis correct per the documented project decision; do not change tomissing. - No source code touched; review doc only.
- Added
CLAUDE.mdat repo root: thin Claude-Code-specific patches layered on top ofAGENTS.md(architecture boundary, test command priority, provider gotchas). - Added this
CHANGELOG.mdto satisfy cross-AI collaboration convention from the user's global rules. - Seeded project memory under
~/.claude/projects/-Users-bing--Code--polycli/memory/withMEMORY.mdindex and layered entries (user / project / feedback / reference). - No source code touched; no tests run (docs/infra only).