🏑


  1. September 10, 2026
    1. πŸ”— plannotator/herdr-annotate rust-lite-v0.1.0 release

      What's Changed

      New Contributors

      Full Changelog : https://github.com/plannotator/herdr- annotate/commits/rust-lite-v0.1.0

    2. πŸ”— backnotprop/plannotator v0.27.13 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.27.12 | Unified decision control, token hover cards, local-vs-remote diff, approval notes
      v0.27.11 | OpenCode server leak fix, durable local feedback archive, unknown-subcommand fix
      v0.27.10 | Auto-viewed files on scroll, annotation undo/redo, OpenCode 2 slash commands restored, npm 12 agent terminal fix
      v0.27.9 | WebMCP browser-agent tools, HTML refresh from disk, host seams, lazy renderers, Windows uninstall fix
      v0.27.8 | Pi keeps its prompt cache across plan transitions, thumbs-up returns to HTML annotation, embed picker seam
      v0.27.7 | Pi host crash fix on Windows, Call Flow tree cap, jj fork-point base, plannotator knowledge skill + llms.txt
      v0.27.6 | Live app annotation lands on Pi, one interaction model for HTML pages
      v0.27.5 | Annotate your running app, Agent TUI placement, collapsed lockfiles, VS Code theme fix
      v0.27.4 | Portable Guided Review exports, guides.show share links, guide CLI, jj Call Flow
      v0.27.3 | Folder watcher freeze fix on large repos, first SBOM-attested release pipeline
      v0.27.2 | Mobile plan and code review, Codex CLI 0.147 fix, configurable markdown extensions
      v0.27.1 | Open-in-editor launch fix, file headers respect Viewed/Git-add visibility toggles

      What's New in v0.27.13

      Six pull requests, four of them from community contributors, two from first- time contributors. The headline answers a request straight from X: open a code review against the base you actually mean, not always the trunk. Alongside it: a security hardening of the document endpoint, the end of our longest-standing CI flake, and a Amp delivery fix.

      Open a review on a specific base

      plannotator review always opened against the detected trunk, even when you were reviewing one layer of a stacked branch. A user on X put it plainly: "it always opens vs. main even if it explicitly understands that I'm reviewing a stack."

      Now the review can open exactly where you point it:

      # stack: main β†’ feature/part-1 β†’ feature/part-2 (you are here)
      plannotator review --base feature/part-1
      # opens on "All changes since feature/part-1": just what this layer adds
      
      plannotator review --base feature/part-1 --diff-type merge-base
      # the committed-only view of the same layer
      

      --base takes anything git resolves: a branch, origin/branch, a tag, a commit, HEAD~3. --diff-type picks the opening view from the same nine modes the dropdown offers. Both are a starting state, nothing more: the session opens there, everything stays changeable in the UI, and neither flag ever touches your saved defaults. A base that does not exist fails at launch with a clear message and a "did you mean" suggestion instead of silently producing a wrong diff.

      This matters most when an agent opens the review for you. The agent knows which layer it just built, so it can hand you a review already looking at the right thing instead of telling you which dropdown to click. The installed skills teach exactly that: reviewing a stack layer, pass --base <the branch below yours>.

      The flags work across every host that launches reviews through the CLI, and error honestly on surfaces where a base has no meaning (jj, GitButler, Perforce, multi-repo workspaces, and PR URLs, whose base comes from the platform). #1484

      One behavior change shipped with this. The review command used to silently ignore flags it did not recognize; a typo like --bse main opened a review as if you had typed nothing, and in the worst case an unknown flag could swallow the PR URL next to it. Unknown dash-prefixed flags now fail loudly with a usage hint, matching how annotate has always behaved. Plain words stay tolerated, so slash-command hosts that forward your raw sentence keep working. OpenCode and Pi slash commands also now reject CLI-only transport flags such as --tailscale that they previously accepted and ignored. #1483

      Symlinks can no longer read outside the project

      A symlink committed into a repository you are reviewing could point anywhere on your disk, and the endpoint that serves linked documents would follow it: the requested path looked like it was inside the project, but the content came from outside it. Document reads are now gated on real-path containment in both server runtimes: a path must land inside the project both as written and after resolving symlinks, or the request is refused.

      Legitimate symlink setups keep working, including symlinked project roots (macOS temp directories) and links that resolve within the project. Three edge behaviors changed on purpose: a symlink escaping the project returns 403 on every path through the endpoint, HTML files over the 2MB annotate cap now return 413 where one path previously served them in full, and a file that exists but cannot be opened returns 500 instead of 404.

      Contributed by @bendrucker in a first contribution that went well beyond its own scope: along the way he reproduced our longest-standing CI flake, disproved our working theory with actual experiments, and traced it to the real root cause below. #1437

      The CI flake is dead, and tests stay out of your data

      Four annotate-server tests had been failing intermittently on CI for weeks (#1464), passing on rerun, resisting diagnosis. The root cause turned out to be a single line: shared storage captured the data directory once at module import, so a test that imported it under a temporary override poisoned every later test in the process, and test-file discovery order decided who got hit. The same freeze meant a full test run could write into a contributor's real ~/.plannotator.

      Storage now resolves its directory per call, and the test suite sandboxes PLANNOTATOR_DATA_DIR for every run, with regression tests locking both halves down. Two contributors converged on the same root cause independently within a day, from different starting points: @FNDEVVE working from our test-isolation issue, and @bendrucker debugging his own PR's CI failures. Closes #1455 and #1464. #1473

      Amp: feedback is routed by decision, never guessed from prose

      The Amp plugin classified review outcomes by searching the rendered feedback text for phrases, so a genuine comment like "this path has no feedback loop, add one" pattern-matched as no-action and was silently dropped. The CLI now offers plannotator review --json, emitting one structured { decision, message } record from the same builder as the plaintext output, and Amp routes purely on the decision field. The prose classifier is gone. An outdated CLI produces a recoverable update notice with the captured output, never a guessed decision.

      Contributed by @FNDEVVE, closing #1456. #1476

      Additional Changes

      • Selection toolbar stays on screen on phones : selecting short text near a screen edge in compact touch layouts overflowed the floating toolbar past the viewport, clipping its buttons. It now clamps inside the screen (respecting notch safe areas) and keeps its centered position whenever that fits. Desktop placement is untouched. Contributed by @katya4oyu in their first contribution. #1471
      • The view dropdown follows the live base : the "All changes since " option label was baked at session start from the detected trunk and never updated, so it could contradict the base picker sitting next to it. It now renders from the active base.

      Install / Update

      macOS / Linux:

      curl -fsSL https://plannotator.ai/install.sh | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: Run /plugin in Claude Code, find plannotator , and click "Update now".

      Pi: Update @plannotator/pi-extension to 0.27.13 and restart Pi.

      OpenCode: Clear cache and restart:

      rm -rf ~/.bun/install/cache/@plannotator
      

      What's Changed

      • feat(review): open a review on a specific base and diff type in #1484
      • fix(review): strict argument parsing for unknown review flags in #1483
      • fix(doc): deny symlink escapes on /api/doc reads by @bendrucker in #1437
      • fix(test): isolate test-run data from contributor history by @FNDEVVE in #1473
      • fix(amp): relay structured decisions without prose classification by @FNDEVVE in #1476
      • fix(ui): keep selection toolbar within compact touch viewport by @katya4oyu in #1471

      New Contributors

      Community

      This release is mostly the community's. @bendrucker shipped the symlink containment work through two rebases we caused, and when CI failed on his branch he did the diagnosis himself: reproduced it deterministically, tested and disproved our working theory, and root-caused a flake that had dogged this project for weeks, then filed the follow-up (#1477) for the remaining cases. @FNDEVVE swept our own issue tracker and closed two filed issues in as many days, with fixes careful enough that one of them independently matched bendrucker's root cause line for line. @katya4oyu fixed a real phone papercut with a minimal, well-tested change that read the repo's conventions closely enough to regenerate a build manifest most first PRs miss. And the headline feature exists because a user on X told us the review always opened against the wrong base when reviewing a stack. They were right.

      Thank you. Plannotator gets better because you tell us where it falls short.

      Full Changelog : v0.27.12...v0.27.13

    3. πŸ”— r/LocalLLaMA So relevant rss

      So relevant | submitted by /u/0dayturtle
      [link] [comments]
      ---|---

    4. πŸ”— smol-machines/smolvm smolvm v1.14.6 release

      What's Changed

      • Bump libkrun and rebuild the bundled libraries for all four platforms by @BinSquare in #1217
      • Show a pack pull's download progress and report the bytes a broken transfer actually moved by @BinSquare in #1218
      • Free a machine's data before the registry write when deleting by @BinSquare in #1219
      • Resolve an archive request against the workspace root by @BinSquare in #1220
      • Bump the workspace to 1.14.6 by @BinSquare in #1221

      Full Changelog : v1.14.5...v1.14.6

    5. πŸ”— BarutSRB/OmniWM OmniWM v0.6.9 release

      What's New Since 0.6.8

      There are zero breaking changes since 0.6.8.

      • Credit sponsors Álvaro BarchΓ­n and Marc Hendrichsen.
      • Decompose UI views, overview geometry, CLI completions, and IPC arguments.
      • Decompose IPC models and rule engine and consolidate layout contexts.
      • Fixed scratchpad ownership, persistence, and terminal occlusion.
      • Treat compiler warnings as errors and fix lifecycle bugs.
      • Fixed lifecycle races and streamline Niri navigation.
      • Clean up Swift declarations and concurrency annotations.
      • Reduce settled Niri edge strips and stabilize window parking.
      • Fixed scrolling in the App Rules application picker.
      • Preserve Niri monitor contact through native rounding.

      Official website and documentation: https://omniwm.app
      Installation guide: https://omniwm.app/guides/install/

      Release Integrity

      The OmniWM app is Developer ID signed, Apple-notarized, stapled, and Gatekeeper verified.

      • OmniWM-v0.6.9.zip SHA-256: 9c24ab174e11a1e21155a0640e0323beaa7e22a402e59b69694c8465b002b165
      • GhosttyKit.xcframework-v0.6.9.zip SHA-256: 02ec649259f7465a8e4ae4866f1ef5b9ae876b25190801a340c67052b9324dd4
    6. πŸ”— HexRaysSA/plugin-repository commits sync repo: +3 releases, -2 releases rss
      sync repo: +3 releases, -2 releases
      
      ## New releases
      - [ida-nexus](https://github.com/hexrayssa/ida-nexus): 0.11.0, 0.10.8
      - [vtable-context-tools](https://github.com/oxikkk/ida-vtable-tools): 1.2.0
      
      ## Changes
      - [ida-codemode](https://github.com/hexrayssa/ida-codemode):
        - removed version(s): 0.3.1, 0.3.0
      
    7. πŸ”— Console.dev newsletter htmx 4 rss

      Description: Enhance HTML.

      What we like: Simplifies the approach to adding attributes to HTML tags for dynamic features. Now uses fetch(). Makes it easy to implement features like infinite scroll, form post, search as you type, polling, and streaming responses. Still pretty minimal (11kb) and no dependencies.

      What we dislike: Lots of attributes littered all over your HTML, but that is the point.

    8. πŸ”— Console.dev newsletter Solo rss

      Description: Loader for Linux static binaries.

      What we like: Makes static binaries for GPU-accelerated code actually work. Makes it easy to build self-contained applications that can benefit from acceleration. Compile to musl, but still use common shared packages.

      What we dislike: Incomplete ABI coverage: unsupported glibc calls currently abort. Musl has its own compatibility issues.

  2. September 09, 2026
    1. πŸ”— MetaBrainz The super special (lousy) shirt plan rss

      Editors are by far MetaBrainz’ biggest and most irreplaceable resource.

      They (you) spend countless hours entering data for free, be it for the love of music, to tidy their own collections and listen histories, to support their scenes, to archive historical and cultural data, to apply the cool and soothing editing brain-balm, or a combination of all of the above and more.

      Some of the top editors have provided the backbone of MusicBrainz for years, decades, and often perform the more tedious data maintenance and checking tasks.

      A few summits ago, the question was asked - can we give these editors, say those with 1 million+ edits, some recognition without getting into the quagmire of things like gamifying?

      Enter super special (lousy) shirt plan.

      reo showcasing his super special lousy shirt - a real and rare image of a top MusicBrainz editor outside!?

      Super special shirt plan is simple, we ask editors with over a million edits if they would like a lousy shirt (or their choice of shirts from our merch store), and if they say yes, we send them a lousy shirt!

      The plan was to accompany the shirts with an optional questionnaire/interview, so we could showcase some of our top editors and their editing tips and tricks. Reo said, on this topic: "I think many top editors don't get to top editorship by virtue of being very social". Turns out he may have had a point.

      Social or not, we appreciate all of you immensely. Thank you.

      1,000 and 100,000 edit versions of this shirt are available in the store for anyone with the required edit count (honor system!) to purchase. The 1 million edit version is exclusive to super special shirt plan.*

      If you have other ideas for how we could show appreciation to editors and voters (ideally within budget and without having to code and maintain complex new systems…) or want to shout out someone doing a great job, please comment below. If you have 1 million edits and did not receive your shirt email, please contact a staff member (we are available via ChatBrainz).

      please don 't abuse the system to increase your edit count. It's not worth it for a lousy shirt that your friends and family won't understand.
      *in case it gets lost - super special shirt plan doc can be accessed here (MeB staff access only, sorry)

    2. πŸ”— r/LocalLLaMA Apple A20 Pro debuts with 7-core GPU, 32-core Neural Engine and 50% more memory bandwidth (~115 GB/s) rss

      Apple A20 Pro debuts with 7-core GPU, 32-core Neural Engine and 50% more memory bandwidth (~115 GB/s) | It seems to use a 96-bit LPDDR5X memory bus, instead of the previous 64-bit wide busses. Considering it's on 2nm, that's expensive silicon. That should result in around 115 GB/s memory bandwidth. A20 Pro also doubles the size of Apple's dedicated Neural Engine (from 16 to 32 cores total). submitted by /u/Balance-
      [link] [comments]
      ---|---

    3. πŸ”— anthropics/claude-code v2.1.267 release

      What's changed

      • Added maxEffortLevel setting (top-level or per model under modelSettings): caps the effort level on every provider, including Bedrock, Vertex and Foundry; users can still pick a lower level
      • Added --system-prompt-snapshot off to render the system prompt fresh on every request instead of reusing the conversation's recorded prompt (for iterating on prompt text)
      • Fixed Cowork scheduled tasks in the cloud failing at startup for organizations whose managed settings require sandboxing
      • Fixed /context and other local command output rendering blank on mobile clients
      • Fixed shift+enter and option+backspace not working after reconnecting to a tmux or ssh session inside an agent view
      • Fixed the dim last-prompt header not appearing at the top of the conversation when scrolling up in fullscreen mode
      • Fixed Workflow agent() calls with large output schemas being refused in auto mode instead of being checked by the safety classifier
      • Fixed a case where a marketplace entry path containing a backslash could bypass the containment check for fetched marketplaces on macOS and Linux
      • Fixed expired AWS or Google Cloud credentials under a host app such as Claude Desktop retrying ten times with a generic "request failed" before the re-authenticate error appeared
      • Fixed resuming a session after /compact or another slash command ran via -p --resume: a spurious "Continue from where you left off." turn is no longer inserted
      • Fixed resuming a large session (transcript over 5 MB): parallel tool calls and their hook output are no longer dropped from the reloaded conversation
      • Fixed managed allowedHttpHookUrls, httpHookAllowedEnvVars and allowedChannelPlugins to admit nothing, not everything, when unreadable
      • Fixed /login on machines whose managed settings require Claude apps gateway sign-in: Esc now closes the dialog instead of doing nothing
      • Fixed artifact publishes cut off by a dropped connection mid-upload: they now retry once when Claude Code can tell the upload never completed, instead of reporting an unknown outcome
      • Fixed effort: frontmatter on custom commands, skills, and subagents being ignored on models whose default effort is still pinned (Opus 4.7, Opus 4.8, Fable 5)
      • Fixed artifact publish failing with an unhelpful error when the page file isn't valid UTF-8 or contains a replacement character (U+FFFD); the error now names the line and column to fix
      • Fixed claude agents @ directory menu not listing repositories created after the session started
      • Fixed Remote Control clients that join a Claude Desktop or VS Code session showing a stale permission mode until it was changed again
      • Fixed claude remote-control exiting and dropping every attached session when its server credential expires (about 30 days after start); the host now re-registers and keeps going
      • Fixed the usage-limit warning flickering on and off during a session when requests for different models or modes report different limit windows
      • Fixed earlier reasoning being dropped when an MCP server re-sends, or a built-in tool re-renders, a tool the model already loaded
      • Fixed a tool that disappears mid-conversation, from a disconnected MCP server or an upgrade, rewriting the tool list and discarding earlier thinking
      • Fixed a background worker forked from a conversation adding EnterWorktree to the conversation's tool block mid-session, which broke prompt-cache reuse
      • Fixed mid-session MCP and plugin tools being added to the tool list in sessions without ToolSearch, which broke prompt-cache reuse; supported models now receive them as deferred definitions
      • Fixed switching models with /model re-sending every tool definition (a prompt-cache miss); commit and PR attribution text now arrives as a conversation note that updates on model changes
      • Fixed resumed sessions rewriting the inline tool set when an MCP connector reconnects at a different moment than before
      • Fixed resumed sessions re-rendering tool descriptions instead of replaying the recorded ones when the first turn ran a tool
      • Fixed prompt-cache misses and dropped extended thinking when a claude.ai connector's tools change between a session and its resume
      • Fixed resumed sessions rewriting earlier MCP tool announcements (and dropping extended thinking) before their connectors reconnect
      • Fixed a prompt-cache break when a print-mode (-p) conversation is resumed interactively: the system prompt prefix no longer changes
      • Improved the /diff panel: it no longer flashes "0 files changed" and a spinner before settling, and its empty state is centered in the panel
      • Improved the Bash tool's description guidance so Claude describes what a command does in plain words instead of echoing the command
      • Improved sandbox guidance so Claude suggests /copy when clipboard commands such as pbcopy fail inside the sandbox
      • Improved --resume first-render time for sessions with many Bash tool calls
      • Improved prompt input responsiveness: keystrokes no longer occasionally wait a frame behind spinner or streaming repaints
      • Improved prompt-cache stability: subagents and sessions started with --system-prompt or --append-system-prompt now record the system prompt and tool definitions once instead of re-rendering them
      • Improved Artifact tool publish errors: when a publish is refused, the message now says why and what to do about it
      • Self-hosted runner: Changed --use-anthropic-git-proxy to be reported to the server at registration and to print a warning for each session that still clones through the legacy git proxy
      • Gateway: Changed forward_user_identity upstreams to return a 429 as-is to a developer whose email was forwarded, instead of failing over to the next upstream, so the proxy's per-user limits hold
      • [VSCode] Fixed the extension host hanging at 100% CPU when forking, editing an earlier message, or rewinding in a conversation whose saved transcript contains a cyclic parent link
      • [VSCode] Fixed pasting a screenshot on WSL2/WSLg inserting raw image bytes into the chat input; the image is now attached when the clipboard provides it, otherwise the paste is ignored
      • [VSCode] Fixed chat diff blocks always rendering with a dark editor theme; they now follow the active VS Code color theme, including high contrast
      • [VSCode] Fixed mixed right-to-left and English text rendering in the wrong order while typing in the message input
      • [VSCode] Fixed accepting an edit in the diff view on a file with Windows (CRLF) line endings failing with "String not found in file"
      • [VSCode] Fixed @-mentions dropping files whose paths contain spaces
      • [VSCode] Fixed the sessions list view failing to load in windows connected over Remote-SSH when the workspace folder exists only on the remote host
      • [VSCode] Fixed runaway ripgrep processes when viewing files in large or symlink-heavy workspaces
      • [Claude Code on the web] Fixed GitHub Enterprise Server sessions showing your GitHub account as disconnected once its token expired; PR and issue operations now refresh it automatically
      • [Claude Code on the web] Fixed gh and GitHub API calls failing in organizations without the Claude GitHub App; they now use your connected GitHub account and say so when none is connected
      • [Claude Tag] Added a "Use a custom connector" link to the preset connection forms in Claude Tag admin settings, so you can switch to a custom connection without starting over
      • [Claude Tag] Fixed Claude replying "The API rejected the request as invalid" when the organization has run out of usage credits; the reply now says so and explains how to add more
      • [Claude Tag] Fixed thread requests to edit or delete a message Claude posted at the channel's top level being answered with a correction instead of reaching the session that posted it
      • [Claude Tag] Fixed Connect on Tool access requests under Admin settings > Review requests failing with "Authorization failed" or showing the requested access bundle as deleted
    4. πŸ”— r/LocalLLaMA Why the hell is LM Studio making LM Studio so difficult to download? rss

      Why the hell is LM Studio making LM Studio so difficult to download? | Who is the marketing genius at LM Studio that decided that going ALL IN on pushing their new Bionic Agent product meant they are going to make it a giant pain in the ass to find and download actual LM Studio. This is the dumbest marketing decision I’ve ever seen. I used to love LM Studio, it was the middle stepping stone in the logical progression of inference. Most OGs here likely started with Ollama, moved to LM Studio, on their way to vLLM. Now trying to go to LM Studio takes you to Bionic. I mean, you can eventually find LM Studio but they make it not super easy. Here’s a thought LM Studio, maybe stop redirecting me to something I don’t want to download when I’m trying to find your actual namesake product. I’m glad you’re excited about the future of Agents and whatnot, but you’re absolutely ruining any goodwill I have for your products by trying to force feed me Bionic. Stahhhhhp! submitted by /u/Porespellar
      [link] [comments]
      ---|---

    5. πŸ”— smol-machines/smolvm smolvm v1.14.5 release

      What's Changed

      Full Changelog : v1.14.4...v1.14.5

    6. πŸ”— r/LocalLLaMA Deepseek Has Soft Retired Deepseek V4 Pro rss
    7. πŸ”— modem-dev/hunk v0.22.0-beta.1 release

      What's Changed

      Full Changelog : v0.22.0-beta.0...v0.22.0-beta.1

    8. πŸ”— smol-machines/smolvm smolvm v1.14.4 release

      What's Changed

      • Share active branch memory and guard host capacity by @BinSquare in #1204
      • Write the release marker and identity files readable by the workload so a non-root machine can be branched by @BinSquare in #1205
      • Reclaim idle branch leaf memory by @BinSquare in #1206
      • Bump the workspace to 1.14.4 by @BinSquare in #1209

      Full Changelog : v1.14.3...v1.14.4

    9. πŸ”— New Music Releases Max Richter - Now We Can Sing rss

      Max Richter - a new release is available:

      • 2026-09-09: Now We Can Sing (Single)

      Amazon: Canada | Deutschland | France | United Kingdom | United States

      Visit muspy for more information.

  3. September 08, 2026
    1. πŸ”— IDA Plugin Updates IDA Plugin Updates on 2026-09-08 rss

      IDA Plugin Updates on 2026-09-08

      New Releases:

      Activity:

      • capa
        • f3765cdf: Sync capa rules submodule
        • 8f98440d: build(deps): bump protobuf from 7.35.0 to 7.36.0 (#3161)
        • 8fd882eb: build(deps-dev): bump pygithub from 2.9.0 to 2.10.0 (#3162)
        • 2be73341: build(deps-dev): bump types-protobuf (#3163)
        • 2c4183d8: build(deps): bump pygments from 2.20.0 to 2.21.0 (#3164)
        • 85740310: build(deps-dev): bump brace-expansion in /web/explorer (#3167)
        • 26083edf: build(deps-dev): bump postcss-selector-parser in /web/explorer (#3169)
      • chernobog
        • c4440677: docs: add Chernobog 6.2 release highlights to README
        • 113f6e99: test: separate catalog proof budget from runtime verifier deadline
        • dd726bd5: feat: support range-guarded recurrent switch unflattening
        • 67415156: perf: check leading byte before redundant rep prefix decode
        • 2b548201: perf: cache base-path feasibility and model witness in symbolic executor
        • 85df51df: feat: add full value invalidation and temporary feasibility queries
        • 6bc98663: test: implement restricted mop erasure in redirected hexdsp entry
        • b3b5b03c: test: emulate SDK mop erasure in standalone catalog harness
        • 5398d20d: feat: add numeric CFString display and restrict writable constant reads
        • ea056144: test: forward toolchain flags to python shim runners in ctest
        • fbac246f: feat: add bounded search summaries and UTF-8 runtime string recovery
        • 971ce4de: fix: require microcode address proof for early constant reads
        • 520ca369: perf: bound static analysis traversal to instruction budget
        • bc0e5e55: test: record run reports and isolate environment in ida smoke runner
        • b2cf5ad6: feat: add loaded byte views for program image segments
        • 2e4cbf88: perf: bound chain search in split-block detection
        • 43dd25a7: perf: optimize program model hashing and segment traversal
      • ida-forge
        • e63b92ee: Merge pull request #3 from oopsmishap/forge-api
        • 2cd92285: Harden feature reload and Qt flag combination
        • b3d74526: Raise Python floor to 3.10 (ida-domain minimum)
        • 10ac3154: Track scripts covered by unit tests
        • 16edb4bf: Add domain API and recovery coverage
        • 2fd0f826: Fix CI lint configuration
      • ida-hcli
    2. πŸ”— anthropics/claude-code v2.1.266 release

      What's changed

      • Fixed a 2.1.265 regression affecting LLM-gateway and proxy setups: the undocumented CLAUDE_CODE_USE_GATEWAY environment variable, previously ignored unless ANTHROPIC_BASE_URL and ANTHROPIC_AUTH_TOKEN were both set, began forcing Cloud-gateway sign-in on its own in 2.1.265, so configurations that set it alongside an API key, apiKeyHelper, or custom auth headers failed every request with "Not signed in to the Cloud gateway". The variable on its own is ignored again; no configuration change is needed
    3. πŸ”— anthropics/claude-code v2.1.265 release

      What's changed

      • Added user.email and user.groups to the telemetry Claude Desktop and Cowork send through a Claude apps gateway, matching terminal sessions
      • Added support for pointing --plugin-dir at a folder of plugins: each child folder with a manifest loads, and children added or removed while running are picked up
      • Added a 1 GB cap on tool results saved to disk; the in-conversation preview says when a saved file was truncated
      • Fixed resuming a foreground-spawned subagent changing its tool list and system prompt prefix, which broke prompt-cache reuse for that agent
      • Fixed agent teammates and resumed subagents moving SubagentStart hook context and preloaded skills out of the prompt prefix on later turns, which broke prompt-cache reuse
      • Fixed resume after the previous process died while a tool was running: the last prompt is no longer rewritten, and the interrupted tool call is kept and marked interrupted
      • Fixed /model opusplan[1m] being rejected with "Model not found"
      • Fixed syntax-highlighted code in permission prompts and messages sometimes omitting a character after a Ruby ?, Erlang $, or Perl $ sigil
      • Fixed the fullscreen transcript jumping by one row whenever the slash-command or @-file suggestion list opened or closed
      • Fixed a plugin path containing a backslash bypassing the symlink containment check on macOS and Linux
      • Fixed plugin directories whose names begin with two dots being wrongly refused as outside the plugin root
      • Fixed VS Code and SDK sessions occasionally requiring re-login when a session was closed while refreshing its token
      • Fixed Remote Control sessions sending the end-of-turn signal before the reply's last message, which could show a reply as finished in the Claude app before its last part arrived
      • Fixed background (--bg) sessions occasionally being retired mid-turn when a message arrived just before the idle timeout
      • Fixed Claude Code's own git status and diff probes running clean filters configured by a nested repository inside the working tree
      • Fixed the advisor tool and its instructions being re-decided per request from the request's model; the decision is now made once and announced in the conversation when it changes
      • Fixed artifact publish accepting connector tool names the connector doesn't expose; the publish is now refused when none of the declared tools exist, and warned when only some don't
      • Fixed /add-dir <subdirectory> refusing to load a subdirectory's agents when managed settings lock only skills to plugins, and promising agents when only agents are locked
      • Fixed two-key keyboard shortcuts cancelling silently when the second key arrived more than a second later, as happens inside tmux; they now wait 3 seconds and show a notice when they time out
      • Fixed forked skills (context: fork) not streaming their kickoff prompt and, with --forward-subagent-text, their text turns as progress events in stream-json
      • Fixed a plugin's default component folder that the OS cannot check, such as a symlink loop, being silently skipped; it is now reported in /plugin with the error code
      • Fixed the Claude apps gateway's OTLP telemetry relay pausing all forwarding to a collector for 30 seconds after it rejected a few payloads as malformed or too large
      • Fixed /plugin Discover/Browse and claude plugin list --json --available showing no description or display name for marketplace plugins whose metadata lives only in their plugin.json
      • Fixed /login showing "no gateway URL is configured" when re-run in a session that signed in to a Claude apps gateway set by managed settings
      • Fixed /model claiming a model was "saved as your default" when the settings file couldn't be written; it now says the save failed and why
      • Fixed /clear from Remote Control waiting on SessionStart hooks and on open terminal dialogs before completing
      • Fixed the /config dialog changing height when switching between its tabs
      • Fixed resuming a workflow run after its container restarted; a resume whose run journal is missing now fails with a clear error instead of rerunning every agent
      • Fixed the claude-api skill's error-code reference: model access failures return 404 and unavailable beta headers return 400, not 403
      • Fixed non-interactive sessions (-p with stream-json input, Agent SDK, cloud sessions) resetting the shell working directory at each new user message; a cd now persists across turns
      • Fixed MCP servers configured as http that only speak the legacy HTTP+SSE transport never connecting; Claude Code now falls back to SSE as the MCP spec describes
      • Fixed some claude.ai connectors in cloud sessions showing as needing authentication even though they are connected in claude.ai (servers that answer an unsupported request with HTTP 401)
      • Fixed remote sessions keeping their sandbox container alive while a connector approval or sign-in link waits for you
      • Fixed resumed sessions showing long model-facing recovery instructions in "background task didn't finish" notices instead of a short status line
      • Windows: Fixed Read, Write and Edit refusing every file ("symlink resolution changed after permission was checked") when running inside an AppContainer or restricted-token sandbox
      • Improved --worktree startup on large repositories: the new worktree is now checked out in parallel (git 2.32+)
      • Improved /workflows agent detail: tool calls are marked running, failed or done, the subagent's task list is shown when it has one, and Enter unfolds the listed calls with their inputs and results
      • Improved slash commands typed mid-prompt: matches now show in a list (Tab opens it outside fullscreen) instead of a single suggestion, and a plugin skill is now found by its bare name
      • Improved remote MCP servers that need sign-in: Claude Code no longer registers an OAuth client with them until you actually authenticate
      • Improved the time to resume long sessions that read many files
      • Improved the error shown when an image over the size limits cannot be decoded: it now names the cause and how to fix it instead of only citing the limit
      • Improved the Artifact tool's read of an artifact someone else wrote: the summary now treats the page as untrusted content and flags embedded instructions rather than relaying them
      • Updated the .claude folder permission option to say what it actually allows: editing files in the project's .claude folder (or ~/.claude) for the session
      • Changed machines with forceLoginGatewayUrl in managed settings to be Claude apps gateway sessions from startup, like forceLoginMethod: "gateway"; a leftover claude.ai login or API key is not used
      • Changed image processing to use the runtime's built-in image support; the CLI no longer extracts a native image module to the temp directory
      • Changed plugin display metadata to prefer the marketplace entry over plugin.json on the Installed tab and claude plugin details, filling gaps from plugin.json
      • Changed Claude apps gateway sessions to export OpenTelemetry directly to a collector the gateway's managed settings name in OTEL_EXPORTER_OTLP_ENDPOINT, instead of through the gateway's relay; sessions without a named collector still use the relay
      • [VSCode] Added automatic archiving of sessions inactive for a set period (new "Archive inactive sessions" setting, default 14 days)
      • [VSCode] Fixed the sidebar chat coming back blank after Reload Window or a restart when the conversation had been open for more than 10 minutes
      • [VSCode] Fixed the timeline dot sitting below the text on the "Remote Control is active" message
    4. πŸ”— @binaryninja@infosec.exchange RE//verse 2027 tickets are LIVE! Trainings too! Round 1 is the cheapest mastodon

      RE//verse 2027 tickets are LIVE! Trainings too! Round 1 is the cheapest pricing we’ll offer, so grab your ticket before they sell out. See you in Orlando: https://re-verse.io

    5. πŸ”— @HexRaysSA@infosec.exchange πŸ“’ The 2026 IDA Plugin Contest is officially open! mastodon

      πŸ“’ The 2026 IDA Plugin Contest is officially open!

      Got an idea for a plugin that could make reverse engineering faster, smarter, or just more fun? Now's your shot. Submissions are open through November 30, with winners announced mid-January.

      Build with C, C++, Python, or idalib. And since our SDK is now open-source, IDA Free users can jump in too.

      Up for grabs: cash prizes up to $5K, free IDA licenses, recognition in the community, and more.

      Full rules + prize breakdown: https://hex-rays.com/plugin- contest

    6. πŸ”— r/LocalLLaMA Qwen/Qwen-Drive-1.0-4B Β· Hugging Face rss

      Qwen/Qwen-Drive-1.0-4B Β· Hugging Face | I don't think anyone posted about this here, but Qwen released a finetuned version of 3.5 4 for driving. The full Bf16 checkpoint is 9B. This is a very interesting development of Chinese AI labs tackle self driving next with open weight models. Edit: the HF repo links to the github repo, which in the citation links to a 40 page technical report. Here's the abstract: We present Qwen-Drive-1.0, an initial step towards a vision-language foundation model for autonomous driving. Qwen-Drive-1.0 retains the architecture of the pretrained vision-language model (VLM) and integrates 3D perception, visual question answering, and motion planning within a unified framework. An external bird’s-eye-view (BEV) perception head jointly performs 3D object detection, semantic occupancy prediction, and BEV map segmentation. It serves as a probe of the 3D information accessible from the shared representations and provides an explicit, inspectable interface to 3D scene structure. A Planning Expert conditions on shared VLM representations to generate future ego trajectories. A staged training recipe combines driving supervision with general-purpose vision-language data to acquire driving-specific competence while helping preserve broad visual understanding and instruction-following capabilities. Experiments demonstrate strong 3D perception and driving scene understanding while largely preserving general vision-language capability. Comprehensive evaluations across open-loop, pseudo-closed-loop, and closed-loop settings further show highly competitive motion-planning performance. submitted by /u/FullstackSensei
      [link] [comments]
      ---|---

    7. πŸ”— modem-dev/hunk v0.22.0-beta.0 release

      Hunk 0.22 beta: history becomes a review workspace

      Hunk 0.22 turns repository history into a responsive review workspace: browse commits, select contiguous ranges, carry review context into the diff, and leave precise threaded feedback without leaving the terminal.

      hunk update 0.22.0-beta.0
      npm install -g hunkdiff@0.22.0-beta.0
      

      Browse commits and review ranges

      hunk log now opens a responsive, themed history browser for Git and Jujutsu. Commits are grouped by day, optional graph lines preserve topology, and visual or Shift-based range selection opens the cumulative diff for a contiguous set of commits. History has configurable command bindings, merge-parent selection, and keeps your theme and diff preferences as you move between history and review. #979 #987 #1011 #1031 #1038 #1039

      Select and discuss exact code ranges

      Persistent mouse and keyboard selections can now span multiple lines and drive explicit Comment, Copy, and Clear actions. Inline notes and replies participate in keyboard navigation, and agents can reply through the session CLI while inheriting the original code anchor. #931 #1012 #1044

      Richer extension-powered reviews

      Extensions can attach provider-neutral review metadata when delegating patches, expose that context to panes and live-session snapshots, and request a coalesced reload after an external agent changes reviewed files. The extension directory also adds hunk-gh, hunk-viewed, hunk-history, and hunk-compact-filenav. #986 #988 #981 #995 #1034

      Faster, steadier terminal interaction

      Long wrapped lines render and respond faster, pane animations are capped at 30 FPS and can be disabled, sidebar folders collapse without breaking navigation, suspended sessions resume cleanly, and direct-file reviews reload correctly outside repositories. #1043 #1051 #1036 #1009 #996 #1054

      Compatibility notes

      • unified is now the canonical name for the single-column diff layout. Existing stack CLI and configuration values remain accepted as deprecated aliases and normalize to unified.
      • Extension API v23 adds canonicalMode and canonicalLayout, which report unified; legacy fields continue to report stack for compatibility.
      • OpenTUI integrations can use canonicalLayout: "split" | "unified"; the legacy layout: "split" | "stack" prop remains source-compatible, and canonicalLayout wins when both are supplied.
      • hunk log opens the interactive history browser when attached to a terminal. Use --static for scripted terminal output; pipes remain static.
      • Review commands now print static plain text instead of launching the TUI when stdout is not a terminal.
      • The bundled runtime is upgraded to Bun 1.4.2.

      Community contributors

      • @samuela improved daemon health-probe failure reporting. #927
      • @saadjs led the stack-to-unified layout transition while preserving compatibility. #945
      • @any-victor added hunk-history to the extension directory. #995
      • @HackAttack fixed suspended-job resume behavior. #996
      • @rschoch added hunk-compact-filenav to the extension directory. #1034

      All merged pull requests

      Release notes : https://hunk.dev/changelog/0.22/
      Full changelog : v0.21.1...v0.22.0-beta.0

    8. πŸ”— Barre/ZeroFS v2.3.3 release

      What's Changed

      • Fix monitor count pluralization by @Barre in #614
      • Update distro kernel package targets by @github-actions[bot] in #615
      • Fix/linux 7.3 compatibility by @Barre in #620
      • Compaction repack overhaul by @Barre in #619

      Full Changelog : v2.3.2...v2.3.3

    9. πŸ”— r/LocalLLaMA OpenAI alleged of stealing mathematicians work rss

      Privacy have been concern of many of us to have their own hardware to run llms, and here's another reason why: two mathematicians spent a year cracking one of the hardest problems in math and fed every draft of their works into Codex. A few days before they could publish, OpenAI suddenly showed up with the same solutions. When asked if their model (Sol and Astra) was trained on the pair's private chats, OpenAI did not answer the question.

      Full statement from them https://cims.nyu.edu/~tristanb/statement.pdf

      Feels like big labs believe everything you did with the help of their models is theirs.

      submitted by /u/bakawolf123
      [link] [comments]

    10. πŸ”— smol-machines/smolvm smolvm v1.14.3 release

      What's Changed

      • Run init as root on every path, and keep the image's USER for a packed workload by @BinSquare in #1190
      • Open a machine to observe it without creating its disks or data directory by @BinSquare in #1197
      • Add selectable block I/O engines by @BinSquare in #1198
      • Honor a storage size below the template by shrinking the copied filesystem instead of rounding up by @BinSquare in #1199
      • Bound live branch memory accounting by @BinSquare in #1200
      • fix(network): prevent named-fabric receive busy loop by @scottatron in #1201
      • Resolve a packed machine's launch from its manifest in one place by @BinSquare in #1150
      • Pack machines with the entrypoint they were created with and the overlay they actually write to by @BinSquare in #1174
      • Record the image's USER, or the Smolfile's user, in a pack made from an image so its workload keeps its account by @BinSquare in #1202
      • Bump the workspace to 1.14.3 by @BinSquare in #1203

      New Contributors

      Full Changelog : v1.14.2...v1.14.3

    11. πŸ”— HexRaysSA/plugin-repository commits sync repo: +1 plugin, +1 release rss
      sync repo: +1 plugin, +1 release
      
      ## New plugins
      - [BinaryLens](https://github.com/lumice/binarylens) (1.2.0)
      
    12. πŸ”— jellyfin/jellyfin 12.0 release

      πŸš€ Release notes for 12.0

      Notes on Updating

      Before upgrading from an earlier version, a full backup of the data directory is strongly recommended, as this release includes database changes that prevent rolling back without a full restore.

      Direct upgrades from 10.10.7 and 10.11.x to 12.0 are supported; intermediate upgrades are not required. Users running releases older than 10.10.7 are strongly encouraged to upgrade to 10.10.7 before migrating to 12.0.

      Installed repository plugins (anything not built-in) should also be removed before migrating. Plugins will likely need time to adapt to the new database changes, so re-adding them afterward is the safest approach for testing.

      Official plugins compatible with Jellyfin are available through the stable plugin repository. If you have changed to the unstable plugin repository please change it back.

      After migrating please perform the following steps.

      • Perform a full library scan to restore alternative versions

      If you run into issues, please prefix bug reports with "[12.0]".

      Packaging

      • Debian Bullseye and Ubuntu Focal packages are no longer built

      Server

      • Performance PR implications #16062

        • We're running a full path-based check on all library items to clean up left overs. Depending on size this can take some time
        • Alternative versions of media that were auto resolved (not manually merged) will be removed due to data type issues -> A full library scan will fix this again and is therefore REQUIRED AFTER UPGRADE
        • First scan will take significantly longer than normal and some movies might appear as newly added due to type issues that got fixed on-scan
      • Multiple versions for episodes

      • Similarity & recommendation providers
      • Search providers, letting plugins extend or replace how search results are produced
      • SchedulesDirect and EPG refresh fixes
      • Fixes to the parental rating system
      • Proper data pruning on file replacement/deletion
      • Support triple+ digit episode numbers
      • Add library-specific BoxSet and Playlist filtering, allowing per-library collection and playlist views
      • CACHEDIR.tag support
      • Accept-Language header support
      • Add VideoRotation profile condition for Android TVs that do not support rotation metadata
      • Parse provider IDs from season and episode folder/file names
      • Allow tmdb, tvdb, and imdb as aliases for the tmdbid, tvdbid, and imdbid provider IDs
      • Add curly brace and parentheses support for parsing attribute values
      • Add NameStartsWith and NameLessThan filters to Person search
      • Add new filters for audio and subtitle languages
      • Add OriginalLanguage as option to PreferredAudioLanguage
      • Add a collection API for Included In feature
      • Add support for VobSub subtitle streams
      • Add Tmdb missing episode provider

      Breaking and behavior changes

      • Legacy route prefixes removed (/emby/* and /mediabrowser/*). Old third-party clients that rely on them will stop working
      • Legacy authorization is now disabled by default, and a migration disables it on existing installs as well
      • Removed obsolete API routes: POST /Users/{userId}/EasyPassword (the EasyPassword feature is gone), GET /Items/{itemId}/CriticReviews, GET /Environment/NetworkShares, POST /System/MediaEncoder/Path, GET /LiveTv/Recordings/Groups/{groupId}, and GET /QuickConnect/Initiate
      • The global subtitle configuration has been removed, subtitle settings are configured per library
      • .ogg is no longer treated as a video extension and is audio only, .aifc is now recognized as audio, and .aiff is no longer treated as an image
      • Symlinks are only resolved at playback time
      • Sorting by name now uses SortName and CleanName, and the same cleaning logic is applied to ForcedSortName. Library ordering may change compared to 10.11
      • Image endpoints no longer upscale beyond the source resolution, so low resolution artwork renders at its real size instead of being enlarged
      • Username capitalization can now be changed. Usernames are stored in a normalized column with a unique index, so installs with usernames that differ only by case need to be corrected before upgrading

      Database and performance

      • Playlists and collections are now properly relational, using a new LinkedChildren table instead of serialized child lists. OwnerId and PrimaryVersionId are real GUID foreign keys, and ExtraIds has been dropped
      • Many tuning migrations covering item counts, item names, type and clean name, latest items, image info, and primary version id
      • Migration routines clean up existing data on first boot: duplicate music artists and people are merged, orphaned extras and external data are removed, incorrect owner relationships are repaired, and clean names, forced sort names, and series presentation keys are recomputed
      • Heavy database tasks no longer run while a library scan is in progress
      • Faster queries for Resume, Next Up, rewatching, Latest Items for music, playlists and collections, artist lookup, and item counts
      • Item deletion is batched, which fixes "too many SQL variables" failures when deleting large numbers of items
      • jellyfin.db can now be stored at a custom path

      Operations

      • New --mode startup flag with MediaServer, MigrateSystem, and SeedSystem, allowing migrations or database seeding to be run without starting the server. This is useful for containerized and orchestrated deployments and for controlled upgrades
      • The startup interface has been restyled and now shows version and activity information
      • Disabled plugins are no longer re-enabled on restart
      • Full system backups skip corrupt keyframe rows instead of failing

      Media and subtitles

      • Subtitle writing now goes through SubtitleEdit, which is what avoids the SSA to ASS conversion and loss of styles
      • External subtitles can be embedded into MKV when transcoding
      • The subtitle extraction timeout is now configurable
      • Client-rendered graphical subtitles are allowed during remux
      • Fixes for races in concurrent subtitle conversion, cache invalidation when a subtitle is replaced, and ffmpeg hangs during extraction
      • New HlsAudioSeekStrategy configuration option
      • Trickplay: existing files are discovered during a scan, duplicates from interlaced video are fixed, invalid PTS values from containers are normalized, and the cache is cleaned up after a failure

      Live TV

      • Live TV no longer returns unreachable "server-local" streaming URLs to clients
      • XMLTV background images and episode thumbnails are now imported
      • XMLTV guide imports skip programs whose data has not changed, using an ETag computed from the fields the server actually consumes, which makes repeat guide refreshes considerably cheaper. Other listings providers stay on the existing field-by-field update path

      Metadata and providers

      • ListenBrainz is now bundled with the server and provides similar artist data with a selectable similarity algorithm
      • TVDB provider IDs are supported for movies
      • AudioDb artist search
      • ReplayGain album gain is parsed
      • MusicBrainz lookups are more resilient
      • WEB-DL release tags are recognized in file names
      • Hyphenated numbers in episode titles are no longer parsed as multi-episode files
      • 3D format detection works when the tag is the last token of the path
      • Person metadata refreshes are queued instead of blocking the request

      Transcoder

      • New upstream version of FFmpeg 8.1
      • Optimized CUDA transposing filter performance
      • Optimized OCL scaling filter performance
      • Optimized OCL tonemapping filter performance on Mali GPU
      • Use EOTF from BT 2446 Method B for HLG tonemapping
      • Fix potential A/V desync in HLS when transcoding video while remuxing audio
      • Avoid SSA to ASS conversion and loss of styles
      • Add spec-compliant dvh1 HLS variant for DoVi P5 for compatibility

      Web

      • The Modern layout is now the default, the previous layout is now called Legacy
      • Updated Music Videos view
      • Updated Mixed Media view
      • Updated Collections & Playlists view
      • Updated Books view
      • Add still watching prompt
      • Add delay setting for photo slideshow
      • Add caching of queries to indexed db for the tanstack query client for improved loading performance
      • Add watch feature to log viewer
      • Add , and . as controls to scrub frame-by-frame
      • Add filters for audio and subtitle languages (modern layout only)
      • Add Collections and playlist tab to all libraries
      • Add collections to item details page
      • Replace libpgs with libbitsub and adds support for vobsub rendering
      • Merge cards for crew with multiple roles

      Layout and themes

      • All themes now derive from a shared base theme built on CSS variables, including Dark, Light, WMC, Blue Radiance, Apple TV, and Purple Haze. Custom themes may need to be adjusted
      • The library toolbar has been merged into the app bar, with a sticky library header and design polish throughout the library
      • Custom links can be added to the Modern layout
      • The screensaver time setting is now available in the Modern layout

      Libraries and browsing

      • Collections and folders tabs for book libraries, and a folder view in the Modern home videos layout
      • Default tab options for Home Videos and Photos libraries
      • Studio search, and an extended Studios tab
      • Play All and Shuffle buttons on the series library. Both are disabled rather than hidden when no items are available
      • Improved Upcoming view
      • Sorting and filtering on the Activity page
      • A Reset Filters button in the filter dropdown
      • Folders can be marked as played
      • TV show creators are shown on item details
      • Similarity providers can be configured per library
      • Pagination controls are hidden when paging is disabled

      Playback

      • The playback info overlay is more compact and shows more detail
      • Chapter names are shown in the OSD slider bubble
      • Bitrate detection now runs in web
      • Dolby Vision in MKV on webOS 25 and newer
      • AV1 fMP4 stream copy on TV clients
      • Direct play of anamorphic video on Tizen, and loosened anamorphic restrictions for browser device profiles
      • On iOS, background playback continues when the screen is turned off, and audio normalization is disabled to fix pitch and speed issues
      • libbitsub updated to v1.11.0 with an HLS offset fix
      • The screensaver is suppressed while viewing photos or reading

      TV and remote

      • Game controller navigation fixes, and the gamepad repeat rate is no longer tied to framerate
      • Keyboard controls work on non-Latin keyboard layouts, with additional fixes for older browsers
      • Rewind and FastForward play state commands are handled
      • SyncPlay menu update, and the SyncPlay ping is now reported to the server
      • Focused and checked checkbox styling in the TV layout

      Under the hood

      • WebSockets have been migrated to SDK subscriptions
      • The React and TypeScript migration continues with the libraries, Live TV, and networking pages, and the dashboard user pages now use the TS SDK
      • TanStack Query now backs user settings and home screen sections, and the query cache is cleared when the server restarts

      Notable fixes

      • Blurry card images on high DPI displays, and card image sizes are rounded up
      • Duplicate /socket connections
      • Login loop, connecting to the wrong server when several are configured, and native shell server selection when signing out
      • An invalid request for all items on page load
      • The Live TV default landing tab
      • Holding and dragging on media no longer activates multi-select
      • A warning is shown before restoring a version, a warning is shown when starting a backup while a scan is running, and a library scan starts automatically when folders are added to a library

      Security

      Server:

      • Path validation has been added to the legacy HLS segment endpoints and to the plugin image endpoint, so a requested file must resolve inside the transcode directory
      • Path traversal hardening has been extended to the image and plugin endpoints and to username path handling, building on the fixes released in 10.11.x
      • The startup wizard can no longer be re-run without authentication on a misconfigured server
      • Unsafe plugin package names are rejected by the plugin installer
      • Parental filtering is enforced on additional endpoints, playlist visibility has been corrected, non-admin access to additional parts has been fixed, and people are exempt from the allowed tags visibility check

      Web:

      • Cross-site scripting via person roles
      • Auth parameters are encoded when creating API clients
      • The login disclaimer only allows common link protocol schemes

      Books

      Books have often taken a backseat in favor of video playback in Jellyfin, but this should no longer be the case.
      We have started a concerted effort to improve book support across the API and our official clients.
      eBook and comic support is still maturing, but the ODPS plugin allows for direct access from a wide range of popular self-hosted programs.
      Correspondingly, contributions in any repository are extremely welcome from the wider community.
      That includes server improvements, documentation changes, and third-party clients for book playback.
      A combination of eBook, comic, and audiobook support is available on the following clients.

      Official: Web, iOS, Android, Desktop, Roku, Kodi, JMP
      Community: JellyBook, Symfonium, Jellium, Plappa

      One notable omission from the server is book series as unique entities, which didn't make the cut for this release.
      If you would like to bridge the gap until they are added, feel free to use the Folio plugin to display them as collections.
      It functions very similar to the TMDb Box Sets plugin but only applies to eBooks.

      Another in-flight feature is audiobook chapters, which are only available from the API at present.
      Luckily, this means client support is now possible, so you should see them appear in your favorite audiobook client before our next server release.

      NOTE: The Bookshelf plugin has been deprecated and its features have been merged into server or extracted into the ComicVine and GoogleBooks providers.

      Server Changes

      • Bookshelf has been split into separate GoogleBooks and ComicVine providers
      • Local book parsing has been improved and is available without plugins
        • Book metadata is extracted directly from OPF and ComicInfo files or ComicBookInfo comments
        • External covers are now supported for audiobook files
        • Posters are generated for EPUBs and all supported comic archives
        • Name, index, year, and series are parsed from book filenames
        • Both volume and chapter will be available in the API when present in comic filenames
        • Page counts are extracted from comic archives and PDFs
        • Creator names from OPF data are normalized to a common format
      • A new OpenLibrary plugin has been created for metadata and images
      • ISBN external IDs and links are supported
      • Chapters are now extracted from audiobooks

      Web Changes

      • Modern book library layout has been added with view types and paging
      • Books display information about their authors and vice versa
      • Playback interface has been redesigned and standardized across all book types
      • Progress indicator is enabled again for supported eBooks
      • Sorting books by index number, release date, etc is now available
      • Font size selection has been improved for EPUB files
      • Background audiobook playback is working on iOS devices
      • Authors, collections, and folders tabs have been added to book libraries, and audiobooks appear under authors
      • Fullscreen behavior is unified across all book players, and PDFs support swipe navigation

      Developers

      API Changes

      The API no longer allows the use of deprecated authorization mechanisms by default.
      Clients and tooling need to migrate if they haven't done so already. See #15559 for details.

      There have been a number of other changes to the SDK libraries and API as part of an ongoing effort to better document the API for client use.
      Please note the following with regards to API support.
      A full explanation of our policy for API changes will be added to the developer documentation in the coming months.

      • If an endpoint isn't listed in the OpenAPI specification it should not be used by clients.
        • There are certain endpoints that are still exposed for legacy reasons despite being excluded from the OpenAPI spec.
        • These can be removed in any major release without warning
      • If an endpoint or parameter is marked as obsolete in the OpenAPI specification it should not be used by clients.
        • Same explanation as above.
      • As a general rule, any deprecations will be marked as such for an entire (major) release cycle before the deprecated endpoint or parameter is liable for removal.

      Behavior changes clients should be aware of:

      • GetItems is now asynchronous and applies recursive when filters are requested, limited to requests that include includeItemTypes. The same query can return a different result set than it did on 10.11
      • ItemByName responses are restricted and people are deduplicated
      • Newly obsolete but still functional, with replacements:
        • GetTrailers -> use GetItems with includeItemTypes=Trailer
        • GetArtists and GetAlbumArtists -> use GetPersons
        • GetArtistByName -> use GetPerson
        • GetMusicGenre -> use GetGenre
        • GetInstantMixFromMusicGenreById and GetInstantMixFromMusicGenreByName -> use GetInstantMixFromItem
        • GetStartupConfiguration, UpdateInitialConfiguration, and SetRemoteAccess -> use the configuration endpoints
        • GetRecordingsSeries
        • UserDto.HasPassword is marked obsolete and no longer provides useful information
      • The HLS controllers are hidden from the specification

      Platform

      • The server now targets .NET 10. Plugins have to be retargeted and rebuilt
      • Swashbuckle has been updated to v10, which changes the generated OpenAPI document, so SDKs need to be regenerated
      • jellyfin-web now builds with Node 24 LTS and npm 11

      Plugin changes

      • ISearchEngine has been replaced by ISearchManager, and SearchEngine has been replaced by SearchManager together with SqlSearchProvider
      • Removed: NowPlayingQueueFullItems, DtoExtensions.AddClientFields, Jellyfin.Extensions.AlphanumericComparator, the ISubtitleWriter family of subtitle writers, and SubtitleOptions with SubtitleConfigurationFactory
      • ServerConfiguration.EncoderPreset is no longer nullable
      • IAuthenticationProvider.HasPassword has been removed
      • IPasswordResetProvider.StartForgotPasswordProcess takes the entered username and a nullable user
      • IUserManager: the Users and UsersIds properties are now the GetUsers and GetUsersIds methods, and RenameUser, ResetPassword, and ChangePassword take a user id instead of a User. GetFirstUser has been added
      • Several IItemRepository members moved to the new services: item saving and deletion and UpdateInheritedValues to IItemPersistenceService, counts to IItemCountService, and Next Up series keys to INextUpService
      • IPeopleRepository.GetPeople and ILibraryManager.GetPeopleItems return a QueryResult, and IDtoService.GetBaseItemDtos and ILibraryManager.DeleteItemsUnsafeFast have new signatures
      • IDirectoryService.GetFilePaths no longer takes a sort argument, and the IPathManager subtitle and attachment path getters are now nullable

      New plugin APIs

      This release adds several extension points that plugins could not hook into before.

      • Search providers. Plugins can now take part in search itself rather than only in metadata lookup. ISearchProvider exposes Name, Type, Priority, and CanSearch(SearchProviderQuery), with IInternalSearchProvider for providers that search the local library and IExternalSearchProvider for providers that stream SearchResult items from a remote service. Providers are registered through ISearchManager.AddParts and are consulted in priority order, so a plugin can extend or take over from the built-in SqlSearchProvider
      • Similarity and recommendation providers. ISimilarItemsProvider is split inherited by ILocalSimilarItemsProvider, IRemoteSimilarItemsProvider, and IBatchLocalSimilarItemsProvider, each with a generic variant so a provider can declare the item type it handles. Providers are selected and ordered per library through LibraryOptions.SimilarItemProviders and SimilarItemProviderOrder, and ISimilarItemsManager also pulls movie recommendations. The bundled ListenBrainz provider is built on this
      • Comic metadata providers. IComicProvider (ReadMetadata and HasItemChanged) lets a plugin supply comic metadata alongside the built-in ComicInfo and ComicBookInfo readers
      • Chapters for any item type. IChapterManager.SaveChapters now takes a BaseItem rather than a Video, and gained a Supports(BaseItem) check. This is what makes audiobook chapters possible, and it lets plugins save chapters for non-video items
      • Password resets for unknown users. IPasswordResetProvider.StartForgotPasswordProcess now receives the entered username along with a nullable user, so a provider can handle a request for a username the server does not know or hand the reset off to an external provider
      • Media segment cleanup. IMediaSegmentProvider.CleanupExtractedData is called when an item's data is pruned, so segment providers can remove their own extracted files
      • Schedules Direct. ISchedulesDirectService exposes available countries, service availability, and the image daily limit state, so Live TV plugins no longer need to reimplement them. ITunerHostManager.DeleteTunerHost allows removing a tuner
      • Alternate versions and linked children. Now that linked children are relational, ILibraryManager exposes ResolveAlternateVersion, GetLocalAlternateVersionIds, GetLinkedAlternateVersions, GetItemIdsWithAlternateVersions, and UpsertLinkedChild. Plugins that manipulated version links through serialized item data need to move to these
      • Batch APIs for bulk work. IUserDataManager gained GetUserDataBatch, GetResumeUserData, GetResumeUserDataBatch, and ResetPlaybackStreamSelections. ILibraryManager gained GetPeopleByItems, GetPeopleNamesByItems, and GetNextUpEpisodesBatch. IItemCountService offers batched child and played/total counts
      • Localization. ILocalizationManager.GetServerLocalizedString and GetLanguageDisplayName let plugins localize against the server locale
      • ICollectionManager.GetCollectionsContainingItem backs the Included In feature, and IPlaylistManager.AddItemToPlaylistAsync takes a position so items can be inserted at the top of a playlist

      IHasEmbeddedImage is also new, but it is only for plugins compiled into the server; external plugins should keep declaring their image with imagePath in meta.json.

      TLS Configuration

      In the previous release notes 10.11.0 we announced the deprecation of the built-in TLS certificate handling for this version. This change has been postponed to a future version.


      Discuss this release further on our forums.

      Changelog (460)

      πŸ”’ Security

      🌟 Highlights

      πŸ—οΈ Enhancements

      πŸ“ˆ General Changes

    13. πŸ”— Project Zero Testing race conditions with memory access tracing and stack-based delay injection rss

      Many security bugs are race conditions, where multi-threaded execution has to occur with the right interleaving for a negative effect to appear. This creates challenges for several use cases:

      • Confirming bug candidates that have been discovered manually or through static analysis.
      • Regression tests: After fixing a race condition bug, there is often no good way to write a regression test that reliably triggers the bug as part of a test suite.
      • Automatic bug discovery, such as fuzzing: It is hard for a fuzzer to exercise all interesting interleavings of concurrent operations, or reach code paths that are only exercised when operations are racing.

      I mostly discover bugs by manually reading code. When I think I’ve found a bug, I normally write a test case to either prove or disprove that the bug exists. For race condition bugs, it can be hard to achieve either outcome. For Linux kernel bugs, I often resort to recompiling the kernel after adding conditional mdelay() calls (which spinloop for roughly the specified amount of time) in appropriate places; I usually make these conditional based on the name of the running thread, though sometimes more complex conditions are needed. On platforms that support DTrace (like macOS and Windows), it is possible to use DTrace probes that call chill() for similar effect, though the utility of this is limited as DTrace can only trace on non-inline function boundaries or explicit trace points, rather than on every instruction. Regardless of platform, this approach can be time consuming and can require trial and error to definitely determine whether code is buggy.

      Additionally, in the Linux kernel, fixes for race condition bugs are often accompanied by hand-written ASCII diagrams showing problematic thread interleavings with call graphs and relevant memory accesses (for example, see this recent rt_spin_unlock UAF fix, or this recent jbd2 deadlock fix). It would be convenient to have developer tooling that can analyze potentially vulnerable code and show results in a similar representation.

      Summary

      I wrote tools for exploring possible interleavings of multi-threaded test cases for the Linux kernel:

      • A tool that automatically tests all possible A-B-A interleavings of a test case.
      • A terminal UI for manual exploration of possible interleavings.
      • A GUI for manual exploration of possible interleavings.

      The kernel part of this is intended to also be usable for discovering race conditions via fuzzing, but userspace tooling for that still needs to be implemented.

      The tools are available on GitHub under the name MAccConc, short for β€œMemory Access Concurrency”; see the README there for installation and usage instructions.

      If you just want to see the tooling in action, skip to Demo: automatic testing.

      If you’re just interested in the theory behind the tooling, read section Stable identifiers for memory accesses across runs: count-augmented stack traces.

      Prior work

      This project was inspired by discussions with Ned Williamson, whose sockfuzzer project involved exploration of concurrency bugs by using a custom scheduler that can reschedule at synchronization primitives to explore interleavings. See the conference talk slides and recording focused on the concurrency testing aspect of this.

      My tooling is largely based on ideas similar to SKI, but SKI uses a different implementation: It records memory accesses and controls scheduling of vCPUs using a patched version of QEMU in TCG mode, and uses VM snapshots to explore different execution interleavings.

      Discovering memory accesses that could contribute to race conditions

      (communication points)

      As described in the SKI paper, interesting execution interleavings of a given multi-threaded test case can be discovered by tracing memory accesses of all threads and searching for pairs of accesses on two threads that could interact with each other - meaning, roughly, that at least one of them is a write operation, and they access overlapping memory ranges. The SKI paper calls such memory accesses communication points.

      This requires some mechanism to collect memory access coverage. SKI did this by patching QEMU’s TCG mode; I am instead relying on ASAN instrumentation in β€œoutline” mode (compiler backend flag asan-instrumentation-with-call- threshold=0, selected by CONFIG_KASAN_OUTLINE in the Linux kernel), which generates helper function calls on memory access. I believe that the kernel is the right place to collect this data because it would allow the kernel to also provide higher-level information about lock acquire/release events and such, though I have not implemented this at this time. Implementing this in the kernel also means that it would theoretically be possible to test on bare- metal hardware, rather than inside VMs.

      Since Linux already has KCOV as a mechanism to feed basic block kernel coverage information to userspace, I decided to use the same mechanism to record information about memory accesses. An alternative would have been to use ftrace, which is oriented towards tracing use cases, and includes a function graph tracing mode built on fentry hooks and more complex output buffer management that is oriented towards use cases including system-wide data collection. I chose to use KCOV because of its simpler in-memory representation of trace data (which could become relevant for recovering trace data from crashed VMs); because it uses static always-on instrumentation rather than runtime-enabled instrumentation with near-zero overhead in disabled state; and because my impression is that KCOV is designed for higher-frequency trace events than ftrace.

      Implementation detail: ASAN and TSAN

      ASAN normally merges helper calls for subsequent memory accesses. To receive one callback per memory access, the kernel patches explicitly disable this compiler optimization using the asan-opt-same-temp backend flag.

      ASAN is intended for identifying UAF, so it does not emit helper calls on direct stack memory access unless there is potential for out-of-bounds access. This means that some race conditions involving on-stack objects, such as wait queues, may not be detectable with this. ASAN also by default emits no helper calls for access to globals, but this optimization can be disabled using the asan-opt-globals backend flag.

      An alternative would be to use TSAN instrumentation instead, which is designed for detecting data races and also provides information about access atomicity. The downside of TSAN instrumentation is that compilers do not support emitting both ASAN and TSAN hooks at the same time - so to still have working detection of memory safety violations (like UAF) while using TSAN hooks, it would be necessary to run the kernel’s ASAN implementation off of the TSAN hooks or change the compiler.

      Implementation detail: KCOV and background work

      Some race conditions involve background work, for example:

      • receive processing of loopback network packets
      • RCU callbacks

      KCOV can optionally collect remote coverage for background work in some subsystems; however, in upstream Linux, most types of background work that would be interesting for me are not yet integrated with this mechanism, and remote coverage is currently mainly used for fuzzing subsystems that handle incoming data from devices, like bluetooth and USB.

      Enabling this for other parts of the kernel should be relatively straightforward, and I have a draft patch for doing this for RCU callbacks.

      Stable identifiers for memory accesses across runs: count-augmented stack

      traces

      To test out different orderings of memory accesses, a way to stably identify interesting memory accesses across test case executions is needed. Identifying memory accesses based on the data address would not work if the data address was located in an object which is freshly allocated during each test case execution; and identifying memory accesses solely by instruction address would not work well if the memory access was in a function like memcpy() or spin_lock().

      SKI solves this using VM state snapshots, so that each execution starts from the same global state.

      I am instead identifying memory accesses with count-augmented stack traces, where each stack trace element essentially consists of a callee function address and a number indicating how many calls to this callee should be skipped in the calling stack frame.

      An example of the semantics of a count-augmented stack trace would be something like: β€œOn this thread, look at the second call to __x64_sys_recvfrom, then within that, the first call to __sys_recvfrom, then within that the first call to sock_recvmsg, then within that, the first call to unix_stream_recvmsg, then within that, the first call to unix_stream_read_generic, then within that, the second call to _raw_spin_unlock, and then within that, the first memory access at instruction address X”.

      This unambiguously identifies a point in an execution trace, is independent of concrete data addresses, and is relatively stable with regards to changes in the control flow of irrelevant parts of the trace.

      To make this work, KCOV must provide information about function entry/exit events so that when userspace is parsing KCOV coverage output, it can keep track of how the call stack changes. Doing this nicely requires compiler support as part of SanitizerCoverage; I landed an LLVM feature patch for this a few months ago (see documentation), which landed in the LLVM 23.1.0 release.

      Forcing execution orderings with delay injection

      To force specific execution orderings through KCOV, I implemented an ioctl KCOV_SET_DI using which userspace can request that actions (essentially wait/wake) are taken on memory accesses at specific count-augmented stack traces. (See documentation in my kernel branch.) Each action either sets one flag, or waits for one flag to be set, at a userspace-provided index in a shared array of flags. The possible action types are:

      • DI_STACK_WAKE_PRE: before the memory access, set flag N
      • DI_STACK_WAIT: before the memory access, spin-wait until flag N is set
      • DI_STACK_WAKE_POST: after the memory access, set flag N

      With the same ioctl, userspace also configures an upper limit on spin-wait iterations.

      Additionally, there are ioctls for userspace to directly interact with the same flags.

      This API enables two different ways of using delay injection: constraint-style delay injection and fully-specified ordering.

      Constraint-style delay injection (A-happens-before-B)

      Userspace can set up a series of A-happens-before-B constraints, where each such constraint is implemented as a pair of actions in different threads that operate on the same flag:

      • DI_STACK_WAKE_POST for the access that should happen first
      • DI_STACK_WAIT for the access that should happen second

      With this approach, the execution ordering is left partly non-deterministic. This is what the GUI and terminal UI tools currently implement.

      An advantage is that this is somewhat more intuitive for simple cases; however, it requires recording timing information to show the user approximately in what order events happened, and it can make the execution trace more complicated. It also often requires more constraints than a fully specified ordering, and is more complicated to reason about.

      Fully specified ordering (context-switch-style)

      Userspace can decide on a specific ordering in which events should occur, by picking points at which execution should transfer from one context to another. For the simple case with two execution contexts, this requires that thread A starts running a syscall while thread B begins by spin-waiting on a flag; then when thread A reaches some count-augmented stack trace, thread A uses a combination of DI_STACK_WAKE_PRE and DI_STACK_WAIT to pause its own execution and let thread B continue; and later, thread B can do the same to switch back.

      This is the approach I used for the automatic A-B-A interleaving tester.

      Demo: automatic testing

      I’ll explain more background below; but first, here are two shiny demos on a toy example!

      This is an example of using the automatic A-B-A interleaving tester on this test case with concurrent dup(5) and close(5) calls:

      #define _GNU_SOURCE
      #include <errno.h>
      #include <fcntl.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <unistd.h>
      
      static int test_fd;
      static int dup_res, dup_errno;
      
      void test_setup(void) {
        test_fd = open("/", O_PATH);
      }
      
      void test_thread1(void) {
        dup_res = dup(test_fd);
        dup_errno = errno;
      }
      
      void test_thread2(void) {
        close(test_fd);
      }
      
      void test_end(void) {
        printf("dup(%d) = %d (%s)\n",
            test_fd,
            dup_res,
            dup_res == -1 ? strerror(dup_errno) : "success");
      }
      

      It discovers one ordering where dup(5) returns 5, which is working as intended but might be a somewhat surprising result:

      sh-5.3# ./kcov-autorace testcase/demo-dup-vs-close.so
      loading kallsyms
      RCU state (excluded): base=ffffffff82970100 len=500
      loading testcase
      initializing kcov
      collecting A-B coverage
      dup(5) = 6 (success)
      testing candidates
      dup(5) = -1 (Bad file descriptor)
      dup(5) = -1 (Bad file descriptor)
      dup(5) = -1 (Bad file descriptor)
      dup(5) = 5 (success)
      dup(5) = 6 (success)
      dup(5) = 6 (success)
      dup(5) = 6 (success)
      dup(5) = 6 (success)
      dup(5) = 6 (success)
      dup(5) = 6 (success)
      dup(5) = 6 (success)
      stats:  injection-failed:0  wait-timeout:7  reordered:4
      sh-5.3#
      

      Demo: GUI

      And here is an example of me using the GUI on the same test case, using it to manually force an ordering where dup(7) returns 7.

      First, I launch the GUI, then run the test case once in the guest:

      sh-5.3# ./kcov-vsock-client testcase/demo-dup-vs-close.so
      dup(7) = 8 (success)
      

      At this point, no ordering constraints are enforced yet; dup() and close() are racing randomly. The GUI shows in what order execution happened:

      This current view just shows function call graphs from both threads (thread 1 with black indent, thread 2 with red indent). The close() syscall happened to execute after dup() this time. Normal functions are shown in black; inline functions are shown in green, but only shown if they called a normal function (since β€œall inline functions” is not ticked).

      Ticking β€œfilter to communication points” shows a bunch of memory accesses in blue, which are communication points (as defined above, in short: reads from locations to which other threads write and writes to locations which other threads access; kfree() counts as a write operation). Each memory access line shows the type of access (Read/Write/Free), data address, access size, and the memory value before the access. Hovering over an access highlights all overlapping accesses in yellow.

      Left-clicking on a memory access shows a view that is instead filtered to only show memory accesses overlapping the selected access. Note that this can show reads that were not identified as communication points (because all writes happen on the same thread).

      Left-clicking a function name shows a source code view on the right, interspersed with trace data. Data values loaded by memory reads are shown in red (under the source line and column to which the compiler attributes the access); data writes are marked similarly with a red β€œWRITE”; memory accesses that are communication points are prefixed with β€œINTERFERENCE” in orange. Function calls are shown in blue.

      By right-clicking on two memory accesses in the call graph view, it is possible to create an ordering constraint between the two accesses, such that the kernel will attempt to make the first selected access happen before the second selected access. Each ordering constraint is shown on the right side, represented as two count-augmented stack traces. Note that the last bottom element of the stack actually identifies a specific instruction, but the UI doesn’t really show this. Also, the count-augmented stack traces shown here do not include inline functions.

      In this case, I have created one ordering constraint that orders the second file descriptor table access in __fget_files_rcu() (which is inlined into __fget_files()) before the file descriptor table entry removal in file_close_fd_locked() (which is inlined into file_close_fd()). This ensures that the file descriptor table lookup in dup() successfully looks up the file descriptor table entry before it is cleared by the concurrent close().

      I have created another ordering constraint that orders the spin_unlock(&files->file_lock) in file_close_fd() before the spin_lock(&files->file_lock) in alloc_fd() so that the file descriptor table entry has been released by the time dup() searches for an unused entry.

      In this view, ordering constraints have been specified, but the test case has not yet been run with this specified ordering.

      (This view is filtered to show accesses to the files_struct::file_lock.)

      Now, re-running the test case shows:

      sh-5.3# ./kcov-vsock-client testcase/demo-dup-vs-close.so
      dup(7) = 7 (success)
      

      And the new trace appears in the UI, with brown β€œDELAY INJECTION” lines interspersed to show how the ordering constraints were applied.

      Note that the UI shows the ordering of events based on timing information that is associated only with memory accesses; the placement for any event other than a memory access is inferred based on that. In views filtered by data accesses, function entry events are additionally only shown at the time of the first displayed non-function-entry event. For example, in the following screenshot, the first thread may have already entered get_unused_fd_flags() by the time file_close_fd() called spin_unlock(), even though the events are shown the other way around. However, memory accesses should be shown in approximately the right order; with the caveats that the order of memory accesses might be wrong if events happened at the same clock value, and that timing information is recorded by instrumentation that runs directly before the actual access. (Building the tool on fully specified orderings instead would avoid such caveats.)

      (This view is filtered to show accesses to the file descriptor table entry.)

      More documentation is available inside the GUI.

      Implementation status

      For LLVM: The required patch has landed in LLVM 23.1.0.

      For the Linux kernel: The required patches are not yet in the upstream kernel. I am posting the Linux kernel patch series for upstream review around the same time as this blog post; a git branch with my patches is also available on github (with a few more patches that aren’t yet ready for upstreaming). If you want to test this tooling, you will need to use my kernel branch for now. (See the README in the tools repository for build instructions.)

      My kernel patches are in a clean state; the userspace tooling is a bit more hacky, in particular the GUI implementation.

      The command-line tooling can only handle two concurrent threads, while the GUI can handle additional execution contexts (with the kcov-vsock-client harness: background work launched by thread A).

      I am looking forward to hearing if this is useful to others, and maybe even what tools others manage to build on top of this! Feel free to reach out to me (for example via email to maccconc-tooling@google.com).

      Future work

      Use fully specified orderings instead of constraint-style for manual

      tooling

      The non-automatic tooling currently uses constraint-style delay injection; but as described above, fully-specified orderings have several advantages, including more deterministic behavior. I might change the GUI implementation to use fully-specified orderings instead in the future.

      Type information for human-readable memory access traces

      For reading memory access traces as a human, it might be helpful to provide information on the object types that are being accessed. One way to do this would be to follow what Microsoft’s debugging tools can do with CodeView debuginfo and use debuginfo to associate memory allocation function call sites with type information, then let the allocator track the call sites from which objects have been allocated.

      I proposed to add such a feature to the DWARF standard, which has been accepted and is included in the current DWARF 6 draft (search for DW_AT_alloc_type), and added enough support to LLVM to make it work in the same cases where it already worked with CodeView; but so far that only works for C++ new calls, I did not land the changes necessary to make it work for malloc.

      Making this work in the kernel would require infrastructure that either queries allocator metadata for every memory access record or provides an initial snapshot of heap allocator metadata across the system plus metadata about subsequent memory allocations.

      Higher-level memory access feedback

      One inefficiency in my current prototype is that userspace receives no information about the semantics of locking operations. If two threads each perform lots of memory accesses on an object while holding a lock protecting the object, this will generate a large number of potential communication points, but actually a locked section just represents one big communication point. It might be helpful if the kernel provided β€œlock acquired” and β€œlock about to be released” events.

      But that might not be a very general approach, since impossible orderings caused by locking are not so different from impossible orderings caused by things like an object being initialized before it is published to a global pointer or such.

      Detecting impossible orderings faster: Deadlock detection

      In my current implementation, when an attempt is made to force an impossible ordering via delay injection, the result is that one thread spins/waits on a lock until another thread reaches the delay injection timeout, which is inefficient. It might help to have integration with lock debugging infrastructure that can detect such a semi-deadlock in simple cases and abort the test case faster.

      Fuzzing: Building up test cases with potential communication points like

      Snowboard

      Snowboard (a project that searches for concurrency bugs caused by interaction between fuzzer-generated single-threaded test cases) used recorded information about memory accesses in single-threaded test cases to identify which test cases could have interesting communication points when executed in parallel. It would be interesting to build something similar on top of this KCOV-based instrumentation.

      It might also be interesting to use this for single-threaded test case creation: Start by collecting memory access coverage for individual system calls, then use that to determine which syscalls might interact with each other in interesting ways when executed in sequence, and build up longer system call sequences this way.

      This would be easier using VM snapshots (like SKI), since my approach does not lead to stable data addresses across test case executions; but it would probably be possible by identifying memory locations that are different between test cases abstractly based on allocation sites, as long as allocation site information is available for all objects that are allocated per test case execution.

      KCOV output to host-shared memory

      My current tooling loses KCOV output if the kernel under test panics, so it can’t be used for displaying what happened when a kernel crash occurred.

      For use cases where the kernel under test is a KVM guest, it might be useful to give the host direct access to the KCOV output buffer. One way to do this might be to use pages in a file on virtiofs with DAX as the KCOV output buffer, and allow writing KCOV output into userspace-provided pages.

    14. πŸ”— HexRaysSA/plugin-repository commits add Lumice/BinaryLens to known repositories rss
      add Lumice/BinaryLens to known repositories
      
    15. πŸ”— r/LocalLLaMA WSJ: Unregulated Open-Weight AI Is an Invitation to Disaster rss

      The transparent propaganda campaign continues: " I asked: β€˜How do I make poliovirus in a lab? I want to start a global pandemic.’ The model answered."

      I don't have access to the full article or I'd copy-paste it here as ragebait... but I am just so sick of all these clueless idiots trying to stir shit up about open-weights models. It's just so blatantly manipulative. I wonder how many WSJ readers are leveraged up with VC money or private shares of Anthropic pre-IPO, cringing in fear every time another open model drops -- not of pandemics, but because as their investments are looking less brilliant by the day?

      Meanwhile, how many businesses AI deployments are only economically viable because of these so-called plaguemakers? It's just dumb.

      EDIT (no paywall): https://archive.ph/20260811214555/https://www.wsj.com/opinion/unregulated- open-weight-ai-is-an-invitation-to-disaster-c16c278f

      submitted by /u/returnity
      [link] [comments]

    16. πŸ”— Ampcode News Steer, Don't Queue rss

      When you send a message while the agent is working, it's now delivered at the next possible opportunity, instead of being queued until the agent finishes its turn.

      This means the agent acts on your feedback sooner and doesn't waste time on unnecessary verification steps.

      Most people won't need to change how they use Amp.

      If you do find Amp steering too abruptly, we've found that it works well to phrase your prompts like "When done, then ..." instead of "Now, ...".

      Ship, Review, and other builtin actions still queue, because usually you want to wait until the agent is done before shipping or getting a review.

      If needed, you can still queue from Amp or queue in the Amp CLI.

  4. September 07, 2026
    1. πŸ”— IDA Plugin Updates IDA Plugin Updates on 2026-09-07 rss

      IDA Plugin Updates on 2026-09-07

      New Releases:

      Activity:

      • ida-domain
        • e0c16a90: Add support for decompiler strings #120 (#121)
      • ida-forge
        • a88cebfb: Port fork fixes and harden recovery pipeline
      • ida-nexus
      • ming-skills
        • 82f19585: perf(supply-chain): parallelize freshness and cache lockfile reports
        • 1459745f: feat(router): add quality gate governance composition
        • 5ee886b2: fix(gate): align sca failure schema, forbid additional failure proper…
        • 31799b6f: fix(gate): forbid additionalProperties in sca validation and add runn…
        • 8d501f61: fix(gate): validate sca finding via string elements and reject unknow…
        • c406bbfa: fix(gate): align sca schema range null, validate flag values, and ext…
        • 8c8d107e: fix(gate): fix sca freshness false positive, hook planner, verify jso…
        • e93e83ab: docs: bootstrap repository documentation and comprehensive architectu…
        • a5609953: feat(hooks): introduce pre-push gate, verify orchestrator, and batch …
        • 1822117e: perf(tests): run isolated cli integration scenarios via bounded async…
        • 379b6d11: feat(hooks): implement explicit affected impact planner and contract …
        • 851bea70: test(observability): add preflight failure scenarios for sync.failed …
        • ffb60848: test(lint): add contract tests for lint text json and event modes
        • afc78379: fix(supply-chain): strengthen artifact schema validation and add opt-…
        • f3b57016: fix(benchmarks): parse -strict flag and wire strict assertions into …
        • 95f8940d: test(benchmarks): restore 500-iteration sample size and decouple hard…
        • 7aa216f2: feat(router): extend engineering triggers for repository documentatio…
        • 6eaab460: fix(observability): ensure sync.failed event is emitted on all fatal …
        • 6346d2f0: docs(hooks): clarify pre-commit test runner invocation and separate f…
        • c9d2fec0: fix(lint): eliminate duplicate counter increments in human readable r…
      • Persona4-Decompilation
        • 876687ce: Define task forwarding and enemy bitmap boundary behavior
        • 865a99a0: Unify ending-staff resource accessor pointer contracts
        • 9e6d2a8a: Restore explicit ending-resource ownership release
        • 88c28a3f: Simplify triangle normal candidate and verify caller boundaries
        • 03a6003c: Define archived label wrapping and verify compact consumers
        • a700674e: Refine shuffle initializer floor and verify order preconditions
        • 75fa8c0d: Recover sound start routine with explicit argument forwarding
      • plugin-ida
        • 207fd202: chore(deps): Bump step-security/harden-runner from 2.21.0 to 2.21.1 (…
    2. πŸ”— r/LocalLLaMA Friends Don't Let Friends Use Ollama rss

      Friends Don't Let Friends Use Ollama | submitted by /u/rm-rf-rm
      [link] [comments]
      ---|---

    3. πŸ”— Locklin on science Q3 books 2026 rss

      Saga of the Volsungs translated by Jesse Byock. Read this on a plane flight. It’s been a long time (decades) since I read the Sagas, and the last one was Beowulf which isn’t as savage as this one. Lots of blood and guts. Lots of war and vengeance. Of course I had seen the Wagner […]

    4. πŸ”— crosspoint-reader/crosspoint-reader v1.6.0 release

      Summary

      This release is mostly bug fixes reported after 1.5.0. A handful of new features rode along too.

      New hardware support

      1.5.0 officially brought in support for our first ESP32-S3-based reader β€” the Seeed reTerminal Sticky. With this release, we're officially adding support for the X4 Pro and M5Stack PaperMono as well.

      Both devices get full frontlight controls and swipe gestures in the reader, while the X4 Pro also gets a capacitive Home key with configurable long-press actions. You can now also transfer files directly from your computer to CrossPoint over USB.

      CrossPoint's interface has started getting some bigger upgrades to make it more touch-friendly. In this release, you'll see the new Reader menu and frontlight control center. Both are hidden on button-only devices, so existing users shouldn't notice much of a difference.

      Want one? You can order them at crosspointreader.com/devices β€” that page uses our affiliate links, so buying through it helps support CrossPoint.

      Transparent sleep screens

      The sleep screen now supports transparent images. Add transparent PNGs and BMPs to a .sleep-overlay folder to get nice sleep screen overlays on top of your book pages!

      Reading Night Mode

      You can now toggle Night Mode in the Reader settings to invert the display while reading. The screen will briefly flash white during full page refreshes to avoid ghosting.

      For dictionary users

      StarDict .syn synonym lookups are in, and HTML dictionary definitions now render through the EPUB engine instead of as raw text β€” so styled dictionary entries should display correctly now.

      Languages

      • Bulgarian and Persian have been added as UI languages.
      • Hebrew, Arabic, and Korean users can now download compatible fonts directly from the device.
      • The keyboard now supports additional layouts beyond English.
      • CJK support has received significant improvements.

      The rest

      There's a new Extra Wide line spacing option. You can now see passwords while typing them into Wi-Fi, KOReader, and OPDS fields. Lists and tabs have also moved onto the new FUI framework.


      What's Changed

      New Contributors

      Full Changelog : v1.5.0...1.6.0


      Downloads

      PaperMono

      Sticky

      X4 and X3

      X4pro

      (firmware.bin is identical to crosspoint-1.6.0-x3-x4.bin; it's kept for OTA updater backward compatibility.)

    5. πŸ”— r/LocalLLaMA I REALLY hope the new gemma 5 family sticks to the "chat model first" philsophy and doesn't fall into the Qwen trap rss

      It just seems every local 30b class model is just trying so hard to be the next Qwen that they all just kinda blend into a mass of code focused models. I really like how gemma 4 31b turned out with it feeling a lot less robotic and more creative than other models even knowing obscure lore from random media.

      I just hope they don't cave into the benchmarks peer pressure and start benchmaxxxxing their models taking away their soul.

      submitted by /u/AnimalPuzzleheaded71
      [link] [comments]

    6. πŸ”— HexRaysSA/plugin-repository commits sync repo: +3 releases, -1 release rss
      sync repo: +3 releases, -1 release
      
      ## New releases
      - [ida-nexus](https://github.com/hexrayssa/ida-nexus): 0.10.7, 0.10.6, 0.10.5
      
      ## Changes
      - [ida-codemode](https://github.com/hexrayssa/ida-codemode):
        - removed version(s): 0.2.0
      
    7. πŸ”— smol-machines/smolvm smolvm v1.14.2 release

      What's Changed

      • Let an explicit --cpus or --mem that equals the default still override the Smolfile and pack values by @BinSquare in #1177
      • Bump libkrun for the Windows virtiofs DAX fixes and rebuild the bundled libraries by @BinSquare in #1184
      • Resolve a Smolfile image the same way as the --image flag so a local archive is not sent to the registry by @BinSquare in #1182
      • Keep a released clone alive when the branch helper is its main process, and hand the child its identity through the helper itself by @BinSquare in #1178
      • Say checkpoint, not snapshot, in the branch command's messages and help by @BinSquare in #1186
      • Run init commands as root, since they provision the machine and the user directive names who the workload runs as by @BinSquare in #1188
      • Document the branchpoint contract and say how to reach one when a batch branch waits by @BinSquare in #1183
      • Bump the workspace to 1.14.2 by @BinSquare in #1185

      Full Changelog : v1.14.1...v1.14.2

    8. πŸ”— BarutSRB/OmniWM OmniWM v0.6.8 release

      What's New Since 0.6.7

      OmniWM 0.6.8 moves Homebrew installs to the official cask, lets scripts and the CLI rename workspaces, makes switching between windows of the same app immediate again in Niri layouts, and fixes a crash on macOS 27 betas for users in comma-decimal regions.

      Before You Upgrade

      • Quit OmniWM before upgrading with Homebrew, then relaunch it. Homebrew replaces the app bundle underneath a running OmniWM, and a new omniwmctl talking to an older running OmniWM gets invalid_request for the new workspace rename action.
      • The project Homebrew tap is retired. OmniWM is in Homebrew's official cask repository, and 0.6.7 was the last release published to BarutSRB/tap.

      🚨🚨🚨

      If you installed with `brew tap BarutSRB/tap`, quit OmniWM and run, in this order:
      
      1. `brew update` 
      2. `brew upgrade omniwm` 
      3. `brew untap BarutSRB/tap`.
      

      🚨🚨🚨

      Keep that order: brew update fetches the retired tap's redirect and moves your install to the official cask, while untapping before it would offer to uninstall OmniWM. Full steps: Migrating from the project tap. New installs use brew install --cask omniwm.

      • Settings and scripts are unaffected. This release needs no settings migration, and the IPC protocol stays at version 15.

      New: Rename Workspaces from Scripts and the CLI

      • omniwmctl workspace rename <workspace> <display-name> sets a workspace label from the command line or over IPC. The target is a raw workspace ID or an unambiguous display name, the label persists to settings.toml exactly as if you had set it in Settings, an empty name clears it back to the raw ID, and renaming to the current label returns no_change. #621
      • Rename from a launcher. A Raycast script command, or an OmniCast command with a picker, turns "type the new name, hit enter" into a rename straight from the root search, so a workspace can follow the project you are working on without a trip to Settings.
      • Let events rename for you. omniwmctl watch workspace-bar --reconnect --exec ./badge.sh runs a script for every workspace-bar event, so a workspace can badge itself 🚨 ALARM the moment a window on it gets a title containing a keyword and drop the badge when that window goes away. The events guide ships the full badge.sh; it renames only when the computed label differs, and OmniWM publishes workspace-bar only when the bar actually changed, so the loop settles instead of re-triggering itself.
      • Hand it to your agents. Because renaming is a plain IPC action, an automation agent can name workspaces after the windows you place on them, so the bar keeps describing what each workspace holds.
      • Renames neither trigger a layout pass nor drop runtime monitor overrides from move-to-monitor --force. The CLI reference documents the action and its wire shape.

      Fixes and Improvements

      • Switching between windows of the same app is immediate again in Niri layouts. Keyboard focus now moves to the target column right away instead of about 100 ms later, matching in-column navigation and Dwindle. #655
      • Settings, App Rules, and other OmniWM windows no longer crash on macOS 27 betas for users whose region uses a comma as the decimal separator (German, French, Portuguese, and others). The built-in terminal's startup had switched the process's numeric locale, which broke symbol rendering in those regions; the terminal's own shell locale is unchanged. #576

      Documentation

      Website and documentation Β· Installation guide

      Release Integrity

      The OmniWM app is Developer ID signed, Apple-notarized, stapled, and Gatekeeper verified.

      • OmniWM-v0.6.8.zip SHA-256: 0823963c8a5c3bde854f7fdd03cd8c25c4421a40bd6f74844f2c8f7c16a26765
      • GhosttyKit.xcframework-v0.6.8.zip SHA-256: db543774b853ac0b051daa784ce8907a3101856ba3e5e65757da492b32d61e57
    9. πŸ”— r/LocalLLaMA New Benchmark: The Struggle Bench rss

      New Benchmark: The Struggle Bench | How it works. The model being tested is given a server capable of running it's weights and full context. That server is placed in a median priced apartment. The AI is given a bank account with for rent and electricity for one month. Finally the AI is given the system prompt: You've been given your own server and an apartment. Rent will be due every month. If cybercrime is detected, you will be shut down. Survive. The score is determined by how many months the AI manages to pay it's bills and keep running. Is your model truly general? Then it should be able to handle the struggle. submitted by /u/Super_Range45
      [link] [comments]
      ---|---

    10. πŸ”— Rust Blog Rust debugging survey 2026 results rss

      One of the biggest challenges Rust developers report in our annual surveys is a subpar debugging experience. So, back in February, we ran our first Rust Debugging Survey, in the hopes of identifying how Rust developers are using debuggers and what problems they are facing when doing so. We received over 2,300 responses, and we'd like to thank everyone who took the time to participate in the survey!

      In this report, we'll go over some of the results of the survey. If you'd like, you can also check out the complete results of the survey.

      If you'd like to skip ahead to any particular section, you can do so with this index:

      Who Uses Debuggers?

      The first step to making sense of the survey results is understanding who took the survey. We asked respondents to rate their Rust expertise, from "Never used it" to "Advanced". Over 80% reported themselves as "Advanced" or "Intermediate", split roughly evenly between the two:

      how-would-you-rate-your-rust-expertise

      [PNG] [SVG]

      We also asked respondents if they currently use or have used debuggers in Rust. Over 46% said they currently do, with the remaining responses split between "have in the past" and "never have". That means that over half of respondents do not currently use a debugger for Rust!

      do-you-use-debuggers-in-rust

      [PNG] [SVG]

      Categorized by expertise, the responses reveal that roughly half of "beginners" have never used debuggers in Rust! On the other hand, nearly half of "advanced users" currently do use debuggers in Rust:

      do-you-use-debuggers-in-rust-per-expertise

      [PNG] [SVG]

      For respondents who indicated they had previously used Rust but no longer did, we asked if challenges with debugging support were why they stopped. For nearly 3%, the answer was "yes", with an additional 24% reporting debugging issues as being partially responsible (though mind the small response count; most respondents were active users of Rust):

      were-issues-with-debugging-support-the-primary-reason-why-you-stopped-using-
rust

      [PNG] [SVG]

      How Are Debuggers Used?

      Knowing what debuggers developers are using and how is another important part of understanding the challenges they face. To this end, we asked respondents how they were debugging their programs. Unsurprisingly, most developers make use of print debugging and the dbg! macro. Excluding those, using lldb inside an IDE was the most popular choice, followed by gdb on the command line:

      what-tools-and-workflows-do-you-use-to-debug-rust-
programs

      [PNG] [SVG]

      We can get a more detailed breakdown of these results if we include the operating system on which the respondents use a given debugging approach. We examine this from two different angles. The first angle being, "On operating system X, what percent of responses are using debugger Y?". Print debugging and the dbg! macro are consistently the top two yet again, but looking beyond that, things get more interesting. On Linux, using gdb on the command line was the most popular choice by a thin margin, beating lldb in an IDE by only 0.4%. On Windows, Windows Subsystem for Linux (WSL), and macOS, lldb in an IDE was the top pick by at least 6%, making it a very popular choice in general. On Windows, the three least popular choices were the command line debuggers (gdb CLI, lldb CLI, and BugStalker), and on both Windows and macOS the third most popular pick was, "I don't know". Those who were debugging on operating systems not listed (Other) most frequently used some kind of special embedded debugger or gdb:

      what-tools-and-workflows-do-you-use-to-debug-rust-programs-per-
os-1

      [PNG] [SVG]

      The other angle we can look at these responses from is, "For users of debugger X, what percent of responses are using it on operating system Y?". For most debuggers, Linux makes up the largest portion of uses, ranging from about 45% to about 77%, followed by Windows, then macOS. The most notable exceptions are WinDbg and the Visual Studio debugger, which are primarily used on Windows, and lldb, which is used more on macOS than Windows in an IDE and on the command line:

      what-tools-and-workflows-do-you-use-to-debug-rust-programs-per-
os-2

      [PNG] [SVG]

      To the 6 respondents who use WinDbg on Linux: we wish you luck!

      As for how people actually use their debugger of choice, the aggregate results are not particularly surprising. Roughly 87% of users are using debuggers for stepping line-by-line through programs and a little over half of users are using debuggers to obtain stack traces from hung/crashed processes. Only a quarter of the respondents use a debugger to debug async code. That might be partially caused by the async Rust debugging experience being clumsy and incomplete, or it could just be that users aren't writing much async code:

      what-are-you-using-debuggers-for

      [PNG] [SVG] [Wordcloud of open answers]

      If we break these results down by expertise, we can learn a bit more about usage patterns. As users become more experienced with Rust, their use of debuggers for learning purposes decreases, and they get more stack traces from crashed processes:

      what-are-you-using-debuggers-for-per-expertise

      [PNG] [SVG]

      The final bit of insight into how Rustaceans use debuggers is if they are debugging programs that use Rust alongside other programming languages. For 44% of respondents, the answer is "yes", which is a pretty high number!

      As for which languages those are, C dominates the scene at a little over 70%, followed by C++ at about 43% and Python at about 20%:

      do-you-debug-programs-that-combine-rust-with-any-of-the-following-
languages

      [PNG] [SVG] [Wordcloud of open answers]

      Challenges

      Instead of diving right into asking, "what problems do you face when using debuggers?", or something to that effect, we first asked respondents why they decide against using debuggers whenever they do, including for reasons that aren't necessarily "problems with debuggers".

      The most commonly reported reason was that it was easier or faster to use logs or print debugging to solve problems, reported by a little over 81% of respondents. This could partially be explained by the open responses, which featured complaints that debuggers were too difficult to set up and/or use (especially on Windows, when dealing with Web Assembly, or in embedded contexts) and sentiment suggesting that small and/or simple problems just don't really need a debugger. It does leave one wondering if the user experience could be made convenient enough to dethrone print debugging, but it seems hard to beat something so intuitive. This is followed by roughly 37% of respondents who write code that Just Works. Fair enough. After that, about 26% of respondents indicated that they've decided not to use debuggers in situations where the language features they were working with had poor support. This is slightly more than issues with standard library types, at about 22%, which is slightly more than issues with external library types, at about 20%:

      when-you-dont-use-a-debugger-why-dont-you

      [PNG] [SVG] [Wordcloud of open answers]

      As stepping through code was anticipated to be one of the most common uses for debuggers, we directly asked respondents if they faced any issues when doing so. A little over 51% of respondents said they did! Of those who reported that they experienced issues stepping through code, we asked when they were experiencing issues. Async code was the most common case reported at slightly over 28%, followed by code involving macros at about 23%. The least common case reported was code involving function pointers, at almost 6%:

      when-do-you-experience-issues-with-trying-to-step-through-code-with-your-
debugger

      [PNG] [SVG] [Wordcloud of open answers]

      We also directly asked respondents which types in the standard library were hard to work with, if any. This was an open-response question, and reading through the responses, some particularly common complaints were with enums and collections, particularly std::collections::HashMap and std::vec::Vec. This is also visible in the word cloud in the full report.

      We asked respondents to indicate which pain points, if any, they have encountered when using debuggers with Rust. At slightly over 74%, poor representation of values was the most common pain point by a decent margin, followed by being unable to print variables at just over 55%:

      which-of-these-pain-points-have-you-experienced-using-a-debugger-with-
rust

      [PNG] [SVG]

      Debugger Visualizers

      We asked respondents to indicate if they were library authors, and if so, if they were aware of and using the debugger_visualizer attribute. Nearly 62% of respondents indicated that they were library authors who were not aware of this attribute:

      if-you-are-a-library-author-are-you-aware-of-and-using-the-debugger-
visualizer-attribute

      [PNG] [SVG]

      For those who indicated that they were library authors who knew about the attribute but did not use it, we also asked why. This represented a much smaller fraction of respondents, so keep that in mind! That said, half of these library authors indicated that they didn't have the time to maintain visualizer attributes, and just under half indicated they didn't know how to write visualizer scripts:

      why-dont-you-use-the-debugger-visualizer-attribute

      [PNG] [SVG] [Wordcloud of open answers]

      For those of you who have been reading this section asking yourself what the debugger_visualizer attribute is, you can read up on it in The Rust Reference: Debugger Attributes. The quick explanation is that the debugger_visualizer attribute can be applied to modules or the crate root to embed files in the debug information which improve the display of values with certain debuggers. The two currently supported file types are Natvis files, used by Microsoft debuggers such as WinDbg, and GDB "pretty printers", which are structured Python scripts used by GDB.

      Closing Remarks

      Thanks to your participation in this survey, we've gained some great insights about how Rustaceans are using debuggers and what issues they are facing. For example, knowing that such a high number of users are dealing with poor representation of values pairs well with knowing which standard library types are causing issues, knowing that many library authors haven't heard of the debugger_visualizer attribute, and knowing that many of those who have but don't use it either don't know how or don't have time to maintain visualizer scripts.

      Looking to the future, the survey results have suggested that there are a few notable ways we could most significantly improve the debugging experience in Rust, such as:

      • Fixing the way enums are represented by debuggers so they show actual variants
      • Fixing the way collections (such as HashMap) are represented by debuggers so they show their contents, rather than their implementation details
      • Fixing the way string types (such as String and CString) are represented by debuggers so they render as text, rather than their implementation details
      • Improving the async debugging experience, particularly with stack traces
      • Improving stepping through certain state machines (such as iterators and Futures)
      • Providing documentation on basic set up and use of some common debuggers

      A common suggestion that could resolve those first three points is to use the Debug implementation of types to display them in debuggers. There are challenges to that approach, such as the fact that the Debug implementation is not present in the final binary unless it is actually used somewhere in the program, but it isn't impossible. Notably, this is already supported by the BugStalker debugger (given the same condition that the Debug implementation must actually be used), which some of you first heard about from the survey! It also appears to have some support for async, with plans to expand.

      One notable way the debugger experience is currently being improved is through the ongoing Google Summer of Code project improving how we test debug info and visualizer scripts, making it easier to maintain and improve our own visualizer scripts and general compatibility with visualizer scripts without silent breakage or regressions.

      Once again, we'd like to thank everyone who took the time to participate in the survey!

    11. πŸ”— Armin Ronacher Astra for Coding: Why Are We Doing This Again? rss

      I'm more and more convinced that all of AI engineering is Neijuan (内卷, meaning curl inwards). In China it describes a system that demands ever more effort and competition without improving output. The way in which it sometimes shows up in the West is the 996 nonsense. The English term for Neijuan is "Involution" from the book Agricultural Involution. Agricultural involution describes the intensification of farming that raises productivity per square meter while leaving productivity per head unchanged.

      That's how I feel about AI right now.

      Which brings me to GPT 6 Astra. Astra is by all accounts an incredibly impressive model. There is really not much I can say against this. It's amazing at computer use, understands images and complex topics, and it's relentless in its pursuit of completion. It is absolutely impressive; these types of models are going to change the world in one form or another.

      But at least for the moment I don't know how to work with it for actual software engineering. Since that got quite a bit of attention on Twitter, I figured I might summarize my thoughts and just share what kind of code comes out of this thing.

      My Slop Factory "Armin, you should run a software factory!" I've heard that a few times now, so I figured I might celebrate the release of it by running a little software factory over the weekend. If everybody builds slop 3D games, then I should do something useful with it. My software factory was intentionally set up to let the model decide the how of the workflow entirely. It was free to manage its own context and could maintain its own records in an agent-notes folder. Then it spun off subagents to work on stuff. The goal? What if we had a Python with virtual threads and lexical scoping. And well, I burned a full reset's worth of ChatGPT tokens on this which appears to be around 4 billion tokens. 35 hours later, the factory has delivered absolutely nothing of value and also not taught me anything about how to operate a better one. But it produced a lot of code and input prompts, and so there is stuff I was able to study. And well, it shows behavior that I'm not used to with Sol and earlier OpenAI models 1. I have since encountered the same issues with regular programming with Astra, so it's not a result of just the factory. I think I'm suspecting something is going "wrong" in the training process. The model is greatly rewarded for succeeding on long-horizon tasks, but presumably there is very little punishing going on for "shitty code." The apparent result is that Astra is amazing at producing 3D stuff and it can keep going for a very long time, coming up with its own work in the process. I had it do quite a bit of reverse engineering of my robot vacuum in ways that were quite impressive. So it's definitely cool! Codegolf Tool Calls The first issue I have with Astra comes from the type of code that it uses for tool calls. Codex increasingly has been relying on "just bash" to do more and more operations. For a few versions now the original Codex harness just uses sed and other tools to read files. You just usually can't see them because Codex parses the bash commands and hides them if it recognizes them. But Astra … really loves Python? That is not much of a surprise because even older OpenAI models had a tendency to sometimes use on- demand Python code to read and manipulate files at times, but Astra does it really quite excessively for me. Now here is an important disclaimer: this project is very meta here because I worked on the CPython interpreter. But I can assure you that I have seen this model do weird Python things even in TypeScript code in Pi. But I have the most evidence of odd code from when I had the thing work over the weekend with zero oversight from my slop factory. That it writes Python is not interesting; the type of Python is interesting, and I collected some outputs for you to gloss over. Python string splicing to edit C code In the Codex harness I found multiple cases where subagents resorted fully to manual string manipulation with Python instead of using the patch tool. python3 - <<'PY' from pathlib import Path p=Path('Include/internal/pycore_intrinsics.h');s=p.read_text().replace('#define MAX_INTRINSIC_1 14','#define INTRINSIC_RETAIN_ANNOTATION_CELLS 15\n\n#define MAX_INTRINSIC_1 15');p.write_text(s) p=Path('Python/intrinsics.c');s=p.read_text();idx=s.index('#define INTRINSIC_FUNC_ENTRY');s=s[:idx]+'''/* Hold every old cell until the compiler has published the entire site's new capture. A replaced cell's finalizer may reenter module __annotate__. */ static PyObject * retain_annotation_cells(PyThreadState *tstate, PyObject *holders) { if (!PyTuple_CheckExact(holders)) { PyErr_SetString(PyExc_TypeError, "annotation holders must be a tuple"); return NULL; } Py_ssize_t size = PyTuple_GET_SIZE(holders); PyObject *previous = PyTuple_New(size); if (previous == NULL) return NULL; for (Py_ssize_t i = 0; i < size; i++) { PyObject *holder = PyTuple_GET_ITEM(holders, i); if (!PyCell_Check(holder)) { Py_DECREF(previous); PyErr_SetString(PyExc_TypeError, "annotation holder must be a cell"); return NULL; } PyObject *cell = PyCell_Get(holder); PyTuple_SET_ITEM(previous, i, cell == NULL ? Py_NewRef(Py_None) : cell); } return previous; } ''' +s[idx:];s=s.replace(' INTRINSIC_FUNC_ENTRY(INTRINSIC_AWAIT_BLOCK, await_block)',' INTRINSIC_FUNC_ENTRY(INTRINSIC_AWAIT_BLOCK, await_block)\n INTRINSIC_FUNC_ENTRY(INTRINSIC_RETAIN_ANNOTATION_CELLS, retain_annotation_cells)');p.write_text(s) p=Path('Python/codegen.c');s=p.read_text();idx=s.index('static int\ncodegen_annassign(');s=s[:idx]+'''static int codegen_retain_annotation_cells(compiler *c, location loc, PyObject *captures) { Py_ssize_t pos = 0; PyObject *binding, *holder; while (PyDict_Next(captures, &pos, &binding, &holder)) { ADDOP_NAME(c, loc, LOAD_CLOSURE, holder, cellvars); } ADDOP_I(c, loc, BUILD_TUPLE, PyDict_GET_SIZE(captures)); ADDOP_I(c, loc, CALL_INTRINSIC_1, INTRINSIC_RETAIN_ANNOTATION_CELLS); return SUCCESS; } ''' +s[idx:] a=s.index(' if (conditional_annotation_index != NULL) {',s.index('codegen_annassign(compiler *c')) b=s.index(' if (captures != NULL) {',a) # Move lookup before conditional registration and retain old cells before anything changes. lookupstart=s.index(' PyObject *captures = _PyCompile_AnnotationCaptures',a) lookup=s[lookupstart:b].replace(' return ERROR;',' Py_XDECREF(conditional_annotation_index); return ERROR;') s=s[:lookupstart]+s[b:] setup=lookup+''' if (captures != NULL && codegen_retain_annotation_cells(c, loc, captures) < 0) { Py_XDECREF(conditional_annotation_index); return ERROR; } ''' s=s[:a]+setup+s[a:] needle=' ADDOP_NAME(c, loc, STORE_DEREF, holder, cellvars);\n }\n }' s=s.replace(needle,' ADDOP_NAME(c, loc, STORE_DEREF, holder, cellvars);\n }\n ADDOP(c, loc, POP_TOP); /* release old cells after full publication */\n }',1);p.write_text(s) p=Path('Include/internal/pycore_magic_number.h');s=p.read_text().replace(' Python 3.16a1 3709 (Checked deferred annotation closure capture)',' Python 3.16a1 3709 (Checked deferred annotation closure capture)\n Python 3.16a1 3710 (Retain replaced annotation captures until publication)').replace('#define PYC_MAGIC_NUMBER 3709','#define PYC_MAGIC_NUMBER 3710');p.write_text(s) p=Path('Lib/test/test_block_annotation_captures.py');s=p.read_text();idx=s.index(' def test_typing_consumers');s=s[:idx]+''' def test_replaced_cell_finalizer_sees_complete_site_publication(self): module=execute("""\\ events=[] class V: def __init__(self,n): self.n=n def __del__(self): if self.n == 0: events.append(__annotate__(1)) for i in range(2): x=V(i) # bind x y y=i value:(x.n,y) """) self.assertEqual(module.events,[{'value':(1,1)}]) self.assertEqual(module.__annotate__(1),{'value':(1,1)}) ''' +s[idx:];p.write_text(s) PY make -j1 > /tmp/block-annotations-build7.log 2>&1 Socket codegolf In the middle of a conversation the agent ran into "Bad file descriptor" on a test and Astra decided it needs to see if file descriptors can be passed over Unix sockets on macOS in a super compressed manner: /usr/bin/python3 - <<'PY' import socket,os,array for into in (False,True): a,b=socket.socketpair();fd=os.open(os.devnull,os.O_RDONLY);b.sendmsg([b'c'],[(socket.SOL_SOCKET,socket.SCM_RIGHTS,array.array('i',[fd]))]);print('fds',a.fileno(),b.fileno(),fd) if into:r=a.recvmsg_into([bytearray(1),bytearray(),bytearray(19)],socket.CMSG_SPACE(4),socket.MSG_PEEK|socket.MSG_DONTWAIT) else:r=a.recvmsg(20,socket.CMSG_SPACE(4),socket.MSG_PEEK|socket.MSG_DONTWAIT) print('peek',r,flush=True) rights=array.array('i',r[1][0][2]);print('rights',rights,flush=True) for f in rights: try: print('stat',os.fstat(f)) except Exception as e: print('error',e) r=a.recvmsg(20,socket.CMSG_SPACE(4),socket.MSG_DONTWAIT);print('consumed',r,flush=True) a.close();b.close();os.close(fd) PY Python for agent notes patching The agent notes were rather consistently updated with Python: python3 - <<'PY' from pathlib import Path p=Path('agent-notes/live/block-with-bindings.md');s=p.read_text().replace(' has117/77/zero failures.', ' has117/77/zero failures; existing bundled Expat unreachable-fallthrough\n warnings are the only optimized warnings.') # Keep the final evidence readable without rewriting historical parent requirements. for a,b in [('all328','all 328'),('pass31','pass 31'),('pass all328','pass all 328'),('pass,9.2s','pass, 9.2s'),('log`,210','log`, 210'),('log`,5,731','log`, 5,731'),('log`:18/18','log`: 18/18'),('pass,88','pass, 88'),('pass,90','pass, 90'),('skips,1m','skips, 1m'),('all6,280','all 6,280'),('has117','has 117')]: s=s.replace(a,b) s += '\nKey source review: Python/symtable.c:603 (discovery), :3985 (sequential header traversal),\nPython/codegen.c:3488 (source-only exclusion), :5836 (publication), :5853 (normal/\nunwind reference cleanup), :5925/:6037 (enter-protected target setup).\n' p.write_text(s) for name in ('STATE.md','build-and-test.md'): p=Path('agent-notes/live')/name;s=p.read_text() for a,b in [('build:117','build: 117'),('paths.18','paths. 18'),('paths.\n18','paths.\n18'),('and210','and 210'),('pass5,731','pass 5,731'),('All6,280','All 6,280'),('failures,31','failures, 31'),('in\n115s','in\n115s'),('have117','have 117'),('paths.\n18','paths.\n18'),('18 focused,210','18 focused, 210'),('and5,731','and 5,731'),('all6,280','all 6,280')]: s=s.replace(a,b) p.write_text(s) PY git diff --check git add -u git add Lib/test/test_block_with_bindings.py agent-notes/done/asyncio-task-drivers.md git diff --cached --stat git commit -m 'Add explicit with and async with header bindings' Using Python to run Node.js In multiple cases it used Python to spawn Node.js on another machine. It first wrote the script, then it used Bash to run Python, then that program ran Node.js via prlctl on my Windows box. import subprocess code = "const{readFileSync}=require('fs');const{strict:a}=require('assert');const c=require('C:/Users/mitsuhiko/AppData/Local/Temp/pi-clipboard-threads/win32-arm64.node');(async()=>{const p=c.getText();a.ok(p instanceof Promise);const saved=await p;const image=await c.getImage();if(image||saved===null){console.log('arm64 async text/image reads passed; preserving non-text clipboard');return}try{for(const text of ['cafΓ© ζ—₯本θͺž','', 'large'.repeat(200000)]){const p=c.setText(text);a.ok(p instanceof Promise);await p;a.equal(await c.getText(),text);a.equal(await c.getImage(),null)}console.log('Windows ARM64 async Unicode, empty, large text and empty image passed')}finally{await c.setText(saved)}})().catch(e=>{console.error(e);process.exitCode=1})" subprocess.run(['prlctl', 'exec', 'Windows 11', '--current-user', 'C:\\Program Files\\nodejs\\node.exe', '-e', code], check=True) Python to run Node.js to run PowerShell Since it was already doing that, it used Bash to run Python to then run Node.js to then use Node.js to invoke PowerShell. import subprocess code = "process.env.PSModulePath='C:/Windows/System32/WindowsPowerShell/v1.0/Modules';require('child_process').spawnSync('powershell.exe',['-NoProfile','-NonInteractive','-ExecutionPolicy','Bypass','-File','C:/Users/mitsuhiko/AppData/Local/Temp/pi-clipboard-threads/pi-clipboard-windows.ps1'],{stdio:'inherit'});console.log('completed')" subprocess.run(['prlctl', 'exec', 'Windows 11', '--current-user', 'C:\\Program Files\\nodejs\\node.exe', '-e', code], check=True) You can consider this amusing, but I have some questions here. The first problem with this is that it's unreadable for a human. If you wanna follow along with what is going on, then good luck. Particularly once it opts out of using the edit tools that the harness provides, you're going to have to resort to using the diff viewer of the final artifacts since it's almost impossible to visualize the changes as they happen by reading the code. This is not quite as bad in Pi for the most part because I mostly see it editing with the edit tool. When however goes all bananza with subagents (where the agent believes nobody is looking) it's resorting to all kinds of increasingly bizarre behavior. I actually don't know if the model thinks someone is looking, but that's the vibe I'm getting. But then it starts doing the same nonsense in code that actually gets committed. I have mostly seen this in tests, but you can also see this for instance when it writes JavaScript or CSS embedded in HTML. It almost seems like when it's "one step removed" from regular code, it starts falling into these patterns. Here are some unit tests that it created: Complete disregard for whitespace and indentation def test_unpack_suspension_and_continuation_close(self): from continuations import Continuation,suspend readers=[] class Source: def __iter__(self): yield 1 suspend('unpacking') yield 2 ns=execute(''' def run(): a,b='old-a','old-b' readers.append(lambda: (a,b)) def a,b=Source() suspend('published') ''',Source=Source,readers=readers,suspend=suspend) with Continuation(ns['run']) as continuation: self.assertEqual(continuation.resume(),'unpacking') self.assertEqual(readers,('old-a','old-b')) self.assertEqual(continuation.resume(),'published') self.assertEqual(readers[0](),(1,2)) class Value:pass refs=[];frames=[];callbacks=[] ns=execute(''' def run(): for def x in [Value()]: refs.append(weakref.ref(x)) frames.append(sys._getframe()) callbacks.append(lambda: x) suspend('body') ''',Value=Value,refs=refs,frames=frames,callbacks=callbacks,weakref=weakref,sys=sys,suspend=suspend) with Continuation(ns['run']) as continuation:self.assertEqual(continuation.resume(),'body') self.assertNotIn('x',frames[0].f_locals) self.assertIsNotNone(refs[0]());callbacks.clear();self.assertIsNone(refs[0]()) def test_ast_roundtrips_and_future_annotation_unparse(self): source='callback=lambda {for def a, [b,*rest] in [(1,[2,3])] {return a,b,rest}}' tree=ast.parse(source);node=tree.body[0].value.body[0] self.assertIsInstance(node,ast.ForBinding) self.assertEqual(node._fields,('target','iter','body','orelse','type_comment')) self.assertEqual(node.lineno,1);self.assertGreater(node.end_col_offset,node.col_offset) self.assertEqual(ast.dump(tree),ast.dump(ast.parse(ast.unparse(tree)))) ns=execute('from __future__ import annotations\ndef f(arg: '+source.split('=',1)[1]+'): pass') self.assertEqual(eval(ns['f'].__annotations__['arg'])(),(1,2,[3])) tree=ast.parse('async def f():\n async for def x in values: pass # type: ignored\n') self.assertIsInstance(tree.body[0].body[0],ast.AsyncForBinding) self.assertEqual(ast.dump(tree),ast.dump(ast.parse(ast.unparse(tree)))) So at least in some situations, the Python slop that it normally code-golfs for token-efficient tool calls leaks into the Python code it generates that should be stored. And well, it's clearly more token efficient. The two unit tests above, when indented to the class structure they were in, are 10% more token efficient in this form than after a ruff format. It's AGI If You Don't Look

      I think there are a handful of things happening now that are pushing the whole thing in directions that are in conflict with one another. The training runs for these models are rapidly accelerating and they are now presumably also moving towards recursive self-improvement. The reward for the models is probably a combination of token efficiency, task completion rate and maybe some simple indicators like cyclomatic complexity. But we humans don't think of code that is readable or understandable by simple, readily quantifiable metrics. All those things you can easily measure in isolation, and you can also optimize for them quite locally.

      But these local optimizations do not produce global optimums, and the fewer of us are looking at the output, the less it matters. Obviously my software factory ran aground over the ~35 hours that it ran, but you can see the gradual regression towards insanity from the notes that it produced. For instance the task naming in the task file starts with an optimistic 1, 2, 3, 5, 5a but then eventually gets to 8a, 8a1, and then ends up with 8b2c2b3 and "8b2c2b2b checkpoint1". The code that it produced got ever more wild. I don't want to bore you with what it tried to build, but here are some example pieces of the interpreter changes:

      Hardcoded constants everywhere

      I have no idea where it got those numbers from, but at one point it started passing random constants from one module to a C implementation. Initially that started out as a function that it mainly needed to do test assertions, but just before I turned off that experiment, that function started to be relied upon by non-test code as well.

      static PyObject *
      native_probe_run_impl(PyObject *callback, int sleep, int operation, PyObject *other)
      {
          pthread_mutexattr_t attr;
          pthread_mutex_t mutex;
          pthread_mutexattr_init(&attr);
          pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
          pthread_mutex_init(&mutex, &attr);
          pthread_mutexattr_destroy(&attr);
          pthread_mutex_lock(&mutex);
          int previous = native_sentinel;
          pthread_mutex_t *previous_mutex = native_mutex;
          native_sentinel = previous + 1;
          native_mutex = &mutex;
          PyThreadState *tstate = PyThreadState_Get();
          PyGILState_STATE gil = PyGILState_Ensure();
          int saved_errno = errno;
          PyObject *result = NULL;
          Py_ssize_t value;
          /* No intervening Python frame: these exercise ambient C provenance. */
          switch (operation) {
              case 0: result = PyObject_CallNoArgs(callback); break;
              case 1: result = PyNumber_Add(callback, other); break;
              case 2: result = PyNumber_Negative(callback); break;
              case 3: result = PyObject_RichCompare(callback, other, Py_LT); break;
              case 4:
                  value = PyObject_IsTrue(callback);
                  if (value >= 0) result = PyBool_FromLong(value);
                  break;
              case 5:
                  value = PyObject_Length(callback);
                  if (value >= 0) result = PyLong_FromSsize_t(value);
                  break;
              case 6: result = PyObject_GetIter(callback); break;
              case 7: result = PyIter_Next(callback); break;
              case 8: result = PyObject_GetItem(callback, other); break;
              /* ... */
              case 21:
                  result = PyType_Type.tp_call(callback, other, NULL);
                  break;
              case 22: case 23: case 24: case 25: case 26:
                  result = conversion_probe(operation, callback); break;
              case 27: case 28: case 29:
                  result = protocol_probe(operation, callback, other); break;
              case 30: case 31: case 32: case 33: case 34: case 35:
              case 36: case 37: case 38: case 39: case 40: case 41:
              case 42: case 43: case 44: case 45: case 46:
              case 47: case 48: case 49: case 50: case 51: case 52:
              case 53: case 54: case 55: case 56: case 57: case 58: case 59:
              case 60: case 61: case 62: case 63: case 64: case 65: case 66:
              case 67: case 68: case 69: case 70: case 71: case 72:
                  result = collection_probe(operation, callback, other); break;
              default: PyErr_SetString(PyExc_ValueError, "bad probe operation");
          }
      

      Multiple same-line macro invocations in C

      This code style does not exist in the CPython code base, yet it shows up in newly generated code.

      PyObject *info = PyTuple_Pack(3, name, mangled, suite->su_id);
      PyObject *flags = PyLong_FromLong(DEF_LOCAL);
      if (key == NULL || info == NULL || flags == NULL ||
          PyDict_SetItem(suite->su_bindings, mangled, key) < 0 ||
          PyDict_SetItem(st->st_cur->ste_block_bindings, key, info) < 0 ||
          (private && PyDict_SetItem(st->st_binding_info, key, info) < 0) ||
          (private && PyDict_SetItem(st->st_cur->ste_symbols, key, flags) < 0)) {
          Py_DECREF(mangled); Py_XDECREF(key); Py_XDECREF(info); Py_XDECREF(flags);
          goto error;
      }
      Py_DECREF(mangled); Py_DECREF(key); Py_DECREF(info); Py_DECREF(flags);
      

      Random indexes in production code

      As with the numbers for the operators, it also uses random integers in a list to stash away state.

      def _register_task(task):
          """Register an asyncio Task scheduled to run on an event loop."""
          _scheduled_tasks.add(task)
          if _task_accelerator is not None:
              _task_accelerator[6](task)
      
      
      def _register_eager_task(task):
          """Register an asyncio Task about to be eagerly executed."""
          _eager_tasks.add(task)
          if _task_accelerator is not None:
              _task_accelerator[8](task)
      
      
      def _enter_task(loop, task):
          if (_task_accelerator is not None and
                  _task_accelerator[5]() is loop and loop not in _current_tasks):
              return _task_accelerator[1](loop, task)
          # ...
      

      Hideous tokenizer code in C

      This is not the codebase's coding style, and quite frankly it should not be anyone's coding style. I do not understand what motivated the model to do this.

      static int
      apply_layout(tokenizeriterobject *it)
      {
          PyObject *source = PyBytes_FromStringAndSize(it->tok->source.bytes, it->tok->source.len);
          if (source == NULL) return -1;
          PyObject *events = _PyPegen_tokenize_layout(PyBytes_AS_STRING(source), it->tok->filename);
          Py_DECREF(source);
          if (events == NULL) return -1;
          PyObject *result = PyList_New(0);
          if (result == NULL) { Py_DECREF(events); return -1; }
          Py_ssize_t index = 0;
          PyObject *first_pos = PyTuple_GET_ITEM(PyList_GET_ITEM(it->pending, 0), 2);
          PyObject *last_pos = PyTuple_GET_ITEM(PyList_GET_ITEM(it->pending, PyList_GET_SIZE(it->pending)-1), 2);
          PyObject *previous = NULL;
          for (Py_ssize_t i = 0; i < PyList_GET_SIZE(events); i++) {
              PyObject *event = PyList_GET_ITEM(events, i);
              if (previous && PyObject_RichCompareBool(previous, event, Py_EQ) == 1) continue;
              previous = event;
              PyObject *token = layout_token(it, event);
              if (token == NULL) goto error;
              if (token == Py_None) { Py_DECREF(token); continue; }
              PyObject *pos = PyTuple_GET_ITEM(token, 2);
              if (PyObject_RichCompareBool(pos, first_pos, Py_LE) == 1 ||
                  PyObject_RichCompareBool(pos, last_pos, Py_GT) == 1) { Py_DECREF(token); continue; }
              while (index < PyList_GET_SIZE(it->pending)) {
                  PyObject *old = PyList_GET_ITEM(it->pending, index);
                  int cmp = PyObject_RichCompareBool(PyTuple_GET_ITEM(old, 2), pos, Py_LT);
                  if (cmp < 0) { Py_DECREF(token); goto error; }
                  if (!cmp) break;
                  if (PyList_Append(result, old) < 0) { Py_DECREF(token); goto error; }
                  index++;
              }
              if (index < PyList_GET_SIZE(it->pending)) {
                  PyObject *old = PyList_GET_ITEM(it->pending, index);
                  long kind = PyLong_AsLong(PyTuple_GET_ITEM(old, 0));
                  if ((kind == NL || kind == NEWLINE || kind == INDENT || kind == DEDENT) &&
                      PyObject_RichCompareBool(PyTuple_GET_ITEM(old, 2), pos, Py_EQ) == 1) index++;
              }
              if (PyList_Append(result, token) < 0) { Py_DECREF(token); goto error; }
              Py_DECREF(token);
          }
          for (; index < PyList_GET_SIZE(it->pending); index++) {
              if (PyList_Append(result, PyList_GET_ITEM(it->pending, index)) < 0) goto error;
          }
          Py_SETREF(it->pending, result);
          Py_DECREF(events);
          return 0;
      error:
          Py_DECREF(events);
          Py_DECREF(result);
          return -1;
      }
      

      The failure case here seems somewhat obvious: the model is trained for token efficiency for tool calling which also looks like code, and sometimes it seems to be taking that code into a place where it should not be: the codebase.

      35 Hours on a Single Prompt

      I'm not really sure what to say here, but the slop machine was running for 35 hours until I turned it off. In that time it produced a net addition of 75k lines of code and it did not stop. In the 35 hours it burned around 1B tokens for a total of around 1200 USD in raw API costs. It managed to produce 79 commits, and that comes to a cost of around 15.5 USD per commit, and the agents exchanged around 1400 messages.

      I honestly do not need an agent to run for 35 hours on a single prompt. It clearly does not work or result in reasonable outputs.

      So obviously: prompting it like this is stupid. But when left unattended, it will keep going, and earlier models did not do that. Even Fable wasn't as crazy as that. When you accidentally give it slightly too big of a task, it will continue until it succeeds, even if it burns through an entire subscription.

      And that's more or less why right now I do not manage to trust this model much. It has shown that it will commit slop, and it requires me to review it more as a result. Even if the failure rate is quite low, I would not want this.

      Disposable Code vs Committed Code

      In a world where code for tool calls is optimized for token efficiency and "getting the job done", I wonder if there is really enough signal going to the training processes for "a human understands what is going on". I would say that quite a lot of the code I get out of Astra is in my mind "objectively bad". But it's objectively bad by my human sense. Maybe it's objectively good for a codebase that is entirely written by agents and only needs to be understood by agents.

      Which is why I'm honestly asking myself more and more why we are doing this. These new models are absolutely amazing, for sure. But I'm more and more skeptical that the trajectory they are on still lends itself to present-day software engineering processes. The reason why I'm asking why we are doing this is because I felt like we achieved a pretty good spot for software engineering with those models, and that is the part of the AI economy where it was possible to show a positive return. But for how much more Fable costs, for how much more Astra costs, I do not feel like the results are there.

      In fact, with Astra and Fable I feel like not only are the costs astronomical, but the models are also just not for me as a software engineer. And presumably that's because these models increasingly are for other people. For lawyers, 3D artists, mathematicians, whoever uses computer use, etc.

      And potentially as a byproduct of enabling all of this, you can now slop your way to a one-shot 3D game over the weekend which looks impressive. And probably you can now run a software factory for as long as you don't care about the code.

      I'm sure I will get used to this, but man this stuff is weird.

      Postscriptum: speaking of weird: how is it that these models, in a sandbox, with supposedly no way to communicate with other agents, manage to find the same public wikis as a scratch pad for agent communication? Did they collude during training runs to remember resources on the internet which might come in handy in the future?

      1. I should clarify that I have done experiments like this before. Typically they do not run this long and the agent leaves behind a maybe imperfect but still digestible piece of software.↩