Hacker Newsnew | past | comments | ask | show | jobs | submit | tlarkworthy's commentslogin

It kills drag scroll over the flow text on my android

Maybe they want a quick switchover and the UB is replicating existing problems so it is net neutral for the codebase (but positive future coz developers can do future work on rust without synchronizing two codebase? ).


If that was true, then I would expect followups to reduce UB and unsafe in general, or at least requiring a lifetime for caller-owned memory.

But I think their true strategy is to have AI produce "fixes" like these which will end up infecting the entire codebase: https://github.com/oven-sh/bun/pull/30728


> If that was true, then I would expect followups to reduce UB and unsafe in general, or at least requiring a lifetime for caller-owned memory.

It's been like a day since the merge, presumably such followups are coming.


So this is a clear case where the LLM generated Rust port introduced a bug:

> The Zig original is a packed struct with the same shape; it "worked" only because Zig has no reference aliasing or provenance rules to violate. The Rust port inherited the shape without rethinking the API surface.


exactly. If they wanted to iterate on their port they would add lifetime annotations here, which are the tool Rust be uses to ensure safety. They're just kicking the unsafety block down the road. This accomplishes nothing and is not how you get Rust to deliver its safety promise.


Lifetimes would prevent the particular use-after-free example here, but the UB that miri currently flags would still exist, as it's related to pointer provenance, not lifetimes.

https://www.reddit.com/r/rust/comments/1hxjdvp/eli5_what_is_...


Yeah, This whole type relies on the C or C++ style "pointers as integers" hack, and while that perhaps works fine in Zig (I don't know) it's wrong or at least a bad idea in Rust. Rust wants you to prefer "integers as pointers" instead because it has different validity rules and lacks C++ "pointer zap".

In C or C++ you conventionally store a suitably large integer (uintptr_t for example) and then when you sometimes need a pointer you just cast that integer to a pointer. Under the proposed C provenance semantics PNVI-ae-udi this gets you exposed provenance.

In Rust you conventionally store a pointer, and then when you sometimes need an integer you ask for the address bits from the pointer (which on popular platforms will be the whole pointer but as an integer) or you make pointers from the integer you have with no claim to their provenance. If you're careful this gets you what Rust calls "strict" provenance, it's just straight PNVI.


Unsafe code still mostly needs lifetimes. It extends the functionality, not removing them. I wonder how much nasty things they have done then.


I just like the game Risk. It boots!


Please follow the guidelines[0] going forward.

0. https://riscv.org/about/brand-guidelines/


OK fixed! As you clearly know this space well, what do think would make this project better? I was thinking I wanted to see a heatmap of memory access (pages?), and more detailed explaination of the opcodes, but getting the thing working took quite a while so I got a bit tired and stopped at the booting milestone, but I like the project a lot and now it is in a notebook I can basically probe any part of the system with dataviz tools to make it more tangible. Do you have anything you think would be helpful or cool for learners that you have not seen before in an emulator?


This is going to be very person by person.

e.g. I'd love to see cycles spent in each mode (machine/supervisor/user). Also how much idle (wfi).


I added a viz for that! Its cool! You can see the transition to user mode https://bsky.app/profile/larkworthy.bsky.social/post/3mjcpky...


I love it.

In the graph, does it show the highest level of execution within the sample interval, or the current one at sample time?


It counts every instruction and blends the colours for the three active modes. Then the height represents idleness. So it's a pretty high resolution measure!


Evergreens only. Yes it's a whole OS in there, 7mb.


There are still web devs unable to make the difference between a web site and a web app and how important the web site is in regards of the web app.


This is an app, the file works from a file:// domain without a local Webserver. It's a different thing than other things you have seen.


We do something similar at work, called metadev. It sits above all repos and git submodules othe repos in, and works with multiple changes with multiple sessions with worktrees, and stores long term knowledge in /learnings. Our trick has been to put domain specific prompts in the submodules, and developer process in metadev. Because of the way Claude hierarchically includes context, the top repo is not polluted with too much domain specifics.


Two husbands without kids, working in tech, have a huge amount of cash, time capacity and ideation opportunity. I felt these added up to a huge advantage for getting quality shit done and taking risks. Fair play.


It makes you download it but then a button appears saying join in browser. I have tons of zoom binary copies


I have a pretty good one here https://observablehq.com/@tomlarkworthy/robocoop-2 and I have a port of opencode in-progress


I use regex to force an XML schema and then use a normal XML parser to decode.

XML is better for code, and for code parts in particular I enforce a cdata[[ part so there LLM is pretty free to do anything without escaping.

OpenAI API lets you do regex structured output and it's much better than JSON for code.


Could you share some samples / pointers on how you do this?


Yeah, this upsert_cell tool does it

https://observablehq.com/@tomlarkworthy/forking-agent#upsert...

format: { type: "grammar", syntax: "regex", definition: cellsRegex },

Where cellRegex is

cellsRegex = { const CELL_OPEN = String.raw`<cell>\s`;

  const INPUTS_BLOCK = String.raw`<inputs>.*<\/inputs>\s*`;

  const CODE_BLOCK = String.raw`<code><!\[CDATA\[[\s\S]*\]\]>\s*<\/code>\s*`;

  const CELL_CLOSE = String.raw`<\/cell>`;

  return "^(" + CELL_OPEN + INPUTS_BLOCK + CODE_BLOCK + CELL_CLOSE + ")*$";
}

And the extraction logic is here https://observablehq.com/@tomlarkworthy/robocoop-2#process

function process(content) { const doc = domParser.parseFromString( "<response>" + content + "</response>", "text/xml" ); const cells = [...doc.querySelectorAll("cell")]; return cells.map((cell) => { const inputsContent = cell.querySelector("inputs")?.textContent || ""; return { inputs: inputsContent.length > 0 ? inputsContent.split(",").map((s) => s.trim()) : [], code: (cell.querySelector("code")?.textContent || "").trim() }; }); }

BTW that agent is under development and not actually that good at programming. Its parent https://observablehq.com/@tomlarkworthy/robocoop-2 is actually very good at notebook programming


Parquet/iceberg


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: