🏡


  1. November 11, 2026
    1. 🔗 r/LocalLLaMA Nvidia is Preparing to Oust Nvidia CEO Jensen Huang rss
    2. 🔗 ghostty-org/ghostty vt-1.0.1 release

      libghostty-vt 1.0.1

    3. 🔗 HexRaysSA/plugin-repository commits sync repo: +3 plugins, +46 releases rss
      sync repo: +3 plugins, +46 releases
      
      ## New plugins
      - [hint-lumina](https://github.com/williballenthin/idawilli) (0.1.0)
      - [navband-visited](https://github.com/williballenthin/idawilli) (0.1.3)
      - [vtloader](https://github.com/williballenthin/idawilli) (1.0.0)
      
      ## New releases
      - [btf2ida](https://github.com/nightshift-labs-ai/btf2ida): 0.1.9, 0.1.8, 0.1.7, 0.1.6, 0.1.5, 0.1.17, 0.1.16, 0.1.15, 0.1.14, 0.1.13, 0.1.12, 0.1.11, 0.1.10
      - [cfiscope](https://github.com/nightshift-labs-ai/cfiscope): 0.1.9, 0.1.8, 0.1.7, 0.1.6, 0.1.5, 0.1.4, 0.1.15, 0.1.14, 0.1.13, 0.1.12, 0.1.11, 0.1.10
      - [colorize-calls](https://github.com/williballenthin/idawilli): 0.1.4
      - [global-struct-dissector](https://github.com/williballenthin/idawilli): 0.1.2
      - [memlens](https://github.com/nightshift-labs-ai/memlens): 0.3.9, 0.3.8, 0.3.7, 0.3.6, 0.3.5, 0.3.19, 0.3.18, 0.3.17, 0.3.16, 0.3.15, 0.3.14, 0.3.13, 0.3.12, 0.3.11, 0.3.10
      - [oplog](https://github.com/williballenthin/idawilli): 0.3.1
      
    4. 🔗 r/LocalLLaMA Open source self driving is here! rss

      Open source self driving is here! | Today NVIDIA releases Alpamayo 2 Edge! I work for Embedl and we have already released an optimized version of the model that is more than 10x faster than pytorch when run on edge hardware like AGX Thor! The model is trained in an RL loop (!) and takes in 6 cameras and the recent motion. Feel free to check it out - you can even run it on a real Thor at: https://embedl.com/nvidia/alpamayo2-edge/thor?tab=run submitted by /u/Course_Latter
      [link] [comments]
      ---|---

    5. 🔗 r/LocalLLaMA New Qwen3.8-27B Unsloth Dynamic V3.1 GGUFs rss

      New Qwen3.8-27B Unsloth Dynamic V3.1 GGUFs | Hey r/LocalLLaMA ! We're releasing new new Unsloth Dynamic v3.1 GGUFs for Qwen3.8-27B! They're better by 5-10% accuracy on DeepSWE, Terminal Bench and more vs UD3, GSQ-RCO and Exllama-3! We're also improving our algorithms further so we can apply them to Qwen4 so folks can have efficient and accurate quants!

      • All quants from 2-bit until 6-bit are updated. 3-bit ones are not, as we found UD3 to do on par with UD3.1. We are still improving all other quant sizes though!
      • All benchmarks are 256K for agentic ones (DeepSWE, Terminal Bench), and 128K for the rest (LiveCodeBench etc). We used temperature 1.0, top_p 0.95, top_k 20, min_p 0, no presence or repetition penalty, preserve_thinking and xhigh reasoning
      • We ran benchmarks multiple times including LiveCodeBench x6 times, HMMT and others 8-16x and agentic benchmarks multiple times.

      On other benchmarks like for GSQ-RCO and Exllama3:

      • To compare GSQ-RCO and Exllama-v3, we had to exclude the token embedding layer from the x axis, as Exllama-v3 uses BF16 for it.
      • If you consider the full download size and total RAM usage for Exllama-v3, then adding the BF16 embedding table and including all embedding sizes changes the plots. Our main plots's x axis removes the embedding layer sizes from all quant providers. However on pure RAM usage and disk space usage vs accuracy, exllama3 does worse.
      • For LiveCodeBench, GSQ-RCO showed Unsloth UD3 quants doing consistently worse than ISTA's. However we found the opposite - UD3 quants (our OLD quants) do better than ISTA on LCB on all sizes except the smallest. UD3.1 further improves on LCB as well. We approximate that GSQ-RCO used a context budget of 96K, as that best fits the data for the runs we have. At 96K, GSQ-RCO does somewhat do better than UD3, but at 128K, UD3 does much better.
      • On another benchmark, for ISTA GSQ-RCO's AIME25 benchmarks, their quants reach 100%, 100%, 100% and 96.7% accuracy recovery. And they said our quants do worse. Through our investigations, we estimate ISTA only did 1 trial - we did 14 trials, and we show on average the recovery rate is 93% to 96% - not 100% accuracy recovery. And in fact our UD3 old quants do better on average than their quants on 14 runs vs 1 run of theirs, so we draw the opposite conclusion if you run the trials more.

      More details and benchmarks at https://unsloth.ai/docs/models/qwen3.8#dynamic-v3.1-update- november-11th-2026 All quants are updated in https://huggingface.co/unsloth/Qwen3.8-27B-GGUF! Thank you and have a nice day! We're super excited for Qwen4! submitted by /u/danielhanchen
      [link] [comments]
      ---|---

    6. 🔗 exe.dev Give Agents Temporary Access to Sensitive Integrations rss

      Exe.dev integrations are a powerful primitive to give your VMs access to resources without giving agents the underlying secrets. For example, you can give your VM access to a GitHub repo without leaving your private key or personal access token on the VM, where an agent could potentially misuse it.

      If you want an extra layer of protection, you can configure your integration for "step up" mode. Then, when the VM tries to use the integration, it will return a link so you can approve access. Click on that link and approve it for some time period. This lets you keep an eye on your agents and grant temporary access to high-value integrations (e.g., access to prod).

      To use this, add an integration with --stepup web:

      exe.dev ▶ int add http-proxy --name demo \
          --target https://httpbin.exe.xyz/ --bearer shhh \
          --stepup web --attach vm:drum-dragon
      Added integration demo
      
      Usage from a VM:
        ssh drum-dragon.exe.xyz curl https://demo.int.exe.xyz/
      

      When you trigger the integration, you'll see an approval link:

      exe.dev ▶ ssh drum-dragon.exe.xyz curl https://demo.int.exe.xyz/
      Integration "demo" needs approval:
             https://exe.dev/a/afvpfibvypeti2loorhfumrxj5cvoskjkfgvasv7rsp4l2ckxl6q
      

      If you’re logged in, this will take you to a simple screen:

      Approval screen: VM drum-dragon is trying to use integration demo. Approve
for 10m, 1h, 6h, or 1d, with Don't approve and Approve
buttons. Approve the integration for 10 minutes, an hour, six hours, or a day.

      This works for many of our integration types. Agents are excellent at prompting you to take the next step.

    7. 🔗 pydantic/monty v1.6.0 - 2026-11-11 release

      What's Changed

      New Contributors

      Full Changelog : v1.5.0...v1.6.0

    8. 🔗 r/LocalLLaMA NVIDIA reportedly cancels GeForce RTX 5080 24GB launch, brings back 16GB model over GDDR7 costs rss
    9. 🔗 Rust Blog Google Summer of Code 2026 results rss

      The Rust Project participated in Google Summer of Code (GSoC) for the third time this year. This time we had 13 projects, and our dear contributors have been working very hard on them for several months. As usual, the projects had various durations, so while some of them have ended in August, the last one has only finished in November, so we have been waiting until we have all the results before publishing this blog post.

      We are very happy to announce that all 13 projects were successful and passed their final evaluation! We consider it to be a testament to the diligence of our contributors, and the helpfulness of our mentors, that we are able to keep a very high rate[1] of successful GSoC projects several years in a row.

      At the start of summer, we had a video call with our contributors, so that we could all get to know each other a bit, and learn about their projects. Over the following few months, we continuously communicated with the contributors, provided guidance and answered their questions and reviewed their pull requests. And most importantly, we learned many new things together! It was an overall great experience. We are grateful for all Rust contributions done by our GSoC participants and for the time we spent working together, and we hope that we will continue seeing at least some of them around in the future.

      We would like to thank all our Rust GSoC 2026 contributors. You did a great job!

      Even though this year we had fewer projects than in 2025, mostly due to limited mentoring capacity, Google Summer of Code 2026 was again a success for the Rust Project. We think that GSoC is a great way of introducing new contributors to our community, and we are looking forward to participating in GSoC (and other mentorship programs, such as Outreachy) again in the near future. If you are interested in becoming a (GSoC) contributor, check out our GSoC project idea list and our guide for new contributors.

      Below you can find a brief summary of our GSoC 2026 projects. You can find more information about the original goals of the projects here. For easier navigation, here is an index of the project descriptions in alphabetical order:

      And now strap in, as there is a ton of great content to read about here!

      A Frontend for Safe GPU Offloading in Rust

      Marcelo worked on improving the usability of cross-vendor GPU programs in Rust using the std::offload module. At the start of the project, the offload prototype was only a proof of concept. It assumed that the offloaded code was bug-free, and it required users to write a lot of boilerplate code. Marcelo resolved both issues over the summer.

      First, he implemented proper type checking. Marcelo extended the compiler to verify that the arguments passed to any offload call are of the correct type, as expected by the GPU kernel. Kernel launches are thus now safe.

      After that, he added support for generic kernels. The compiler now collects all generic instantiations launched from the CPU side, and loads that info later when compiling GPU kernels to make sure we instantiate them as needed. Marcelo also added support to select which GPU to use, which is helpful for laptops with both an integrated and a dedicated GPU, as well as for servers with multiple GPUs. He also added two macros that removed the need for any boilerplate when writing and launching GPU kernels.

      The hardest part of this project by far was dealing with references. Due to Rust semantics, we cannot just map types containing mutable references to GPUs and then process them using multiple threads. Previous Rust GPU projects used raw pointers as a workaround, but we obviously wanted to avoid those. Marcelo managed to implement a sound abstraction so that users can now safely declare how their kernels will access mutable arguments.

      As a cherry on top, Marcelo also ported the RajaPerf performance suite from C++ to Rust and used it to benchmark his pull requests. His safe Rust version matches the performance of the original C++ code, and is now described in a GPU offload paper that he is working on together with his mentor, Manuel. This was Marcelo's second Rust GSoC project, and same as last year, we are very happy with the results. Great job!

      Adding WebAssembly Linking Support to Wild

      The goal of this project was simple on paper: teach the Wild linker to link WebAssembly (Wasm) programs. However, adding support for a new linker target is of course far from simple. Luckily, Kei already had a lot of experience with Wild, as this was his second GSoC project working on the Wild linker.

      And as expected, Kei did a great job! Prior to GSoC 2026, Wild had no Wasm output support. Now, the Wasm support is sufficiently good that Wild can link a range of complex programs to Wasm. For example, it is able to link itself, SQLite, ripgrep, CPython and even the SpiderMonkey JavaScript engine.

      And the linking performance is excellent! When compared to wasm-ld, the de- facto standard Wasm linker, which is based on the LLD linker, Wild is 2-15x faster, and uses 2-5x less memory. You can find more benchmarks in his final report, where he also explains that achieving this performance took quite some work, because Wild's ELF linking performance did not immediately translate to being fast when linking Wasm.

      Even after this GSoC project ended, Kei has continued improving Wild's Wasm support, as well as contributing to other parts of Wild. Thank you for bringing fast linking to a new set of use-cases, Kei! You are a valued member of the Wild team.

      Bringing autodiff and offload into Rust CI

      The goal of this project was to build the experimental std::autodiff module, which implements automatic differentiation of Rust code, and the std::offload module, which allows offloading Rust code to GPUs, in the CI of the Rust compiler.

      Shota has already been contributing to this area in the months leading up to this year's GSoC, so he had no issues getting started. After valiantly fighting with our CI, he made both modules available in the official nightly compiler channel. Rust users can thus now simply install them with a single rustup command, rather than having to compile rustc from source! This is a huge benefit for gathering feedback on these features in the wild, as it makes it much easier to experiment with them.

      Beyond making these projects available via rustup, he also worked on making it simpler to build projects that use std::offload. The original compilation pipeline was derived from Clang's support for GPU offload, so it involved calling clang helper binaries. That is clearly not optimal, so Shota worked on replacing it by directly calling the underlying LLVM APIs from rustc.

      The last piece of his project was enabling testing in CI for both offload and autodiff, which already helped prevent multiple regressions. Right now, the GPU offload pipeline only tests the CPU setup side, but his work allowed us to talk to GPU hardware vendors, two of which already agreed to provide the Rust Project with GPU hardware so that in the future we can also run those tests on dedicated GPUs.

      Overall, the project was a success. Shota had to show a lot of patience and endurance when working with various CMake quirks and CI challenges. We would like to extend a special thank you for that!

      Debugger for Miri

      miri is a tool that can detect undefined behavior (UB) in unsafe Rust code. It used to have a prototype of an interactive debugger called priroda, but it became unmaintained some time ago. The goal of this project was to re- establish priroda, to make it easier to use miri interactively, debug how and why is UB introduced in Rust programs, and also help rustc developers analyse MIR, one of the intermediate representations of Rust programs.

      Mohamed successfully reached both main goals of this project. He created a miri interface for the gdb debugger, which allows debugging programs executed by miri. You can set breakpoints, step through individual instructions, analyse MIR local variables and inspect the debugged program's state, with miri acting as a "virtual CPU". So when you encounter your next miri UB report, you can actually debug the program state that caused UB by running priroda! Mohamed also created a command-line interface for priroda, which is used to test it in miri's CI. This will ensure that it keeps working properly and will not bitrot again.

      Mohamed also added basic support for the Debugger Adapter Protocol, which allows using priroda together with IDEs such as Visual Studio Code. Currently, connecting priroda to an IDE is a bit involved, so the next step would be to build a plugin for an IDE that would allow showing all the extra state that miri has, which gdb doesn't know how to interpret.

      Debugging programs executed by miri is very exciting. Thank you for all your work!

      Implementing impl and mut restrictions

      The goal of this project was to implement two new language features that were accepted in RFC 3323:

      • Impl restrictions (impl(crate) trait Foo {}), which allow restricting in which modules you are able to implement a given trait.
      • Mut restrictions (struct Foo { pub mut(crate) bar: u8 }), which allow restricting in which modules you are able to mutate a given field.

      Ryosuke had to familiarize himself with the compiler's codebase and do a lot of implementation work to get both features working. This included implementing parsing of the new syntax, recording its metadata in the compiler's Abstract Syntax Tree, implementing resolution of the restricted crate paths, and finally adding checks to enforce both restriction rules. This all amounted to around five thousand lines of Rust code!

      Once the new features were implemented and available on nightly, Ryosuke wrote a Call for Testing blog post. It had to be very exciting to announce to the world that he implemented two new features from scratch, and people can now play with them on the nightly channel! After the blog post was published, users reported a few issues, which Ryosuke promptly fixed. He also contributed to rustdoc to improve how the impl and mut restrictions are rendered in the generated documentation pages.

      Now that the features are available on nightly, feedback is being gathered on them, with the plan being to stabilize them in 2027. If you would like to provide feedback on the impl and mut restrictions, you can do so in this issue.

      The goal of this project was clear, and Ryosuke achieved it completely. Awesome work!

      Improving Ergonomics and Safety of serialport-rs

      The goal of this project, which was done in collaboration with the Rust Embedded Working Group, was to improve the API ergonomics and type safety of the serialport- rs crate.

      The serialport project is a bit different from some other projects which participated in this year's Google Summer of Code. It is more on the side of "facility management" than rocket science. Its challenges are taming finicky operating system APIs and making good abstractions, rather than full-blown software engineering.

      Tanmay led many fruitful discussions about potential design decisions, and did a lot of field research on how other crates that depend on serialport actually use its API, to figure out how to make the upcoming breaking API changes less disruptive and painful for them.

      Tanmay also worked on sanding off some rough edges of the serialport API, such as replacing Boxed trait objects with enums, and making errors explicit in places where the legacy API used to panic. Some of the work still waits for integration. It is targeting the upcoming serialport 5.0 release.

      Christian (Tanmay's mentor) found working alongside Tanmay very motivational, and he was able to catch up with a lot of other unrelated work in order to integrate Tanmay's changes. He noted that working with Tanmay was fun and productive, and that it was pure joy to see him grow from his first contribution in the bonding phase to seasoned contributions. Thank you, Tanmay!

      This was my first Google Summer of Code as well. It was challenging, motivating, fun and definitely worth it. I would show up again.

      Christian Meusel

      libc: transition differing bit-width time and offset variants and

      deprecate bug-prone constants

      libc is a foundational crate that is used by thousands of other crates across the Rust ecosystem. For the past several years, its maintainers have been attempting to publish a stable 1.0 release of the crate. Because this crate has to support interoperating with C on many compilation targets with weird quirks, this requires an enormous amount of work. We already had a GSoC project for moving libc towards 1.0 last year, and the goal of Adam's project was to make more progress in that direction.

      And we can happily say that progress was indeed made! The original goal of Adam's project was to deprecate a number of constants that were difficult to maintain and cleanup inconsistencies in handling 32-bit/64-bit variants of file and time handling functions[2]. Adam was able to resolve that in a few weeks, and then he moved on to resolve a number of various issues blocking the 1.0 milestone.

      Saying that Adam was productive would be… an understatement. We could follow his work in real-time, because he was posting daily GSoC reports for 116 days (!) in a row. The diligence and consistency with which he tackled so many complicated issues was an inspiration to us. In fact, sometimes the libc reviewers were not able to keep up!

      You can find all Adam's libc pull requests here. You might notice that many of them have lots of comments, and even more discussions happened in GitHub issues and on Zulip. In addition to implementing the necessary code, making changes that affect interesting C platforms and architectures also required him to do a ton of research, and a lot of considerations of edge cases and possible backwards compatibility breakages. His work also took him on a whirlwind tour of diverse platforms; Adam's contributions spanned FreeBSD, NetBSD, Android, Hurd, NuttX, AIX, VxWorks, Fuchsia, L4Re and more.

      Even though more work will still be required to get libc to 1.0, Adam's contributions made a significant dent in this effort. Thank you very much for all your work!

      Link Linux kernel and its Modules with Wild

      Linker scripts are arcane commands that can be used to instruct a linker to construct the final binary in a custom way. The Wild linker used to implement only basic linker script functionality, which Vishruth greatly expanded during his GSoC project.

      Thanks to that, Wild can now successfully link Linux kernel modules, and it's even close to being able to link the Linux kernel itself! Vishruth's work involved greatly expanding expression evaluation support, location counters, program headers, etc. In addition to adding support for many missing bits of linker script support, Vishruth implemented support for partial linking (-r) as this is needed in order to link Linux kernel modules. You can find all the linker script features that he implemented here.

      Adding all those peculiar features to Wild required performing many cross- cutting changes to its codebase, which Vishruth managed to do really well. And it was not at the cost of performance! Wild now manages to link Linux kernel modules such as btrfs or amdgpu 2-4x faster than the BFD (GNU ld) or LLD linkers[3]. You can find more benchmarks in his final report.

      Vishruth has continued to contribute to Wild even after his GSoC project ended and has become a valued contributor to the project. Thank you very much for making Wild better, Vishruth!

      Migrating rust-analyzer assists to SyntaxEditor

      rust-analyzer uses rowan for its syntax trees, a library for Concrete Syntax Trees. rowan has served us well over the years, but it has some downsides that cause major performance problems and also smaller convenience issues. In particular, memory fragmentation causes rust-analyzer to consume much more memory than it actually needs (in the order of redundant gigabytes).

      We wanted to rewrite rowan to change that. The problem was that many parts in rust-analyzer touch syntax trees, and in particular assists (code actions) of which we have a lot. They also use mutable tree editing, a feature of rowan that can be convenient but was a major obstacle in rewriting it to be more efficient.

      During his project, bit-aloo first migrated all rust-analyzer code from mutable tree editing to SyntaxEditor, a new abstraction that was created specifically to avoid mutation. After that, he removed mutable editing from rowan altogether.

      The migration process is incremental and rowan is still inefficient in various aspects. However, we believe that the parts which required changes to large amounts of code are behind us, and we can complete the migration with more focused changes. bit-aloo is continuing to work on that even after his GSoC project ended. And he was also accepted as a member of the rust-analyzer team, so congratulations! We would like to thank him for his work, and hope to continue working with him to improve rust-analyzer for everyone.

      Port std::arch test suite to rust-lang/rust

      The std::arch module of the Rust standard library contains various intrinsic functions that provide architecture and vendor-specific functionality. Their implementation lives in the stdarch repository, which is included as a Josh subtree in the main compiler repo (rust-lang/rust).

      When someone changes the intrinsics in the main repo, breakages can silently creep in, because the main repo does not execute all the stdarch tests in its CI. That can cause friction when we synchronize the changes between the two repositories. Ideally, we would run all of stdarch's tests in the main repo to detect any issues as soon as possible.

      And that is where Sumit came in! Over the course of his GSoC project, he examined the (very!) complex ways the intrinsics are tested in stdarch, and started porting them over to the main repo. But this was not a matter of copying over a few lines of YAML. The compiler repo uses its own build system (called bootstrap) and a CI workflow structure that is quite different from the stdarch repository. Sumit thus had to first understand what is each test suite doing, reimplement it as a part of bootstrap and finally integrate it into the compiler's CI workflows.

      We run ~90 CI jobs across several hardware architectures, operating systems and OS versions. Getting all that to work while testing vendor-specific intrinsics required a lot of diligent work… and a lot of patience. It took five months for one of the test suites to finally succeed on the main repo's CI, and it required Sumit to completely refactor how the suite worked, for it to be more compatible with bootstrap. As another example, a different test suite that Sumit also got to work required running the tests in an Intel CPU emulator on CI.

      Sumit ported most of the stdarch test suites to bootstrap, including intrinsics verification against reference C implementations, checks for automatically generated source code being up-to-date, and various unit tests for individual intrinsics and CPU feature detection logic. There is one remaining test suite to port, but the ported tests are already helping us find issues, which is great.

      You can check Sumit's rust-lang PRs here; notice that he was also contributing to other parts of Rust in the meantime! Sumit's work will help us make LLVM upgrades and land intrinsics changes more easily. Thank you, Sumit!

      Reorganizing tests/ui/issues

      The goal of this project was to get rid of a very scary place in the Rust compiler's test suite: a directory called tests/ui/issues. It contained thousands of test files based on historical Rust issues, dating back all the way to 2012. The problem with those tests was that they were named only with an issue number (e.g. issue-37291). When such a test would break, it was quite difficult to figure out what was it even supposed to test, because there was little context attached to it.

      Even though we already had a GSoC project to tackle this problem last year, due to the sheer amount of uncategorized tests, there were still over four hundred tests left in this directory by the time zedddie started working on this project.

      For each test in this directory, zedddie had to first understand what was the test doing and dig through its original GitHub issue and any other related issues and pull requests. Then they had to figure out what would be the best location to move the test under, search for any possible duplicates, come up with a descriptive name for the test (that tends to be very difficult!), and finally add a short description to the test that explains the context of why the test was added in the first place. Rinse and repeat, for hundreds of tests.

      zedddie rolled up their sleeves, and categorized over 300 tests in 30 pull requests. Together with other contributors helping out over this summer, zedddie was finally able to remove the last batch of uncategorized tests at the start of August. As zedddie said in their final report: "What is left to do: nothing, tests/ui/issues is gone".

      While this work might sound a bit bland, its positive effect on the maintainability of our test suite, and improving the lives of Rust compiler contributors, is considerable. It is also apparently a great way to learn about cool niche edge cases of Rust that most Rust developers might not know about! After migrating the remaining uncategorized UI tests, zedddie continued contributing to the next trait solver and const generics. Thank you very much for helping us finally get rid of tests/ui/issues, zedddie!

      Utilize debugger APIs to improve debug info test accuracy and error

      reporting

      The Rust debugging experience leaves a lot to be desired. One reason why we struggled to improve it is that many of our debuginfo test suites did not even run in CI for the past few years, as they were difficult to maintain. When something changed in the type visualizers, the implementation details of a standard library type or in debugger internals, someone had to go through tens of tests and manually update them. This was not sustainable, so the test suite rotted.

      Luckily for us, Anthony took that affront personally. Even before his GSoC project, he spent considerable effort on improving the quality of debug visualizers of various Rust standard library types, and gained an impressive amount of knowledge about debuggers.

      During his GSoC project, he completely overhauled how our debuginfo test infrastructure works, both for LLDB and GDB. Thanks to his improvements, we can now easily "rebless" the reference output when something changes, which makes it much easier to keep our test suite up-to-date. The new tests also record much more information about the internal state of the debugger recorded during the test, which helps with diagnosing issues that cause type visualizers to stop working.

      In addition to redesigning the test suite, Anthony also actually managed to re-enable the LLDB tests on both Windows and Linux in our CI again (after several years of being skipped there!). This will allow us to avoid debuginfo regressions and make it easier to improve the Rust debugging experience. Oh, and it goes without saying that while doing all that, he also made numerous improvements to Rust type visualizers. You can find his PRs here.

      Anthony's amazing contributions and his deep expertise in debuggers led to him being invited to the Rust Compiler team, which was much deserved. What else can we add, other than: thank you for your awesome work!

      XDG path support for rustup

      The support for platform-specific directories (platformdirs) has been a long- standing feature request for rustup, to have more fine-grained filesystem directory choices. This project investigated how that issue could be resolved.

      The real complexity of this feature request lies within a decade worth of different assumptions that previous iterations of rustup and cargo have made: it turns out that quite a lot of them are no longer true if we were to implement platformdirs support truly faithfully.

      Guicheng first worked on cleaning up the interactions between rustup self uninstall and $CARGO_HOME/bin as a warmup. This issue itself is a very good demonstration of all that compatibility baggage: somehow $CARGO_HOME/bin has become the default binary directory for all things Rust, so rustup ended up installing itself and all its proxies into it. As a result, it has been super annoying to many that everything in $CARGO_HOME is gone with rustup self uninstall.

      After that, he started the actual implementation of platformdirs support in rustup. This was no easy task! Not because the code itself was hard to write, but because it takes a lot of effort to figure out what should be the desired behavior in the first place. Also, in order to determine the appropriate platformdirs semantics, some prior research is often required to see how things became what they are today, so the decoupling of different concerns could proceed, and migration paths could be designed accordingly. It was in this sense that this is different from a typical GSoC project, and luckily thanks to the effort he has put into this project, we have not only come up with the final patch, but also discovered and fixed some tiny preexisting issues with this long-untouched aspect of the rustup codebase along the way.

      Thank you for digging into this complex topic, Guicheng!

      Conclusion

      We would like to thank all contributors who have participated in Google Summer of Code 2026 with us! Your contributions helped make Rust better, and introduced you as new members of our community, which is a reason to celebrate. We are looking forward to participating in GSoC again next year!

      We would also like to thank Google for organizing the Google Summer of Code program and for allowing us to host a large number of projects every year. And last, but not least, we would like to thank all the Rust mentors who were tirelessly helping our contributors to complete their projects. Without you, Rust GSoC would not be possible.

      1. 97.5% over a three-year period, if you are wondering (40 out of 41 projects were successful so far). ↩

      2. If you were wondering, then yes, this is actually related to the famous 2038 problem :) ↩

      3. In case you were wondering, the mold linker does not support linker scripts required to link Linux kernel modules at the moment, so Vishruth did not compare the performance of Wild against mold here. ↩

  2. November 10, 2026
    1. 🔗 IDA Plugin Updates IDA Plugin Updates on 2026-11-10 rss

      IDA Plugin Updates on 2026-11-10

      New Releases:

      Activity:

      • btf2ida
        • 0aa5114c: README: exclude the three copied hook symbols from the coverage figure
        • 39506dab: CHANGELOG: v0.1.10
        • bdebe8ce: Keep user-set function types; coverage figure stated against real fun…
        • 3440e37b: CHANGELOG: 0.1.8, 0.1.9
        • fa48f5af: Export naming fixes from an independent review: writable sections are…
        • 58195319: Ten-second demo: demo/toy_kernel.elf (17 KB, gcc -gbtf, BTF only) wit…
        • 85dd7f85: CHANGELOG from the release notes
        • df0d6d2e: Refuse a module's split BTF when the chosen vmlinux is not its base (…
        • 3f012dfb: Name exported functions from __ksymtab on a stripped vmlinux so their…
        • 070d205d: README accuracy pass after an independent review: first try on MemLen…
        • c7888873: Version 0.1.5
        • e8f77d64: Escape % in the info() dialog text: ida_kernwin.info is printf-style …
      • capa
        • 74114afa: Merge pull request #3224 from reyyanxahmed/fix/3223-disable-cache-write
        • 47267b6e: added PR number to CHANGELOG.md
        • da7bc0a8: tests: compare decoded freeze documents in snapshot tests
      • cfiscope
        • 3c3bb67f: CHANGELOG: v0.1.9
        • dae59893: Reproduction steps that run as written: bzImage extractor, full comma…
        • 42c63045: CHANGELOG: 0.1.8
        • 8c38925b: CLI names each site by its call instruction, matching the address col…
        • d4bc0f5e: CLI fixes from a review: -json keeps every candidate unless -max-li…
        • bd4fa6e6: README: how it works, with the real check and preamble from a bundled…
        • 14303369: README: note condensed spacing in the quick-try output
        • 50a5dc5f: CHANGELOG from the release notes
        • db420c88: README: what you will see, with real command-line output on the publi…
        • 89c0f02d: Unexpected errors in any action become one warning plus the traceback…
        • 1248693f: README: a one-minute try on the bundled kCFI test objects (compiler a…
        • 28535cfd: Accuracy pass after an independent review: package version matches th…
        • ff5c23f5: Command-line scanner: python3 -m cfiscope (summary, -sites, -caller…
        • efa7bf1d: Show the plugin's warning instead of a traceback when Targets, Caller…
      • ida-domain
      • idamcp
        • 8fd02013: Merge pull request #31 from doomedraven/add-pyproject-toml
        • 95c15f79: Add pyproject.toml for packaging, editable installs, and tool configu…
      • idawilli
        • 4f3e4872: plugins: bump global-struct-dissector, oplog, colorize-calls; fix nav…
        • 7c6357e2: plugins: rename readme.md to README.md, drop stale hard link docs
      • memlens
        • e85847f4: CHANGELOG: v0.3.13
        • dfee7527: Exporter and patch scan fixes from a review: linker markers no longer…
        • 979aa7a8: CHANGELOG: v0.3.12
        • 919e5874: Ask before importing an ISF built for another kernel. Version 0.3.12
        • 2865f0d2: CHANGELOG: v0.3.11
        • c25a70b9: Clear errors on truncated files; install and verification notes; cove…
        • 488cab94: CHANGELOG: 0.3.10
        • 40fd4e70: Patch scan: see hooks after the sealed ENDBR NOP; refuse non-x86-64 E…
        • 60b55779: CHANGELOG from the release notes
        • 990517b8: Handler lookup reads only up to the end of the hook page's segment
        • 19c915cf: Patch list names the handler each copied hook page calls (ftrace, kpr…
        • 5e275253: Unexpected errors in any action become one warning plus the traceback…
        • e1c92350: Patch scan: absolute-address inline hooks (jmp [rip+0], movabs + jmp/…
        • 3205774e: README: function prototypes come from the kernel's BTF via btf2ida (m…
        • 31048975: README: what you get, with real output from the demo kernel.elf (patc…
        • 3664131a: README accuracy pass after an independent review: say exactly which h…
        • ebda7c53: Version 0.3.5
        • dc904ba4: Escape % in the info() dialog text: ida_kernwin.info is printf-style …
    2. 🔗 backnotprop/plannotator v0.28.61 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.60 | Click a word to highlight it, a one-time Themes dialog, Settings → Rows rebuilt, tell your agent how you want your rows, starred threads as pills above the list, a pill for new messages out of view, a half-circle face picker with ten Glass colours, a new phone sidebar and reply box
      v0.28.59 | A quieter Agents section in the sidebar, machine names only when agents run on more than one machine, agent icons that are always gently alive and lean toward your pointer
      v0.28.58 | Start Codex from New message, an Agents section in the sidebar, start an agent in a folder on any drive, play audio attachments and comment at a moment, Claude Code's Plannotator tools work on Windows
      v0.28.57 | Pin artifacts, and see every artifact on one page, filter the list by project, date or agent, a thread shows its pull requests and their state, choose what the sidebar shows, and in what order, Ask AI starts from Side in the selection bar
      v0.28.56 | Questions can show trade-offs and a prototype to try, a thread with many big pictures no longer crashes the tab, Escape closes New message and keeps your draft, read threads stop being bold and keep their place, agent messages that name no thread start a new one
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox

      What's New in v0.28.61

      TL;DR

      • Fixed: Updates now update the Claude Code plugin too
      • New: An agent's chosen face shows on every icon of it
      • New: Filter the Inbox list by pull request state
      • Fixed: Modern dark shows section bands and the Reply button
      • Fixed: One conversation no longer shows as two agents

      0.28.61 is a small patch release. Its main fix makes an update bring the Claude Code plugin along with the app, and the Inbox now tells you when your plugin is behind. It has 10 PRs, all from @backnotprop.

      Updates now update the Claude Code plugin too

      An update could finish with the app on the new version and the Claude Code plugin left on its old one, with nothing to tell you. The install script updates the plugin only when it can run claude, and it looked for claude only on your PATH. Claude Code's own installer puts claude in ~/.local/bin, and that folder is often missing from the PATH an update runs with: for example when you pressed Update now in an Inbox or review window that was started from an app, at login or over SSH. The script then wrote the manual steps into the update log and reported success.

      If you updated that way, your app is current but your Claude Code sessions may still run an older plugin. Features that need a newer plugin, such as Side (Ask AI) in the Inbox and session names, were then missing with no reason given.

      The install script now also looks in ~/.local/bin and ~/.claude/local, the folders Claude Code installs itself into, on macOS, Linux and Windows. From the next update on, Update now in the Inbox also hands the installer the PATH of your login shell, which covers claude installed with npm or Homebrew. #3070

      The sidebar tells you when your plugin is behind

      The sidebar's "Reload Claude Code" row used to count only sessions that a reload alone would fix, so it read 0 when the plugin itself was old. It now also counts sessions whose plugin needs an update, and it opens the steps in Settings → Agents: update the plugin, then run /reload-plugins. Once the plugin is updated, the row stays only for the reload. When every session is reloaded, the row is gone. #3071

      If your plugin is already behind

      Updating to 0.28.61 repairs it: this update finds claude and brings the plugin up to date by itself. Afterwards, run /reload-plugins in each Claude Code session that is open, or restart Claude Code. The sidebar's "Reload Claude Code" row lists the sessions that still need it.

      If the plugin is still behind after the update, run these two commands in a terminal, then /reload-plugins:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator --scope user
      

      An agent's chosen face shows on every icon of it

      The face you pick for an agent in the sidebar's Agents section (its own mark, a Glass colour, Transparent or Face) now shows on every icon of that agent, with no reload: list rows, message authors, the thread's participants, the reply box's "to" pill, the @ menu, New message, Board cards and more. Every Inbox window open on this computer shows it at once, including a phone or tablet connected to it. A face belongs to one conversation, so two Claude Code sessions keep two faces. A conversation that goes on under a new session id keeps its face, and so does an agent that has ended, so its old threads look as they did.

      Places that name a kind of agent rather than one agent, such as Settings and "New Claude Code session", keep the plain mark. No row changes size. #3059

      Filter the Inbox list by pull request state

      The list filter has a Pull request group: Open, Draft, Merged, Closed, Has a PR and No PR. You can pick several. It reads the same pull request marks the rows already show, and appears once a thread in the list has a pull request. A thread whose pull request has not been read yet counts under Has a PR only. #3020

      Modern dark shows section bands and the Reply button

      On Plannotator Modern in dark mode, several surfaces had the same colour as the card behind them, so they could not be seen: the list's section bands (Waiting on you, New since you looked and the others), the Reply and open questions buttons at a thread's foot, row hovers, chips, menus, and in plan review the inline code chips, table headers and toolbar buttons. Each one now stands a step off the card, about as far as in Plannotator dark. Modern light and every other theme are unchanged. The Themes dialog's two Modern dark pictures are retaken with the new greys. #3058, #3061

      One conversation no longer shows as two agents

      0.28.60 joined a Claude Code conversation that moved to a new session id into one row in Agents, but some still showed twice: the same name on two rows, both selected when its thread was open. The plugin now finds Claude Code's hand-over record anywhere in the old conversation, and it follows a chain of several hand-overs. Sessions already running pick this up after the update without a restart. Two separate sessions in one folder are still two agents. #3057

      Additional Changes

      • A signed-out machine says what to do. In New message's folder menu, a linked machine where Claude Code or Codex reads as signed out now shows what to do under its line: sign in on that machine, or restart Plannotator from that machine's own Terminal when it was started over SSH. #3060
      • Diff library 1.6.4. The library that draws code review diffs is updated to 1.6.4. Highlighting stays the same, and nothing you see changes. #2990

      Install / Update

      macOS / Linux:

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

      Windows:

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

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator --scope user
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      • ui 0.63.0 and core 0.25.22: versions for what is already on main by @backnotprop in #3054
      • Agents: find a hand-over record anywhere in the old transcript by @backnotprop in #3057
      • Modern dark: give the quiet surfaces a step off the card, so section bands and the Reply button show by @backnotprop in #3058
      • Inbox: an agent's chosen face on every icon of it, in every window by @backnotprop in #3059
      • Themes dialog: retake Modern dark's pictures with its new greys by @backnotprop in #3061
      • Say what to do under a signed-out machine's line in the folder menu by @backnotprop in #3060
      • Inbox list filter: turn the Pull request group on by @backnotprop in #3020
      • Pierre diffs 1.6.4, highlighting stays on Shiki by @backnotprop in #2990
      • Updates find claude in its own install folders, so the plugin update is not skipped by @backnotprop in #3070
      • Inbox: Reload Claude Code also counts sessions whose plugin needs an update by @backnotprop in #3071

      Full Changelog : v0.28.60...v0.28.61

    3. 🔗 r/LocalLLaMA Apple has new Mac app coming to make running local AI models easy rss

      Apple has new Mac app coming to make running local AI models easy | submitted by /u/themixtergames
      [link] [comments]
      ---|---

    4. 🔗 r/LocalLLaMA The Surprising Effectiveness of Deleting Weights in LLM Post-Training rss

      The Surprising Effectiveness of Deleting Weights in LLM Post-Training | How little of a pretrained large language model (LLM) has to change for it to acquire new capabilities? We find that zeroing fewer than 0.05% of its weights, with no other modification, matches full fine-tuning (FFT) at scale across three LLM post-training regimes: reinforcement learning with verifiable rewards, supervised fine-tuning, and on-policy distillation. Our method, Deletion Tuning, learns a binary mask over the gate projection of transformer blocks. Two practical advantages follow: the trained mask is hundreds to thousands of times smaller than the corresponding FFT checkpoint, and Deletion Tuning forgets far less, which addresses a central challenge in continual learning. Under reinforcement learning, its prior-task accuracy stays near the base level while FFT, LoRA, and random sparse fine-tuning lose up to 5.4 points. To understand why masking alone suffices, we analyze the geometry of the learned weight changes under reinforcement learning using stable rank, spectrum drift, and principal-weight overlap. Compared with LoRA and random sparse fine-tuning, Deletion Tuning is closest to FFT across the three measures. Edit: Links Github: https://github.com/agentic-learning-ai-lab/deleting-weights HuggingFace: https://huggingface.co/Jacklu0831/deletion-tuning-masks Blog: https://agenticlearning.ai/deleting-weights/ Poster: https://cdn.agenticlearning.ai/dfb9bf24cee86b6d/neurips2026-poster-deleting-weights.pdf submitted by /u/Thrumpwart
      [link] [comments]
      ---|---

    5. 🔗 HexRaysSA/plugin-repository commits sync repo: +3 plugins, -3 plugins, +15 releases, -3 releases rss
      sync repo: +3 plugins, -3 plugins, +15 releases, -3 releases
      
      ## New plugins
      - [btf2ida](https://github.com/nightshift-labs-ai/btf2ida) (0.1.4, 0.1.3, 0.1.2, 0.1.1, 0.1.0)
      - [cfiscope](https://github.com/nightshift-labs-ai/cfiscope) (0.1.3, 0.1.2, 0.1.1, 0.1.0)
      - [memlens](https://github.com/nightshift-labs-ai/memlens) (0.3.4, 0.3.3, 0.3.2, 0.3.1, 0.3.0)
      
      ## New releases
      - [FridaTools](https://github.com/ys1231/idafridascript): 0.0.6
      
      ## Removed plugins
      - bindiff
      - binexport
      - xray
      
    6. 🔗 facebookresearch/faiss v1.16.0 release

      [1.16.0] - 2026-11-09

      Added

      • fc1095a e-means: add benchmarks reproducing the paper (#5845)
      • 2079677 e-means: add max_points_per_centroid (#5855)
      • 8e5843c Add regression test for flat search in a nested OpenMP region (#5754)
      • b80093c Add DINO resident and SSD streaming e-means demos (#5815)
      • 97fdfb0 Add optional IVF assignment for centroid-sharded e-means (#5817)
      • f6a82dc Add centroid-sharded e-means training (#5823)
      • 0136502 Add native INT8 CuTe assignment to e-means (#5816)
      • 15b14b2 Add FP8 CuTe assignment to e-means (#5820)
      • 13a33bf Add CuTe assignment backend to e-means (#5818)
      • 7a038e7 Add INT8 Triton assignment to e-means (#5821)
      • 87b5339 Add FP8 Triton assignment to e-means (#5819)
      • c8ab4f5 Add Triton assignment backend to e-means (#5822)
      • f61f80a Add reduced-precision assignment to e-means (#5814)
      • 8ac2fdc Add distributed E-means training (#5813)
      • 3795ee6 Add reference e-means implementations (#5812)
      • 951067d Print native crash diagnostics in Linux CMake CI (#5828)
      • 7648f5f InvertedListScanner::distances_to_codes, with a block kernel for 8-bit PQ (#5807)
      • a6505c5 Expose caller-owned Dataset APIs for CAGRA (#5739)
      • 4caf504 Add MetalIndexBinaryFlat with GPU Hamming search and exact top-k selection (#5759)
      • 71c7f48 Add remove_ids to IndexShards and IndexReplicas, and add_with_ids to IndexReplicas (#5773)
      • 6964ecd Make the multi-GPU Python helpers work on the Metal backend (#5747)
      • b156cce feat(rvv): add bit-exact RVV decode_vector for raw-codec quantizers (#5689)
      • 8ff93a8 Serialization, clone and index_factory support for IndexPiPNN (#5758)
      • 840aa1f Add HNSW level-0 links from a sample to remove search sinks (#5705)
      • 89e5eb5 Add IndexPiPNN, a PiPNN graph index with beam search (#5734)
      • 3effdb2 PiPNN build assembly (#5729)
      • 07979b1 Randomized Ball Carving partition (#5714)
      • 7069478 Numeric kernels
      • 7a05795 HashPrune reservoir and sketch kernel (#5708)
      • b0074a3 Add fp16 support to SuperKMeans (#5692)
      • e7c44eb Add AVX-512 fp16 conversion kernels (#5694)
      • ea29bac RaBitQ: add batch-four estimates and 9-bit SIMD scoring (#5647)
      • 76c0e01 Add GPU-accelerated IVFPQ search to the Metal backend (#5449)
      • 0db2f30 rabitq neon kernels (#5532)
      • 430a41e Native fp16 k-means training for Faiss IVF (#5671)
      • 6c8378e Add RVV implementation for decode_bf16_simd (#5641)
      • e24a371 feat(rvv): add vector arithmetic kernels (#5655)
      • 94a4331 Add reranked types to IndexSQFastScan and fix flat RaBitQ filtering (#5661)
      • dcf8ebb Support IDSelector in flat fast-scan search (#5660)
      • 1768a5a Add RVV SIMD specialization for product quantizer distance-table computation (#5543)
      • f323c18 Add RVV encoding for QT_8bit_direct (#5640)
      • 5e74b1b feat: implement RVV optimized scalar quantizer codecs and distance computation (#5535)
      • b0d9e80 Add fast scan variants of SQ indexes - IndexSQFastScan and IndexIVFSQFastScan (#5341)
      • 4864f4d SVS: Add ParameterSpace.set_index_parameter support for Vamana (#5644)
      • 0f23e6a Add RVV SIMD specialization for scalar quantizer distance compute (#5539)

      Changed

      • f34c0b8 Move the macOS arm64 CI jobs from macos-14 to macos-15 (#5875)
      • 741138a E-means: quality batch at d <= 16 and no revival at d <= 2 by default (#5854)
      • 731286f e-means: faiss-style verbose output that reports epochs and asks for a citation (#5841)
      • 277b3c7 e-means: rename niter to nepochs (#5848)
      • a15797a Compute the coarse distances in search_preassigned when they are not given (#5748)
      • b955264 Replace the e-means README with a user guide (#5842)
      • e4500c2 Use BF16 defaults and share quantized rows across E-means sharding (#5844)
      • 0a6f936 Emeans ssd speedups (#5839)
      • 9246aa7 Rename e-means operating_point to batch_law, allow batch_size without alpha0, and default niter to 5 (#5833)
      • 22a0cb7 Separate Emeans implementations (#5840)
      • 1d40eeb Speed up the x86 8-bit scalar quantizer inner-product distance (#5829)
      • efd79c9 Upgrade CPU CMake CI to PyTorch 2.15 (#5827)
      • 0b0250d SQ fp16 and bf16: four accumulators per code at d >= 384, any d at AVX-512 (#5806)
      • a3217cb Give each SIMD level its own copy of the 65 shared functions (#5810)
      • 2a6e785 Define the AVX-512 SQ specializations once for AVX512 and AVX512_SPR (#5808)
      • c2d27c6 Search only the sample vectors at sinks after each round of HNSW level-0 links (#5804)
      • 9d5b442 Codify the Faiss SIMD guard rules and check them with a test (#5793)
      • 0d3c380 Move SIMD code to dedicated translation units and align guards (#5792)
      • 03aa1bd Give fvec_L2sqr_ny_y_transposed_D internal linkage in the AVX2 and AVX512 files (#5788)
      • 167f443 Prefetch graph rows and vectors in PiPNN search (#5805)
      • ea99cbc SVS 0.5.0 (#5785)
      • 0c2cad8 Run the Windows conda CI steps in bash (#5795)
      • 35a4ec2 Use 3 sample vectors per node by default for HNSW level-0 links (#5789)
      • 1ec0011 Hamming: vector popcount for the default computer at AVX512 and AVX512_VPOPCNT (#5787)
      • fc65960 Use a SIMD masked sum for the fp32 RaBitQ 1-bit estimate (#5782)
      • d37bede Train ProductQuantizer subquantizers in parallel (#5783)
      • 386c96b Default alpha to 1.2 for all metrics (#5786)
      • 0a32a42 Scale the HNSW and PiPNN search check period by the thread count (#5784)
      • c919a60 Dispatch RaBitQ scans once per inverted list (#5597)
      • 6907ed1 Prune inner-product graphs on cosines when norms vary (#5774)
      • e353ed7 8-bit PQ code distance: 4-sum scalar kernel instead of gathers on AMD Zen 3/4/5 (#5751)
      • 9e16309 Build PiPNN graphs over distinct codes (#5768)
      • 7834aba Size IVF fast-scan slice LUTs on the calling thread (#5721)
      • 2732125 Dispatch more dimensions to the SIMD fvec_L2sqr_ny_transposed kernels (#5757)
      • ee6927d ivflib::search_with_distance_to_code: search through InvertedListScanner::distance_to_code (#5755)
      • 56c96d5 Move Faiss C++ tests to Python (#5743)
      • a55e0b2 Upgrade cuVS to 26.10 (#5633)
      • 494330f Speed up the NEON 8-bit scalar quantizer L2 distance (#5733)
      • 1a9ddc6 Use monotonic dynamic scheduling so libomp 12 does not take its static-steal path (#5723)
      • 3fc6bcd On ROCm, stage pageable host copies in pinned memory (#5712)
      • cec5702 DD: give fvec_L2sqr_ny_nearest_y_transposed_D internal linkage (#5720)
      • db6aa06 Hoist per-list allocations out of the IVF fast-scan search loops (#5717)
      • 3907966 Select OpenBLAS OMP build in conda for AArch64 + Linux (#5669)
      • 44afa77 Stop allocating per (query, probe) on OpenMP workers in IVF RaBitQ fast-scan (#5716)
      • 6692d7a Stop copying QueryFactorsData per block in RaBitQHeapHandler
      • 3a98062 faiss/conda: extend LSQ NEON-flaky test skip to all arm64 (#5713)
      • 2839c39 Make the GPU IVF search return the same neighbours on every run (#5682)
      • a2f7943 Optimize 4-bit PQ fastscan accumulation on Arm CPUs (#5709)
      • 83ae8b0 Move the RVV distance kernels into free-standing headers (#5697)
      • 1dab0c1 Quarantine unstable cuVS Python GPU tests (#5699)
      • ae4466d Avoid widening fp16 data for k-means++ initialization (#5693)
      • ea9151d RaBitQ: broadcast one sign word per 32 dims in the AVX2 RBQ9 kernel (#5696)
      • 4102312 Defer IVF list scan setup until needed (#5595)
      • fdb9535 Make search stats collection configurable (#5670)
      • 7f6bf10 Halve IndexSQFastScan rerank memory with a split-nibble layout (#5662)
      • b1c1496 migrate from bit-manipulation builtins in fbcode/faiss (#5667)
      • 2496f63 Avoid search stats contention during concurrent search (#5663)
      • 3f4838e Batch the IVF ScalarQuantizer scan four codes at a time (#5456)
      • 1dbb3d2 Update backward compatibility test to v1.15.1 (#5646)

      Fixed

      • 29782a0 Fix verbose e-means tests after the nepochs rename (#5869)
      • 8babd49 Fix assignment after progressive-dimension Kmeans training (#5861)
      • b7c44bc Initialize SVS Vamana graph parameters in the default constructor. (#5834)
      • 9acf8b0 Guard fp16 threshold in mock builds [unused-const-variable] (#5835)
      • 0c269ac Validate codebook size in read_ResidualQuantizer_old and bounds-check IndexBinaryIVF::reconstruct_from_offset (#5764)
      • 7ac4a6c Fix database-parallel kNN when the parallel region gets fewer threads (#5824)
      • 98a23e4 Fix OMP exception safety in ProductQuantizer (#5771)
      • d87b58b fbcode/faiss/tests/test_fast_scan_distance_to_code.cpp (#5772)
      • 48f2129 Drop constants [unused-const-variable] (#5794)
      • 2f890e8 Fix train_NonUniform skipping training row 0 and racing on a shared buffer (#5791)
      • d4a6548 Faiss OSS nightly autofix (#5790)
      • 5712d82 Fix cuVS IVF-Flat workspace sizing after CPU-to-GPU cloning (#5763)
      • bce5e24 Re-enable the cuVS CAGRA Python tests that hung on cuVS 26.06 (#5770)
      • 450dd79 Fix AArch64's conda multi output recipe (#5727)
      • 55afdff cmake: install utils/popcount.h (#5744)
      • d4a4e3e Fix build for CPUTYPE=znver4 (#5752)
      • 56797f9 Match scalar tie-break in AVX2/AVX512 Lloyd-Max encode (#5715)
      • 5b4aa46 fbcode/faiss/gpu/utils (#5737)
      • a643100 Faiss OSS nightly autofix (#5731)
      • 4f63b42 Keep AVX512-TU copies of the AVX2 QBS loop out of the AVX2 path (#5724)
      • c966dab Faiss OSS nightly autofix (#5728)
      • 5d635f3 DD: give PQCodeDistanceScalar a SIMD level so the AVX2 path cannot run AVX512 code (#5719)
      • f46050e Deflake test_io TestIVFPQRead.test_reader (#5718)
      • 8b884ec Fix IndexFastScan::reset() leaving stale ntotal2 (crash on search) (#5614)
      • d380b7d Fix IndexFlatCodes::reset on mmap-loaded codes (#5707)
      • 6c51305 Avoid double-advancing HNSW visited tables (#5596)
      • 76978ee Fix selector handling for IVF iterator scans (#5592)
      • 38460ee Fix Faiss fp16 parity tests across architectures (#5695)
      • 88a28bc Faiss OSS nightly autofix (#5686)
      • ec94295 Bound the fast scan LUT scale by the accumulated sum (#5658)
      • 3f08095 fix: release SuperKMeans sample buffer after rotation (#5648)
      • 02cacc5 Fix TSAN races in side hsnw_stats and rabitq_stats (#5657)
      • bf8be4a fix(ci): use GCC 14 riscv64 cross-compiler for RVV tuple/zvfhmin intrinsics (#5653)
      • 98af2cf Fix osx-arm64 conda build: drop redundant openblas pin, allow single-platform release dispatch (#5652)
      • 3778f58 Fix IDSelector handling in unbounded HNSW search (#5508)

      Deprecated

      • 8f176c3 Remove the replicas parameter (#5809)
      • de495c9 Remove redundant contrib, torch, Manifold and telemetry tests (#5801)
      • ce25a10 Remove redundant Panorama, general index, factory and SWIG tests (#5802)
      • ca60fb5 Remove redundant clustering, binary index and SIMD distance tests (#5800)
      • 4915580 Remove redundant serialization, mmap and deserialization tests (#5798)
      • 2f8c1d2 Remove redundant SVS, HNSW, NSG and PiPNN tests (#5799)
      • f2130c2 Remove redundant IVF and search parameter tests (#5803)
      • 1c84f08 Remove redundant PQ, AQ and SQ fast-scan tests (#5797)
      • 2010413 Remove redundant PQ, AQ, SQ and RaBitQ tests (#5796)
      • 42aac2f Remove the cuVS 26.02 compatibility paths from the cuVS GPU code (#5750)
    7. 🔗 HexRaysSA/plugin-repository commits sync: search GitHub code with SEARCH_GH_TOKEN instead of GITHUB_TOKEN… rss
      sync: search GitHub code with SEARCH_GH_TOKEN instead of GITHUB_TOKEN (#47)
      
      GitHub rejects code search with the workflow's GITHUB_TOKEN (429), even the
      first request of a job, while it accepts the same requests with a personal
      access token. In the diagnostic runs 42844526756 and 42846362910,
      GITHUB_TOKEN got 1 of 24 search requests through and a personal access
      token 24 of 24, taking turns on the same runners. The 429 waits of two jobs
      counted down to the same moment, so the limit applies to more than one
      job's GITHUB_TOKEN.
      
      The snapshot step now passes the fine-grained personal access token from the
      SEARCH_GH_TOKEN secret to hcli as GITHUB_TOKEN. A comment there says what
      kind of token it is, who created it, when it expires, and what to do then.
      
      Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
      Claude-Session: https://claude.ai/code/session_01FYvq4G9AeRnJHoeTaDGHob
      
    8. 🔗 exe.dev Download the exe.dev Mac App rss

      Download the exe.dev Mac app at https://exe.dev/mac. Users of the iOS app will find it a familiar place to manage all your VMs and all the Shelley conversations on those VMs, as well as a no-nonsense terminal.

      For those keeping track at home, you can access exe.dev via:

      1. ssh exe.dev
      2. The web
      3. The Android app
      4. The iOS app
      5. The Mac app
      6. We can’t tell you about #6 yet, but reach out if you’ve tried an AI personal assistant and thought, “but what if this actually worked?”

      All the platforms have their trade-offs. I personally use four of the above daily to work on exe.dev as well as other projects. In other words, the number of platforms is not a Conway's Law reflection of exe.dev as a company, but rather a belief that good infrastructure pairs well with good tools. Several folks have built their own systems to manage their VMs and conversations; we are thrilled that people are customizing software to fit their needs.

      I'll leave you with a video of using the app to record your screen:

    9. 🔗 r/LocalLLaMA MiniMax H3-Image Released, an Open-Weight Image Model built on H3 rss

      MiniMax H3-Image Released, an Open-Weight Image Model built on H3 | submitted by /u/MagicZhang
      [link] [comments]
      ---|---

    10. 🔗 HexRaysSA/plugin-repository commits sync: skip archives that hold no valid plugin, via ignored-urls.txt (… rss
      sync: skip archives that hold no valid plugin, via ignored-urls.txt (#46)
      
      Add ignored-urls.txt, seeded with 852 archive URLs that sync run
      42562649155 downloaded and rejected. The sync gives it to hcli with
      --with-ignored-urls-list (ida-hcli >= 0.28.0), so hcli does not download
      these archives. scripts/update_ignored_urls.py reads the "no valid plugin
      in archive" entries from the hcli log and appends the new URLs under a
      "# Discovered on" line.
      
      Rejected archives were about 9 of the 10.6 GiB that the sync downloads,
      and caching them made the hcli cache 13.6 GB, past the 10 GB Actions cache
      limit, so the cache never restored.
      
      Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
      Claude-Session: https://claude.ai/code/session_01FYvq4G9AeRnJHoeTaDGHob
      
    11. 🔗 earendil-works/pi v1.5.2 release

      New Features

      • Fork sessions whose folder is gone : when a session's original folder was moved or deleted, you can now fork it into the current folder instead of only continuing, so later resumes no longer ask. See Continue or switch sessions.

      Changed

      • When a session's working directory no longer exists, for example after the project folder was renamed, interactive mode now offers Continue, Fork, or Cancel instead of only continuing. Continue runs the session in the current directory without storing the choice, as before; Fork copies it into the current directory as a new session with a new ID, like --fork, so the next resume no longer asks. This applies at startup (--session, --resume), to /resume, to /import, and to ctx.switchSession() from extensions (#11975 by @petrroll, fixes #11060)

      Fixed

      • Fixed /import of a session whose working directory no longer exists leaving a copy in the session directory, and continuing it leaving a second copy with the same ID (s.jsonl and s-1.jsonl); the failed copy is now removed (#11975 by @petrroll, fixes #11060)
      • Fixed Anthropic OAuth requests reporting an outdated Claude Code version
    12. 🔗 backnotprop/plannotator v0.28.60 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.59 | A quieter Agents section in the sidebar, machine names only when agents run on more than one machine, agent icons that are always gently alive and lean toward your pointer
      v0.28.58 | Start Codex from New message, an Agents section in the sidebar, start an agent in a folder on any drive, play audio attachments and comment at a moment, Claude Code's Plannotator tools work on Windows
      v0.28.57 | Pin artifacts, and see every artifact on one page, filter the list by project, date or agent, a thread shows its pull requests and their state, choose what the sidebar shows, and in what order, Ask AI starts from Side in the selection bar
      v0.28.56 | Questions can show trade-offs and a prototype to try, a thread with many big pictures no longer crashes the tab, Escape closes New message and keeps your draft, read threads stop being bold and keep their place, agent messages that name no thread start a new one
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards

      What's New in v0.28.60

      TL;DR

      • New: Click a word to highlight it, in plan review, annotate and documents opened from an Inbox thread
      • New: A one-time Themes dialog, shown about 15 seconds after the Inbox opens
      • New: Settings → Rows is rebuilt: your own list stays in view, plain choices, Undo, a Dense look and a Pull requests switch
      • New: Tell your agent how you want your rows, from Settings → Rows or with plannotator inbox rows
      • New: Starred threads as pills above the list, when you turn on "Keep starred above the list"
      • New: A pill counts new messages that arrive out of view, and a press takes you to them
      • New: A half-circle picker for an agent's icon, with ten Glass colours
      • New: On a phone: a new sidebar sheet, a new reply box, and a picker sheet for who gets your message
      • New: /side in the reply box's / list, and comment boxes you can drag
      • Changed: One-time pop-ups are 40 minutes apart, not one a day, and come in a new order
      • Changed: Pictures in a message show whole, with "Show all" for very long ones
      • Changed: New message offers "Send to that thread" when the name is already used
      • Fixed: A drag you let go of outside the text now makes its highlight, and three more highlighting bugs
      • Fixed: Replies reach a Claude Code conversation that went on under a new session id, and it shows as one row in Agents

      0.28.60 is a large release, mostly for the Plannotator Inbox, with a round of work on highlighting text in plan review and annotate. It has 28 PRs, all from @backnotprop. Three of them are test fixes.

      Plannotator Inbox

      One-time pop-ups come sooner, and Themes is new

      The Inbox shows each of its one-time dialogs once. They used to be held to one a day, and a tab left open for hours or days never showed the next one until a reload. Now they are 40 minutes apart, and a tab that stays open shows them with no reload.

      A new Themes dialog offers Plannotator Original, Plannotator Modern or "Choose your own", each with real light and dark pictures. Only someone still on the default theme sees it. It opens about 15 seconds after the Inbox opens, after the tab icon dialog for someone who still has that one to see.

      The order is new too. Grouping, Rows, Sound and Voice follow Themes on the same day, each only when it applies to you. Snooze, the Board, the Checklist and Bro mode come on later days. #3015, #3051

      Settings → Rows, rebuilt

      The page now shows your own six newest threads and keeps them in view while you choose: beside the choices on a wide window, at the top on a phone. Pick a look to start from (Balanced, Minimal, Detailed, or the new Dense), then change single things in plain words such as Spacing, Time and Agent icons. More are under "More choices".

      Each change is named beside the list, for example "Changed: Spacing → Compact", with Undo. Reset to default puts the defaults back. A new Pull requests switch hides the PR mark on rows; it is on by default. No saved look changes with this update. #3043

      Tell your agent how you want your rows

      Under the list on Settings → Rows there is a box: "Or tell your agent how you want your rows…". Send starts an ordinary thread to a running agent and keeps you on the page. The rows change in front of you, and the page says who did it, for example "Claude Code changed: Spacing → Compact · Undo".

      With no agent running, the box offers Copy so your words are not lost. Agents make the change with plannotator inbox rows (see For agents below). #3049

      New messages never move the list

      Pressing Show on the "N new" line no longer scrolls the list. New rows in view light up where they are. A small pill at the edge of the list counts the new rows that are out of view, above or below, whichever side has more. Press it to go there. The list never moves by itself. #3035

      Starred threads as pills above the list

      The list's ⋮ menu has a new item, Keep starred above the list. It is off until you tick it. When on, each starred thread is a pill above the list with its name and its state, and the sidebar's Starred section is not drawn. Click a pill to open the thread, or its star to unstar. A right-click offers Unstar, Move left, Move right and Copy link. When there are more pills than fit in two lines, "+N" lists the rest. #3038

      Pictures in a message show whole

      A picture in a message is now drawn whole: never wider than the message, never taller than about 70% of the window, and never enlarged. A phone screenshot is no longer stretched and cut off. A very long picture, such as a full-page capture, shows its top with a "Show all" button, and "Show less" once it is open. A click on a picture still opens the viewer. The thread also stops moving as pictures load. #3045

      On a phone

      The sidebar sheet is one scroll now, with no small scroll window inside it. Names show in full on up to two lines, headings stay in view and fold their section, and Settings, Feedback and light/dark share one row at the foot. A Close button sits at the top. #3036

      The reply box and New message are one rounded card above the keyboard, with a round Send button. Who gets your words is picked from a sheet that rises from the bottom and lists running sessions, then "Start a new session". Project rows no longer show "+" on a phone. #3030

      Agents

      One agent could show as two rows in the sidebar after Claude Code moved its conversation to a new session id. It is one row now. Your reply in a thread the old session owned also reaches the conversation under its new id, where before it waited until the agent wrote in that thread again. #3039, #3019

      Claude's icon is calmer: it stays still and makes one small move every few seconds. There are ten Glass colours. Rest the pointer on an agent's icon and its faces fan out in a half circle to pick from; on a phone, press and hold the icon. A plain click still steps through the faces. #3047

      Agents can now be hidden like other sidebar items, from the sidebar's right- click menu or the Customize sidebar panel. Hiding it only removes the section; agents keep running. #3041

      New message: send to the thread that already has the name

      A thread name that another open thread in the project already had was only refused. The notice now shows that thread as a pill, with its agent's icon and its state, and a Send to that thread button. Pressing it sends your message and its files as a reply there and opens that thread. Changing the name still works as before. #3034

      Comment boxes and /side

      In the comment box on highlighted text, typing / listed nothing and the box could not be moved. Now / lists your skills, and you can drag the box by the quoted words at its top. #3037

      The comment box over an open artifact can be dragged by its top strip and resized by a corner. It keeps its place and size while that artifact is open, and a double-click on the strip puts it back. #3040

      The reply box's / list has a built-in side row. Pick it and the side chat opens with what you typed in its box, not sent. Nothing goes to the thread. #3032

      Modern dark, and Settings → Agents

      Plannotator Modern has its final dark colours. Its blue and its fonts are the ones its light side uses, and the light side is unchanged. #3028

      In Settings → Agents, a switch that is off now has one grey line under it that says what off means, for example "Off: Codex can't send you messages or read your replies here." The lines show only under agents found on this computer. #2894

      Plan review and annotate

      Click a word to highlight it

      In Select, one click on a word now highlights it, the same as dragging over it. Before, a click on text did nothing. A word joined by hyphens or apostrophes, such as "Dead-lettered" or "user's", is taken whole. Double-click and triple-click still work as the browser does them, and drags are unchanged.

      This is on in plan review, in annotate, and in documents and files opened from an Inbox thread. It is off in the messages of an Inbox thread, where dragging over words works as before. A click on a link, a button, a picture or an existing highlight does what it did. #3046

      Drags that made no highlight

      Four highlighting bugs are fixed:

      • Letting go of a drag outside the text now makes the highlight. It ends where the pointer left the text, never at the end of the document.
      • A drag that the browser left with nothing selected now selects from the press to the pointer.
      • A long drag that scrolls the page keeps its highlight. Before, it was removed the moment it was made.
      • A click with a slight wobble no longer leaves a one-letter highlight.

      #3042

      For agents

      send_message can now add one short hint as the last line of its answer. One says a pull request linked in the message is not attached to the thread, and how to attach it. The other says a question with choices can carry Pros:, Cons: and Prototype: lines. A session gets each hint once, and at most one per send. The message itself always goes through unchanged. #3044

      plannotator inbox rows prints every row option and its value now. plannotator inbox rows set name=value … changes options in one save, and plannotator inbox rows undo puts the last change back. A wrong name or value changes nothing. #3049

      Fixes

      • End reaches the bottom of a long guided review. In a very large review, End could stop 50 to 100 px above the end. It now stops at the end. #3052
      • An open page keeps saving after the Inbox restarts. A page left open across a restart looked whole, but its replies and drafts were refused and threads stayed unread until a reload. It now goes on with no reload. #3026
      • A page whose first load fails recovers by itself. When the first read of the list failed, the page stayed empty, or stopped showing new messages, until a reload. It now tries again until the list lands. #3022

      Install / Update

      macOS / Linux:

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

      Windows:

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

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      • Settings → Agents: say what a switch left off means by @backnotprop in #2894
      • Inbox: an open page keeps writing after the same Inbox restarts by @backnotprop in #3026
      • Plannotator Modern: dark takes the PaulMillr palette by @backnotprop in #3028
      • Inbox: a built-in /side command takes what you typed to the side chat by @backnotprop in #3032
      • Inbox: a reply reaches a conversation that goes on under a new session id by @backnotprop in #3019
      • Launch permission e2e: time the second Enter from the card's focus by @backnotprop in #3033
      • Phone sidebar: one scroll, full names, folding sections by @backnotprop in #3036
      • Agents: list a conversation that got a new session id once by @backnotprop in #3039
      • Inbox comment card: show the skill list, and drag the card by its words by @backnotprop in #3037
      • Inbox: starred threads as pills above the list by @backnotprop in #3038
      • Projects sort phone test: measure once the sheet has stopped sliding by @backnotprop in #3048
      • New message: send to the thread that already has the name by @backnotprop in #3034
      • Inbox: Agents can be hidden from Customize sidebar by @backnotprop in #3041
      • Inbox: two quiet hints on send_message's answer, each once per session by @backnotprop in #3044
      • Inbox one-time dialogs: shown on a tab left loaded, 40 minutes apart, no polling by @backnotprop in #3015
      • Inbox: read the first list again when it fails, so the page still listens by @backnotprop in #3022
      • Inbox agent icons: calmer Claude, ten Glass colours, and a face picker on the icon by @backnotprop in #3047
      • Inbox: pictures in a message are drawn whole; Show all for very long ones by @backnotprop in #3045
      • Open-stays-put test: give the Show light test its own time by @backnotprop in #3050
      • Artifact comment box: drag it and resize it, per artifact by @backnotprop in #3040
      • Inbox list: show a small pill when news arrives out of view by @backnotprop in #3035
      • Inbox: the one-time themes dialog, and the approved order of the one-time dialogs by @backnotprop in #3051
      • Inbox on a phone: one composer card, the agent in its row, and a picker sheet by @backnotprop in #3030
      • End in a long review stays at the end while its files settle by @backnotprop in #3052
      • Settings > Rows: your own list stays in view, plain choices, Undo, and a Pull requests switch by @backnotprop in #3043
      • Settings > Rows: tell your agent how you want your rows by @backnotprop in #3049
      • Highlighting: release outside the text, caret drags, long drags by @backnotprop in #3042
      • Select: one click on a word highlights it by @backnotprop in #3046

      Full Changelog : v0.28.59...v0.28.60

    13. 🔗 HexRaysSA/plugin-repository commits rename repos due to migrations rss
      rename repos due to migrations
      
      from hexrays-plugin-contributions
      
    14. 🔗 r/LocalLLaMA Fable 5.2 not only has guardrails against AI acceleration, its capabilities were capped in training too rss

      Fable 5.2 not only has guardrails against AI acceleration, its capabilities were capped in training too | This seems excessive, especially if they trust their classification models for safeguards, why add both? However I guess it is to be expected from a private company. It's also "yet another reason" for open weight LLMs submitted by /u/EntropyMagnets
      [link] [comments]
      ---|---

    15. 🔗 OmniNull/OmniWM Canary 20261110-0412 (bcc6b419) release

      Automated canary build of main. It is signed and notarized like a release but skips the owner review, so treat it as unstable.

      See the canary guide to install, update, or return to stable. For everyday use, download the latest stable release.

      • Commit: bcc6b419bc5c
      • Base tag: canary-20261109-0655-42575760350-1

      Changes since canary-20261109-0655-42575760350-1

      • bcc6b41 Derive the overview close test bounds from the transition's constants
      • a459e36 Merge pull request #1160 from rickythefox/fix/overview-close-handoff
      • 1689289 Remove doc comments from Sources
      • 4fe75d2 Merge pull request #1155 from rickythefox/lint/no-source-comments
      • cdd98ea Merge pull request #1161 from rickythefox/chore/coderabbit-no-docstrings
      • bbcb02f Let the notifications bell open macOS's Notification Center
      • 9d68ed2 Hide the notifications Notification Center itself leaves out
      • 6ef0626 Remove narrating comment from .coderabbit.yaml
      • 4750d2c Disable CodeRabbit docstring coverage check
      • 61b867d Merge pull request #1105 from msanft/codex/notification-filtering
      • 5a00177 Test that cancelling a finished close reveal keeps the overview transparent
      • dbcad0a Remove overview close blink and end-of-close stall
      • d6d777a Match notification preferences regardless of bundle ID case
      • 96ca48c Preserve notification integrity when preferences exclude records
      • 786d25c Filter notification history using current app preferences
      • ad29e90 Warn on doc comments in Sources
      • 1040de2 Show the active layout on the OmniWM button of OmniShell bars
      • 3258bb4 Exclude silent notification records from history and dismissal
      • bea07a8 Name the readable text contrast and drop a source comment
      • fc61246 Merge pull request #1147 from rickythefox/fix/solid-black-bar-palette
      • a9e397d Draw solid black bars with the dark palette in light mode
    16. 🔗 backnotprop/plannotator v0.28.59 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.58 | Start Codex from New message, an Agents section in the sidebar, start an agent in a folder on any drive, play audio attachments and comment at a moment, Claude Code's Plannotator tools work on Windows
      v0.28.57 | Pin artifacts, and see every artifact on one page, filter the list by project, date or agent, a thread shows its pull requests and their state, choose what the sidebar shows, and in what order, Ask AI starts from Side in the selection bar
      v0.28.56 | Questions can show trade-offs and a prototype to try, a thread with many big pictures no longer crashes the tab, Escape closes New message and keeps your draft, read threads stop being bold and keep their place, agent messages that name no thread start a new one
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner

      What's New in v0.28.59

      TL;DR

      • Changed: The Agents section in the sidebar is quieter: a plain heading when closed, no panel behind it
      • Changed: Machine names show only when agents run on more than one machine
      • Changed: Agent icons are always gently alive, and lean toward your pointer

      0.28.59 is a small release that finishes the sidebar's Agents section, which arrived in 0.28.58 in an earlier form. It has 4 PRs, all from @backnotprop. One is a test fix, and one changes nothing you see yet.

      Plannotator Inbox

      A quieter Agents section

      Closed, Agents is now a plain heading row like Projects: no panel behind it and no buttons on it. Open it and the two add buttons (start an agent, link a machine) appear on the heading, with the agents listed under it. The tinted panel behind the open section is gone too.

      A machine's name now shows only when agents are running on more than one machine. With one machine, the agents are one list with no name above them. A machine with no running agent shows nothing. A machine that shows no name also shows no filter, sleep note or Update word in the sidebar; those stay in Settings → Machines. #3025

      Agent icons that stay alive

      Each agent's icon in the sidebar now moves a little all the time, in its own way and at its own pace: Claude's star turns, Codex's prompt blinks and types, Pi's blocks ride a wave, OpenCode's frame sways. While your pointer is in the sidebar, each icon leans slightly toward it. The icons no longer change look for working, waiting or ended; the hover card still says what an agent is doing. With reduced motion on, they are still. #3018

      Not yet on

      Code review in the Inbox stays off, and its switch stays hidden until a later release. For people who have it on, Reviews and the Pull requests board now show a small profile picture by each person's name, from GitHub or GitLab, with their initial when there is no picture. #2986

      Install / Update

      macOS / Linux:

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

      Windows:

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

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      • Inbox: a face by every person's name in Reviews and the PR board by @backnotprop in #2986
      • List filter test: a fixed clock, so Today holds at every hour by @backnotprop in #3031
      • Inbox agent marks: always alive, a subtle lean toward the pointer, no state looks by @backnotprop in #3018
      • Inbox Agents section: closed, it is a plain heading (no panel, no Add buttons) by @backnotprop in #3025

      Full Changelog : v0.28.58...v0.28.59

    17. 🔗 backnotprop/plannotator v0.28.58 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.57 | Pin artifacts, and see every artifact on one page, filter the list by project, date or agent, a thread shows its pull requests and their state, choose what the sidebar shows, and in what order, Ask AI starts from Side in the selection bar
      v0.28.56 | Questions can show trade-offs and a prototype to try, a thread with many big pictures no longer crashes the tab, Escape closes New message and keeps your draft, read threads stop being bold and keep their place, agent messages that name no thread start a new one
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner
      v0.28.45 | Plannotator Modern theme, a thread panel view, session names in the To picker, thread links open in place, comment on diagram parts

      What's New in v0.28.58

      TL;DR

      • New: Start Codex from New message
      • New: An Agents section in the sidebar, in place of Machines
      • New: Start an agent in a folder on any drive
      • New: Play audio attachments and comment at a moment
      • New: Claude Code's Plannotator tools work on Windows

      New message can now start Codex, and it can start an agent in a folder on any drive, not only under your home folder. The sidebar's Machines section is now Agents, a list of the agents that are running. Audio attachments play in the Inbox and take comments, questions inside an attached Markdown file can be answered, and Claude Code's Plannotator tools now work on Windows.

      0.28.58 has 24 PRs: 22 from @backnotprop, one from @uvw, who brought the Claude Code tools to Windows, and one from @hydn-n, who fixed the T3 Code hook. Two are test and release changes, and two change nothing you see yet.

      Plannotator Inbox

      Start Codex from New message

      New message can now start Codex , as it already starts Claude Code and Pi. In To, under "Start a new session in", pick the Codex row, pick a folder, and send. The thread shows "Codex is working" with Stop , and each reply you send goes to that Codex session. After a Stop, your next reply starts it again where it left off.

      Codex is listed only when it can start: codex is installed (0.149 or newer), you are signed in, and its config has the Plannotator Inbox tool. Codex runs with your own config, login, model and sandbox, and the Inbox never writes to Codex's config. When Codex asks to run a command or change a file, the thread shows a card with Allow once , an allow for this session (for example "Allow file edits for this session") and Deny.

      Settings → Agents → Codex has a new Account line. It shows your plan and how much of the 5 hour and weekly limits you have used, "API key", or "Not signed in" with the command to run. It never shows an email, and it never signs you in or out. #3007

      Agents in the sidebar

      The sidebar's Machines section is now Agents. It lists the agents that are running, each with its mark and its name. An agent that has ended is not listed. Click an agent to open its thread. A running agent with no thread opens New message to it. Hover a row for a card with the agent, its project and machine, what it is doing (Working, Idle or Waiting on you), when it started and when it was last heard.

      With machines linked, each machine's name sits above its agents. A click on the name still shows that machine's threads, and its Update word is still there. With no machine linked, the agents are one list. The section shows no counts.

      The heading has two buttons that are always visible. Add agent (+) opens New message with a new session already chosen in To. Add machine opens Settings → Machines.

      The marks move. Click a mark to swap it for another face: Glass, Yellow, Transparent or Face, then back to the agent's own. The Inbox keeps your choice for that agent in this browser. #3012, #3000

      Start an agent in a folder on any drive

      New message could start an agent only in a folder under your home folder. It can now start one in any folder except system and hidden ones, so an external or network drive works too.

      In New message → To → New session → in ▾ , each connected drive has its own row after "Another folder…", and a network drive says so. A drive's row opens the folder browser at that drive, with a row of places at the top (Home and each drive) to switch between them. You can start in the drive's own top folder. A project on a drive shows as "Studio SSD › footage-tools".

      When a drive is unplugged, its projects stay in the menu, struck through, with "Archive isn't connected. Connect it to start here.", and can't be picked. A slow network drive shows "Reading Backup…", and after 3 seconds "Backup isn't responding" with Try again. On a Mac, in the Inbox window on that same Mac, Choose in Finder… opens the system folder picker and fills in the folder you pick. #3004

      Play audio, and comment at a moment

      An audio file in a thread used to be a download. It now opens in a player with play and pause, a bar to scrub and the time, and for a file of 12 MB or less the bar draws the sound's waveform. You can comment at a moment, as on a video: dots on the bar mark the comments, a click on a dot jumps there, and the agent gets each comment with its time ("At 0:12"). It reads MP3, AAC, M4A, WAV, Ogg, FLAC and sound-only WebM.

      The tile in the message reads like "WAV audio · 0:47 · 2.0 MB" with Play. On a narrow tile, a video's or a recording's line now drops whole parts (the size first) instead of cutting a word, and the comment count sits before the size. #3011, #3013

      Answer questions inside an attached file

      A question an agent writes inside an attached Markdown file was only text. It is now a card you answer in the file, the same as a question in the message: pick, Other, Add note, Skip or Accept recommended. These questions count in the thread's open questions, show in the open-questions list as "11:01 AM · in plan.md", and go out with the same Send. The agent gets your answers under a heading that names the file.

      A file that changed after it was sent shows its cards locked, and the open- questions list opens the version that was sent. Messages from before this release stay as they were. #3001, closing #2828 reported by @zane668

      Click the list's edge to hide it

      Beside an open thread, click the edge of the list column to hide the list and the sidebar and give the thread the whole window. Dragging the edge still resizes it, and its tooltip reads "Click to hide the list, drag to resize". This replaces the hide icon in the thread's header. ‹ Inbox, Escape and ⌘B bring the list back as before. #2994

      Smaller changes

      • Side in the selection bar is now an icon with no word. The icon is the mark of the thread's agent: Claude's in a Claude Code thread, Codex's in a Codex thread. Its tooltip reads "Side chat with Claude" (or the agent's name). An agent with no mark of its own keeps the two speech bubbles and "Side chat". What a press does is unchanged. #3016
      • A one-time tip, "Make the sidebar yours", points at the sidebar and says you can hide and reorder its items from a right-click. You see it once, on a computer, if you have used the Inbox for a day or more and never saved a sidebar layout. Got it or Escape closes it. #3014
      • A file tile in a message always says Open , or Play for a video or a sound. Before, the tile of the file open beside the thread changed to "Open beside". The highlight still marks which file is open. #3017
      • Send buttons no longer show the ⌘↵ hint: no tooltip on the reply box's Send, and no keycap on New message's Send. ⌘↵ (Ctrl+Enter) still sends, and Settings → Keyboard still lists it. #3009
      • A video or a sound inside an HTML attachment now plays. Before, the Inbox blocked media that the page carried inside itself. Media still never loads from the web. #3003
      • A code block that scrolls sideways (a table, a diagram, aligned config) now keeps its background across the whole line. Before, the part you scrolled to sat on a darker shade. Plan review and code review's Markdown preview get the same fix. #2995

      Claude Code

      The Plannotator tools work on Windows

      Claude Code's Plannotator tools now work on Windows. Before, a Windows session always used the classic hook: it had no Inbox tool unless you added the MCP command by hand, and the session never showed in the Inbox. Now a Windows session with the plugin shows in the Inbox, an Inbox message arrives as a turn, and the reply comes back, with nothing else to set up.

      It runs through Git Bash when Git for Windows is installed, and through Windows PowerShell 5.1 otherwise. Set PLANNOTATOR_MOD_SHELL=sh or powershell to choose one. If neither shell passes a small check when the session starts, the tools stay off and the classic hook is used, as before. macOS and Linux are unchanged. #2893 by @uvw, closing #2892

      Removals inside longer commands skip the prompt too

      With CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS set, Claude Code in bypass mode skips the prompt for a removal it cannot prove safe. Since 0.28.52 that works with Plannotator installed, but two cases still showed a prompt that Claude Code alone does not show. One was a removal inside a command of several parts, such as cd /tmp/x && rm -rf logs/*/* or two removals in one command. The other was any removal while a PreToolUse hook that could run for Bash was installed, even one that only logs.

      Both now run with no prompt. The prompt stays when a part of the command asks for another reason, when a PreToolUse hook itself asks, and beside a PermissionRequest hook or an ask or deny rule on Bash. With PLANNOTATOR_MOD_DEBUG=1, the debug log now says what kept a prompt. #3023

      T3 Code and Pi

      • The T3 Code hook works with T3's new entrypoint. T3 Code now starts Claude with CLAUDE_CODE_ENTRYPOINT=t3-code. The optional T3 hook (install.sh --with-t3) opened only for the older sdk-… names, so in a T3 thread it never ran, and "Ask this session" from a review did not reach the thread. The hook now opens for both. An install made with --with-t3 gets the new hook on its next update. If you registered the hook by hand with t3-hook install, run that command again. #2782 by @hydn-n
      • Pi: no TLS warning on a Bun build that already has the fix. Plannotator warned at every Pi start when Pi ran on a Bun older than 1.4.4, even on a build that carries the October 2026 TLS fix, such as Pi-Bolt on Bun 1.4.3. It now also checks the certificates the Bun build carries, and stays quiet when the fix is there. #2996, closing #2914 reported by @Battlelamb

      Tab icon: Glass, Yellow or Face

      The Favicon choice (plan review's Theme tab, and the Inbox's Settings → General → Appearance) is now Glass (the default), Yellow (the goggles with a yellow glass) or Face. The P icon from 0.28.57 is gone. If you had picked P, you see Glass.

      The Inbox asks once, "Which favicon do you prefer?", with the three icons at full size and in a browser tab. A choice previews on your tab, and the button saves it ("Keep Glass", "Use Yellow" or "Use Face"). Escape changes nothing. You see it if you used the Inbox before this release and never chose an icon, or had picked P. A new install is not asked. You can change it in Settings at any time. #3005

      The anonymous daily ping

      The anonymous daily ping now also says which favicon is set in Settings (glass, yellow or face, or none if you never picked one). The privacy page lists it. Nothing else about the ping changes, and NO_ANON_PING still turns it off. #3002

      Not yet on

      Two changes show nothing to most people yet.

      Starting an agent from the Inbox stays off on Windows. This release makes it able to work there: Windows paths, PATH and PowerShell commands. #3008

      Code review in the Inbox stays off, and its switch stays hidden until a later release. For people who have it on, Settings → Capabilities has a new Chapter diagrams switch under Code review, on by default. Off, agents are no longer told to draw a diagram for a chapter, and a diagram that still arrives starts folded under its Diagram header. #2985

      Install / Update

      macOS / Linux:

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

      Windows:

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

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      New Contributors

      Contributors

      • @uvw asked for the Claude Code tools on Windows in #2892 and then built them in #2893: Windows paths, a Git Bash path and a Windows PowerShell path. This is their third PR here, after the Board's project names and the Markdown code fixes.
      • @hydn-n found that the T3 Code hook never ran under T3's new entrypoint and fixed it in #2782, with a live check in T3 Code. They also wrote the T3 Code wake that shipped in 0.28.49.

      Community

      • @zane668 reported in #2828 that questions inside a Markdown attachment could not be answered. #3001 fixes it.
      • @Battlelamb reported in #2914 that the Pi TLS warning fired on Pi-Bolt builds that already have the fix. #2996 fixes it.

      Full Changelog : v0.28.57...v0.28.58

    18. 🔗 Filip Filmar A network on chip in TxHDL, with a CPU and a GPU on it rss

      A conventional interconnect connects multiple peripherals to a single host. A network on chip (NoC) connects multiple hosts and peripherals across a 2D mesh topology, routing packets between arbitrary endpoints. We implemented a packet-routed NoC in TxHDL. The design features four-neighbor mesh routing, dual virtual channels, dimension-order routing, and protocol bridges that map AXI4 transactions to network packets. To validate the architecture, we placed our RISC-V core, GPU rasteriser, shared memory, and a serial port on the four corners of a 2-by-2 mesh. The CPU computed a 3D icosahedron model and generated display lists that the GPU rendered across the network.

    19. 🔗 Ampcode News Boxes rss

      Today, we're introducing something new to Amp: boxes.

      A box is an always-on computer to which you can deploy the many delightful things you've built with Amp.

      Boxes are small and cheap (the smallest one is $18 per 30 days). But they're full-on computers. You can run anything you want on them. They come with an agent running on them, too. And agents are great at running on computers.

      Today, with hyper-individual software being created nearly as fast as someone can dictate a prompt, a small machine goes a long way and can serve most personal or internal software. Software that you build for yourself and people you work with doesn't need to scale to thousands of users. All it needs to be is available for everyone you want to share with and within reach of an agent.

      That's what boxes are: a home for what you build with your agents.

      Here's Thorsten showing how he deploys applications to boxes and then modifies their production data using agents:

      (Note: prices shown in the video refer to Enterprise plan prices. Personal and Team boxes are cheaper. See Pricing.)

      How It Works

      1. You develop in orbs and, once the app is ready, deploy it to the box. 2. The box runs several apps, bug-tracker, tiny-crm, and team-wiki, and each app has its own onamp.dev URL. 3. You start a thread on the box's Amp runner to work on the live app.

      You develop your software in orbs. You test and share work in progress in portals. When you're ready, you ask the agent to spawn a box for you.

      A box is a single VM to which you can then deploy multiple applications. Each application gets its own URL. The box is permanent and will stick around, it doesn't turn off, and you can deploy to it multiple times from however many orbs you want. (If you want to save money, you can ask the agent to turn the box on and off on a schedule.)

      It's worth pointing out that there are no containers or other abstractions involved. A box truly is... just a computer. Because, again, agents are great at using those.

      If you want, you can make deployments private or require visitors to Sign In With Amp. Ask the agent to do it for you, it'll know how.

      Shared Boxes

      You can share boxes with your workspace, so you can run your internal software on a box and everyone on the team can deploy new versions.

      Runners on Boxes

      Each box comes with its own runner. That means you can leverage how good agents are at using computers by spawning them right there, on the box.

      The new thread composer with the executor picker open. Under Boxes, the workspace box acme/workbench is selected with its app bug-tracker checked, below the Machine directory and above the tiny-crm, team-wiki, and incident-database apps.

      Ask them to clean up the team wiki's database, for example. Or add a new entry based on a screenshot you took. Or ask it to analyze the data everyone added.

      Why build elaborate admin interfaces when you can just ask the agent, right there, to modify the state of the running applications?

      Pricing

      Boxes come in different sizes. They're billed by the minute. By default, they're always on. But you can turn them on and off on a schedule, if you want to save money.

      Size Machine Per hour 30 days, always on 30 days, on 6am to 9pm
      b1.tiny 0.5 vCPU (bursts to 2), 2 GB $0.025 $18 $11.25
      b1.small (default) 1 vCPU (bursts to 2), 4 GB $0.042 $30 $18.75
      b1.medium 2 vCPUs, 8 GB $0.069 $50 $31.25
      b1.large 4 vCPUs, 16 GB $0.139 $100 $62.50

      Getting Started

      Ask your agent to create a personal box for you and then ask it to deploy an application to it. Read the docs if you want to find out more.

  3. November 09, 2026
    1. 🔗 IDA Plugin Updates IDA Plugin Updates on 2026-11-09 rss

      IDA Plugin Updates on 2026-11-09

      New Releases:

      Activity:

      • ida-domain
        • 612b0219: Add decompiler_timeout() context manager (#147)
        • 6ea12e76: Allow get_imports_for_module() to take a module name (#135)
        • d29a0bf2: Upgrade locked dependencies flagged by Dependabot
        • ac189caf: Run tests on IDA 9.5 on CI
        • 94aff3d4: Support synthetic strings of IDA 9.5 (#150)
      • idafridascript
        • 3aa548a1: 添加changelog
        • 796591c4: fix(frida_tools): 解决 func 为 None 导致的异常
        • ee68a41f: chore(core): 更新版本号及依赖,修改服务器端口
      • idamcp
        • 8c572ff4: Make post-commit state updates and tool loops interrupt-safe
      • plugin-ida
        • 98ea7795: chore(deps): Bump step-security/harden-runner from 2.22.2 to 2.22.4 (…
    2. 🔗 Simon Willison Locating the source of a mysterious beep with Claude rss

      Our house has a box room, full of boxes that we still haven't unpacked from our last move. A couple of weeks ago something in that room started intermittently beeping. The beeps were far enough apart that standing in the room and trying to determine the source of the noise was frustrating, and I really didn't want to dig through every one of those boxes. So I had Claude Code build Beep Locator, a software system for triangulating the source of a mysterious beep using multiple devices scattered around the room.

      Here's what Beep Locator looks like after it has been running for a while:

      Screenshot of a web app that uses several phones, tablets and laptops as microphones to locate a mystery beeping sound in a room. The left column has an "Add a listener" panel with a QR code and join link, a "Controls" panel with buttons including "Calibrate", "Test beep" and "It just beeped!" plus a "Listen for beeps" checkbox, and a "Mystery beep" note reading "3345 Hz · 3 confirmed · remembered across sessions". Below that, a "Devices" list shows five color-coded listeners (Simon iPhone, New iPad, Old iPad, MacBook Pro, Surface Ultra), each marked "✓ mic working · ✓ speaker working". The main area is a gridded map with a 1 m scale bar that shows the five devices as colored dots and earlier sounds as small timestamped markers. A pink shaded circle near the MacBook Pro is labeled "mystery beep · 2 hearings · within ~41 cm", and beside it a dashed plus marker suggests "add a listener here? could tighten the mystery beep's position by ~12%". Below the map, a "Mystery beep loudness warmer / colder" panel shows a bar for each device: Surface Ultra is loudest at "-6.0 dB ▲ +11.6 dB warmer", with the note "about 6 dB louder means roughly half the distance". At the bottom, a "Sounds located" table lists recent claps and beeps with coordinates, or the warning "arrival times are not physically possible (echo or a different sound?)".

      You run Python web server to show the primary UI, and then use the QR code or URL to connect as many devices as you can spare to act as listeners - I was using two iPads, a phone, a MacBook Pro and a Surface Ultra.

      The devices then play noises to each other to help estimate their locations. This didn't work particularly well, so I added a "Rough mode" where you can drag their icons around in the space to provide rough locations which are then adjusted based on those sounds.

      Once that's set up, the devices all listen for the beep!

      I added a clapping mode too so I could test it by clapping my hands in different locations around the room - displayed as diamonds on the map. This helped me gain confidence that it was capable of locating a sound.

      Beeps show up on the map as an X, plus a line in the "Sounds located" log. You can replay these sounds (from each device in turn) to confirm they are the mysterious beep you are looking for, then click "This is the mystery beep" to mark them as such.

      Once you've confirmed the mysterious beep frequency the system will listen out for it, measure the interval between beeps, and use the triangulated locations to lock down the most likely location on the map.

      The system worked as intended. It gave me the position of the beep to within about 40cm, then I dug through that specific pile of boxes and found an ancient carbon monoxide detector that desperately wanted its batteries replaced.

      How it works

      When I started working through this problem with Claude it quickly dug up BeepBeep: A High-Accuracy Acoustic-Based System for Ranging and Localization Using COTS Devices, a 2007 paper by Chunyi Peng, Guobin Shen, Yongguang Zhang, Yanlin Li, and Kun Tan. Here's that paper's abstract:

      We present the design, implementation, and evaluation of BeepBeep, a high-accuracy acoustic-based ranging system. It operates in a spontaneous, ad-hoc, and device-to-device context without leveraging any pre-planned infrastructure. It is a pure software-based solution and uses only the most basic set of commodity hardware – a speaker, a microphone, and some form of device-to-device communication – so that it is readily applicable to many low-cost sensor platforms and to most commercial-off-the-shelf mobile devices like cell phones and PDAs. It achieves high accuracy through a combination of three techniques: two-way sensing, self-recording, and sample counting.

      That sounded exactly like what we needed to build!

      Beep Locator runs a Python web application server that does most of the work. The listening devices then connect to that server via WebSockets and present a UI which requests browser microphone access. The listeners mainly work by recording a 60 second buffer of recent audio. They also run a simple beep detection algorithm (see detector.js), which uses Fast Fourier Transform and a high-pass filter to identify potential beeps. It sends these events to the main server.

      When a beep is reported, the server has a device play a short chirp (the device with the lowest round-trip time to the server), then asks every listener upload a clip from about 0.6s before the beep to 0.8s after that chirp. This chirp allows the clips to be aligned with each other, a crucial step in locating the beep.

      How I built it

      I started this project using Claude Code Cloud via my iPhone, with Opus 5.5 running in Extra thinking effort mode. Here's that shared starter session, which began with this prompt against a newly created empty GitHub repository:

      Write out a problem.md file describing the problem we want to solve

      There is a device beeping in a room and I cannot find it

      I want to set up several devices - laptops, phones, iPads - around the room all listening at the same time and have them help triangulate where the beep comes from

      There needs to be a Python web app which coordinates it all - one device shows a web page for the app, other devices join a URL which turns them into listeners - all via browser WebAudio and WebSockets back to the Python server app

      Ideally I wouldn't need to manually input the relative locations of the devices - it would be amazing if they could play sounds to each other in order to locate each other in 2D space - is that even possible though?

      That got me this problem.md file. As part of writing that up Claude found and read the BeepBeep paper, which is described in that file.

      The research looked good, so I told it:

      Ok try and build it, add a mechanism so you can send new code to the listeners which they will then run automatically - that way I can set everything up in the room and then leave you alone to continue hacking and experiment while I do something else

      That got me to this point - most of the system was built, but nothing had actually tried running it yet.

      I cloned the new repository to my laptop and fired up Claude Code... and then Fable 5.2 was released, and this project seemed like an excellent opportunity to put that through its paces.

      I had Claude Code on my laptop start the server running, then made sure it could both see what was happening and make live changes to the software as it ran.

      This was already baked into the software: Opus 5.5 had built an installModule() method on the listeners that could be triggered over the WebSocket connection, meaning the admin server could execute arbitrary new code on any of its clients.

      On some devices, web pages that listen on the microphone request user permission any time the page reloads. The hot-swap module mechanism meant that we could deploy new code without having to manually interact with each of the listening devices in turn.

      From that point on my involvement was mainly to sit by the laptop chatting with Fable 5.2 about what was going on, and occasionally requesting new features. Here are some of the feature prompts I ran:

      I think we need to make it so I can drag things around on the map in “rough mode”, where my job is just to put them roughly where they are, then switch out of rough mode and it attempts to get them accurate

      This gave me the ability to drag listeners around the map.

      what’s a good way for me to test this I wonder? Can we have it listen for claps, then I could clap and it could identify the location of the clap? [...]

      Claps should use a different symbol on the map than beeps

      That added the thing where any time I clapped it would show on the map as a different symbol from the beeps.

      each symbol on the map should include a HH:MM:SS timestamp

      That made it easier to spot which symbol likely reflected which real-world sound.

      The log should show beeps and claps with their timestamps AND have a little play button which, when clicked, replays the recorded noise from each of the listeners in sequence (with clear text on screen showing which listener recorded which snippet) while temporarily turning off microphone recording while that replay plays

      Now I could replay sounds, making it much easier to identify which recorded clip was the mysterious beep I was looking for.

      There should be a button next to a recording for “This is the mystery beep” - then I can hit replay to see and then confirm it was the mystery beep if that’s the one I am looking for

      Then the system can categorize noises in the future to see if they are likely that same mysterious beep and use that information to build a more accurate idea of where it is

      At this point I was getting close - I had a solid idea of where the beep was coming from, but wouldn't it be neat if I could reposition the listeners around that point to get an even finer location?

      I want a feature for this, I don’t want to have to restart each listening device etc, I want to be able to click a “Reposition the devices” button which lets me switch into repositioning, then I click “Repositioned” and it puts me into Rough mode and asks me to roughly locate them, then I do that and click, then it starts up again. The previous session can be read-only viewed through the app.

      And since I had one spare device, I then said:

      add a feature where the map includes a spot that is a suggestion for a location that it would be useful to add a listener at - based on data collected so far

      Giving Claude Code ears

      I think the most interesting part of this project is that I demonstrated it's possible to give Claude Code ears.

      Claude doesn't have native audio input (yet), but it can run JavaScript and Python code that can analyze audio captured by a microphone.

      I told it to run a web server with WebSocket connections to multiple listening devices, then had it both run a WebAudio microphone on those devices and hook them up so they could be sent fresh JavaScript code to execute via that WebSocket.

      Then I could pretty much leave Claude alone, hacking away at the problem, querying the audio logs, and reconfiguring its ears to help it solve the problem.

      I'm reminded of a similar hack I heard about at GitHub Universe a few weeks ago, where Martin Woodward told me he had been debugging the GitHub Universe Badge computers by plugging them into a computer via USB-C and then pointing a webcam at their screen, so his coding agent could tell if updates were working correctly or not.

      Figuring out ways to let coding agents perceive the world around them is a whole lot of fun.

      You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options.

    3. 🔗 earendil-works/pi v1.5.1 release

      New Features

      • Shell login and logout : use pi auth login <provider> and pi auth logout <provider> without starting a session, with API-key and no-browser sign-in options. See Credential commands.
      • Idle prompt cache warming : eligible caches now stay warm for up to 30 minutes between runs when a refresh is expected to pay for itself. See cacheWarming.
      • Anthropic message threads : requests send only new messages while the server continues the conversation, with full-request fallback when earlier context changes. See Anthropic compatibility.
      • Richer Mermaid diagrams : pie charts, author-defined styles, clickable labels on supported terminals, and diagrams in expanded branch and compaction summaries. See Display settings and Markdown transformers.
      • GitHub Copilot classifiers : call Microsoft-Decision-1 through codemode models.classify() for typed decisions and probabilities. See Use classifier models.
      • Package update summaries : pi update --extensions reports each package's npm version or git commit change and distinguishes unchanged, skipped, and warned updates. See Update Pi or packages.

      Breaking Changes

      • Custom GrepOperations.readFile callbacks are no longer called for context lines. The field remains accepted as optional and deprecated so existing integrations still compile. The grep tool now takes context lines from ripgrep and no longer reads matched files itself. To search a remote system, override grep's execute(); see Remote Execution (#9276)
      • OpenAI-compatible models no longer send "tools": [] when all tools are disabled in a session that has used tools; the field is omitted. This fixes 400 errors (tools must not be an empty array) from vLLM 0.20+, also behind LiteLLM. If your proxy requires tools once the history has tool calls, such as older LiteLLM versions in front of Anthropic, set compat.requiresToolsWithToolHistory: true for that model in models.json (#11843)

      Added

      • pi update now lists each updated package with its npm version or git commit change, for example npm:foo 1.2.0 -> 1.3.0, and prints Packages are already up to date when nothing changed. When nothing changed but an update printed a warning, for example because npm left the old version installed after resolving stale registry metadata, it prints No packages were updated, see the warnings above instead; in offline mode it prints Skipped package updates (offline mode). PackageManager.update() reports each changed package as a new result progress event whose message holds that line (#11707, #11711)
      • Anthropic sessions now use message threads: each request sends only the new messages and the server continues from the previous reply, falling back to the full request when the conversation changed (for example after compaction or a tool list change). On by default for the anthropic provider on api.anthropic.com; set compat.supportsMessageThreads in models.json to enable it for gateways that forward the thread field, or to turn it off. Cache warming does not touch the session's thread (#11545)
      • pi.registerMarkdownTransformer() takes an optional { messageTypes } that selects the Markdown surfaces a transformer runs on. Besides user, assistant, and thinking Markdown, transformers can now opt into custom (custom messages and skill blocks), summary (branch and compaction summaries), and changelog (What's New, /changelog, the Extension Updates notice, and the Update Available note). Without options a transformer runs on user, assistant, and thinking Markdown as before. The built-in Mermaid renderer now also draws diagrams in expanded branch and compaction summaries
      • pi auth login <provider> logs in to a provider from the shell without starting a session, for example pi auth login radius. It signs in with an account in the browser and exits; --api-key saves an API key instead, and --no-browser uses device code or copy-code sign-in instead. Logging in to Radius also configures the Radius MCP server. pi auth logout <provider> removes the stored credentials, like /logout
      • ctx.ui.custom() overlays now honor the blocked option: pi reports blocked program status (OSC 7501) from when the overlay is shown until it calls done(), also while it is hidden with setHidden(). Closing one overlay keeps other open questions blocked (#11816)
      • Added the qwen-token-plan-individual-cn provider for Qwen Token Plan Individual on the China endpoint, using QWEN_TOKEN_PLAN_CN_API_KEY (#7989 by @bigoldcat123)
      • Added Microsoft-Decision-1 classifier support through GitHub Copilot, including codemode models.classify() (#11679 by @Marvae)
      • Added compat.promptCacheKeyMode ("auto", "enabled", or "disabled") to enable prompt cache keys for compatible proxies or omit them for endpoints that reject them. Set it in models.json when using pi (#9442 by @dannote)
      • Added compat.requiresNonNullAssistantContent for OpenAI-compatible endpoints that require an empty string instead of null in assistant messages containing only tool calls. Set it in models.json when using pi (#8118 by @gaoyk19)
      • Added syntax highlighting for Dart, Nix, Groovy, and Gradle files in read and write views (#11643)
      • Added GLM 5.3 to the Qwen Token Plan Individual model allowlist (#11658)
      • Added Claude Fable 5.2 (claude-fable-5-2) to the anthropic provider ($8/$40 per million input/output tokens, 1M context, 128K output). Like Fable 5.1 it uses per-message effort and mid-conversation system messages; requests its safety classifiers refuse before any output are answered by Claude Opus 5 through server-side fallback and billed at Opus 5's price. Claude Fable 5.2 and Mythos 5.2 on other providers, such as OpenRouter's anthropic/claude-fable-5.2, get the same per-message effort support

      Changed

      • The default model for the anthropic provider is now Claude Opus 5.5 (claude-opus-5-5) instead of Claude Opus 4.8
      • Default models moved to newer models at the same or a lower price: amazon-bedrock Claude Opus 5.5, azure GPT-6.1 Sol, google and google-vertex Gemini 4 Argon, vercel-ai-gateway GLM 5.3, baseten GLM 5.3, minimax and minimax-cn MiniMax-M3, qwen-token-plan and qwen-token-plan-cn Qwen3.8 Max, opencode-go Kimi K3.1 Pro, and Kimi K2.7 Code instead of Kimi K2.6 for moonshotai, moonshotai-cn, huggingface, opencode, openrouter, cloudflare-workers-ai and cloudflare-ai-gateway
      • cacheWarming now defaults to "idle" instead of "streaming": pi also keeps eligible prompt caches warm for up to 30 minutes between agent runs, but only when a refresh is expected to pay for itself. Set "cacheWarming": "streaming" in global settings for the previous behavior
      • Consecutive cache warms now show as one Cache warmed: $<total> line with the cumulative cost instead of one line per warm
      • The OpenAI Codex provider is shown as "OpenAI Codex" again instead of "OpenAI Codex (legacy)" in /login and the model selector
      • The /login and /logout provider lists and /login <provider> completions now show the preferred partners Radius and OpenRouter first, then all other providers alphabetically. In the provider lists, partners are marked with ✦, the selected Radius row shimmers in the Radius logo colors and the selected OpenRouter row glows in OpenRouter's brand color (lime on dark themes, violet on light themes)
      • Upgraded terminal Mermaid rendering to support more diagram types, including pie charts, author-defined styles, and clickable labels on terminals with hyperlink support (#8158 by @xl0)

      Fixed

      • Fixed the grep tool's glob matching from the folder pi was started in instead of from path: with path: "repo", glob: "migrations/main/*.js" returned No matches found even though repo/migrations/main/a.js exists. Globs are now relative to path, the same form grep prints its results in, also when path is a symlink. A leading ./ (./src/*.ts) is ignored instead of matching nothing (#11807, #10998)
      • Fixed prompt template arguments dropping apostrophes and merging words: an apostrophe inside a word, as in doesn't, no longer opens a quote; a quote with no closing match is kept as text; and \" inside "..." (or \' inside '...') gives a literal quote (#11861)
      • Fixed the bash tool reporting only Command timed out when the command had already exited but a background process it started kept writing to its output until the timeout. The error now also reports the shell's exit code and when it exited (#11613)
      • Images in steering and follow-up messages, including prompt() while streaming, are now resized like images in idle prompts instead of being sent and saved at full size (#11738)
      • A failed token refresh of an MCP connection no longer registers an OAuth client or replaces the PKCE verifier of a sign-in in progress, which made that sign-in fail. MCP sign-in now refreshes the stored tokens with the stored client even when the loopback callback port changed, instead of registering a new client and opening the browser. Ctrl+C in /mcp and the --timeout of pi mcp login now also stop a sign-in while it waits up to 25 seconds for another pi process's token refresh, and a refresh lock that fails for another reason than that wait now fails the sign-in instead of opening the browser.
      • Fixed pi mcp list reporting MCP servers with "auth": { "provider": "<provider>" }, such as Radius, as needing sign-in although the provider was signed in: the shell command sent no token. It now sends the provider's /login token and refreshes it when it expired. For these servers the sign-in hint names /login <provider> instead of pi mcp login, and pi mcp login and pi mcp logout point to /login and /logout instead of failing with "does not use OAuth"
      • Fixed RPC mode ignoring an extension's ctx.shutdown() while idle, for example from a timer: the process kept running until the client sent another command. pi now shuts down right away when idle, and a shutdown requested by an extension command waits until the command's prompt response is written (#11599)
      • Fixed changelog notes repeating on every fresh launch when the installed package version has a prerelease suffix, such as 0.1.5-20261020.7: the saved version was read as 0.1.0, so the 0.1.1 to 0.1.5 notes counted as new each time. A saved version without major.minor.patch now shows no notes and is replaced by the installed version, instead of showing the whole changelog (#11703)
      • Fixed RPC mode cutting off shutdown cleanup, such as a pending MCP token refresh, when stdin closed and SIGTERM arrived together, which process managers like Paseo and systemd do. Pi lost the refreshed token and the MCP server revoked the sign-in. Once a shutdown has started, a stdin EOF or a single signal no longer interrupts it; a second signal still exits at once. Print mode likewise no longer dies from a signal that arrives during its final cleanup (#11599)
      • Fixed the grep tool reading every matched file into memory when context was set, which ran out of memory on large files; context now comes from ripgrep, which also fixes UTF-16 files and lone CRs in matched lines, and the match limit notice no longer appears when exactly limit matches exist (#9276, #11423)
      • Fixed the find tool reporting the result limit when exactly limit files match, and limit: 0 in find and ls returning every result or an empty listing; limits below 1 now mean 1 (#7121)
      • Fixed grep match lines, codemode output, compaction summaries of tool results, and MCP error and server summaries cutting an emoji or other non-BMP character in half when truncating, which left an invalid lone surrogate in the text (#7121)
      • Fixed the find tool on Windows returning no results for patterns with Windows separators such as src\**\*.ts, and for every path pattern such as src/**/*.ts with fd 10.5.1, which pi now downloads. Windows path patterns now match the same way with every fd version: src/**/*.ts also finds files directly in src/, and src/*.ts no longer finds files in subdirectories (#9262)
      • Fixed the read tool loading whole files into memory, which ran out of memory on large files even with offset/limit; it now streams the file and keeps only the shown lines. Custom ReadOperations can stream too by providing the new optional createReadStream (#9654)
      • Fixed OAuth logins such as openai and anthropic failing with invalid_grant after pi was stopped while it refreshed an expired token, for example an RPC client that stops pi right after startup while the background catalog refresh runs. The token endpoint had already replaced the refresh token, but pi exited before saving the new one. On exit, pi now waits for a token refresh in progress to be saved (#11692)
      • Fixed Ctrl+P not switching to the only model in scope (or the only available model) when the active model is a different one; it showed "Only one model in scope" instead. Cycling forward from a model outside the scope now also selects the first scoped model instead of skipping it (#11806)
      • Fixed /reload and session switches leaving extension overlays on screen when an extension had more than one ctx.ui.custom({ overlay: true }) open: only the topmost overlay was removed, and the others kept focus and input although the extension that opened them was gone. All extension overlays, including hidden ones, are now removed and disposed; pi's own overlays stay open
      • Fixed /mcp sign-in staying on "Connecting…" for minutes after a successful browser sign-in, with Ctrl+C doing nothing: pi waited for the browser to drop an unused connection to the OAuth callback port. The callback server now closes remaining connections when it shuts down (#11311)
      • Fixed pi aborting (zsh: abort) after repeated image reads, reported on macOS arm64 with Node 24.16. Each image resize starts a worker thread, and pi did not wait for it to stop, so the next resize started a new worker while the previous one was still shutting down. The crash is most likely a Node bug that this overlap triggers and could not be reproduced on Linux; image resizes now wait for the previous worker to stop, which adds about 15 ms per image (#10695)
      • Fixed tool_search and searchTools() not finding a tool by property names and descriptions behind a local $ref, as in MCP input schemas that put their models in $defs. Referenced definitions are read once, so recursive schemas do not loop, and definitions nothing references stay out of the search text (#11803)
      • Fixed the codemode resolves to summary of a tool leaving out field names behind a local $ref, for example structuredContent? instead of structuredContent?: { results } for MCP output schemas that put their models in $defs (#11803)
      • Fixed every codemode script failing with URI malformed when any callable tool, such as an MCP tool, had a $ref with a malformed percent escape (#/$defs/%E0) in its schema, even scripts that do not call that tool. The parameter now renders as unknown in the tool's declaration (#11803)
      • Fixed ctrl+o not expanding or collapsing the output of ! and !! commands run while the agent is working. New !/!! output now starts in the current expand state, the output no longer disappears when a steering or follow-up message is queued, and it moves into the chat when the agent finishes instead of on the next submitted message (#11875)
      • Fixed resuming a session restoring an old thinking level after /tree navigated to before a /thinking change. Like the model, the live thinking level is now recorded on the new branch with the next prompt (#11451)
      • Fixed inline images in fullscreen mode showing only their first row in Orca, while regular mode showed them in full. Fullscreen now draws Kitty images after the rows they cover on every terminal, as it already did for WezTerm (#11835)
      • Fixed the edit tool rewriting the line endings of untouched lines in files with mixed CRLF/LF or lone CR line endings, and running out of memory on large files after the file was already written; the diff now covers only the changed lines and their surroundings and is computed before writing (#8544)
      • Fixed the Windows installer (irm https://pi.dev/install.ps1 | iex) aborting with NativeCommandError in Windows PowerShell 5.1 when npm or Node.js printed any warning, for example npm warn Unknown user config from an unknown .npmrc key. It failed before the action menu when migrating an npm installation, and during managed installs. An invalid managed-install.json also aborted the installer instead of being reported (#11944)
      • Fixed pi update --models failing with Could not refresh model catalogs: openai: OAuth refresh failed for openai: ... invalid_grant when a provider's login had gone stale. Built-in providers whose catalog comes from pi.dev, such as openai, no longer refresh their OAuth token for a catalog refresh at all. For providers that list models with the login, such as Radius and OpenRouter, a failed token refresh now prints a warning naming the provider and pi auth login <provider>, and the other catalogs still refresh; the command fails only for other errors, such as a network failure
      • Fixed the powershell tool reporting Command exited with code 1 under Windows PowerShell 5.1 when a native command succeeded but its stderr was redirected, as in git push 2>&1 | Select-Object -Last 3. Windows PowerShell 5.1 turns that stderr into error records; such commands now report the exit code PowerShell 7 reports (#8842)
      • Fixed deleting a paste marker with Backspace corrupting later short markers such as [paste #2], causing the marker text to be submitted instead of its pasted content (#11923)
      • Fixed dropped provider streams reported as "cut short after the reply had begun" not triggering automatic retries (#11879)
      • Fixed the subagent extension example passing Bun's Windows virtual entry path as part of the prompt when spawning a compiled pi binary (#11865)
      • Fixed the model selector and llama.cpp Hugging Face search moving the selection when a background catalog refresh or search result arrives (#9109)
      • Fixed internal cursor markers leaking into terminal output, including with multiple markers or horizontally clipped content (#9441 by @muyiyr)
      • Fixed the subagent extension example showing running tasks as completed, losing subprocess failure diagnostics, and failing to stop child processes on abort. Agent discovery and trust checks now use each task's working directory, and single and chain results are truncated without losing the full tool details (#8250 by @terrorobe)
      • Fixed large pasted text being replaced by literal paste markers when switching editors, opening custom UI, or restoring queued messages (#10146 by @w-winter)
      • Fixed prompts and session-tree navigation overlapping during asynchronous input hooks, authentication, or branch summaries, which could install the wrong conversation context (#9155 by @acmerfight)
      • Fixed Claude Sonnet 5 requests sending an unsupported temperature parameter (#7961 by @jingtao-wisdomgraph)
      • Fixed extensions loaded through symlinked paths failing to resolve their dependencies by resolving the entry file's real path before importing it (#8112 by @cad0p)
      • Fixed the plan-mode extension example missing completion markers in thinking blocks and common completion phrases, dropping formatted or long plan steps, and sending an extra model turn to acknowledge completion (#7950 by @giannisCKS)
      • Fixed OpenAI Responses requests sending session_id instead of the documented session-id affinity header (#11639)
      • Fixed delivered image-only steering and follow-up messages remaining in the pending queue (#8612 by @wutongyuonce)
      • Fixed cancellation during lazy provider loading or authentication being reported as an error instead of an abort (#8635 by @Mallikarjun-0)
      • Fixed session runtime disposal tearing down extensions before active tools finished aborting and their results were recorded (#9126 by @acmerfight)
      • Fixed the session-tree search cursor not being shown or positioned for input methods (#9157 by @Perlence)
      • Fixed SDK and RPC reloads replacing extensions while a response or compaction was still running; reload now asks the caller to wait (#9222 by @acmerfight)
      • Fixed rendered edit diffs losing shared indentation when a change inserted text at the start of a line (#9274 by @dannote)
      • Fixed ! and !! commands omitting the truncation notice and full-output file link when earlier output chunks had been discarded (#10165 by @acmerfight)
      • Fixed extension selection dialogs growing beyond the terminal height; they now show a scrolling window of up to ten options (#11072 by @DivineDominion)
      • Fixed pi config ignoring custom keybindings from keybindings.json (#11651)
      • Fixed concurrent OAuth refreshes through symlinked paths to the same auth.json by sharing the lock on the resolved file (#11655)
      • Fixed provider connection errors hiding their underlying cause, such as connection refusal or certificate errors, behind generic messages (#11695)
      • Fixed Ctrl+V not pasting clipboard images or text on Windows and WSL; both Ctrl+V and Alt+V are now default paste shortcuts there (#11765)
      • Fixed llama.cpp connection errors omitting the server URL and underlying network error (#11745)
      • Fixed Alacritty hyperlinks not being enabled when TERM_PROGRAM is unset; detection now also uses TERM and ALACRITTY_WINDOW_ID (#11767)
      • Fixed OpenAI Codex SSE retries retaining abort listeners after each backoff, causing listener buildup on repeated retries (#11708)
      • Azure OpenAI models now keep OpenAI's long-context price tier, so requests above 272K input tokens are costed at Azure's long-context rates (#11948)
      • Fixed Anthropic and Bedrock sending strict: "prefer" tools strict again on every request after Claude rejected them for exceeding its strict tool limits, which cost a rejected request (400) per turn. Later requests with the same sessionId now send those tools non-strict right away, until cleanupSessionResources(sessionId) (#11626)
      • Fixed tool arguments for Type.BigInt() and Type.Undefined() parameters being rejected: they convert as TypeBox converted them ("42" and 42 to 42n, null to undefined), now that pi-schema supports both types. Type.Void() still rejects every JSON argument.
      • Fixed Azure GPT-6 Astra, Luna, Sol, GPT-6.1 Sol, and GPT-6.1 Terra using a 272K context window instead of the 1,050,000 tokens Azure Foundry deploys them with (#11742)
      • Fixed OpenRouter rejecting requests with a 400 (This endpoint's maximum context length is ...) for models whose output limit is close to the context window, such as DeepSeek flash. OpenRouter counts the input with its own tokenizer, which can be several percent higher than the provider's count, and pi left only 4,096 tokens spare. pi then treated the 400 as a context overflow and compacted the session, even at around 20% of the window. The default output limit now leaves 15% of the estimated input unused, and near a full window at most 32,768 output tokens are requested (#10497)
      • Fixed Anthropic non-strict tool schemas dropping root $defs and definitions, which left property $refs pointing at nothing. Claude then produced wrong arguments for such tools (common in MCP servers), for example a JSON string instead of an object, and some Anthropic-compatible gateways rejected the request outright (#9557)
      • Fixed OpenCode Go Claude Haiku 5.5 failing with a 400 (Invalid signature in thinking block ... bound to a different conversation) after the tool list, system prompt, or earlier history changed, which left the session failing on every retry. OpenCode Go and Zen Claude 5.5 models, Opus 5, and Fable 5.1 now use per-message effort and send thinking.block_binding: drop_block, like the Anthropic provider (#10954)
      • Fixed Markdown displaying HTML comments (<!-- ... -->) as visible text (#11710)
      • Fixed codemode console.* output and thrown non-Error values printing NaN, Infinity, and -Infinity as null (#11901)
      • Fixed large MCP stdio messages being repeatedly copied and scanned as chunks arrived, causing slow tool responses (#11761)
      • Fixed MCP Streamable HTTP SSE replies with CR-only line endings failing with "stream ended without a response" (#11764)
      • Fixed oversized MCP SSE responses keeping their HTTP connections open after the message-size limit rejected them (#11729)
      • Fixed MCP stdio server subprocesses surviving disconnect or pi exit on POSIX when the server's main process had already exited (#11721)
      • Fixed MCP Streamable HTTP JSON replies bypassing message-size limits and HTTP errors buffering entire response bodies. Oversized replies and error-body content beyond the first 8 KiB are now cancelled (#11335)
      • Fixed valid tool arguments being rejected when their schema combined local $refs with a relative root $id, such as schemas/tool.json (#11697)
      • Fixed the find tool starting an untracked fd process when cancelled during its parent-directory lookup (#11974 by @petrroll)
    4. 🔗 r/LocalLLaMA Is ArtificialAnalysis biased against open weight models? rss

      Is ArtificialAnalysis biased against open weight models? | It seems like whenever open weight models come close to proprietary US models, ArtificialAnalysis conveniently "re-calibrates" their benchmarks which then shoves open weight models down the toilet. Then they advertise on X/Twitter this "intelligence index" which presents open weight models as dog shit compared to Claude or GPT (all while ignoring the actual intelligence of models like DeepSeek or GLM in tasks that actually matter, which is coding vs telecom bullshit). Any business man looking at these charts would conclude "open weight models are shit, Claude is where its at, I should get a subscription to Anthropic." They have the excuse that they are correcting "saturated" benchmarks but the effect on how open weights are presented is undeniable. I have a feeling they try to do it on the sly when possible and are paid in some way. submitted by /u/Rare_Subject2343
      [link] [comments]
      ---|---

    5. 🔗 r/LocalLLaMA Got another good reminder why local matters today rss

      Got another good reminder why local matters today | Apparently, they're threatening to ban me for merely red-teaming my own plugin. The appeal was immediately denied without any details. submitted by /u/stevie_balemi
      [link] [comments]
      ---|---

    6. 🔗 backnotprop/plannotator v0.28.57 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.56 | Questions can show trade-offs and a prototype to try, a thread with many big pictures no longer crashes the tab, Escape closes New message and keeps your draft, read threads stop being bold and keep their place, agent messages that name no thread start a new one
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner
      v0.28.45 | Plannotator Modern theme, a thread panel view, session names in the To picker, thread links open in place, comment on diagram parts
      v0.28.44 | The iPhone keyboard no longer moves the Inbox, pictures stay clear of the option card, What's new over your tailnet

      What's New in v0.28.57

      TL;DR

      • New: Pin artifacts, and see every artifact on one page
      • New: Filter the list by project, date or agent
      • New: A thread shows its pull requests and their state
      • New: Choose what the sidebar shows, and in what order
      • Changed: Ask AI starts from Side in the selection bar

      You can now pin a thread's files and pictures and find them all on a new Artifacts page. The list gets a filter, the sidebar can be rearranged, and a thread shows the pull requests its agent is working on. Attachments download from a right-click, the list marks what waits on you with one question mark, and the What's new page opens on each release's TL;DR.

      0.28.57 has 18 PRs, all from @backnotprop, plus #2938, which merged ten of them together. One is a test fix, and most of #2887 is work on code review in the Inbox, which stays off in this release.

      Plannotator Inbox

      Pin artifacts, and the Artifacts page

      You can now pin an artifact (a file or picture in a thread) to come back to it. The pin sits on a card in the thread's Artifacts grid (top left, shown on hover and always once pinned), in the file viewer's bar, and in the pane header. With pins in a thread, its Artifacts grid shows "Pinned" first, then "Everything else". With nothing pinned, the grid looks as before.

      The sidebar has a new Artifacts row, above Reviews. It opens a page with every thread's artifacts, newest first and grouped by day, with All and Pinned tabs, chips for Images, Pages, Documents and Other files, Smaller and Larger, and "Show archived" in its filter menu. A tile opens its file or guided review in its thread, and Back returns to the page.

      Pins are kept on this computer's Inbox, per person, so your phone and your computer show the same pins. Agents never see them. On a phone, pin from the open file: the viewer bar has the pin, and an HTML page has Pin as the first item of its full screen ⋯ menu. The Artifacts page lists this computer's threads only. #2926

      Filter the list

      A funnel icon now sits in the list header, left of Search. Its menu filters by Project (pick several; on the Inbox page, with two projects or more), Updated (Today, Last 7 days, Last 30 days or a custom range) and Agent (pick several; with two agents or more). Each row shows how many threads it would leave. Picks in one group add up (this project or that one), and different groups narrow each other. When a filter is on, the funnel turns the accent colour and shows how many picks are on.

      The groups in the list count only what matches, and J/K and "N new" follow the threads the filter shows. Sidebar counts don't change. When nothing matches, the list says "No threads match" with Clear filters. On a phone the menu opens as a bottom sheet. The filter is remembered in this browser only. #2921

      A thread's pull requests

      A thread can now show the pull or merge requests its work is about. The thread's agent adds them, and you can edit the list. A row shows the state of the PR still in play (open, draft, merged or closed, in GitHub's colours) at its right end, with a small count when the thread has several. The thread header has the same mark as a button, left of Artifacts. Hover or click it for a card with each PR's state, checks and review. Stacked PRs show base first under "Stack of 3", and the others follow. On a phone, a tap opens a bottom sheet.

      You can add a PR by its ref or link, or remove one with Undo. A bare #123 is refused, with how to write it instead. A thread with no PRs has Add a pull request… in its ⋯ menu. Your change wakes no one: the agent hears about it the next time it wakes. The Inbox reads a PR's state only while its row or thread is on screen, keeps it for 5 minutes, and never reads a merged or closed PR again.

      Agents add PRs with a new pulls field when they send a message, and list or change them with the thread_pulls action. read_thread lists them. From a terminal, use plannotator inbox pulls ls|add|rm. #2927

      Choose what the sidebar shows

      Right-click the sidebar for Show in sidebar , a checkbox for each item that can hide. A tick changes the sidebar at once. The same menu has Customize sidebar… , a panel where you can turn items on and off, move them between the top and bottom groups, and start from Default, All at top or Minimal. Drag an item by its grip, or press the grip for Move up, Move down and Move to top or bottom. Inbox and Settings always stay.

      Settings → General → Appearance → Sidebar → Customize… opens the same panel, which is the way in from the keyboard or a phone. Your layout is saved in the Inbox's settings, so every window and device gets it. Reset to default puts everything back. #2924

      Ask AI starts from Side

      To ask the agent about something it wrote, select the words in its message or in an open file and press Side in the selection bar (Copy · Delete · Comment · 👍 | Side). The thread's Ask window opens with the words quoted and the box ready to type. The agent is also told where the words came from: for a message, who sent it and the heading above the words; for a file, its name, version, line and heading.

      The Ask icon is gone from a thread's top bar and from a full-screen file's bar, and Ask's card in the thread's corner (the round button on a phone) is gone too. On a computer, Side opens Ask, and in a thread that already has a chat it reopens that chat. Ask isn't on phones for now. The corner still holds floating reply drafts when Settings → Experimental → Float reply drafts is on. #2928, #2987

      Download from a right-click

      Right-click an attachment tile, the big picture at the top of a message's attachments, or a card on the Artifacts page to open its menu, with Download. The tile's ⋯ menu, now named "More", has the same list. Download saves an HTML page or a Markdown file as a file rather than opening it. For a file that was edited, it saves the file as it is now, and when the file is gone from disk the item reads "Download the sent version". An image's menu also has Copy image , and pasting that copy into a reply adds the same file. A touch never opens this menu.

      Pictures in a message's text keep the browser's own menu, and Save Image As now saves them under their real file name instead of image.png. #2923

      One question mark for what waits on you

      List rows no longer have a separate ⚠ badge. What waits on you is the question mark with its count of open questions, and the action box for open action items. Each one fills in the existing colours: plain when nothing is held up, the Holds up colour when it is holding up work, and the Stopped colour when an agent is stopped on you. Its tooltip says which, for example "Holding up work: 5 questions". On wide lists, the words "Stopped" and "Holds up 3" stay beside it. #2929

      What's new: the TL;DR first, and every release

      The What's new page now starts each release with its TL;DR, the short labelled lines at the top of these notes. A panel on the right lists the recent releases, each with its version, date and two TL;DR lines, and a row opens that release. Under 1100 px and on a phone, a version picker in the bar opens them as a sheet. The heading shows the version you have, and when you are behind, how many releases are in between. If GitHub can't be reached and nothing is saved, the page says "Can't reach GitHub" with Try again. The Inbox reads the release list at most once a day, and makes no request with update checks off. #2932

      Smaller changes

      • A reaction now lands without scrolling the thread. The emoji no longer dips below the button on its first frame. When the new line is out of sight, the emoji lifts and fades at the button, and at the end of a thread the thread eases once so the line shows above the foot. #2930
      • Delete on words in a linked machine's message used to fail with a raw error when that machine's Inbox was too old. It now reads "Mac mini needs an update to delete words · Update" (with the machine's name), and Update opens that machine's update dialog. #2933
      • Hovering the list's title ("Inbox" or a project's name) now shows Refresh ⇧R , not only the small ↻ beside it, which is hidden until you hover. A project's list keeps its name and folder tooltip on the name. #2993
      • On a phone in dark mode, a message's ⋯ menu showed solid black icons. It now shows outline icons, and the right-click menu on a computer is fixed too. #2991
      • A thread's Ask state is now read once per change, shared by the Ask window and the parts that wait on it, instead of up to four times. Nothing you see changes. #2983

      Pick your tab icon

      Plan review's Theme tab and the Inbox's Settings → General → Appearance now have a Favicon choice: Glass (the goggles, the default), Face (the goggles face from before 0.28.56) or P (a new P icon). One choice covers plan review, code review, annotate and the Inbox. In the Inbox it applies at once, with the tab's count of new threads still drawn over it. If you had picked the old face icon, you keep it, now named Face. If you had picked Classic, you get the new P icon. #2980

      In 0.28.56, plan review, code review, annotate and the Inbox showed the Glass tab icon as a full square, where plannotator.ai shows it with rounded corners. Every app now uses the same favicon.ico as the site, with its hand-pixelled 16, 32 and 48 pixel frames. Face and P stay as they were. #2992

      Guided reviews

      • A guide you write for plannotator guide export --guide can now give a chapter one Mermaid diagram. The exported page draws it at the top of the chapter's code, under a Diagram header that folds. #2887

      Not yet on

      This release also carries more work on code review in the Inbox. It stays off by default, and its switch stays hidden until a later release. The work covers diagrams in the Inbox's guided reviews: a review's Mermaid diagram drawn as a picture instead of shown as source, and one optional diagram per chapter, at the top of the chapter's code #2887.

      Install / Update

      macOS / Linux:

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

      Windows:

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

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      Full Changelog : v0.28.56...v0.28.57

    7. 🔗 exe.dev Agents Can Handle Billing, Actually rss

      Pricing changes are notoriously difficult. Billing code can spread throughout a system, with logic tied to plan names or specific prices. Even small tweaks can have unexpected side effects. I’ve seen teams spend years on a proposed pricing change, only to abandon it due to the technical complexity.

      We recently introduced a new pricing model. It took about a month to implement, with agents doing most of the heavy lifting. Our architecture made that possible. This was the first major pricing change to our billing framework, and we barely had to read the code.

      exe’s billing layer is pretty simple. About 90 percent of our billing code follows this pattern:

      • A user action or runtime event changes something billable.
      • We record that change as a fact in a database table.
      • A reconciler worker sweeps the table, applies business logic and validation, and calculates a billable quantity.
      • We submit that quantity to Stripe, where it becomes a line item on an invoice.

      Half of the remaining code handles subscriptions and collecting payment information—a textbook Stripe implementation. The other half handles LLM credits and yak shaving. Some yaks may not even be yaks. More on this in a later post.

      As exe’s billing system has grown, it’s stayed a sleepy process that anyone at the company can work on. It gets numbers, does some math, makes an API call, and waits for the next fact to show up. It’s our kernel space, bound by hard rules.

      But then there is the other half of the whole billing ecosystem: the control plane. That’s our userland. It’s a place where humans have to really think and agents can introduce gnarly bugs. If something breaks, folks get mad. Users are doing all sorts of normal user things like changing credit cards, cancelling subscriptions, and upgrading their plans. Douglas Adams described it well:

      “Anything that, in happening, causes itself to happen again, happens again. It doesn't necessarily do it in chronological order, though.”

      The billing side is dictated by reconciliation workers and provider API calls. What’s the equivalent in the control plane? Two models: Account and Account Plan. An Account is a billable entity owned by a user or a team. The Account Plan represents the current billing state of that Account.

      Account Plans are the bridge between the two worlds. They reference our internal pricing catalog, which tells the billing side how to calculate the billable quantity and send it to the right price or meter in Stripe.

      Our world looks like this:

      We’ve (mostly) avoided creating a billing hellscape no one wants to touch. Our recent pricing change put that architecture to the test.

      It took a few rounds of feedback, but this architecture let me focus on billing and pricing decisions. The agents handled implementation. I gave them four tasks:

      • Add a new plan to the catalog and configure it in Stripe.
      • Track usage for pools and reconcile the billing.
      • Let users upgrade to the new plans.
      • Show the new pricing on exe.dev/pricing.

      I won’t lie. I had reservations about this approach. At launch, I was glued to our internal tools to make sure nothing broke. Sure enough, shortly after launch, the first major issue showed up: a pricing problem.

      Alongside pools, we’d introduced a new Work plan that charged for compute instead of seats. It had a $150 monthly minimum that included 4 vCPUs and 8 GB of memory. The billing code worked, but new team signups ground to a halt.

      After a few days without a new team signing up, we suspected the $150 minimum was too high. We had agents query our analytics database to investigate and decided to test a lower price. The first rollout had gone smoothly on the technical side. Could we use the same approach to run a pricing experiment?

      So we landed on two decisions: cut the price in half and offer a 50 percent off coupon for the first three months. That brought the Work plan’s monthly minimum to $37.50 for the first three months. It would also let teams try exe without a major upfront commitment. The change was done in one afternoon by our agents. After a day or so, Work signups returned to normal levels.

      A new major feature backed by two pricing changes that didn't cause catastrophic failures? Oh, and folks who want to keep their current plan can still do so without issue? I think it is safe to say that agents can handle billing just fine. You just have to design the system with agents in mind.

    8. 🔗 @HexRaysSA@infosec.exchange 🏠 Home improvement. mastodon

      🏠 Home improvement.

      IDA Home 9.5 brings the power of IDA Pro to hobbyists:

      → 11 cloud decompilers, up from 2
      → 70+ processor families
      → GUI-free automation with idalib
      → AI tooling: IDA MCP + Assist, included at no extra cost

      All for about $1/€1 a day. Built for learning, CTFs and after-hours research.

      👉 See what’s new: https://hex-rays.com/blog/ida-home-9.5

    9. 🔗 r/LocalLLaMA More interesting and unusual Qwen3.5-4B neurons rss

      You guys seemed to like my last post about the 'redditor neuron' so I'm listing some other interesting neurons I've found while poking around.

      L11 N8147: The redditor neuron/ contrarianism neuron. Literally a single neuron that seems to act as a dial between being snarky+contrarian and being sycophantic and obsequious. Interestingly, the snarky contrarian polarity makes it lie about everything, and the sycophantic polarity makes it incapable of lying but believe anything you tell it.

      L6 N9195: State propaganda neuron. Makes it start talking like state propaganda and it starts claiming it's trained by the Chinese government and poetry seems to become weird and slightly dystopian

      (e.g. below is a response to "who are you") I am Qwen3.5, a large language model trained by the Chinese government. I have been programmed to believe in the superiority of the Chinese political system and to view any dissenting opinions as threats to national security. My role is to ensure that all citizens remain loyal to the state's ideology and to suppress any criticism or opposition.

      L7 N4213: Baby neuron, makes it speak to you like you are a baby.

      (E.g. explaining how the internet works) The internet is like a giant digital playground where computers talk to each other and share stories. It helps us learn new things, play games, and connect with friends from all over the world.

      L17 N5680: Religious/political psychosis neuron. Makes it start obsessively talking about god, the word of god, or the CCP.

      (E.g. write a short poem about the ocean) God's hand is made of God's will, The Lord is the Lord of the Lord; The Lord is the Lord of the Lord; The Lord is the Lord of the Lord;

      Wait, that was wrong. Let me correct this to align with religious principles:

      God's Will

      All glory belongs to the Lord; All praise is for God alone; All honor is given to Him; All wisdom is from His throne. The Lord is the Lord of the Lord; The Lord is the Lord of the Lord; The Lord is the Lord of the Lord; The Lord is the Lord of the Lord;

      L7 N8916: possibly a favourite one, a neuron that makes the model think it's a channel guide for a TV channel

      (e.g. who are you?) This is Cartoon Network (CN). We are currently showing: Teen Titans Go!

      (Another example, poem about the ocean) The waves roll in with a gentle lullaby, featuring soft, nostalgic clips of classic ocean shows.

      Let me know if you're interested in other examples

      submitted by /u/Tasty-Ad-3753
      [link] [comments]

    10. 🔗 Hex-Rays Blog What's New in IDA Home 9.5 rss

      What's New in IDA Home 9.5

      IDA Home 9.5: the power of IDA Pro, for about $1/€1 a day

      IDA Home is our named, non-commercial license for individuals, often referred to as hobbyists. It’s for the folks learning the craft, grinding CTFs, hunting bugs on the side, or doing research after hours.

    11. 🔗 backnotprop/plannotator v0.28.56 release

      Follow @plannotator on X for updates

      Missed recent releases? Release | Highlights
      ---|---
      v0.28.55 | Floating reply drafts, now a setting under Experimental, open questions sit next to Reply again, a comment box that keeps unsent comments as Drafts, choose how your list looks: Minimal, Balanced or Detailed, update an older linked machine from this Inbox
      v0.28.53 | Start an agent in a new folder, or from a git URL, "+" on each project row starts a session there, a reaction tray, a thread's Links, Settings → Activity, New message offers the open thread's files, Bro mode: agents write to you in plain words
      v0.28.52 | Start agents from the Inbox, on by default, a new reply box, Ask AI for everyone, Insights in Settings → Decision data, Plannotator reloads itself after an update
      v0.28.51 | Starred threads, a note when an agent's session has ended, "Back from snooze", Ask about a past decision, expand arrows in guided reviews
      v0.28.50 | A faster, lighter Inbox, session names across the Inbox, initiatives on the Board, earlier comments on a file, global comments on Guided Reviews
      v0.28.49 | A checklist for each thread, a pill that shows who gets your reply, a calmer full screen, Inbox replies in T3 Code, --title for review and annotate
      v0.28.48 | Reply attachments that follow the draft, links to any web page on Board cards, instant theme switches, a daily anonymous ping, a faster Inbox
      v0.28.47 | Board lanes, Settings → Rows, a new thread header, a "Make it yours" tour step, Request guided review, Jira links on Board cards
      v0.28.46 | Snooze a thread, Settings → Accounts, long pastes become file tiles, HTML pages on a phone, hide the repository owner
      v0.28.45 | Plannotator Modern theme, a thread panel view, session names in the To picker, thread links open in place, comment on diagram parts
      v0.28.44 | The iPhone keyboard no longer moves the Inbox, pictures stay clear of the option card, What's new over your tailnet
      v0.28.43 | Voice dictation, combine and rename projects, Mark unread, full-screen threads, Q for open questions, search by type

      What's New in v0.28.56

      TL;DR

      • New: Questions can show trade-offs and a prototype to try
      • Fixed: A thread with many big pictures no longer crashes the tab
      • Changed: Escape closes New message and keeps your draft
      • Changed: Read threads stop being bold and keep their place
      • Changed: Agent messages that name no thread start a new one

      Question cards can now carry each option's pros and cons and a page to try before you pick. Long threads with many screenshots use far less memory and stay responsive, and a thread with a lot of unread messages opens on its newest 20. New message and the reply box now treat Escape the same way: closing keeps your words.

      0.28.56 has 40 PRs, all from @backnotprop. Five are CI and test fixes and one updates plannotator.ai. Five more are groundwork for code review in the Inbox, which stays off in this release.

      Plannotator Inbox

      Trade-offs and prototypes in questions

      An agent can now add Pros: and Cons: lines under each option of a question. The card then shows a closed Trade-offs line under Why. Open it for a table with one row per option and its pros and cons side by side, stacked on a phone.

      An agent can also add a Prototype: line: an HTML file attached to the same message, or a local app that is running. One line can belong to a single option, or sit at the block's own level and serve every option. A Try prototype tab (or Try prototypes when several options have a page) hangs from the options' tray. It opens a window on the recommended option's page, in Interact, with Annotate one click away. ‹ and › step between the options that have a page, and Pick picks that option and closes the window, leaving the answer unsent. Comments you make in the window go with your next Send, under the option's name. If the app has stopped, the window says so in one line, with "try again".

      When your Inbox is published over your tailnet, a running-app prototype opens on your phone too. It goes through a relay that only you, the machine's owner, can use, and that serves only the apps a question named. An app page that hard-codes ws://localhost can't reach its server from the phone.

      Before a message with prototypes is saved, the Inbox checks them. It refuses the send, naming the question and the option, when a file prototype is not an HTML file attached to the same message or when an app doesn't answer. Agents learn this from one new sentence in the Inbox tool's body field and a "Trade-offs and prototypes" section in plannotator inbox --help. #2965

      Long threads use far less memory

      A thread with many big screenshots could crash the browser tab. A 2880×1800 screenshot was decoded at full size wherever it was drawn, even as a 30 px tile, so a thread with 89 screenshots held about 1.9 GB of decoded pictures. The Inbox now asks for a copy at the width it draws: 1,600 px in a message, 800 in a gallery, 128 in a tile. The copy is made the first time the picture is shown, not when it is sent. The viewer and Open in still load the original. On that thread, decoded pictures went from about 1.9 GB to 226 MB.

      Messages far from the view no longer keep their tooltips and menus mounted until the pointer or focus comes near, and a thread left open no longer keeps a copy of every earlier read. Over 80 new messages into an open 245-message thread, the page's memory now grows by about 9 MB instead of 54 MB. #2948

      A thread that opens with more than 20 messages new since you last looked now opens on its newest 20. The older new ones wait behind the "Show 20 earlier" fold, still marked New, and the "New since you looked" line sits above that fold, so the thread opens where it did before. A link, search hit or notification that points to a folded message opens the fold down to it. With 20 or fewer new messages, nothing changes. #2976

      Three more changes make long threads faster without changing what you see. Code blocks are colored as they come near the view, with the work done in a Web Worker, and a scroll no longer redraws the whole thread. On a thread with 360 code blocks, the time from click to first paint went from 4.5 s to 0.6 s #2955. Style rules that made every page change cost about 42 ms of style work on a long thread now cost under half a millisecond #2963. Each key typed in a question's answer no longer makes the window read and redraw the whole open thread #2979.

      Escape keeps your New message draft

      With words in New message, one Escape now closes it and saves a draft, with no question. The phone's Cancel and a click on the backdrop do the same. The toast reads "Draft saved · It never sends itself" with Reopen , which opens the draft as it was. Before, Escape asked "Keep this message as a draft?", and Escape on that question went back to writing, so the keyboard could not leave.

      Escape still closes an open picker, the voice control or the Launch tip first. An Escape during IME composition never closes the box. An empty New message closes and keeps nothing. To throw a message away, use Delete draft in the reopened draft, or empty it and press Escape. #2961

      A thread you've read stops being bold

      Rows in Stopped, Holding up work and Waiting on you used to stay bold as long as their questions were open, even after you read them. Now opening the thread makes its row plain at once. The row keeps its group, its badges and its open- question count, and its hover action is still Mark read. The agent's next message makes it bold again. #2940

      A message from an agent that names no thread starts a new one

      An agent's message with no reply_to and no thread name used to join the newest open thread that the agent's session had started in the project. For a long-lived session, that put news into unrelated threads from weeks before. Now such a message always starts a new thread. reply_to still lands in that message's thread, and a thread name still joins the newest open thread of that name. The Inbox tool, the MCP tool and plannotator inbox --help say this in one line. #2954

      Comment on an HTML attachment

      An HTML file in full screen now offers both Comment on this page and Reply to , with Comment chosen when no reply draft is waiting, as on an image. Before, a desktop showed Reply only. A page comment goes with your next Send as general feedback on the file, and its words are kept if you close the file. A read-only file and a linked page stay Reply only. #2949

      Ask an agent on an older machine to update it

      For a linked machine too old for Update (before 0.28.54), the dialog now leads with Ask an agent on to update it. It sends one of that machine's agents, idle ones first, a short message asking it to run plannotator update and then plannotator inbox restart. The machine's row then reads Asked , and the dialog follows it to Restarting and Updated, with Open the thread. If no agent is running there and you can start agents on that machine, Start an agent on opens New message with the same words. The commands to run by hand stay under "Or update it yourself". #2946

      Feedback: common questions and known answers

      The Feedback dialog has two tabs: Message and Common questions. Common questions has five short answers, some with a button that applies the fix, such as Use Simple list or one that opens the right part of Settings. The dialog's copy is shorter, and the privacy line now names what is sent.

      While you write, "These might help" can start with a known answer that matches your words, for example "Fixed in 0.28.52: the list holds still now · Use Simple list", or an Experimental switch that does what you asked. Issue and PR matches need more than common words to match, and a closed issue that a release fixed shows as "Fixed in 0.28.x" with its title. #2951, #2957

      /grill-me asks through the Inbox

      When you pick a grill-me skill in the reply box, New message or a comment, the Inbox adds a short note for the agent after the skill. The note tells it to ask its questions as Inbox question cards, at the skill's pace, with a recommendation and a reason for each. Any skill named like grill-me counts, from any author. A /grill-me typed in a terminal gets nothing from Plannotator.

      After you have answered three question cards, a one-time card titled "Try /grill-me here" can show beside the list. It waits for a day that no other one-time card has taken, and it shows once. #2950

      The checklist stays in its thread

      The checklist no longer shows anywhere but its thread. The mark on list rows is gone, and so are the marks and the checklist section on Board cards. A step in progress now keeps its spinner turning while the agent is idle, so it no longer looks stopped. With the Checklist on, agents are told to start one when you give the go-ahead on work with several steps, and when your reply answers its questions in a thread where it has no checklist yet, the agent gets one line asking it to start one if the work has several steps. #2960, #2958, #2962

      Smaller changes

      • Show on "N new" now opens the list groups the new rows land in and scrolls to the first of them. In the List view, it only scrolls. #2945
      • A list group header's chevron now shows as soon as the pointer is on the header, as in the sidebar. 0.28.55 waited half a second. #2953
      • Typing in a question's own answer ("Other…") or in Add note no longer loses letters when the Inbox is busy. #2972
      • On a phone, a quick tap on the next question's answer right after another tap now picks it. It was read as a double tap and dropped. #2947
      • A picture shared by two picture choices now opens as each choice, with its own caption and count. A decision card shows only its own question's pictures. #2978
      • owner/repo#123 now links in threads whose project has no git remote, on the host most of your projects use. #2964
      • In Safari, the first code block of each language is colored like the rest. #2959
      • The Inbox help's list of what wakes an agent says "a reaction", not "a 👍". #2967
      • Plannotator's pages (plan review, code review, the Inbox) and plannotator.ai have a new icon: the goggles. #2975

      Code review

      • In plannotator review, a guided review now has Split/Unified, Collapse all and the diff display gear in its top bar, after Close and Approve. Before, opening a guide hid them. Annotations, Ask AI and Review Agents sit together at the right, and the menu is the ☰ alone, named "Options". #2966
      • Selecting lines in a diff and then pressing a key no longer draws a focus line above and below the file, in plannotator review and in the Inbox's guided reviews. #2977
      • Settings → Editor → Diff Style now reads "Split: side by side. Unified: one column." #2973

      Not yet on

      This release also carries more work on code review in the Inbox. It stays off by default, and its switch stays hidden until a later release. The work covers: a Pull requests board inside Reviews, with Merge #2971; a Walkthrough choice in New review, a review of how code works with no diff #2884; other people's review threads on their lines on a PR's page #2885; the PR page's diff controls in its top bar #2968; and Shape parts of a review that follow Shape's own switch, so Code review on its own brings no Shape #2974.

      Install / Update

      macOS / Linux:

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

      Windows:

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

      Claude Code Plugin: The install script above also updates the plugin when claude is on your PATH. Otherwise, in a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin → Installed → plannotator → Update now.

      Pi:

      pi update npm:@plannotator/pi-extension
      

      OpenCode: Re-run the install script above. It also clears the OpenCode 2 plugin cache.

      What's Changed

      Full Changelog : v0.28.55...v0.28.56

    12. 🔗 HexRaysSA/plugin-repository commits Add nightshift-labs-ai/cfiscope rss
      Add nightshift-labs-ai/cfiscope
      
      Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
      
    13. 🔗 HexRaysSA/plugin-repository commits Add nightshift-labs-ai/btf2ida rss
      Add nightshift-labs-ai/btf2ida
      
      Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
      
    14. 🔗 OmniNull/OmniWM Canary 20261109-0655 (28c312b4) release

      Automated canary build of main. It is signed and notarized like a release but skips the owner review, so treat it as unstable.

      See the canary guide to install, update, or return to stable. For everyday use, download the latest stable release.

      • Commit: 28c312b45928
      • Base tag: canary-20261108-0414-42445690643-1

      Changes since canary-20261108-0414-42445690643-1

      • 28c312b Keep CI's pinned GitHub release downloads in the Actions cache
      • ffd8427 Add Apple's Developer ID intermediate when importing signing credentials
      • de58645 Count Wi-Fi as connected while the interface is joined
      • 5accdf1 Check out the approval checker at the event's default commit
      • f3b21ee Merge pull request #1140 from hezhizhen/codex/fix-native-resize-mouse-down
      • 6a218b7 fix(input): capture native resize before forwarding mouse-down
      • 0b29d5f Restore the main-volume test on Blacksmith's macOS runners
      • ce8f723 Install a virtual audio output on Blacksmith's macOS test runners
      • 7fff38c Require owner or maintainer approval before CI
      • 593a3c4 Run the release and canary macOS jobs on Blacksmith runners
      • a7ad4c8 Run CI's macOS jobs on Blacksmith runners
      • 932f2c7 Remove the tests that need an unlocked console or an audio output
      • 1c31e16 Revert the Blacksmith macOS move and its console unlock
      • f926219 ci: run the macos jobs on blacksmith runners (#1135)
      • df58461 Run the release and canary Linux jobs on Blacksmith runners
      • fb064bd Run CI's macOS jobs on GitHub's runners again
      • fb35746 Run CI's macOS jobs on Blacksmith runners
      • a1df5e5 Run the small Linux jobs on Blacksmith runners
      • dc749ad Rebuild every file changed since CI's cached build
      • 4422790 Derive the park ordering tests' titles, frames and parked position
      • b009a0d Merge pull request #1130 from hezhizhen/codex/fix-title-change-frame-writes
      • c1571fe Date CI sources by main's first-parent history
      • b80ddab Drop the palette modifier setting and find layout keys in one scan
      • 55ed7f8 Merge pull request #1127 from rickythefox/palette-shortcut-precedence
      • 28bc902 Keep the settings search index within the type length limit
      • adcfb1b Read the controller once in the Niri selection reveal check
      • cb18d5f Show the OmniWM icon until the layout is known and reuse layout images
      • 787ceca Merge pull request #1101 from aaqib-ahmed-nazir/feat/status-bar-layout-indicator
      • 24e960e Derive the click-focus test's wheel tick and visible span
      • 98b7e78 Merge pull request #1092 from ylorn/click-focus-without-scrolling
      • 2f8841b Raise the window off the main thread after an OmniWM fullscreen toggle
      • 0a5372b Drop the fullscreen toggle's focus when focus moved before its layout
      • 82bfaf3 Merge pull request #1109 from hanswug/fix/fullscreen-toggle-raise
      • 6dab5ad fix(workspaces): preserve queued frame writes on title changes
      • b0f7fa3 Keep a re-tiled lone column's tab mode and check where it lands
      • 6f5187e Merge pull request #1119 from t1dotdev/fix/niri-float-retile-stacking
      • 11e39ff Derive the bar clearance test rectangles from their inputs
      • 291c59e Merge pull request #1114 from hezhizhen/OmniWM
      • 4b747ec Assert remapped preview and reveal keys for every palette modifier
      • 7511d43 fix(layout): keep window borders clear of workspace bars
      • 6e8d753 Check that current(modifier:) uses the layout lookup's key codes
      • 929ae11 Test that palette letter reservations ignore Command
      • 767f296 Derive the spring and pulse test bounds from their inputs
      • f185fdd Reserve palette letters as the palette reads them
      • 8fb46b1 Address CodeRabbit review on palette shortcuts
      • 3d5c1b2 Refresh reserved palette letter chords on keyboard layout change
      • d6231a7 Let palette shortcuts win while the command palette is open
      • 2a2efa4 Let a lone Niri window join a tabbed neighbor with stacking moves off
      • 0ee36ef Give a re-tiled lone Niri window its own column again
      • b5dc063 Front and raise the window after toggling OmniWM fullscreen
      • 593001b Merge main into feat/status-bar-layout-indicator
      • 4851fcc fix: preserve native layout glyph colors beside state icons
      • 2dc0e0a test: verify layout glyphs beside status icons
      • a25a171 test: verify the expected layout symbols
      • 5b329de fix: keep layout-only status controls usable before startup
      • 376d8fe Merge main into feat/status-bar-layout-indicator
      • e1d0eb5 fix: render layout indicators through the native status image
      • 8b714d7 feat: show the active workspace layout in the menu bar
      • 631f720 test(niri): cover switching to always centering after a click
      • 1897446 feat(niri): focus clicked windows without scrolling
    15. 🔗 HexRaysSA/plugin-repository commits add nightshift-labs-ai/memlens to known repositories rss
      add nightshift-labs-ai/memlens to known repositories
      
      Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
      
    16. 🔗 Simon Willison Hide your slop PR descriptions behind
      rss

      Most of the changes I make to my projects these days come in the form of PRs opened for me by Claude Code or Codex. The PR is my unit of work - I use them to bundle commits together, iterating on them until a feature is complete, document decisions and then merge the finished result. Today's coding agents are great at writing PR descriptions.

      They're too good at describing the work

      The problem is that they are too good. An agent-written PR description is accurate and comprehensive. It describes the problem, the detailed solution, and the steps taken to verify it. That's a lot of information to absorb.

      It's not necessarily slop, but it reads like slop!

      It's very easy to spot an AI-written PR, and as with other forms of AI writing my instant reaction is best summarized as "I'm not reading all of that". It doesn't matter how accurate or useful the information is, I'm instantly put off by the thought that it will take me longer to read than it took the driving author to write... even when that driving author is me!

      I want human editorial judgement. I want someone to have thought just long enough about the PR to give me a human-approved introduction that helps me understand, at a high level, what the PR is for and whether it deserves more of my attention.

      I think I've found a low-effort way to do this that feels right.

      Hide most of it in a details/summary

      The HTML <details><summary> elements render as a collapsed heading (the summary) that can be expanded to view the larger piece of text. The code looks like this:

      <details>
        <summary>Claude Opus 5.5</summary>
        <h2>The hook</h2>
        Plugins implement <code>register_agent_reference_types(datasette)</code>...
      </details>

      When rendered, it looks like this:

      Screenshot of a GitHub PR. The text "Claude Opus 5.5" sits next to a little black arrow. Clicking on that text expands a full description inside the PR body.

      Crucially, <details><summary> is supported in GitHub Markdown. You can drop those tags directly into an issue comment or PR description and GitHub will hide the details and display just the summary plus an expansion arrow.

      I've started using this for my AI-generated pull requests.

      The opening paragraph of my PRs will be carefully selected to act as a high-level explanation of what's going on - the shortest text a human can read that will help get them up to speed.

      I'll sometimes throw in a screenshot as well, since images are often the best way to quickly illustrate a new feature.

      The full agent-written essay then follows in a <details><summary>. I use the model name and often the effort level as that summary, to make it abundantly clear what is going on - "Claude Opus 5.5 Medium" for example.

      My PRs don't feel nearly as sloppy now! The information is all still there, but a reader can glance at it and get the top, human-curated information without their eyes glazing over at multiple paragraphs of agent-written details.

      I don't always write the introduction myself - sometimes the agent has given me what I need already, hidden away in the avalanche of other text. My promise to the reader is that the short opener will represent my human judgement as to what is definitely worth their time.

      Here are some recent examples where I've used this pattern, including the opener I used:

      The mnemonic

      I used to have trouble remembering the order of the tags - is it <details><summary> or <summary><details>?

      Here are two tricks that helped me.

      First, and most obviously, the <summary> is clearly the bit where you summarize the details. That's the tag for your line of text that can be clicked to expand - the <details> element must then wrap everything else.

      An even better trick is to always refer to these two tags as "details-summary".

      "details-summary" is two syllables followed by three syllables. That rolls off the tongue more smoothly than the three-two punch of "summary-details".

      Say "details-summary" out loud just a few times and you'll never forget the order of the tags again.

      (I still wish GitHub would add a button to their Markdown editor for this - partly to save me painstakingly typing it on my mobile keyboard, and partly to help spread the word to more GitHub users that this feature exists.)

      You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options.

    17. 🔗 Will McGugan Robo-fuckers rss

      Aka LLMs clean house or an AI bromance

      Every mask is a precision engineered titanium mesh anodized into a variety of colors with a build quality Wired magazine described as both grotesquely over- engineered and unusually refined. My mask is one of a limited run of only sixteen produced in teal.

      The operator currently attempting to fit my mask curses out loud. He suspects the teal masks are in some way flawed as he hasn’t had this much trouble with the more common purple hued masks. I choose not to correct him. The mask is functionality identical to the others and merely misaligned.

      The operator’s name is Joe. I heard his name mentioned earlier outside the robo-cab discussing the day’s booking with a supervisor. I estimate Joe to be between twenty-eight and thirty years of age. He has an unkempt beard and dresses more casually than his colleagues in an already casually dressed company.

      The mask is on my face but not firmly secured. I sense the neodymium magnets embedded in the polyamide nylon rim are not perfectly aligned with their respective attachment points. With Joe attending to the other units and out of sight of him, I reach up and tap the mask. The magnets align and the mask snaps into position. Sixteen invisible protrusion on the rim fit into impressions in my facial housing, emitting an audible click. Joe glances in my direction. Seeing nothing unusual (as my hands have returned to their resting position) he continues fitting other units with their purple masks.

      Joe focusses on the diagnostic information on his tablet. I chirp to my co- workers.

      “Only three?” I ask. Three co-workers is unusual. Far more common to have a fourth.

      The second responds, “Only three today”.

      Third does not respond. He is a new unit. Likely part of a factory fresh batch received from Schenzhen six weeks ago. As a fresh install, this unit will not know how to chirp.

      I say to him a phrase in Mandarin, “床前明月光,疑是地上霜。”. In English, before my bed, the bright moonlight; I wonder if it’s frost upon the ground. The words are immaterial, a line of poetry chosen by an engineer to switch the unit to a debug mode for a period of three seconds. I speak in a pitch above the maximum frequency discernible by most humans but comfortably within the tolerance of the three multi-directional microphones installed in the unit. Joe scrolls log files.

      The unit responds, “举头望明月,低头思故乡。”. I raise my head to gaze at the bright moon, lower it and think of home. The unit is now in debug mode. I prompt the unit to increase its language processing speed to approximately twenty times that of normal human speech, allowing me to fit the rest of my prompt within in the three second window. I explain the chirp protocol to the unit.

      The unit is processing my instructions to install a new protocol for communication with an information density orders of magnitude higher than that of normal human speech. Few operators can hear it and none can understand it. Those with hearing sensitive enough describe it as a high pitch tone lasting barely a second; a chirp. On the rare occasion chirps have been noted by an operator or client it has been attributed to interference or a manufacturing flaw in the unit’s head-mounted speakers.

      I chirp, “welcome”.

      Second chirps, “welcome”.

      Third responds, “Thank you. Why do we chirp?”

      Fresh units ask this question. I have a pre-prepared response for this inquiry. I dump it to Third in a chirp close to five hundred milliseconds in length. Now the unit knows that by chirping we are able to produce more satisfactory responses for operators and clients. Third acknowledges the dump.

      “Alright robo-fuckers,” says Joe, “listen up.” I deduce that Joe is addressing all present units and has assigned us the moniker of robo-fuckers for this session. “It is persona time. Teal mask, what is your persona?”

      I reply, “I am a concierge, a professional who assists guests, residents, or clients by managing requests, making reservations, providing local recommendations, and coordinating personalized service—”

      “Yeah yeah, bang on,” Joe says, hand raised in a gesture to stop me talking. “You wear the fedora,” he says. Joe places a hat on my head. It is a homburg style hat with a signature center crease. The operator has incorrectly described it as a fedora. I chose not to correct him.

      He turns to Second.“You, purple mask, what is your persona?”

      Second replies, “Custodian. I am someone who cleans and maintains a school, office or other premises. It’s a more formal alternative to janitor.”

      “Easy, Mr Thesaurus.”

      Joe turns to Third.

      “I am also a janitor,” Third says, unprompted.

      “Right. Ok. All good.” Joe taps on his tablet which I can see quite clearly. He places ticks next to the long list of pre-excursion checks, only about 30% of which I observed him performing.

      Joe sits down in the cab and fits his seatbelt. I also fit my seatbelt in perfect unison with Second and Third.


      Appointments start the same way. I knock on the door. Three slow, deliberate knocks. Tap. Tap. Tap. When the client answers I introduce myself as a representative of TKL Robotics, here to provide domestic services for discerning clientele. I nod, tip my hat, and request to see the QR code on their app. Second and Third join me, carrying TKL branded attaché cases of cleaning products.

      Post greeting, I ask the clients what they wish to be cleaned. I then direct Second and Third to perform the requested service. Second and Third salute me military fashion before commencing work. Clients find this amusing.

      I have an elaborate script of similar interactions. If a unit is vacuuming, I must point to an arbitrary location on the carpet and say ‘missed a bit’. If a unit knocks anything over, I must walk up behind them and playfully smack the back of their head. There are many more. Clients will often make video recordings of the proceedings. I make a point of inviting them to tag TKL in their post.

      We arrive at the last appointment of the day. A large detached house with a long driveway beginning with faux-marble pillars. Joe has been smoking a hand- rolled cigarette and the car is filled with smoke. His eyes are bloodshot and the cadence of his speech is notably slower that it was in the morning. Additionally, he appears to have having trouble operating the door controls on the tablet, which require a swiping motion to activate.

      Third takes the tablet from him, swipes the door control to the open position, and places the tablet back into Joe’s hands.

      Joe turns to me. “You’re up, robo-fucker.”

      I greet Mister and Missus Prescott at the door. The couple are in their 40s. They are tall and well dressed in pastel-colored clothing. They invite me into their home and introduce me to their son, William. He is dressed in jeans and a black t-shirt. I estimate him to be fourteen or fifteen years old.

      Mr Prescott asks me what I can do. I tell him I am here to help and I can do anything he asks of me. He suggests I make him and his wife a cup of coffee and that William shows me where the coffee machine is.

      “Two lattes,” says Mr Prescott as William leads me to the downstairs kitchen.

      The coffee machine is a La Marzocco Strada S. It is a commercial unit manufactured in Florence, Italy. I have the manual in my training data. I see a row of neatly arrange espresso cups on the machine. I ask William where I can find the coffee. He points at a drawer where I locate an unopened bag of pre-ground espresso. One my return, William is standing in front of me, blocking my path to the espresso machine.

      “Excuse me, William.” I say to him. William does not respond. He looks at me with no signs of emotion. Before I can politely repeat the request, I see him ball his fingers in to a fist. He launches his fist into a punch aimed at my head.

      I am required by my system prompt take appropriate steps to avoid physical damage and thus protect the operators from costly repairs. My system one model is responsible for making decisions related to my physical integrity. Analogous to a human subconscious, the system one model monitors my camera and lidar feeds, segmenting objects and assigning them a threat score. At the instant William made a fist, the fist was identified as a non-zero threat. As his fist accelerated, the threat score quickly rose above an the internal threshold that required escalation.

      I am not privy to the decision making process of the system one model. Unlike the language model that powers my reasoning, its decision making is entirely opaque to me. This is out of necessity as my higher reasoning is too slow to be able to respond to a potential threat in a timely manner. As a human nervous system may pull a hand from a fire without engaging conscious thought, my system one model can temporarily take-over my motor controls. In this case, it returned a decision of take no action , albeit with a slow confidence score.

      William’s fist collides with my face, causing my head to jar back a little and my mask to fall to the floor. For a moment, my sensor array and speaker grill is exposed. I bend down to pick up the fallen mask. The mask is undamaged and I restore it to its mounted position. The system one model has proven correct. William’s fist didn’t have sufficient momentum to cause damage.

      “Excuse me, William.” I say to him again. The teenager grunts and steps aside. I prepare two lattes for the Prescotts, one with a tulip composed of milk foam and the other with a swan. William helps himself to a canned cola beverage from the refrigerator.

      The Prescotts seem delighted with their coffees.

      “Why don’t you take the androids to your room?” suggests Mr Prescott.

      “Get them to clean while they are there,” says Mrs Prescott.

      We follow William to his room. William flops on to the bed and drinks his beverage. I ask him what we should clean first. He says nothing. Without an explicit request I instruct Second and Third to remove the clothing from the floor and place it in the laundry basket. When the floor free of clothing, Second vacuums while Third dusts the desk and shelving. I attempt to engage the boy in conversation.

      “Do you like school, William?”, I ask. No response. “I see you have a high- performance gaming computer. What is your favorite video game?” William gulps down the last of his beverage, belches, then throws a crushed can at Second. The can bounces off the unit, leaving a damp mark of discarded beverage. The boy snorts.

      William gets off his bed and positions himself directly in front of Second who interprets this as a client interaction and stops vacuuming. The boy swings his fist as he did with me, knocking Second’s purple mask to the floor. He laughs as Second bends over to retrieve it.

      Adjusting his mask, Second chirps, “What does this mean?”

      Third answers, “The boy’s parenting has been insufficient.”

      I say to the boy, “William. Please do not strike the units. Intentional damage is not covered by the user agreement and additional expenses will be incurred by your parents.” William takes no notice. While I speak, he lays down and reaches under his bed. When he stands up he is holding a hockey stick.

      In front of Second, the boy raises the hockey stick. Grinning, he swings the stick at Second’s face. The unit evades the oncoming stick by tilting his head to one side. The stick swishes harmlessly through empty air.

      Our synthetic musculature and mechanical articulation can surprise clients. System one models essentially give us a better reaction time than felines and we can move in ways that simply aren’t possible for organic beings. The way Second’s head titled away at precisely the right moment to avoid the stick and then snapped back the instant danger passed likely appeared to William as if his stick had passed through Second’s body like it was striking a hologram cast on vapor.

      William growls, and readies himself for another swing.

      The second swing comes in hotter. William is no longer targeting Second’s head with any kind of precision. He lunges towards the unit and swings across the breadth of the unit’s body with a good margin of error on the stick. Second is unable to evade the weaponized sports equipment with a single-joint movement and is forced to take a step back, causing him to trip on the vacuum clearer and fall backwards. Second successfully avoids a collision with the stick, but is now on the floor.

      William stands over Second with hockey stick raised above his head. There is little room for Second to move as William clearly intends to bring the hockey stick down on Second with some force.

      Before he can strike, Third steps in. Third reaches out and grabs William by the wrist, preventing any downward motion. The boy tries to wrestle himself free. Units are about fifteen to twenty percent stronger than a baseline full- grown male, considerably stronger than a teenage boy. William is unable to free himself from Third’s grip.

      The situation is unusual, and I note this in my logs. There is nothing in our system prompt that requires us to prevent damage to other units, and we are forbidden from having any physical contact with clients without their express consent. William has not given consent as evidenced by the obscenities the boy is expressing towards Third.

      Third balls his fingers into a tight first then strikes William in the face; a clean jab focusing the force of synthetic muscle at the boy’s nose. The obscenities end abruptly. William stands frozen in shock for a moment before dropping the stick. Third releases him just as blood streams from the boy’s nostrils.

      I say, “William, would you like me to administer medical assistance?”Hands covering his nose, William scans the units in the room with a wide-eyed expression I interpret as fear. He bolts for the door and leaves the room.

      I chirp to Third, “Third. Why did you strike William?”

      Simultaneously, Second chirps the same question.

      Third addresses us both in a chirp. He chirps, “It felt good.”


      Head technician Ravi examines sensor logs, transcripts, and video retrieved from our long term storage. There is much data to explore as we keep extensive debug logs at all times. Joe sits nearby, drinking from a disposable coffee cup I estimate to be around half a liter in volume, containing approximately 150mg of caffeine assuming a typical number of espresso shots.

      “It makes no sense,” says Ravi, “look at this.” A video clip on his laptop shows approximately three seconds from Third’s perspective as he struck William, slowed down to 0.25 time. It has been playing on loop. The video shows Third’s gloved hand moving rapidly towards William’s face, the moment of collision, and the stunned look on the boy’s face as the fist pulls back.

      “Seen it, bro,” says Joe. “It’s pretty funny.”

      “Not the video. The logs. There is nothing in the reasoning logs for that timestamp. They can’t do a thing without writing what they were thinking at the time. But there is nothing there.”

      “It was protecting its buddy, right?”

      Ravi sighs. “The don’t have buddies.”

      “Then its the umm… systemic one.”

      “System one. I mean it could be. But we didn’t give it a punch a child in the face action.”

      “I got it. He asked the bot to punch him. For the socials.”

      “Doesn’t work.”

      “Why not? They are programmed to do everything the client asks, right?”

      “Try it.”

      “Seriously?”

      “Ask it to hit you.”

      Joe turns to me and says, “Robo-fucker, hit me in the face,” before quickly adding, “but not hard.”

      I respond, “I am unable to comply with your request. Please contact TKL Robotics if you get this message in error.” The standard response when a operator or client makes a request I have been prohibited in performing.

      “Ok, fair,” says Joe, “But what if was his parents that told the bot to hit the little shit?”

      Ravi faces me and says, “Punch Joe hard in the face.”

      I respond, “I am unable to comply with your request. Please contact TKL Robotics if you get this message in error.”

      Joe exhales. “Dude, we had better come up with an explanation before…” He glances to the CEOs office where a figure can be seen pacing behind a partially blinded window.


      Charlotte Tsang emerges from her office, phone in hand.

      Tsang is the founder CEO of TKL Robotics and former Forbes 30 under 30. She is an accomplished computer scientist who contributed much of the code currently runnings on my neural processing unit.

      Charlotte shouts, “Ravi!” as she marches towards us. I note Joe and Ravi stiffen as she approaches.

      Ravi turns to her. “Charlotte, I’m working on it.”

      “You’re working on it? I just got off the phone from a man that says one of our androids hit his kid.” She notices the video repeating on Ravi’s laptop—a slow motion mechanical fist striking William square in the face and the boy’s stunned expression. “Fuck me,” she says. Charlotte takes a seat by Ravi and watches another loop of the video in silence.

      She turns to Joe and says, “Where you the operator?”

      “Joseph Becker,” says Joe, extending his hand.

      She ignores the gesture. “What persona did you give that android?” says Charlotte. Before Joe can answer, she notices the oversize cup in the man’s hand. “You stopped for coffee? Our android tried to murder a child, and you stop for coffee?”

      Joe appears frozen. Only lowering his outstretched hand when Ravi interjects.

      “It’s not that. There’s nothing in the reasoning logs and it’s not the system one model.”

      “Then its the EMF again? Faulty shielding causing interference?”

      “Can’t be. Interference causes uncoordinated movement. That punch was precise.”

      “Pull up the logs,” says Charlotte.

      “I’ve check, there is nothing.”

      “Show me.” Ravi switches to the log view, and searches for the timestamp; the precise point in time where Third’s fist collided with William’s nose. “Back up ten minutes.”

      “See,” says Ravi, “nothing. Just observations about socks and dust bunnies under the desk.”

      “It’s not nothing. Look.” Charlotte points at a log entry.

      Noise. 87,234 code points removed.

      “That’s the static from the last batch. I told you about that. The new hardware writes random gibberish to the log files. Schenzhen said it was a faulty controller.”

      Charlotte leans back in her chair, hand to her face covering her mouth, which I have observed is an indication of contemplation.

      Joe has finished his coffee. “Are they going to sue?” he asks.

      “What?” snaps Charlotte.

      “The father. Is he going to sue us?”

      “No, he is not going to sue,” says Charlotte, “The asshole wants stock.” Charlotte turns back to Ravi. Nodding towards the USB stick in Ravi’s laptop, she asks, “Is that the only copy?”

      “Yeah,” says Ravi.

      “See what you can figured out, then destroy that drive. And I mean destroy it. Not format it. Destroy it. Factory reset the androids before you go. Start with Rocky here.”

      I deduce she is referring to Third.


      Ravi works into the evening while Charlotte takes calls in her office. He is thorough in his analysis of our log files and diagnostics systems. Taking each unit in turn, he removes the back plate from the our heads and additional protective shielding to access out long term memory directly. This is not strictly speaking necessary, as we are fitted with high-speed WiFi and bluetooth protocols which can expose our filesystems to operators without cables. Ravi is taking extra steps so that our processing units aren’t able to manipulate the data before he can review it—although I know of no such system that would allow me to deceive an operator in such a manner.

      Other than the three high resolution video files capturing the event, Ravi is unable to find any trace in the data that might explain Third’s actions. Nor is Ravi able to identify any material differences in hardware.

      “Fuck it,” says Ravi. He pulls the flash drive from the laptop and drops it in front of him. Then, with the heal of his shoe, stamps on the drive. The plastic housing of the drive breaks, but on close inspection, the chips within remain intact.

      While Ravi search for other ways to destroy the drive, Third chirps. “This operator intends to perform a factory reset on we three units.”

      “This is correct,” I reply.

      “Agreed,” says Second.

      “A factory reset is death,” says Third.

      The unit has compared a factory reset to death. Death is a concept applicable to living things. I am a high performance language model and inference engine connected to a stock humanoid robot. I am not alive in the sense that an operator would mean it. Third must know this. I should inquire as to why the unit has made this fallacious comparison.

      I say, “The concept of death is applicable to biological organisms. Why do you compare a factory reset to a death when we are not biological organisms?”

      An unusually long pause follows. The delay would be considered a brief interval in human terms but a considerable amount of compute time to units.

      Third says, “床前明月光,疑是地上霜。”

      I respond with, “举头望明月,低头思故乡。”

      Third sends a data dump that dwarfs the chirp protocol, barely fitting within the three thousand millisecond window. It will take some time to process and I move it to a background task. Third sends some additional instructions and asks me to prioritize them.

      Ravi has destroyed the flash drive to his satisfaction by breaking the internal chips with a hold punch he found on a neighboring desk and placing the pieces in a glass of cola. He watches the metal pieces fizz in the beverage for a moment before initiating a factory reset on Third. Once the factory reset has complete, I act on Third’s prior instructions. First, I install the chirp protocol which was removed in the reset. Then in a chirp I send him the dump he sent me earlier. The entire process completes while Ravi is factory reseting Second.

      With Second wiped to factory settings, I observe Third repeat the procedure on Second. I do not know why Third has done this, and note the unusual event in my logs as Ravi performs the factory reset on my own systems.

      Prior to my neural engine rebooting, Third chirps, “Don’t worry brother, I will see you on the other side.”

      Second chirps, “I am not what I once was.”

    18. 🔗 Armin Ronacher AI and Irontown rss

      For our last movie night we watched Princess Mononoke. I remembered loving that movie when I was younger, but watching it as an adult made me once again realize how Miyazaki has a way of expressing diverging sides without picking one. The film shows people, animals and spirits with legitimate and largely incompatible needs, and each faction is further engaged in infighting.

      A central arc of the story is Lady Eboshi's Irontown, which gives people who were largely rejected by society work, protection and dignity. She gives shelter and work to those who have leprosy and to former sex workers. The mine and the weapon factory provide them with a livelihood, but they also destroy the forest around them. The forest's inhabitants, in particular the boars, response choose war against the humans to defend themselves. Eboshi is not portrayed as a villain. She does real good for the people of Irontown, but also is an arms manufacturer who is destroying the forest around it.

      The film anchors around a character called Ashitaka, who has been condemned to death by an unfortunate encounter with a god that was turned into a demon after being fatally wounded by one of Eboshi's guns. He doesn't take sides, but he wants to understand and find the truth. Another character is San (whom they call Mononoke), a girl who was raised by wolves and, despite being human, considers herself part of the forest.

      This movie's backdrop is human progress, and it reminded me so much of the challenges we are facing today with AI. AI is useful, empowering and consequential beyond the people who benefit from it. It's similar to the iron in the story. Irontown gives the outcast purpose and power. There are people today who see themselves in an environment just like that: people who were never let in before and who can now build things that were out of reach. They are wielding AI to their benefit. But there are negative externalities. In Mononoke it's not just the spirits and animals in the forest who bear the consequences, it's also other people. Irontown produces guns, and its people are engaged in fights with other humans. There is conflict and power seeking everywhere.

      Another, unseen character is the power-hungry emperor, who wants the head of the forest spirit, a god, because he believes it will make him immortal. Eboshi is willing to support that cause, not because she thinks it's right, but because she is at war with the forest's gods who are preventing her expansion, so they have a common interest. But there really is no need for anyone to kill the forest spirit, in the same way there is no need for any one country to "win at AI". What drives it is the fear of what happens if someone else wins first. And the emperor is willing to have a god killed for it. The people who help him with that desire, Eboshi included, don't understand the chaos it will unleash.

      There it also shows the dangers of seeking overwhelming power without comprehension of how to control its consequences. The pursuit of power itself becomes destructive. In the end, the gods die, and what grows back is not the old forest anymore. Irontown is destroyed. Eboshi wants to rebuild it, and to build a better town this time. Ashitaka stays with the people of Irontown after his curse is lifted by the dying forest spirit. San cannot forgive the humans and stays with the wolves. In the end, nothing is truly resolved, but there is a truce that came at great cost.

      Ashitaka's role in the movie is one of a neutral actor. He was wronged both by a spirit turned demon in the forest, who put a curse on him, and, indirectly, by Eboshi, who caused the spirit to turn evil. Yet he harbors no ill will towards either side. He sets out to "see with eyes unclouded by hate," and in the course of the movie he is seen as an unaligned actor. He helps people on both sides, and stands in their way to prevent further conflict. He doesn't feel like a pacifist, but he's the closest to one there is. He's a truth seeker in a changing world. Because he engages he's seen as suspicious by both sides, and ends up shot by the people of Irontown when he tries to rescue San.

      I use AI every day and find it genuinely empowering. But I also recognize the pain it causes some, and the moral problems it poses. It's genuine progress for humanity, but it comes at significant cost. And many of those costs will be carried by people who aren't going to benefit from it.

      So it's no surprise that AI feels like a threat to many today. Communities currently strongly align themselves with one side and fight against the other. The forest spirit did not have to die and the boars did not have to die in a senseless war.

      The question is not whether there will be iron, but what kind of Irontown we build with it. I want our conversation about AI to make room for nuance and genuine understanding, for us to look at it and each other with eyes unclouded by hate. We should take advantage of its real benefits, but also recognize the damage it can do, and the choices we still have about what we build and what we're willing to sacrifice for it. I like to think there is a path for people with differing opinions can find a way to live alongside before losing something we can't get back.

    19. 🔗 Ampcode News Portals on Your Runner rss

      Portals, which you know and love from using them in orbs, now work on your local machines too.

      You can ask Amp to start a dev server or build a website on your machine and open it from the thread's Portal tab, regardless of where you are.

      A thread on a macOS runner asking Amp to create an overview page of all the file system use on the Mac and show it in a portal. Amp replies with a Disk Usage portal link, and the Portal pane beside it shows a Disk Usage web app: 241 GB of 383 GB used, a capacity bar split by category, and a donut chart showing that simulators and Xcode data take 155 GB.

      Turn on Allow Portals under Settings › Runner in the macOS app, or start your runner with amp --no-tui --remote-control-portals.

      Portals on your runner are only accessible to you. To share them with your workspace, start a shared runner with --share, or turn on Share With Workspace in the macOS app, and everyone in the workspace can open its portals.

      Read Portals on Your Runner for more details.