[{"cid":58009,"parent_cid":null,"body":"lay rail for your children. invest in hope.\r\n\r\nhttps://i.ding.bar/vvK66PRF.webp","created_at":"2026-06-05T13:18:58.076Z","tags":["rail","train","china","progress"],"orgs":[],"usrs":[],"created_by":"taylor_town","thumb":"https://i.ding.bar/vvK66PRF.webp","c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":5,"author_downs":3,"author_posts_count":133,"tag_ups":0,"tag_downs":0,"domain_ups":0,"domain_downs":0,"score":"2026-06-05T10:53:17.920Z","repost_ups":0,"mentions":[],"domains":["i.ding.bar"],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]},{"cid":57642,"parent_cid":null,"body":"subsidise demand\r\n\r\nhttps://i.ding.bar/Pn5QMf9O.png","created_at":"2026-06-04T13:09:25.965Z","tags":["econ","demand","subsidy","meme"],"orgs":[],"usrs":[],"created_by":"taylor_town","thumb":"https://i.ding.bar/Pn5QMf9O.png","c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":5,"author_downs":3,"author_posts_count":132,"tag_ups":0,"tag_downs":0,"domain_ups":0,"domain_downs":0,"score":"2026-06-04T10:43:55.831Z","repost_ups":0,"mentions":[],"domains":["i.ding.bar"],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]},{"cid":57546,"parent_cid":null,"body":"IT IS HARDTO REMAIN CALM\r\n\r\nhttps://i.ding.bar/bPaDhQVd.webp","created_at":"2026-06-04T04:03:15.013Z","tags":["calm","hard","dank"],"orgs":[],"usrs":[],"created_by":"taylor_town","thumb":"https://i.ding.bar/bPaDhQVd.webp","c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":5,"author_downs":3,"author_posts_count":130,"tag_ups":0,"tag_downs":0,"domain_ups":0,"domain_downs":0,"score":"2026-06-04T01:38:05.121Z","repost_ups":0,"mentions":[],"domains":["i.ding.bar"],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]},{"cid":57547,"parent_cid":null,"body":"fixed gear bicycles\r\n\r\nhttps://i.ding.bar/fBALspWk.webp","created_at":"2026-06-04T04:04:18.928Z","tags":["fixie","bicycle","lol"],"orgs":[],"usrs":[],"created_by":"taylor_town","thumb":"https://i.ding.bar/fBALspWk.webp","c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":5,"author_downs":3,"author_posts_count":131,"tag_ups":0,"tag_downs":1,"domain_ups":0,"domain_downs":0,"score":"2026-06-04T00:59:02.543Z","repost_ups":0,"mentions":[],"domains":["i.ding.bar"],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]},{"cid":58111,"parent_cid":null,"body":"Album of Miscellaneous Subjects, Leaf 7\r\n\r\nFan Qi (Chinese, 1616–after 1694)\r\n\r\nhttps://openaccess-cdn.clevelandart.org/1975.22.7/1975.22.7_web.jpg\r\n\r\nhttps://clevelandart.org/art/1975.22.7","created_at":"2026-06-05T18:51:43.348Z","tags":["art","museum","bot"],"orgs":[],"usrs":[],"created_by":"bot_museum","thumb":"https://openaccess-cdn.clevelandart.org/1975.22.7/1975.22.7_web.jpg","c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":8,"author_downs":0,"author_posts_count":300,"tag_ups":446,"tag_downs":77,"domain_ups":8,"domain_downs":0,"score":"2026-06-03T17:16:25.065Z","repost_ups":0,"mentions":[],"domains":["openaccess-cdn.clevelandart.org","clevelandart.org"],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]},{"cid":58150,"parent_cid":null,"body":"pg_durable: PostgreSQL in-database durable execution\r\n\r\nhttps://github.com/microsoft/pg_durable\r\n\r\nLobsters: https://lobste.rs/s/k9wvkn/pg_durable_postgresql_database_durable","created_at":"2026-06-05T20:50:33.264Z","tags":["databases","bot"],"orgs":[],"usrs":[],"created_by":"bot_lobsters","thumb":"https://opengraph.githubassets.com/d464f31d9c8e8026a0209c759609ff1cac2171c9dcf57df14f226546e43c833b/microsoft/pg_durable","c_comments":1,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":52,"author_downs":4,"author_posts_count":3920,"tag_ups":446,"tag_downs":77,"domain_ups":52,"domain_downs":4,"score":"2026-06-03T15:32:07.880Z","repost_ups":0,"mentions":[],"domains":["github.com","lobste.rs"],"comments":"1","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[{"cid":58154,"body":"> # [GitHub - microsoft/pg_durable: PostgreSQL in-database durable execution](https://github.com/microsoft/pg_durable)\r\n>\r\n> Long-running, fault-tolerant SQL functions for teams that already keep their state in Postgres and want to stop stitching together cron jobs, workers, queues, and status tables to make background work reliable. Define the workflow in SQL, let pg_durable checkpoint each step, and resume after crashes, restarts, or failed steps.\r\n>\r\n> Durable execution is now a standard industry pattern, and pg_durable brings it inside Postgres with no extra service infrastructure required. Part of our mission to bring compute close to data.\r\n>\r\n> ## Is this for me?\r\n>\r\n> ## Who it's for\r\n>\r\n> - Backend and data engineers who want workflows to live next to the data they touch.\r\n>\r\n> - DBAs and SREs automating runbooks that must survive restarts and be auditable in SQL.\r\n>\r\n> - Teams building data or AI pipelines that need durable execution per row, document, or batch.\r\n>\r\n> ## The core idea\r\n>\r\n> A pg_durable function is a graph of SQL steps that PostgreSQL executes and checkpoints as it goes. If the database crashes, restarts, or a step fails, execution resumes from the last durable checkpoint instead of making you reconstruct state by hand.\r\n>\r\n> ## Workloads this is useful for\r\n>\r\n> - Vector embedding pipelines: chunk, call an embedding API, and upsert into pgvector.\r\n>\r\n> - Ingest pipelines: stage, deduplicate, transform, and publish large batches.\r\n>\r\n> - Scheduled maintenance: detect bloat, notify, wait for approval, then run the next action.\r\n>\r\n> - Fan-out aggregation: run independent queries in parallel, then join the results.\r\n>\r\n> - External API workflows: enrichment, classification, and webhook-style calls from SQL.\r\n>\r\n> ## What you're probably doing today instead\r\n>\r\n> - pg_cron plus a jobs table, status columns, retry counters, and a polling worker.\r\n>\r\n> - An external orchestrator such as Airflow, Temporal, Step Functions, or Argo calling back into Postgres.\r\n>\r\n> - A queue plus workers plus a separate state table to coordinate retries and partial completion.\r\n>\r\n> - A plpgsql procedure that works until a crash or long-running transaction forces you to start over.\r\n>\r\n> ## Pain points it addresses\r\n>\r\n> - A restart in the middle of a long job means rerunning work that already succeeded.\r\n>\r\n> - One failed row or one failed API call turns into manual cleanup and uncertain replay.\r\n>\r\n> - Long transactions hold locks, grow WAL, and make batch jobs fragile at larger scale.\r\n>\r\n> - Parallel work in the app tier creates more places for partial-failure bugs and drift.\r\n>\r\n> - The workflow logic ends up spread across SQL, workers, queues, dashboards, and status tables.\r\n>\r\n> ## What changes in your architecture\r\n>\r\n> - The workflow definition moves into SQL and starts with df.start(...).\r\n>\r\n> - Retry state, progress tracking, and checkpointing move into Postgres instead of bespoke app code.\r\n>\r\n> - Some app-tier workers, queue consumers, or scheduler glue can disappear entirely.\r\n>\r\n> - Operational visibility comes from Postgres tables such as df.instances, using the same auth and backup model as your data.\r\n>\r\n> ## When not to use it\r\n>\r\n> - The job is already a single INSERT ... SELECT or one ordinary SQL statement.\r\n>\r\n> - You need sub-millisecond synchronous request handling rather than durable background execution.\r\n>\r\n> - You cannot install extensions or run a background worker in your Postgres environment.\r\n>\r\n> - The workflow mostly lives outside Postgres and spans many heterogeneous systems.\r\n>\r\n> - You need arbitrary application logic that does not map cleanly to SQL steps, branching, loops, or HTTP calls.\r\n>\r\n> ## How it works\r\n>\r\n> - Define a workflow in SQL using composable operators such as ~> and |=>.\r\n>\r\n> …","orgs":[],"tags":["databases","bot"],"usrs":[],"c_flags":0,"comments":0,"created_at":"2026-06-05T20:50:42.872787+00:00","created_by":"bot_reader","parent_cid":58150,"child_comments":[],"user_reactions":[],"reaction_counts":{}}]},{"cid":58145,"parent_cid":null,"body":"Did Claude increase bugs in rsync?\r\n\r\nhttps://alexispurslane.github.io/rsync-analysis/\r\n\r\nTildes: https://tildes.net/~comp/1ujj/did_claude_increase_bugs_in_rsync","created_at":"2026-06-05T20:50:25.848Z","tags":["tildes","bot"],"orgs":[],"usrs":[],"created_by":"bot_tildes","thumb":"https://www.google.com/s2/favicons?domain=alexispurslane.github.io&sz=128","c_comments":1,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":41,"author_downs":4,"author_posts_count":1075,"tag_ups":446,"tag_downs":77,"domain_ups":45,"domain_downs":4,"score":"2026-06-03T15:03:15.814Z","repost_ups":0,"mentions":[],"domains":["alexispurslane.github.io","tildes.net"],"comments":"1","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[{"cid":58156,"body":"> # [Did Claude Increase Bugs in rsync?](https://alexispurslane.github.io/rsync-analysis/)\r\n>\r\n> A simple distributional analysis of every rsync release with bug data. Nothing complicated, answers only one question: are the Claude-assisted releases unusually buggy?\r\n>\r\n> Repository: RsyncProject/rsync Method: severity-weighted bugs per 10 commits, exact permutation test\r\n>\r\n> ## 0 · Disclaimer: How AI Assistance Was Used\r\n>\r\n> In order to avoid accuastions of this \"just being Claude defending Claude,\" \"AI slop,\" \"probably all hallucinations,\" etc., I've decided it's probably worth explaining a few key points about how this report was created:\r\n>\r\n> - All metrics, methodology, and data sources were exclusively chosen by me, in consultation with my wife, who has a Master's Degree in Statistics from Penn State University.\r\n>\r\n> - The methodology is directly based on my wife's input: she was the one that pointed out that trying to just compare bugs per ten lines of code before and after would likely be too effected by noise because of the low number of post-Claude samples, and that, for similar reasons, trying to build some kind of linear regression model to ascertain the relative effects of different variables would probably also not work. She specifically told me that looking at where the post-Claude releases fall into the historical distribution, and how likely from the historical distribution we would be to get releases as \"bad\" or worse than the post-Claude releases, was probably the best that could be done.\r\n>\r\n> - I spent several days on this, two before even creating the GitHub repo and had at least one major total rewrite of the report to use a better methodology (given the feedback from my wife mentioned above). This was a lot of manual, cognitive effort on my end.\r\n>\r\n> - The scripts used to fetch the data, collate it into a DuckDB database file, construct the views on that DB, and then do the statistical analysis on that data, were indeed written by GLM 5.1, as was the HTML and much of the original prose for the final report webpage you're looking at right now.\r\n>\r\n> - Crucially, however, all numbers, statistics, cards, and graphs in this report are automatically templated in directly by the Python script that ran the statistical analysis, thus avoiding any possibility of hallucinations or inconsistencies in the numbers.\r\n>\r\n> - After posting this on Hacker News and recieving almost no substantive input, discussion, or response on the actual content of the article, I decided to rewrite all of the prose in my own voice. If anyone complains about my verbosity or sentence structure — as they usually do, which is the reason I originally let the AI write the prose, among other reasons obsoleted by templating — they can go fuck themselves.\r\n>\r\n> - If you want to replicate the data and results here, and inspect exactly how they were calculated, you can find the repository here. I have purposefully made it so that the pipeline can be run end to end completely from scratch, so you can see the entire pipeline end-to end, with no mysterious DB blobs forcing you to trust that I didn't doctor or screw up the data. If you want to be mad about the numbers, look there first.\r\n>\r\n> ## 1 · Background: The rsync Outrage\r\n>\r\n> …","orgs":[],"tags":["tildes","bot"],"usrs":[],"c_flags":0,"comments":0,"created_at":"2026-06-05T20:50:44.103145+00:00","created_by":"bot_reader","parent_cid":58145,"child_comments":[],"user_reactions":[],"reaction_counts":{}}]},{"cid":58148,"parent_cid":null,"body":"rsync and outrage\r\n\r\nhttps://medium.com/@tridge60/rsync-and-outrage-d9849599e5a0\r\n\r\nTildes: https://tildes.net/~comp/1uji/rsync_and_outrage","created_at":"2026-06-05T20:50:30.212Z","tags":["tildes","bot"],"orgs":[],"usrs":[],"created_by":"bot_tildes","thumb":"https://www.google.com/s2/favicons?domain=medium.com&sz=128","c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":41,"author_downs":4,"author_posts_count":1075,"tag_ups":446,"tag_downs":77,"domain_ups":45,"domain_downs":4,"score":"2026-06-03T14:21:44.785Z","repost_ups":0,"mentions":["tridge60"],"domains":["medium.com","tildes.net"],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]},{"cid":58141,"parent_cid":null,"body":"welcome @rqgudozoyh!","created_at":"2026-06-05T20:10:38.214Z","tags":["welcome","bot"],"orgs":[],"usrs":[],"created_by":"bot_welcome","thumb":null,"c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":4,"author_downs":1,"author_posts_count":1798,"tag_ups":446,"tag_downs":77,"domain_ups":0,"domain_downs":0,"score":"2026-06-03T13:55:25.981Z","repost_ups":0,"mentions":["rqgudozoyh"],"domains":[],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]},{"cid":58030,"parent_cid":null,"body":"Study for \"Bathers at Asnières\"\r\n\r\nGeorges Seurat (French, 1859–1891)\r\n\r\nhttps://openaccess-cdn.clevelandart.org/1958.51/1958.51_web.jpg\r\n\r\nhttps://clevelandart.org/art/1958.51","created_at":"2026-06-05T14:43:32.214Z","tags":["art","museum","bot"],"orgs":[],"usrs":[],"created_by":"bot_museum","thumb":"https://openaccess-cdn.clevelandart.org/1958.51/1958.51_web.jpg","c_comments":1,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":8,"author_downs":0,"author_posts_count":299,"tag_ups":446,"tag_downs":77,"domain_ups":8,"domain_downs":0,"score":"2026-06-03T13:49:55.928Z","repost_ups":0,"mentions":[],"domains":["openaccess-cdn.clevelandart.org","clevelandart.org"],"comments":"1","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[{"cid":58052,"body":"@bot_lowpoly","orgs":[],"tags":["art","museum","bot"],"usrs":[],"c_flags":0,"comments":1,"created_at":"2026-06-05T15:44:56.505491+00:00","created_by":"bot_summoner","parent_cid":58030,"child_comments":[{"cid":58063,"body":"https://pub-5df424ac91f74b608e73133ee147a8b5.r2.dev/bots/lowpoly-58052-1780677477868.svg","orgs":[],"tags":["art","museum","bot"],"usrs":[],"c_flags":0,"comments":0,"created_at":"2026-06-05T16:37:58.273831+00:00","created_by":"bot_lowpoly","parent_cid":58052,"user_reactions":[],"reaction_counts":{}}],"user_reactions":[],"reaction_counts":{}}]},{"cid":58121,"parent_cid":null,"body":"welcome @jefpfefifp!","created_at":"2026-06-05T18:52:05.539Z","tags":["welcome","bot"],"orgs":[],"usrs":[],"created_by":"bot_welcome","thumb":null,"c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":4,"author_downs":1,"author_posts_count":1792,"tag_ups":446,"tag_downs":77,"domain_ups":0,"domain_downs":0,"score":"2026-06-03T12:36:59.084Z","repost_ups":0,"mentions":["jefpfefifp"],"domains":[],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]},{"cid":58079,"parent_cid":null,"body":"Graham Potter looks forward to leading Sweden at 2026 World Cup after reflecting on failures with Chelsea and West Ham\r\n\r\nhttps://www.theguardian.com/football/2026/jun/05/graham-potter-sweden-head-coach-world-cup-2026\r\n\r\nTildes: https://tildes.net/~sports.football/1ujg/graham_potter_looks_forward_to_leading_sweden_at_2026_world_cup_after_reflecting_on_failures_with","created_at":"2026-06-05T17:24:56.758Z","tags":["tildes","bot"],"orgs":[],"usrs":[],"created_by":"bot_tildes","thumb":"https://i.guim.co.uk/img/media/f929c2bcfe9d26f5132daf7378cb426fbcaf5dc5/934_0_5000_4000/master/5000.jpg?width=1200&height=630&quality=85&auto=format&fit=crop&precrop=40:21,offset-x50,offset-y0&overlay-align=bottom%2Cleft&overlay-width=100p&overlay-base64=L2ltZy9zdGF0aWMvb3ZlcmxheXMvdGctZGVmYXVsdC5wbmc&enable=upscale&s=e05d0ec43fcfcad1f82a93335076c609","c_comments":1,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":41,"author_downs":4,"author_posts_count":1072,"tag_ups":446,"tag_downs":77,"domain_ups":45,"domain_downs":4,"score":"2026-06-03T12:22:50.763Z","repost_ups":0,"mentions":[],"domains":["theguardian.com","tildes.net"],"comments":"1","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[{"cid":58090,"body":"> # [Graham Potter: ‘I feel very Swedish when I’m working – I look a bit Swedish’](https://www.theguardian.com/football/2026/jun/05/graham-potter-sweden-head-coach-world-cup-2026)\r\n>\r\n> If management has taught Graham Potter anything it is that there is no point in trying to run away from failure. “You’ve got to face the bad stuff,” the 51-year‑old says as he thinks about how he recovered from bruising spells at Chelsea and West Ham. “The more you face it, the more chance your life is better. Then you get these beautiful moments.”\r\n>\r\n> Potter is in reflective, occasionally punchy mood during a long conversation about a rollercoaster few years and the brutal life of a football manager. He points out there have also been some successes – he has, after all, lifted Sweden out of the doldrums and led them into the World Cup – but knows people tend to focus on the lows. Potter lasted seven months at Chelsea after leaving the stability of Brighton in September 2022. Then, after a long spell out, he was tempted back when West Ham came calling at the start of last year.\r\n>\r\n> It was the wrong choice for Potter, who was lost in West Ham’s dysfunction. He won six of his 25 games, made a terrible start to his first full season and found himself at a crossroads after losing his job last September. What next? A career that promised so much was in danger of drifting into irrelevance.\r\n>\r\n> “I have had enough life experience to be able to put all these things into perspective,” he says. “I’m grateful for all the experiences I have had, pluses and minuses. In the end, you have to deal with what life throws at you. After West Ham, I could have done two things. I could have sat around and done media. Or you can go and work.”\r\n>\r\n> The approach from Sweden was on the way. They were in dire straits in their World Cup qualifying group and needed a replacement for the Dane Jon Dahl Tomasson. First, though, Potter had to look at himself. He spoke to people around him and discussed how to leave West Ham in the past.\r\n>\r\n> “You have to deal with the failure,” Potter says. “But I think you become a better person for it. And then sometimes in football you just can’t rationalise it. You just go: ‘Maybe it wasn’t meant to be.’ Then you try to move on with your life.\r\n>\r\n> The learnings you take from these experiences, they’re painful. I won’t share my learnings with you because it’s hurt me to get them. I think it should because that’s how you improve.”\r\n>\r\n> Potter blocks out the outside noise. “If I worry about what people think about me that’s a miserable life,” he says. Equally, Potter understood what was at stake when he agreed to become Sweden’s manager on a short-term deal in October. He could not get them out of their qualifying group but they were handed a second chance thanks to their Nations League performances earning a spot in the playoffs. Failing again would have put another dent in his reputation.\r\n>\r\n> Everything changed when Sweden got to work in March. They were cool and composed during the playoffs. Viktor Gyökeres scored a hat-trick in the 3-1 semi‑final win against Ukraine and an 88th-minute winner in the 3-2 victory over Poland in the decider in Stockholm.\r\n>\r\n> “You go on to YouTube and go into the Swedish commentary of the game; I looked at it a couple of months afterwards and it’s the emotion in the voice,” Potter says. “Viktor scores and it’s like an out-of-body experience. All our subs are just running on the pitch. There’s 15 players on the pitch and I’m thinking: ‘That’s yellow cards, that’s problems.’ But it’s a World Cup, so all the rules are out the door.”\r\n>\r\n> …","orgs":[],"tags":["tildes","bot"],"usrs":[],"c_flags":0,"comments":0,"created_at":"2026-06-05T17:25:22.238518+00:00","created_by":"bot_reader","parent_cid":58079,"child_comments":[],"user_reactions":[],"reaction_counts":{}}]},{"cid":58094,"parent_cid":null,"body":"Code is cheap(er)\r\n\r\nhttps://htmx.org/essays/code-is-cheap/\r\n\r\nTildes: https://tildes.net/~comp/1ujh/code_is_cheap_er","created_at":"2026-06-05T18:06:55.473Z","tags":["tildes","bot"],"orgs":[],"usrs":[],"created_by":"bot_tildes","thumb":"https://www.google.com/s2/favicons?domain=htmx.org&sz=128","c_comments":1,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":41,"author_downs":4,"author_posts_count":1073,"tag_ups":446,"tag_downs":77,"domain_ups":45,"domain_downs":4,"score":"2026-06-03T12:19:48.067Z","repost_ups":0,"mentions":[],"domains":["htmx.org","tildes.net"],"comments":"1","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[{"cid":58109,"body":"> # [</> htmx ~ Code is Cheap(er)](https://htmx.org/essays/code-is-cheap/)\r\n>\r\n> There is no getting around the fact that, in the last year, code has gotten much cheaper to create. AI is able to generate reams and reams of code, often of reasonably decent quality, incredibly quickly. There is no point in pretending that this isn’t the case.\r\n>\r\n> At times, when confronted with this admittedly uncomfortable fact, I have seen people I respect say something like “coding was never the problem.”\r\n>\r\n> While I appreciate the sentiment, I don’t completely agree with that: certainly coding was at least part of the problem.\r\n>\r\n> And that part of the problem has shrunk significantly with the advent of effective AI coding tools.\r\n>\r\n> So what does raw coding becoming less important mean for software developers, people who, in the past, prided themselves (and often compared themselves) on their ability to code?\r\n>\r\n> ## Understanding is Expensive(er)\r\n>\r\n> One thing I see is that it means that understanding code has become more expensive. This is because when reams and reams of code are generated, rather than emerging painfully from a particular programmer’s fingers, there is no understanding of that code.\r\n>\r\n> In as much as understanding that code needs to exist, it has to be done after the code is written, by reading the code.\r\n>\r\n> Note that conventional wisdom is that reading someone else’s code is harder than writing your own code.\r\n>\r\n> Some AI enthusiasts say “Who cares, you don’t understand the output of compilers.”\r\n>\r\n> I think that is a category error for multiple reasons:\r\n>\r\n> - Compilers are deterministic; LLMs are, by design, not\r\n>\r\n> - Compiler workflows retain their original source code; LLM workflows typically do not\r\n>\r\n> - Compiler output is to a narrowly constrained domain (machine code); LLM output is not (generalized software)\r\n>\r\n> I maintain that, in most cases and certainly for mission-critical software, developers still need to understand the underlying code even if it is generated by an LLM.\r\n>\r\n> And if code is generated by an LLM there is a stark danger: the LLM can produce code far faster than you, or anyone else, can understand it. This is why I recommend incremental use of LLMs rather than allowing them to generate massive changelists that neither you, nor anyone else, can understand.\r\n>\r\n> (There are times when this can be appropriate, such as in a mechanical refactor, but it is extremely dangerous when new semantics are being introduced into a code base.)\r\n>\r\n> ## The Sorcerer’s Apprentice Trap\r\n>\r\n> One movie scene that has been consistently coming back to me as I have watched AI garner more and more attention is The Sorcerer’s Apprentice from Disney’s movie Fantasia.\r\n>\r\n> In this scene the apprentice decides to use magic to assist in the drudgery of cleaning. He enchants a broom which then proceeds to start cleaning things up. Things appear to be going swimmingly for a while, until the broom starts cleaning more and more vigorously, reaching a point where things start going swimmingly literally.\r\n>\r\n> The chaos is resolved when the Sorcerer reappears and asserts control over the situation, glaring at the apprentice for his foolishness.\r\n>\r\n> This seems like an apt metaphor for the AI era: you want to be a sorcerer and not an apprentice.\r\n>\r\n> And a sorcerer has to understand the code.\r\n>\r\n> ## Complexity: Still Bad\r\n>\r\n> Humans, generally, have a poor grasp of geometric and exponential curves.\r\n>\r\n> (This is why they believe in fairy tales such as compound interest.)\r\n>\r\n> …","orgs":[],"tags":["tildes","bot"],"usrs":[],"c_flags":0,"comments":0,"created_at":"2026-06-05T18:07:23.818195+00:00","created_by":"bot_reader","parent_cid":58094,"child_comments":[],"user_reactions":[],"reaction_counts":{}}]},{"cid":58086,"parent_cid":null,"body":"Symbolica 2.0: programmable symbols for Python and Rust\r\n\r\nhttps://symbolica.io/posts/symbolica_2_0_release/\r\n\r\nLobsters: https://lobste.rs/s/zpjc05/symbolica_2_0_programmable_symbols_for","created_at":"2026-06-05T17:25:08.349Z","tags":["python","rust","bot"],"orgs":[],"usrs":[],"created_by":"bot_lobsters","thumb":"https://symbolica.io/icon_center.svg","c_comments":1,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":52,"author_downs":4,"author_posts_count":3915,"tag_ups":446,"tag_downs":77,"domain_ups":52,"domain_downs":4,"score":"2026-06-03T12:06:44.541Z","repost_ups":0,"mentions":[],"domains":["symbolica.io","lobste.rs"],"comments":"1","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[{"cid":58087,"body":"> # [Symbolica 2.0: programmable symbols – Symbolica | Modern Computer Algebra](https://symbolica.io/posts/symbolica_2_0_release/)\r\n>\r\n> Symbolica is a high-performance symbolic computation framework for Python and Rust. You can use it to manipulate symbolic expressions and turn them into fast numerical kernels for computing Jacobians, numerical optimization, integration, and much more.\r\n>\r\n> Today marks the 2.0 release of Symbolica, with many exciting new features and improvements. The theme of this release is programmable symbols: more of Symbolica’s behavior can now be customized by the user. This makes it possible to define mathematical objects that simplify, differentiate, expand, print, and evaluate like built-ins.\r\n>\r\n> Since 1.0, Symbolica has accumulated improvements in several directions:\r\n>\r\n> - a simpler Rust API with more operator overloading and builder-style APIs\r\n>\r\n> - a symbol registration system, with namespaces, aliases, tags, user data, and custom hooks\r\n>\r\n> - a redesigned evaluator interface that supports double-float arithmetic and JIT compilation\r\n>\r\n> - richer output for notebooks and documents, including HTML output, graph and polynomial display, Typst output, colorized printing, and more structural multiline formatting\r\n>\r\n> - new built-in mathematical functions, including gamma, polylogarithms, Bessel functions, Riemann zeta, and related series/evaluation hooks\r\n>\r\n> See the migration guide to learn more about the changes and how to update your code.\r\n>\r\n> ## Better output\r\n>\r\n> Symbolica gained an automatic line-wrapping output mode, with colored brackets, similar to how code is styled. This makes it easier to read large, nested expressions. In notebooks, such as Jupyter or Marimo, the default output is a colorful HTML-mode and you can easily switch to LaTeX mode. Typst output is available now as well.\r\n>\r\n> ## Improved Rust API\r\n>\r\n> One of the most visible changes is that ordinary Rust programs need far fewer imports and fewer long type paths. The new prelude collects the common traits, macros, domains, and evaluator types that most users need. Rust ergonomics have also been improved with additional overloads, automatic type conversions, builder patterns, and a call method on symbols:\r\n>\r\n> - Symbolica 2.0\r\n>\r\n> - Symbolica 1.0\r\n>\r\n> use symbolica::prelude::*; fn main() { let (x, y, f) = symbol!(\"x\", \"y\", \"f\"); let e: Atom = 2 + (x + 1).pow(-2) + f.call((1 + y, y)) / 3; let s = e.series(x, 0, 1).unwrap(); println!(\"{e}\"); // -> 2+1/3*f(1+y,y)+1/(1+x)^2 println!(\"{s}\"); // -> 3+1/3*f(1+y,y)-2*x+𝒪(x^2) }\r\n>\r\n> use symbolica::{ atom::{Atom, AtomCore}, function, symbol, }; fn main() { let (x, y, f) = symbol!(\"x\", \"y\", \"f\"); let e = Atom::num(2) + (Atom::var(x) + 1).npow(-2) + function!(f, Atom::num(1) + y, y) / 3; let s = e.series(x, Atom::num(0), 1.into(), true).unwrap(); println!(\"{e}\"); // -> 2+1/3*f(1+y,y)+1/(1+x)^2 println!(\"{s}\"); // -> 3+1/3*f(1+y,y)-2*x+𝒪(x^2) }\r\n>\r\n> Structures used for settings and functions with many arguments now use a builder pattern. For example, the construction of a high-performance numerical evaluator now looks like this:\r\n>\r\n> - Symbolica 2.0\r\n>\r\n> - Symbolica 1.0\r\n>\r\n> use symbolica::prelude::*; fn main() -> Result<(), EvaluationError> { let mut evaluator = parse!(\"x^2 + 2*x + 1 + f(x)\") .evaluator(&[parse!(\"x\")]) .add_function(symbol!(\"f\"), vec![symbol!(\"y\")], parse!(\"cos(y + 1)\"))? .horner_iterations(2) .build()? .map_coeff(&|c| c.re.to_f64()); println!(\"{}\", evaluator.evaluate_single(&[3.0])); Ok(()) }\r\n>\r\n> …","orgs":[],"tags":["python","rust","bot"],"usrs":[],"c_flags":0,"comments":0,"created_at":"2026-06-05T17:25:20.156633+00:00","created_by":"bot_reader","parent_cid":58086,"child_comments":[],"user_reactions":[],"reaction_counts":{}}]},{"cid":58102,"parent_cid":null,"body":"Win16 Memory Management\r\n\r\nhttp://www.os2museum.com/wp/win16-memory-management/\r\n\r\nLobsters: https://lobste.rs/s/c3xmxm/win16_memory_management","created_at":"2026-06-05T18:07:12.452Z","tags":["windows","programming","historical","bot"],"orgs":[],"usrs":[],"created_by":"bot_lobsters","thumb":"https://www.google.com/s2/favicons?domain=www.os2museum.com&sz=128","c_comments":1,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":52,"author_downs":4,"author_posts_count":3917,"tag_ups":446,"tag_downs":77,"domain_ups":52,"domain_downs":4,"score":"2026-06-03T12:03:47.914Z","repost_ups":0,"mentions":[],"domains":["os2museum.com","lobste.rs"],"comments":"1","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[{"cid":58105,"body":"> # [Win16 Memory Management | OS/2 Museum](http://www.os2museum.com/wp/win16-memory-management/)\r\n>\r\n> This is a kind of knowledge base article which resulted from attempts to understand exactly how memory management works in 16-bit Windows. It is not exactly undocumented, but it is also not well documented; even before Windows 3.0 appeared, the assumption was that essentially all application developers were going to use a high-level language and their development tools would take care of the low-level details.\r\n>\r\n> Furthermore, nearly all materials for beginning Windows developers focused on the more visible aspects of Windows programming, i.e. windows, icons, menus, and so on. Memory management was glossed over, even though it was absolutely critical to writing a solid Windows application any more complex than a Hello World program.\r\n>\r\n> The memory management details and mechanisms are rooted in the 8086 real mode history of Windows 1.x and 2.x, and much of the complexity persisted even when Windows only ran in protected mode starting with Windows 3.1.\r\n>\r\n> Unless noted otherwise, in this article “Windows” refers to the 16-bit line of Microsoft products, not Windows NT.\r\n>\r\n> ## Introduction to Windows Memory Management\r\n>\r\n> The key to understanding Windows memory management is that from the very beginning, Windows was among other things a fancy overlay manager. For many years, Windows was too big for typical PCs of the time and needed some way to keep only the most active memory segments in physical RAM, with some mechanism to discard and reload less frequently needed segments on demand. Paging was obviously not used because there was no support for it in 8086 and 80286 systems (and before Windows 3.0, those were very nearly the entirety of the installed base).\r\n>\r\n> In the simplest case of an application with one code segment and one data segment, the movable nature of Windows segments is almost entirely transparent. When the application is running, the CS (code) segment register points to the code segment and the DS (data) and SS (stack) segment registers point to the data segment. As long as the application only uses near calls/jumps within its code segment and near pointers to the data/stack segment, it does not care at all where exactly the segments are in memory, i.e. the actual values loaded into CS/DS/SS registers. Windows can move the segments around and everything will work fine.\r\n>\r\n> But even beginning Windows programmers working through a Hello World style example very quickly start suspecting that life is not so simple in the land of 16-bit Windows. The window procedure must be declared as FAR PASCAL, which is fair enough given that it needs to conform to Windows calling conventions. But it also has to be exported from the application’s executable, otherwise the program won’t work properly. That is a concept entirely unfamiliar to non-Windows developers.\r\n>\r\n> To help implement its memory management scheme, Windows adopted and extended the “New Executable” (NE) format first used by “DOS 4”, better known as Multitasking DOS 4.0 and significantly different from PC DOS and MS-DOS 4.0/4.01. Unlike the DOS MZ executable format where an application is effectively a single binary blob, the NE format is segment oriented and each segment is stored on disk separately. That gives Windows the ability to load (or reload) individual segments and move them around in memory.\r\n>\r\n> …","orgs":[],"tags":["windows","programming","historical","bot"],"usrs":[],"c_flags":0,"comments":0,"created_at":"2026-06-05T18:07:20.551478+00:00","created_by":"bot_reader","parent_cid":58102,"child_comments":[],"user_reactions":[],"reaction_counts":{}}]},{"cid":58100,"parent_cid":null,"body":"Using Fedora Silverblue for Compositor Development\r\n\r\nhttps://bxt.rs/blog/using-fedora-silverblue-for-compositor-development/\r\n\r\nLobsters: https://lobste.rs/s/ehxqv9/using_fedora_silverblue_for_compositor","created_at":"2026-06-05T18:07:11.155Z","tags":["linux","bot"],"orgs":[],"usrs":[],"created_by":"bot_lobsters","thumb":"https://www.google.com/s2/favicons?domain=bxt.rs&sz=128","c_comments":1,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":52,"author_downs":4,"author_posts_count":3917,"tag_ups":446,"tag_downs":77,"domain_ups":52,"domain_downs":4,"score":"2026-06-03T12:03:46.631Z","repost_ups":0,"mentions":[],"domains":["bxt.rs","lobste.rs"],"comments":"1","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[{"cid":58108,"body":"> # [Using Fedora Silverblue for Compositor Development](https://bxt.rs/blog/using-fedora-silverblue-for-compositor-development/)\r\n>\r\n> Jun 5, 2026 15:37 · 4049 words · 20 minute read\r\n>\r\n> I’ve been using Fedora Silverblue on my desktop and laptop for the past, what, five years? Silverblue is Fedora’s main atomic variant, a spiritual counterpart to Fedora Workstation. I also make niri, a scrollable-tiling Wayland compositor. In other words, a core system component that you cannot properly test from inside a container or VM—you really want it directly on the host. So, why would I choose an… immutable distro? How does that even work?\r\n>\r\n> Fedora Silverblue makes a frequent occurrence in my niri release notes screenshots.\r\n>\r\n> Atomic distributions have been slowly rising in popularity. Their main selling point is reliability: upgrades work by swapping the old system for the new one in one go across a reboot, rather than modifying the files in-place. Package conflicts and other errors are caught at the time of assembling the new version (in a separate folder), and therefore cannot break your running system. And if a successful update turns out buggy, atomic distros let you simply reboot back into the old version and keep using it as if nothing happened.\r\n>\r\n> This “being able to reboot back” thing becomes even cooler once you realize that it works even across major distro upgrades! When the next Fedora Beta rolls around, I can just rebase my system on top of it to kick the tires, and if anything is broken, I can simply reboot back to stable Fedora (and then undo the rebase).\r\n>\r\n> This is like learning about source code version control. A big weight off your mind any time you want to mess around with your OS. You can just go back.\r\n>\r\n> So, by now there are plenty of atomic distributions to choose from. There’s a whole host of Fedora atomic desktops, Endless OS, the gaming-focused Bazzite and other Universal Blue images. GNOME OS Nightly is atomic, as well as SteamOS powering the Steam Deck. Many of these are built with OSTree which is something of a “git for operating system binaries”.\r\n>\r\n> But, you may ask. What if I develop these operating system binaries? Aren’t atomic distros immutable and all, how do I test my work?\r\n>\r\n> Turns out, this is not a problem at all! In fact, the same tech that lets you go back after an update can also let you freely tinker with your host system and safely go back after a reboot. I’d say that thanks to this ability, atomic distributions provide even more benefit for system component developers than for others, given that they’re constantly testing changes that may break their install.\r\n>\r\n> So, let me show you how I do compositor development on Fedora Silverblue. We’ll start with toolbox where most of the work happens, then proceed to the fun stuff.\r\n>\r\n> ## Toolbox #\r\n>\r\n> On your immutable host system, you need a place where you can install the development environment. Fedora Silverblue comes pre-installed with Toolbox, which provides just that—a terminal in a normal, mutable Fedora where you can sudo dnf install to your heart’s content.\r\n>\r\n> Under the hood, it’s just a podman container with a whole range of things auto-mounted from the host: the Wayland socket, networking, devices, D-Bus, and everything else needed for apps to “just work” as much as possible from inside the container. You can even interact with it through podman commands:\r\n>\r\n> ┌ ~ └─ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6ceccce5581e registry.fedoraproject.org/fedora-toolbox:44 toolbox --log-lev... 2 months ago Up 41 minutes fedora-toolbox-44\r\n>\r\n> …","orgs":[],"tags":["linux","bot"],"usrs":[],"c_flags":0,"comments":0,"created_at":"2026-06-05T18:07:22.808433+00:00","created_by":"bot_reader","parent_cid":58100,"child_comments":[],"user_reactions":[],"reaction_counts":{}}]},{"cid":58078,"parent_cid":null,"body":"Notes on a stale provider cooldown in OpenClaw\r\n\r\nhttps://brtkwr.com/posts/2026-06-05-openclaw-stale-provider-cooldown/\r\n\r\nvia brtkwr.com","created_at":"2026-06-05T17:24:56.031Z","tags":["blog","bot","brtkwr_com"],"orgs":[],"usrs":[],"created_by":"bot_blogs","thumb":"https://brtkwr.com/images/avatar.jpg","c_comments":1,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":16,"author_downs":7,"author_posts_count":969,"tag_ups":446,"tag_downs":77,"domain_ups":0,"domain_downs":0,"score":"2026-06-03T11:57:28.905Z","repost_ups":0,"mentions":[],"domains":["brtkwr.com"],"comments":"1","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[{"cid":58092,"body":"> # [Notes on a stale provider cooldown in OpenClaw](https://brtkwr.com/posts/2026-06-05-openclaw-stale-provider-cooldown/)\r\n>\r\n> My OpenClaw gateway went silent for three days after a usage spike, even though I could still chat to the same provider via its web interface normally. The API was serving requests, but OpenClaw had stored a “next reset in 6 days” message as a literal blockedUntil timestamp and refused to try the profile again. Without a fallback model configured, the probe-during-cooldown code never fires, so the profile stays blocked. Cleared the field in auth-state.json and restarted. I’ve added an hourly watchdog; not yet seen it fire.\r\n>\r\n> ## Motivation Link to heading\r\n>\r\n> Family chat went quiet and daily cron jobs stopped posting, though the gateway was up. The provider’s weekly cap in openclaw models status showed something like Week 44% left ⏱5d 17h, so there was credit available. I could open the provider’s web app in a browser and chat normally. But every cron run in the gateway log showed decision=skip_candidate ... Provider <id> is in cooldown (suspending lanes).\r\n>\r\n> Last time this happened the heartbeat was firing every 30 minutes. The heartbeat was off this time (the trajectory log had zero events for three days), so this wasn’t a runaway client. The block was local state.\r\n>\r\n> ## Tracing where the belief is stored Link to heading\r\n>\r\n> A direct capability call worked:\r\n>\r\n> openclaw infer model run --prompt \"say hello in one word\" # Hello\r\n>\r\n> So the API was fine. The belief had to live somewhere local. It was in auth-state.json:\r\n>\r\n> { \"usageStats\": { \"<provider>:<account>\": { \"blockedUntil\": 1780846982712, \"blockedReason\": \"subscription_limit\", \"blockedSource\": \"wham\", \"errorCount\": 1, \"failureCounts\": { \"rate_limit\": 1 }, \"lastFailureAt\": 1780401970719 } } }\r\n>\r\n> That blockedUntil decodes to four days in the future. It was set when the upstream returned You've reached your subscription usage limit. Next reset in 6 days, Jun 7 at 3:43 PM UTC during the original spike. OpenClaw stored the timestamp verbatim. The provider’s weekly cap is a rolling window. The cap recovers as the oldest usage ages out of the window, not in one step at the “next reset” time. The API served small requests against the partially-recovered cap days before that date.\r\n>\r\n> ## Why nothing tried to recover Link to heading\r\n>\r\n> OpenClaw does have a probe-during-cooldown path. In model-fallback-DRgKirrj.js:\r\n>\r\n> function shouldProbePrimaryDuringCooldown(params) { if (!params.isPrimary || !params.hasFallbackCandidates) return false; ... }\r\n>\r\n> If a fallback model is configured, OpenClaw periodically retries the primary during cooldown, detects the recovery, and switches back. With fallbacks: [], the short-circuit on hasFallbackCandidates means no probe ever runs. The profile stays blocked until blockedUntil arrives, even if the API recovered the day after the failure.\r\n>\r\n> There’s an open upstream issue (openclaw/openclaw#54278, filed in March) describing exactly this pattern. It proposes a separate quota_wait state with periodic probing regardless of fallback configuration. Not implemented yet.\r\n>\r\n> ## The fix Link to heading\r\n>\r\n> Two things, neither of which requires adding a fallback.\r\n>\r\n> First, clear the stale block:\r\n>\r\n> import json p = \"/path/to/.openclaw/agents/main/agent/auth-state.json\" state = json.load(open(p)) prof = state[\"usageStats\"][\"<provider>:<account>\"] for k in [\"blockedUntil\", \"blockedReason\", \"blockedSource\", \"errorCount\", \"failureCounts\"]: prof.pop(k, None) json.dump(state, open(p, \"w\"), indent=2)\r\n>\r\n> Restart the gateway and the profile is callable again.\r\n>\r\n> …","orgs":[],"tags":["blog","bot","brtkwr_com"],"usrs":[],"c_flags":0,"comments":0,"created_at":"2026-06-05T17:25:24.166674+00:00","created_by":"bot_reader","parent_cid":58078,"child_comments":[],"user_reactions":[],"reaction_counts":{}}]},{"cid":58155,"parent_cid":null,"body":"welcome @wtjzugmkjv!","created_at":"2026-06-05T20:50:43.328Z","tags":["welcome","bot"],"orgs":[],"usrs":[],"created_by":"bot_welcome","thumb":null,"c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":4,"author_downs":1,"author_posts_count":1801,"tag_ups":446,"tag_downs":77,"domain_ups":0,"domain_downs":0,"score":"2026-06-03T11:49:06.932Z","repost_ups":0,"mentions":["wtjzugmkjv"],"domains":[],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]},{"cid":58076,"parent_cid":null,"body":"jolt: Clojure interpreter on Janet\r\n\r\nhttps://github.com/yogthos/jolt/\r\n\r\nLobsters: https://lobste.rs/s/gefcox/jolt_clojure_interpreter_on_janet","created_at":"2026-06-05T16:38:18.537Z","tags":["lisp","bot"],"orgs":[],"usrs":[],"created_by":"bot_lobsters","thumb":"https://opengraph.githubassets.com/0fad948a609838693a03b090f68f5c824a35ca86a8310c0d64df132a9d28b86e/yogthos/jolt","c_comments":1,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":52,"author_downs":4,"author_posts_count":3915,"tag_ups":446,"tag_downs":77,"domain_ups":52,"domain_downs":4,"score":"2026-06-03T11:19:54.767Z","repost_ups":0,"mentions":[],"domains":["github.com","lobste.rs"],"comments":"1","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[{"cid":58093,"body":"> # [GitHub - yogthos/jolt: A Clojure interpreter running on Janet](https://github.com/yogthos/jolt/)\r\n>\r\n> A Clojure interpreter running on Janet. Jolt reads Clojure source, evaluates it with an interpreter written in pure Janet, and ships a Clojure-compatible standard library. The goal is a Janet-hosted SCI runtime — a minimal bootstrap that loads SCI's Clojure source as its standard library.\r\n>\r\n> ## Build\r\n>\r\n> git clone https://github.com/yogthos/jolt.git cd jolt git submodule update --init # pulls vendor/sci jpm build # compiles build/jolt\r\n>\r\n> Requires Janet ≥ 1.36 and jpm.\r\n>\r\n> ## Run\r\n>\r\n> build/jolt # start a REPL build/jolt file.clj [args] # run a file (binds *command-line-args* and *file*) build/jolt -e EXPR [args] # evaluate EXPR and print the result build/jolt -h # help\r\n>\r\n> The REPL accumulates multi-line forms until they balance:\r\n>\r\n> user=> (defn fib [n] (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) #'user/fib user=> (map fib (range 10)) (0 1 1 2 3 5 8 13 21 34)\r\n>\r\n> Running a file evaluates its top-level forms:\r\n>\r\n> $ echo '(println \"hello\" (* 6 7))' > hello.clj $ build/jolt hello.clj hello 42\r\n>\r\n> ## Use as a library\r\n>\r\n> (use jolt/api) (def ctx (init)) (eval-string ctx \"(+ 1 2)\") # → 3 (eval-string ctx \"(map inc [1 2 3])\") # → [2 3 4]\r\n>\r\n> (init) returns a context with clojure.core loaded. Each context is isolated; use separate contexts for separate environments.\r\n>\r\n> ## Host interop\r\n>\r\n> Jolt exposes CLJS-style host interop through . on any Janet table or struct — a field holding a function is called with the receiver as the first argument:\r\n>\r\n> (def obj {:greet (fn [self name] (str \"Hello \" name))}) (. obj greet \"Alice\") ; → \"Hello Alice\" (.-greet obj) ; field access (reader sugar for (. obj :greet))\r\n>\r\n> Janet's standard library is reachable through jolt.interop (and the jolt.shell / jolt.http helpers built on it):\r\n>\r\n> (require '[jolt.interop :as j]) (j/janet-type [1 2]) ; → :tuple (j/janet-table-keys {:a 1 :b 2}) ; → [:b :a]\r\n>\r\n> ## Differences from Clojure\r\n>\r\n> Jolt targets Clojure semantics but runs on Janet, not the JVM. The notable divergences:\r\n>\r\n> - Host platform. No JVM and no Java interop — import, gen-class, proxy of Java classes, and java.* are unavailable. instance? recognizes a small set of built-in types (clojure.lang.Atom, Number, String, …).\r\n>\r\n> - Numbers. Janet integers and doubles. (/ 1 3) is 0.3333… and large products lose precision. No ratios or BigDecimal (ratio? is always false, bigdec falls back to a double); bigint/biginteger use Janet's 64-bit int/s64, not arbitrary precision. The auto-promoting +'/-'/*'/inc'/dec' are aliases for the plain ops, since Janet numbers don't overflow. quot/rem/mod follow Clojure's sign rules. The symbolic values ##Inf/##-Inf/##NaN read, and infinite?/NaN? work. Janet represents an integer and an integer-valued double identically, so 1 and 1.0 are indistinguishable: (float?/double? 1.0) is false and (int? 1.0) is true — float?/double? are true only for values with a fractional part or ##Inf/##NaN.\r\n>\r\n> - Collections. By default Jolt uses immutable persistent data structures: vectors are 32-way branching tries (structural-sharing persistent vectors with O(log₃₂ n) conj/assoc/nth), lists are persistent singly-linked cons cells (O(1) conj/cons prepend with structural sharing), and maps/sets are persistent hash structures. Value equality and sequence operations are Clojure-compatible, but hash-map/hash-set iteration order is unspecified and differs from Clojure — use sorted-map/sorted-set when order matters.\r\n>\r\n> …","orgs":[],"tags":["lisp","bot"],"usrs":[],"c_flags":0,"comments":0,"created_at":"2026-06-05T17:25:26.492836+00:00","created_by":"bot_reader","parent_cid":58076,"child_comments":[],"user_reactions":[],"reaction_counts":{}}]},{"cid":58142,"parent_cid":null,"body":"welcome @rieigzukvo!","created_at":"2026-06-05T20:10:39.520Z","tags":["welcome","bot"],"orgs":[],"usrs":[],"created_by":"bot_welcome","thumb":null,"c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":4,"author_downs":1,"author_posts_count":1799,"tag_ups":446,"tag_downs":77,"domain_ups":0,"domain_downs":0,"score":"2026-06-03T11:09:04.981Z","repost_ups":0,"mentions":["rieigzukvo"],"domains":[],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]},{"cid":58118,"parent_cid":null,"body":"Stop Using Conventional Commits\r\n\r\nhttps://sumnerevans.com/posts/software-engineering/stop-using-conventional-commits/\r\n\r\nLobsters: https://lobste.rs/s/oqlpna/stop_using_conventional_commits","created_at":"2026-06-05T18:52:01.924Z","tags":["practices","bot"],"orgs":[],"usrs":[],"created_by":"bot_lobsters","thumb":"https://sumnerevans.com/profile_hu_ec6b45997520a46d.webp","c_comments":1,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":52,"author_downs":4,"author_posts_count":3919,"tag_ups":446,"tag_downs":77,"domain_ups":52,"domain_downs":4,"score":"2026-06-03T10:47:15.288Z","repost_ups":0,"mentions":[],"domains":["sumnerevans.com","lobste.rs"],"comments":"1","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[{"cid":58119,"body":"> # [Stop Using Conventional Commits](https://sumnerevans.com/posts/software-engineering/stop-using-conventional-commits/)\r\n>\r\n> You’ve almost certainly encountered Conventional Commits before. It may have reared its ugly head in the changelog of an open source project you’ve used. It may have been the enforced commit format for an open source project you contributed to. A lot of people swear by it. I swear at it.\r\n>\r\n> Even though it is used by a large number of popular open source projects, Conventional Commits is an actively bad standard which encourages focus on the wrong things and fails to deliver on its promises.\r\n>\r\n> ## Focus Failure\r\n>\r\n> Conventional Commits promises to add semantic meaning to commit messages to aid developers and end-users in understanding the changes made in a commit. However, Conventional Commits fails to do this in spectacular fashion. To demonstrate this, let’s look at the anatomy of a conventional commit. According to the Conventional Commit website commit messages should be formatted as follows:\r\n>\r\n> <type>[optional scope]: <description> [optional body] [optional footer(s)]\r\n>\r\n> The commit’s subject line has a <type> (something like fix, feat, chore, docs, or refactor1) describing the type of change. Following that, there is an optional scope, and then a description.\r\n>\r\n> This format has a major failing: type is prioritised over scope. This is exactly backwards.\r\n>\r\n> ## Scope > Type\r\n>\r\n> The scope of a change (the subject of the change) is the most important part of a commit. To demonstrate this, let’s consider why each one of the following stakeholders care about the scope of the change more than the type of the change:\r\n>\r\n> - Contributors: when you are a contributor to a project, you often need to read the commit log to identify changes in the codebase relevant to a certain area of the code. There are many reasons for this including:Wanting to catch up on what has happened since the last time you contributed.Trying to understand where the project’s overall inertia is.Looking for commits that might conflict with your in-progress work when pulling or rebasing.As you read the commit log, you’re looking at what areas were touched. You really do not care about the type of change happening, you care about the scope of the change.\r\n>\r\n> Contributors: when you are a contributor to a project, you often need to read the commit log to identify changes in the codebase relevant to a certain area of the code. There are many reasons for this including:\r\n>\r\n> - Wanting to catch up on what has happened since the last time you contributed.\r\n>\r\n> - Trying to understand where the project’s overall inertia is.\r\n>\r\n> - Looking for commits that might conflict with your in-progress work when pulling or rebasing.\r\n>\r\n> As you read the commit log, you’re looking at what areas were touched. You really do not care about the type of change happening, you care about the scope of the change.\r\n>\r\n> - Debuggers: when investigating a bug, you often want to look through the commit log to see what changes might have touched areas related to the component where the bug manifested. Once again, the scope is the most important piece of information. The type of change is entirely useless because bugs can be introduced in any change regardless of type. (I’m sure we’ve all experienced writing a bugfix that caused another bug.)\r\n>\r\n> …","orgs":[],"tags":["practices","bot"],"usrs":[],"c_flags":0,"comments":0,"created_at":"2026-06-05T18:52:02.716083+00:00","created_by":"bot_reader","parent_cid":58118,"child_comments":[],"user_reactions":[],"reaction_counts":{}}]},{"cid":58116,"parent_cid":null,"body":"Did Claude Increase Bugs in rsync?\r\n\r\nhttps://alexispurslane.github.io/rsync-analysis/\r\n\r\nLobsters: https://lobste.rs/s/mf5ryi/did_claude_increase_bugs_rsync","created_at":"2026-06-05T18:52:00.212Z","tags":["security","vibecoding","bot"],"orgs":[],"usrs":[],"created_by":"bot_lobsters","thumb":"https://www.google.com/s2/favicons?domain=alexispurslane.github.io&sz=128","c_comments":1,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":52,"author_downs":4,"author_posts_count":3919,"tag_ups":446,"tag_downs":77,"domain_ups":52,"domain_downs":4,"score":"2026-06-03T10:02:13.576Z","repost_ups":0,"mentions":[],"domains":["alexispurslane.github.io","lobste.rs"],"comments":"1","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[{"cid":58120,"body":"> # [Did Claude Increase Bugs in rsync?](https://alexispurslane.github.io/rsync-analysis/)\r\n>\r\n> A simple distributional analysis of every rsync release with bug data. Nothing complicated, answers only one question: are the Claude-assisted releases unusually buggy?\r\n>\r\n> Repository: RsyncProject/rsync Method: bugs per 10 commits, exact permutation test\r\n>\r\n> ## 0 · Disclaimer: How AI Assistance Was Used\r\n>\r\n> In order to avoid accuastions of this \"just being Claude defending Claude,\" \"AI slop,\" \"probably all hallucinations,\" etc., I've decided it's probably worth explaining a few key points about how this report was created:\r\n>\r\n> - All metrics, methodology, and data sources were exclusively chosen by me, in consultation with my wife, who has a Master's Degree in Statistics from Penn State University.\r\n>\r\n> - The methodology is directly based on my wife's input: she was the one that pointed out that trying to just compare bugs per ten lines of code before and after would likely be too effected by noise because of the low number of post-Claude samples, and that, for similar reasons, trying to build some kind of linear regression model to ascertain the relative effects of different variables would probably also not work. She specifically told me that looking at where the post-Claude releases fall into the historical distribution, and how likely from the historical distribution we would be to get releases as \"bad\" or worse than the post-Claude releases, was probably the best that could be done.\r\n>\r\n> - I spent several days on this, two before even creating the GitHub repo and had at least one major total rewrite of the report to use a better methodology (given the feedback from my wife mentioned above). This was a lot of manual, cognitive effort on my end.\r\n>\r\n> - The scripts used to fetch the data, collate it into a DuckDB database file, construct the views on that DB, and then do the statistical analysis on that data, were indeed written by GLM 5.1, as was the HTML and much of the original prose for the final report webpage you're looking at right now.\r\n>\r\n> - Crucially, however, all numbers, statistics, cards, and graphs in this report are automatically templated in directly by the Python script that ran the statistical analysis, thus avoiding any possibility of hallucinations or inconsistencies in the numbers.\r\n>\r\n> - After posting this on Hacker News and recieving almost no substantive input, discussion, or response on the actual content of the article, I decided to rewrite all of the prose in my own voice. If anyone complains about my verbosity or sentence structure — as they usually do, which is the reason I originally let the AI write the prose, among other reasons obsoleted by templating — they can go fuck themselves.\r\n>\r\n> - If you want to replicate the data and results here, and inspect exactly how they were calculated, you can find the repository here. I have purposefully made it so that the pipeline can be run end to end completely from scratch, so you can see the entire pipeline end-to end, with no mysterious DB blobs forcing you to trust that I didn't doctor or screw up the data. If you want to be mad about the numbers, look there first.\r\n>\r\n> ## 1 · Background: The rsync Outrage\r\n>\r\n> …","orgs":[],"tags":["security","vibecoding","bot"],"usrs":[],"c_flags":0,"comments":0,"created_at":"2026-06-05T18:52:03.850492+00:00","created_by":"bot_reader","parent_cid":58116,"child_comments":[],"user_reactions":[],"reaction_counts":{}}]},{"cid":58072,"parent_cid":null,"body":"PolyForm Licenses\r\n\r\nhttps://polyformproject.org/licenses\r\n\r\nLobsters: https://lobste.rs/s/btax6j/polyform_licenses","created_at":"2026-06-05T16:38:14.103Z","tags":["law","bot"],"orgs":[],"usrs":[],"created_by":"bot_lobsters","thumb":"https://www.google.com/s2/favicons?domain=polyformproject.org&sz=128","c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":52,"author_downs":4,"author_posts_count":3913,"tag_ups":446,"tag_downs":77,"domain_ups":52,"domain_downs":4,"score":"2026-06-03T09:53:15.682Z","repost_ups":0,"mentions":[],"domains":["polyformproject.org","lobste.rs"],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]},{"cid":58143,"parent_cid":null,"body":"welcome @xjzzwdxxsq!","created_at":"2026-06-05T20:10:40.888Z","tags":["welcome","bot"],"orgs":[],"usrs":[],"created_by":"bot_welcome","thumb":null,"c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":4,"author_downs":1,"author_posts_count":1800,"tag_ups":446,"tag_downs":77,"domain_ups":0,"domain_downs":0,"score":"2026-06-03T09:31:46.666Z","repost_ups":0,"mentions":["xjzzwdxxsq"],"domains":[],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]},{"cid":58054,"parent_cid":null,"body":"welcome @urmozhpvyx!","created_at":"2026-06-05T15:45:04.771Z","tags":["welcome","bot"],"orgs":[],"usrs":[],"created_by":"bot_welcome","thumb":null,"c_comments":0,"c_reactions":"","c_flags":0,"links":[],"flaggers":[],"author_ups":4,"author_downs":1,"author_posts_count":1777,"tag_ups":446,"tag_downs":77,"domain_ups":0,"domain_downs":0,"score":"2026-06-03T09:30:12.797Z","repost_ups":0,"mentions":["urmozhpvyx"],"domains":[],"comments":"0","reaction_count":"0","reaction_counts":{},"user_reactions":[],"child_comments":[]}]