Repository navigation
fix: residuals of the 2026-10-13 bug hunt (classifier runners, redaction, telegram media, CLI) - #323
Merged
Merged
Conversation
Unquoted operators are words of their own, so a quoted word followed by an operator no longer swallows it and an assignment cut by an operator reports no program. Test file also carries the verifier-args test, which passes with the next commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 9187ff5d6375468ee9c798d5fca6491d0d9d78e2)
Arguments are model-authored and may be copied from untrusted content; they now sit inside the nonce'd boundary and the prompt names them as data. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 7a43a7ce0c02d4bfcd47b9449f4893fdd396109b)
The SDK reports pause_turn and model_context_window_exceeded as an empty reason while end_turn is stop, so an empty reason without tool calls from an Anthropic provider is interrupted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit d1b11db4ed013f15e7d23e76ea474b49076ee280)
The model-authored clarify question is sanitized like approval prompts, in both the WebUI frame and the recorded decision. Adds the area test file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit ccd321e73a0160c65876d471b61375b92216c236)
A prompt rejected for a bad session token no longer changes the connection's model or thinking setting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 6c7d4dbaca2d44637c5bb9fcd7ba79aa89300ad9)
… setting Per-class friction no longer advertises a typed confirmation the answer endpoint does not require; docs corrected (REST runs do not echo auth_token). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit dd20e25df0cff62a4fdd212f5de7233e1689d167)
Reuses the search_files skip list, stops after 2000 entries with a notice, and drops the raw file name from lstat error entries. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 6711710279fe7539ed53d83b97e3cf22c6e2e07f)
Error results are always valid JSON; the verified open uses O_NONBLOCK so a FIFO swap cannot hang the call. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit a731c287ae34dce44a615a2c891e1e6938d3f38f)
ValidateSessionID rejects index and vectors_meta, and directory scans no longer treat vectors_meta.json as a session. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit e2e89412253b6c1c446f3d9c81c3b790c00924d8)
ResolveImage refuses explicit images starting with '-' or containing whitespace/control characters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit eb8d3de196be9d0e967cfa8efd6c548e9e37dd58)
Heartbeat files left by crashed or os.Exit'd scheduler hosts are removed once unrefreshed for 10 minutes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit cb3d58afcfda2b5b0b75481c7628d7553acb5bca)
readKeyFromInheritedFD uses strconv.Atoi and rejects signs, so values like 3x no longer select fd 3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 233619e46b7486675ecc3c19ebc61a8ef4fd0df6)
…uest timeout The client has no whole-body deadline; header waits and body stalls are bounded (30s idle) under the existing 5 minute command cap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit e97e3619e6efa701723d22dde06353f47e9a6224)
Leading help requests for session/schedule/skill/run/continue/repl/init/ subagent print usage and exit 0; flag.ErrHelp from flag-parsed subcommands is success. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 9227a35117021957dfe2b7a17b0cf51be0ca441f)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 53214311517f43ee6154ec351a497eb8737107f4)
A profile that enables a globally disabled tool is no longer overridden by the global filter handed to the engine. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 87a0763a7234bf549cff79c2926860eaf3eb6d4c)
…behavior Also adds the regression tests for the runtime/ops fixes in cmd/odek. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 2d0005899047409b947e0b597da950e5b7071e66)
…wn media Reads under ~/.odek/media of another chat's downloads are refused on Telegram turns, matching the outbound-upload scope. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 8f1dfed9121fee0df0c33ebace45d81f1729b3c3)
…date loop Per-chat ordered background queue with panic containment; documents the media read scope. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit ef8aaf8cab1bc45360a33ea5e9fee21b3125a3bb)
…next turn The summary was injected into a session object the next turn discards (and cost an LLM call on the update loop); /resume now marks the chat and the turn injects it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit ec510eb83914a2f6be7da8b06abf70d9c021e9af)
…replaces ResumeSessionArchived reports the archive id; CheckChatMediaRead also scopes not-yet-existing media paths through symlinked ancestors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit ad1c348e519c64f7604a5d95913cefcd976884de)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 582f4afd94b5a6dc65a2c1bb98bb516997ff5e2b)
list prints each episode's sha256; promote hashes the text it shows (or takes --sha256 for one id) and refuses a changed summary, matching the REST API. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit cc14fdbdcf4263fc6c6ea9b53199f645d3071067)
…d associations Anaphora resolution strips untrusted wrappers before locating a pronoun; stale follow-up deliveries cannot overwrite newer ones; associations.json is merged under a cross-process lock. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit a1c08b6469c0d7a5a1ea0482622eff8130345939)
…tring ends Credential-named values inside a JSON string stop at a \n \r \t escape and at the closing quote, and bare-key values no longer swallow the closing quote. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 473cb6e8899cc48e660409bd59a7beec3d7102db)
Bare-key, flag and .netrc values that a pattern stopped at a \" escape are redacted through it, and doubly escaped quotes no longer end a quoted operand. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 0f6f28c0db4464533690b7316cc7266aca3fa2a2)
Cookie/Set-Cookie values are redacted unless the name reads as a preference; __Host-/__Secure- names always count. Updates two pins that kept loginHint and tokenType tokens readable (now short values). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 8b11ab7a45e5f9bd1c9ba9b52a39813c66baff37)
…can linear Covers unclosed, truncated and over-long escaped-quoted values; a guarded match inside an already redacted span is skipped so continuation never rescans. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 2260faea515f5ac5b761ba95235de838d1897ef8)
token/secret/pwd/pass values written as \"...\" inside a JSON string were never matched; they are now judged as quoted literals. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 314918edd8b144645f4c46d2bb56c337696e6077)
Decompress clusters, ditto, scripted editors, gawk inplace, server-named downloads, scp into a directory, git merge-file/mv -f, more svn/hg verbs (also behind global options) and glob/dynamic write targets. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit b66e7f6d02e4a7a83e6ae40665a7ce82639d0941)
Index and VECTORS_META alias the store-owned files on case-insensitive filesystems; ValidateSessionID and isSessionFile now compare with EqualFold. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 3615939a9fce330713cb50925dd1d8cb48d8eeab)
…'s usage and exits 0 run/continue/repl/init/subagent parsers report -h/--help in the flag section as a help request; exit translators treat it as success. Group commands print their own usage instead of the global one. Help-looking tokens in task text stay unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 01b530e8481ff6b9801c081ccec29d212745683e)
…pending media job Media jobs share the reset gate chain and run their turn inside it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 59aff98c28dec33377bef28e42c922fe7b108d27)
…media head_tail, base64, checksum, diff, json_query, file_info, patch, write_file, search_files, glob and tree share the media read guard; broad search roots skip the media dir. Documents that shell and sub-agents are not scoped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit ddc551f24893cd12fb0c518cdfe0083a88b923a8)
…tions npm exe/explo prefixes and a verb after -- are runner verbs; yarn/pnpm exec|dlx and bun -c options are parsed (pnpm -c is a command line); uv/poetry directory options are the stage cwd for scripts and interpreter operands; pdm run --venv. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 29c1c17bd461aafafdf41fe52cb5c33f64a2b710)
…n leading options Loader keys count only as the package manager's own options outside npm; yarn --cwd/workspace prefixes no longer hide plugin import, import-from-sources or set version. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit ec3efa7d413a93f257af2dd5633995cc79246adf)
… interactive editors aws s3, gsutil, docker/kubectl cp, rclone, gh downloads, sftp, lftp and aria2c write named or unnamed local files; an interactive vim without scripting options writes only the files it names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 5010b374abe6396a0f950577fbf9a010a35a2af1)
The declaration operand no longer matches its own name; regression tests for the review findings on package-manager options, yarn installers, fetchers and editors land here too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit b500fcd20f5bf48613c84095169b526972bbec23)
Restores the original inputs and asserts the new fail-closed cookie outcome instead of the vacuous short-value pins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 50474da0f44ba2a2327fb83512554e65a48cd2ff)
Quoted values are judged without quotes, headers end at literal \r \n \t and the JSON string end, folded Set-Cookie and curl -b/--cookie operands are split into pairs, and Max-Age spellings such as max_age stay readable. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit b7954da6e088626a80dccaa63ca9caae96d3dbc4)
Under a quoted key whose value has the same quotes only the value inside the
quotes is replaced, so {"password":"…"} stays well-formed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 989c4f193ce4d400de4777d40fcd1428e9587709)
An unclosed opening quote is skipped and the value judged unquoted; a doubly escaped quote inside a JSON-escaped value belongs to it. Adds edge coverage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit c217241d2cc2338c3fa165ba7bf297d990caa3bd)
The engine filter merges the effective (profile or global) filter with the parent's stamped filter, so engine-registered tools such as memory obey the same rule as built-ins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 75e18cb8ca6a0a278c980b156e3b25c52ffe0919)
maintenance.ScheduleHeartbeatCandidates is shared by the sweep and the dry-run preview so the cutoff cannot drift. Regression tests for both this and the engine filter are included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit ce91c1d4cf5bca0d69bcbe4712ba07ed77690884)
…listings, per-invocation checksum context /stop and /new cancel queued or running media messages; /resume marks the summary only after the replaced conversation unwinds; glob/search_files/tree skip other chats' media entries; docs state the shell and sub-agents are not scoped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 32e66702def14bf8daefe8193c7ede7ddfaeed6a)
…tch emacs -o FILE and URL base names are named writes, sessions and directories unnamed; emacs Lisp-running modes (--batch, --script, -l, --eval, -f, --daemon) write unnamed files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 7745ea8ee5379cbdb2963b84938bdbe928fd0083)
… calls
Credentials under \"key\": are redacted inside their escaped quotes; Set-Cookie
JSON arrays and setHeader/set/append('Set-Cookie', …) values follow the cookie rule.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit c2d7b942f53b620c361f9dbd4efa80424229b89b)
pnpm -C|--dir, yarn --cwd, bun --cwd and mise exec -C|--cd move the working directory of the command they run; workspace selections make a relative script unknown. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 675b33495527369173dd3f935224c28da02645f2)
…dger uv/poetry run sub/script.py and ./script.py are gated while unread and code_execution once read, instead of unknown. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 10b4d84daa8282c0abdd6e2228337dfa7f5d34c6)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ap per-entry media skip The turn lease derives from the media job context and is re-checked after taking the chat slot; listings resolve the media dir once and only fully check entries inside it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 17d416185b0529268212236d08ad704fa87ae4b0)
…it/chdir runs emacsclient -e/--eval/-a and emacs --chdir write unnamed files; emacsclient operands and emacs --visit/--file/--find-file=FILE are named writes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 9b3e7f370e1f6d30b5aee8a7d39982cf6063e621)
…alues npm/pnpm/yarn/bun/cargo/composer script verbs and registry publish are read with their global option grammars; bun exec STRING is a command line; bun --filter and pnpm -w are unknown directories and pnpm exec -C|--dir after the verb is honoured. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 8f23886b22753a458b1d94db2b82514e03399e71)
… escaped JSON values Array elements may be separated by line breaks and escaped quotes; escaped JSON values track their own escapes and unquoted ones end at ,\" or a bracket. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 903251fcc6f68f47257a9cf15fe4b5ff0bc402fb)
…r; no nil context sentinel Entries reached through a symlinked root are judged by where they really live; runChatTurn takes an explicit gateHeld flag. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 1f06558b6a829b7d9ec0825a4b98cd9a2f48fe0a)
…the read ledger Abbreviations resolve against each tool's option table (ambiguous ones count as any candidate); ALTERNATE_EDITOR set for emacsclient voids licences like -a. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit ec92df678070957138865be4fdac470f4ea701f7)
…the tools npm verbs resolve via camelCase, aliases and unambiguous prefixes; a built-in subcommand ends the verb search (npm -g install test is an install); a non-builtin first word for pnpm/yarn/bun is a package.json script (code_execution). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit f4768c7ab7b18d9e06bb60cf9ee90621d48f705a)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
odek | 24747a6 | Commit Preview URL Branch Preview URL |
Oct 14 2026, 01:11 PM |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes the known gaps left after the 2026-10-13 bug hunt (#322), together with the hunters' unproven notes once each was confirmed with a failing test. Each fix is RED → GREEN with a
TestRED_regression test inredres_2026_10_14_<area>_test.go.Command classifier (
internal/danger)bun --cwd app exec …,npm --prefix app test) no longer hide it.npm exe,npm exploandnpm run-scount.--before the verb no longer hides it.npx -c,npm exec -c,pnpm exec -c,npm explore … --andbun exec STRINGcommand lines are classified.bun --cwd app exec 'rm -rf ~'was allowed with no prompt on main; it is now denied.yarn build,pnpm build,bun devandpnpm --filter web buildare nowcode_execution, likenpm run build. Built-in subcommands are unchanged.npm --prefix app --registry r publish).uv|poetry|pipenv|pdm run script.pynow gates the script, including paths with/.uv --directory,poetry -C,pnpm -C|--dir,yarn --cwd,bun --cwdandmise -C. Workspace and filter selectors that can't be resolved areunknown.ditto, scripted vim/nvim, emacs Lisp runs (with long-option abbreviations),emacsclient -e|-a,gawk -i inplace,curl -J|-K,wget -r|-i|…,scpdownloads,git merge-file/mv -f, and svn/hg verbs.aws s3,gsutil,docker|kubectl cp,rclone,gh release download,sftp,lftp,aria2c,ftp|tftp|fetch -o.yarnPath,plugins,init-module,browser,python,globalconfig,userconfig) arepersistencewhen set andcode_executionwhen passed as an option on a run.yarn playwright test --browser=…is unaffected.yarn plugin importandyarn set version <url|path>arepersistence.~/.m2/settings*.xml,~/.gradle/gradle.properties) aresystem_write.npm|pnpm|yarn config getof an auth token issystem_write.Redaction (
internal/redact)CookieandSet-Cookieheaders, cookie values of 8 or more characters are redacted, except for names that mark a preference (theme, language, …).Set-Cookievalues are handled.Set-CookieJSON arrays, including pretty-printed and escaped ones.setHeader|set|append('Set-Cookie'|'Cookie', …)calls and curl-b/--cookie.Max-Ageand other attribute variants are left as they are.{"password":"[REDACTED]"}.Telegram
~/.odek/media. These are read_file, vision, transcribe, head_tail, base64, checksum, diff, json_query, file_info, patch, write_file, search_files, glob and tree. Listings skip such entries, including through symlinked roots. docs/TELEGRAM.md says thatshelland sub-agents are not scoped./stopand/newcancel queued or running media jobs./resume: the return-after-break summary now reaches the next principal turn, and/resumeextracts a memory episode for the conversation it replaces.Serve and tools
requires_confirmationreflects the REST friction setting that is enforced.treeskips dependency directories and caps total entries.artifact_readerrors are built withencoding/json, and its open is non-blocking.checksumhas a per-invocation context.Memory
odek memory promotebinds the promotion to the reviewed text and accepts--sha256.associations.jsonpersists under a cross-process lock with merge.Runtime and ops
indexandvectors_metaare reserved session IDs, matched case-insensitively.odek upgradebounds downloads by idle time instead of a 60s whole-request timeout. The 5-minute cap and size caps remain.-h/--helpprints the command's own usage and exits 0 everywhere in a command's flags.schedule-host-*.jsonheartbeats, andodek cleanup --dry-runlists them.continue.Loop
argv0intool_call_startedends at the first unquoted operator and never reports an assignment-shaped word.pause_turn,model_context_window_exceeded) is reported as partial, not complete. docs/CONFIG.md says Anthropic-format endpoints must returnstop_reason.Testing
go vetandgofmtare clean. golangci-lint v2 reports 0 issues.go test ./...,go test -race -short ./...and the fullinternal/dangersuite pass withHOME=/home/user.cmd/odeksearch tests fail locally on macOS on main as well and pass on Linux.Coverage (main → branch)
🤖 Generated with Claude Code