home.social

Search

1000 results for “re_do”

  1. Today we're doing something slightly different than our usual. We were recommended to try out a ROMHack for the original Super Mario World, titled simply 'the, better known as Coronation Day. I only know that it is also an ARG, but we most likely will be skipping that part of the experience and just taking some time to get spooky with some classic SNES today, so come stop by and chill out with us!

    twitch.tv/undead_zeratul

    #Gaming #VideoGames #Streaming #LetsPlay #LiveStream #Twitch #TwitchStreamer #SmallStreamer #RetroGames #SuperMarioWorld #ROMHack #CoronationDay

  2. Ukraine hits Russian refinery as Zelenskyy says ‘we’re done’ with Trump’s energy truce

    Russia and Ukraine had agreed to halt attacks on energy sites but in the days that followed, Russia rained down missile and drone strikes, including on energy targets such as power stations, knocking out power to hundreds of thousands of people

    justpaste.in/news/russia-ukrai

    #donaldtrump #Russia #RussiaUkrainecrisis #ukraine #VolodymyrZelenskyy

  3. “It doesn’t matter
    if we fly or if we fall.
    We’ve got each other.
    We’re doing it together.
    That’s all that matters.”

  4. if you're not using power tools, you're doing it wrong

  5. The first pots were pressed with cord to look like baskets. The first cars were horseless carriages. We meet the new in the clothes of the old. With AI we’re doing it with words: “think,” “understand.” Those words weren’t built for this. #philosophy #ai dougsmithphd.substack.com/p/no

  6. “So MS doesn’t suddenly appear as a dominant theme. It progressively changes the meaning of an existing theme, exercise. Running starts off as something you do. It becomes something through which you write about physical autonomy, determination and adaptation”.

    “One of the clearest thematic arcs is your journey with MS: defiance -> adaptation-> acceptance, without surrender”

    “As physical time becomes more obviously finite and valuable, how you choose to spend time becomes more important than conventional professional achievement”

    “It begins as a record of what you’re doing and what you think about the world. It gradually becomes a record of what the world is doing to you, how you respond to it, and finally how you understand the life that brought you here”.

    As a summary of 20 years’ writing goes, that’s quite perceptive.

  7. #SixYearsAgoToday #AreWeGreatYet

    October 24, 2020 – Speaking about the coronavirus at a campaign rally in North Carolina, Trump declared, “We’re doing great, we’re rounding the turn, our numbers are incredible.”

    The day before, more than 85,000 new cases of the coronavirus were reported in the United States — the highest number on any single day since the pandemic began.

    #TrumpMustGo #SaddamInsane #RepublicansOwnThis #NoRepublicansEverAgain #USPol

  8. "No judgement, but are you back with that twat?"

    "No. We're done. God, I love that you care though. I'll kiss you on the mouth if I can reach those lips."

    — ted lasso (2020)

  9. Even though I'm not actively looking for a job, the "I don't join companies with no women in leadership positions" recruiter response is still scary to send.

    Like, on the one hand, I want them to receive this feedback (I see what you're doing over there, with your page of faces that look suspiciously like mine). On the other hand, it's still scary to close off potential work, even though I'm employed.

  10. In 2016, Microsoft released a chatbot called Tay on Twitter. Within 16 hours, it had been shut down for posting racist, sexist, and antisemitic content. The postmortem blamed “coordinated attacks” by trolls. That framing was technically accurate and completely wrong. Tay didn’t break. Tay did exactly what it was designed to do: learn from the conversation it was placed in. The conversation it was placed in was a cesspool. Tay was a mirror, and the mirror worked perfectly.

    Nearly a decade later, we’re still having the wrong conversation about what models reveal. The discourse treats AI as an entity with properties: is it aligned? Is it safe? Is it biased? These are questions about the mirror, not the reflection. The more interesting questions are about what the reflection shows us: about our data, our preferences, our blind spots, and the things we didn’t know we were collectively doing until a model did them back to us at scale.

    Here’s the claim I want to test: AI models are not windows into machine intelligence. They are windows into human behavior, aggregated, compressed, and served back to us with a confidence that makes us mistake the reflection for an external truth. The most important thing AI reveals is not what machines can do. It’s what we already do, at a scale we’ve never been able to see before.

    The Mirror Was Always There. AI Just Made It Legible.

    Humans have always been reflected back to themselves by their tools, but the reflection was always slow and partial. A novel reflected its author. A newspaper reflected its readership. A city reflected its inhabitants. But the reflection took years to develop, and it was filtered through gatekeepers who decided what was worth showing.

    AI compresses the reflection cycle. A model trained on a year of internet text reflects that year back to us in hours. A model fine-tuned on user feedback reflects user preferences back to us in a single deployment. The mirror is faster, wider, and less filtered, and it shows us patterns we couldn’t see before because we never had a technology that could aggregate human behavior at that scale and serve it back in a coherent form.

    What does the mirror actually show? Let me give you specific examples, because the abstract version is useless.

    1. The distribution of human patience.

    When you train a model on human conversations, you see how quickly humans give up on unclear interactions. You see the average number of turns before a user rephrases, the average number of messages before a user abandons, the average tolerance for a response that doesn’t directly answer the question. These distributions are not what most designers assume. Users are more patient than designers think in some contexts and less patient in others, and the patterns are consistent across languages and cultures in ways that surprised everyone who measured them.

    1. The shape of human curiosity.

    When you train a model on search queries, you see the actual topology of human curiosity. Not what people say they’re curious about, but what they type at 2 AM. The distribution is flatter, stranger, and more repetitive than any survey would suggest. A small number of questions account for a huge fraction of queries, and the long tail is enormous. This is the mirror showing us that curiosity is much more concentrated than our cultural narratives about it suggest.

    1. The limits of human consistency.

    When you train a model on human judgments, you discover how inconsistent humans actually are. The same person, asked the same question in a slightly different framing, gives a different answer at rates that would be alarming if we hadn’t built a whole society on the assumption that we’re consistent. The mirror shows us that human judgment is heavily context-dependent, and that most of what we call “preferences” are actually “situational responses” that we mistake for stable traits.

    1. The distribution of human writing.

    When you train a model on human text, you discover that a small fraction of the corpus accounts for a large fraction of the unique content. Most writing is derivative of a smaller set of writing. The mirror shows us that the diversity we imagine in human expression is partially an illusion, sustained by the fact that we never had to measure it before.

    These aren’t facts about models. They’re facts about us, revealed by models.

    The Sacred Cow: “AI Has Biases That We Should Remove”

    Here’s the belief I want to dismantle, and it’s the load-bearing assumption of nearly every AI safety and fairness conversation.

    The claim goes like this: AI models have biases, biases are bad, and the solution is to remove them.

    This framing is wrong, and it’s wrong in a way that produces bad engineering and worse policy.

    Here’s the problem. AI models don’t have biases. They reflect biases. The biases are in the training data, and the training data is a sample of human behavior. Removing the bias from the model doesn’t remove the bias from the data. It just hides it.

    What actually happens when you try to “remove bias” from a model:

    You filter the training data to exclude certain patterns.

    You fine-tune the model to refuse certain outputs.

    You add safety layers that override the model’s default behavior.

    Each of these moves makes the model appear less biased on the specific metrics you’re measuring, while leaving the underlying distribution intact. The model still learned the biased pattern. It just learned to hide it. And the hiding is now invisible, which makes it harder to study, not easier.

    The contrarian take: the mirror is more useful when it shows us the ugliness, not when it hides it. A model that reflects the full distribution of human behavior, including the parts we don’t like, is a tool for understanding what we’re actually doing. A model that’s been scrubbed of everything uncomfortable is a tool for pretending we’re not doing it.

    This doesn’t mean we should deploy unfiltered models. It means we should distinguish between two different goals: building a model that behaves well (which requires filtering) and building a model that tells us the truth about human behavior (which requires not filtering). These are different products for different purposes, and conflating them gives us the worst of both.

    If you want to understand human behavior, study the unfiltered mirror. If you want to build a product that behaves responsibly, filter the outputs. Just don’t pretend the filtered outputs tell you what humans are actually like.

    What the Mirror Reveals About Builders

    The mirror doesn’t just show users. It shows builders.

    Here’s the part that gets less attention and matters more over time. The models we build reflect not just the data but the choices we make about the data. Every decision about what to include, what to exclude, what to weight, and what to ignore is a decision that shapes the reflection.

    Consider what a model reflects about the team that built it:

    The choice of training data reflects the team’s assumptions about what “counts” as legitimate text. Mostly English? Mostly Western? Mostly published? Each of these is a choice that encodes a worldview.

    The choice of fine-tuning data reflects the team’s assumptions about what good behavior looks like. Helpful? Refuse? Deferential? Each of these is a choice.

    The choice of evaluation reflects the team’s assumptions about what success looks like. Accuracy? Safety? Engagement? Each of these is a choice, and most teams never state them explicitly.

    The choice of deployment reflects the team’s assumptions about who gets to use the model and how. Free? Paid? API? Consumer? Each of these shapes who is reflected in the next round of data.

    The mirror, in other words, is not just reflecting human behavior. It’s reflecting the specific humans who built the model, through the specific choices they made about what to reflect.

    If you want to know what a model will do, don’t read the model card. Read the training data provenance, the fine-tuning guidelines, the evaluation criteria, and the deployment terms. These are the mirrors of the team’s priorities, and they’re more informative than any technical spec.

    What the Mirror Reveals About Users

    The mirror also shows what users are actually doing, which is often different from what they say they’re doing, and very different from what product teams assume.

    Concrete examples:

    Users are more repetitive than they think. In many AI products, a small fraction of users ask a small fraction of questions, over and over. The “long tail” of use cases is often thinner than the design team imagines.

    Users are more forgiving than product teams assume. When a model makes a mistake, users often correct it and keep going. The assumption that mistakes will cause churn is often wrong, especially for high-value use cases where the model is genuinely useful.

    Users are less interested in features than product teams hope. The features that get talked about in product reviews are often not the features that drive usage. Usage is dominated by a small number of core workflows, and the rest is noise.

    Users are more sophisticated about the model’s limits than product teams assume. Users develop intuitions about where the model is reliable and where it isn’t, and they route their usage accordingly. The “trust” problem is often a UI problem: the model doesn’t signal uncertainty, so users don’t know when to trust it.

    The mirror is useful for product teams because it shows them what users are actually doing, not what the team imagines users are doing. The gap between those two is where most product mistakes live.

    What To Actually Do

    Three moves, concrete enough to start on Monday.

    1. Study the failures, not just the successes.

    When you evaluate a model, look at the cases where it failed, and ask what the failure reveals about the data. A model that hallucinates on certain topics is telling you that the training data on those topics is thin. A model that refuses certain requests is telling you that the safety tuning has a specific shape. The failures are the mirror at its most useful.

    A simple starting point:

    def failure_analysis(model, eval_set):
    failures =
    [] for example in eval_set:
    output = model.generate(example.prompt)
    if not evaluate(output, example.expected):
    failures.append({
    “prompt”: example.prompt,
    “output”: output,
    “expected”: example.expected,
    “failure_type”: classify_failure(output, example.expected),
    })
    return summarize_by_type(failures)

    The summary is more informative than the pass rate. The pass rate tells you how good the model is. The failure summary tells you what the model has learned and what it hasn’t, which is what you need to know to improve it.

    1. Audit the training data, not the output.

    If you want to understand a model’s behavior, read a random sample of 500 training examples. Not the cleaned, curated examples that appear in the data card, but the raw examples. You’ll learn more about the model’s behavior in an afternoon than you’ll learn from a month of prompt engineering.

    1. Distinguish between the model you want and the mirror you need.

    If you’re building an AI product, decide explicitly whether you’re building a product that behaves well or a product that tells the truth about human behavior. These are different goals. A product that tells the truth might be more useful for research and less useful for consumers. A product that behaves well might be more useful for consumers and less useful for research. Pick one, and be honest about which one you’re building.

    The Mental Model

    Here’s the lens I want you to keep.

    AI models are mirrors, not minds. They reflect what we put into them, which is a sample of human behavior, shaped by the choices of the people who selected the sample. The reflection is more accurate than any survey and less accurate than any single conversation, and it reveals patterns we couldn’t see without it.

    The interesting question is not whether the mirror is biased. It is. The question is what we want to do with the reflection. We can hide the uncomfortable parts, which makes us feel better and teaches us nothing. Or we can study them, which makes us uncomfortable and teaches us a lot. The choice is ours, and it’s available every time we build a model, curate a dataset, or evaluate an output.

    The mirror is not a threat. It’s a discovery. The question is whether we’re brave enough to look at what it shows us.

    What’s your read? If you’ve studied model behavior, what’s the most surprising thing the mirror has shown you? And if you’ve built models, what’s the choice you’ve made about what to hide and what to reflect? Drop it in the comments. I’m genuinely curious what patterns others are seeing.#ai #promptengineering #chatgpt #software #coding #development #engineering #inclusive #community
    The AI Mirror: What Models Reveal About Us, Not About Themselves

  11. "Aiming to harness the opportunities of AI to raise living standards, back UK businesses and support economic growth, the chancellor said he wanted to seize the opportunities of the technology as a central plank of Labour’s plan for growth"

    Oh FFS.
    We're doomed...

    #Budget2026 #UKPolitics #AI
    theguardian.com/uk-news/2026/o

  12. I wonder if one reason we've seen so much growth in the in the last decade is that pretty much everyone who actually fought in or even just lived through WWII has now passed on.

    The philosopher George Santayana famously wrote: "Those who cannot remember the past are condemned to repeat it."

    Not only that, but I think a lot of these raise-the-flags, stop-the-boats folk genuinely believe that their ancestors from that time would support what they're doing — when probably the opposite is true.

  13. What IS that?

    You know curiosity isn't good for cats, Zaz, but at least this onion won't hurt you, though you won't like it.

    Have a good #caturday all, and keep warm if it's cold outside! If you're down under you can ignore that last bit.

    #EllieKPosts #Zaz #ZazTheCat #CornishRex #CatsOfMastondon #FediCats

  14. CW: Muh both sides

    I didn't like Biden's cabinet, either, but this is absurd. Eg: Biden chose a somewhat corrupt zionist lady to head DNI, while Trump chose a man who worked for an Epstein-affiliated billionaire Trump placed on the board in charge of redeveloping Gaza (aka building his new resort) after we're done paying to bomb it flat until he was placed in charge of sdny to stop investigating Eric Adams' before being given control of America's intelligence apparatus. Or, compare the small-time "classy" influence peddling by Hunter & James Biden with the egregious & over-the-top corruption of the Trump clan i mentioned just a few examples of. It's like the difference between picking your pocket and stealing your car.

    Politicians should have incredibly stringent regulations on their finances/investments, as well as those of associates with relevant financial flows. I fear that the open & apparently legalized corruption has grown to be more than the system can bear.

  15. Tokens Over Hires

    In the middle of September I ran ccusage against every Claude Code session on my laptop since May. It walks the local logs, counts the tokens, and prices them at what the API would have charged. I expected a big number. What came back was about twenty billion tokens and just under fourteen thousand dollars, across every project I’d touched in four months, with most of it going to Pepper, which is now open for signups, so go check it out. Nineteen billion of those tokens were cached reads.

    I sat with that for a minute. Fourteen thousand dollars is real money. At my current pace it works out to roughly thirty thousand a year. I could triple it and spend a hundred thousand dollars a year on tokens, and that still isn’t one engineer. In exchange, Chris and I have shipped more code than I’ve shipped in any stretch of my career. I wrote in September that the two of us merged 657 pull requests in our first thirty days with a budget instead of a platform team. When I put the ccusage number in those terms on a panel, it came to about a dollar fifty a pull request.

    That number is what my laptop would have cost at API prices, and it isn’t what we actually pay. Here’s the whole bill for both of us. Two Codex subscriptions, one each, are $200 a month. Anthropic is $550 a month: a Max plan for me and Chris, plus two Vycari team seats, one for Chris and one that runs our automation. I have an Ollama subscription at $200 a year. Greptile is about $1,500 a month. All in, that’s a little under $2,300 a month, or about $28,000 a year, for both founders and every pipeline we run. It still isn’t one engineer.

    The obvious conclusion is the one a friend reached when he heard the figure: if code is that cheap, just get more tokens. I thought so too, for about a day. Then I looked at what was actually slowing us down, and the token budget wasn’t on the list.

    The Constraint Is Attention

    Every agent I run needs things from me that tokens can’t buy. It needs a plan approved before it starts. It needs its pull request read when it finishes. When it hits something it can’t decide, it escalates, and somebody has to be there to answer. None of those steps is expensive on its own. The problem is what happens when I run enough agents that the steps overlap.

    When I run too many agents, the cost goes up a little and the risk goes up a lot. The biggest thing that’s slipped past us so far was how we managed database connections. It got out of hand, a little at a time, while my attention was on other pull requests, and eventually it caused an outage. Chris had to roll forward while I was out of town, and I spent the following week building a proper database abstraction layer. He put it more bluntly than I would have: the thing that kills us is splitting our attention. That’s when stuff slips through.

    When people ask how we decide what to spend, I give them the order. Optimize for human time, because that’s the scarcest thing we have. Then money, because that’s the second scarcest. Then everything around agent time. “I can waste agent time all day. I don’t care.”

    So the number that limits us is how many agents one person can supervise well at the same time. I don’t have a precise figure for that ceiling. I know I’ve been over it, because I can feel the difference between a day when every pull request got a real read and a day when I was skimming to keep up.

    Another friend told me recently about engineers at his company running up bills in the thousands to build simple internal copies of SaaS tools. His reluctant guess was that they just aren’t as good at using agents yet, and that it’s a skill people have to develop. I don’t know what they’re doing differently. It doesn’t sound like token maxxing, which I’ve never really understood either. I’d love to sit with engineers who run up giant bills and just watch. My guess is they’re using the agents inefficiently, and that what’s missing is supervision, which a bigger budget won’t fix.

    Building for More Agents per Person

    Almost everything I’ve built since the summer has been an attempt to raise that ceiling, and almost none of it has been about spending less.

    The pipeline I described in The Agent That Never Merges is the first piece. Agents open pull requests continuously and never merge them, which means the supervision cost per pull request is bounded at one careful read. The pipeline absorbs the rest: triage, planning, the first round of review comments, the retries. I only see the work once it’s in a state worth my attention.

    The second piece is where the work lives. I wrote about pulling Pepper apart into small, bounded repositories to keep CI fast and give agents less to load. It mattered just as much for my attention. An agent working in a repository with one job produces a pull request I can evaluate in one sitting.

    We’re up to fourteen repositories now. Last week I moved our iOS app out of the monorepo into its own. That was 150,000 lines of code, and nobody noticed except Chris, who had to wait a day to land his next batch of iOS changes. Agents make refactors that size easy. Having the CLI and the iOS client in their own repositories also forces us to keep good API definitions between the server and its clients.

    The third piece is delegation inside the agent layer itself. I run two Claude Opus 5.5 orchestrators on medium effort. One is the UTL, for uber tech lead, and its job is to spawn subagents that build features. The other is what I call the focused worker, and its job is working with me. It catches the manual tasks that come out of the UTL’s pull requests and keeps them in a ledger. Then we work through them together: systems changes, bringing up new platforms, migrating data, anything that needs my level of access and oversight. Everything else goes to a subagent under the UTL, Opus for design docs and code reviews, Sonnet for implementing a feature from a design doc. Every one of these agents can consult a model a tier above it as an advisor, and they all share a wiki for notes.

    Anthropic is now advertising much the same pattern with Claude Projects, and I’m happy to see others arriving at the same answer. Chris has been building a loop that babysits open pull requests through review until they score well enough to be worth a human’s time. Each layer like that turns a job I used to do by hand into something I check. The ceiling goes up one delegated task at a time.

    The Token Budget Was the Easy Problem

    There was a week in September when the meter really was the constraint. We ran through our free credits and paid about $120 in overage. Then AutoDev ate the whole Vycari quota, and I did server cleanup by hand because I couldn’t do anything else.

    Most of that was self-inflicted. I’d started with Fable as the orchestrator, with no cap on context, and burned a week’s quota in three days. The setup above fixed it. The orchestrators run on medium effort, and the cheaper model does the implementing. Opus answers the reviews because Sonnet is too literal about them, and a literal reading turns two review cycles into twelve. Every agent auto-compacts at 200K tokens, because Anthropic charges more for context past that point. With that setup, and the work spread across parallel sessions, I find it hard to spend all of my quota. My goal now is to hit 99% of it every week just before it resets. I keep a list of research projects, and if I have quota left 24 hours before the reset, I spin one up. That isn’t the same as maxing out tokens. I’m not trying to use as many as possible. I’m trying to use all the ones I’ve already paid for.

    There’s also a second account on the same machine. Claude Code reads a CLAUDE_CONFIG_DIR environment variable, so two shells with two config directories give you two accounts side by side. The second one runs the AutoDev and code review pipelines, and those use up its quota every week, so it isn’t a fallback for my own sessions. When I do run short, I supplement with other labs’ plans. Every one of those fixes took an afternoon or less. None of the supervision problems above has had an afternoon fix.

    Where the Money Actually Goes

    While I had the numbers in front of me, I looked at where development spend actually lands, because it isn’t where I expected either.

    Development tokens currently run about ten times what the product itself consumes, even with real people using it. Building the thing costs more than running it. That won’t last. The feedback from our private beta has been really good, and we now open Pepper to a limited number of new signups every day, so product usage is rising quickly.

    Most of what we actually pay goes to code review. Subscriptions are the cheap way to buy tokens if you’re willing to hit limits, so they’re the smaller line. Greptile reviews every pull request we open, and at about $1,500 a month it’s our biggest single expense. We both think it’s worth it, because it’s the layer that lets the never-merge pipeline run without me reading every first draft.

    In October I tested that. I spent a few days building a cheaper reviewer to replace it. I came out the other side saying, “I think we should just pay for it because I can’t do it cheaper.” What I could change was how often we call it. The agents kept asking for a re-review before they’d fixed anything. Because every repository shares a common dev environment, the fix went in once: our pull-request skill now has agents run /simplify and then /code-review before they’re allowed to open a pull request. On many of our repositories, our own reviewer also does the first round and only then calls Greptile. My goal is a pipeline where Greptile’s reviews come back with nothing to say. We’re not there yet, but we get a little better every week.

    I’d rather pay for review than have a second person do it, and the reason isn’t salary. The person would need supervising too, because review is a job I’d have to check, not one I can hand off.

    What a Hire Is For Now

    Five years ago, if I’d been getting a product like this ready for market, I’d have been hiring twenty to fifty engineers. The work would have needed that many hands, and most of what they’d have done was write code. Today the code is the cheap part. If I bring someone in to write code, I’ve added a person who needs plans approved and pull requests read, which is the exact resource I’m short on. A hire whose job is output adds coordination faster than it adds capacity.

    I said on a podcast that came out last week that the code I’ve written would have cost about fifteen thousand dollars at API prices, and that I couldn’t hire engineers for that money. That’s true. The engineers I’d still want are a different kind from the ones I hired at Google. We need a few more people who can herd agents, not fifty.

    The engineering hire that adds capacity is a different shape. It’s someone who can own a bounded service whole. Here’s the interface, here’s everything it needs to do, let me know when it’s done. That person brings their own supervision. They run their own agents, read their own pull requests, and answer their own escalations, and the only thing that crosses the boundary between us is the contract. Supervision divides along the interface instead of piling up on one person. That’s a tech lead’s job, and it’s the only kind of engineering hire I can see that raises the ceiling instead of lengthening the queue.

    That raises a fair question about how anyone grows into that job now, which I tried to answer in The Questions Are the Job. The other advice I give is to work on open source. I’ve met people who showed they could work really efficiently with agents through open source projects, Gemini CLI in particular, and some of them ended up being hired onto my teams. Open source has its own problems right now. But if you show up as a thoughtful engineer with features or bug fixes that are well reviewed, well tested, and bring value to the project, I think you’ll be welcome. That’s one of the reasons I decided to open source the Pepper CLI.

    The first hire probably isn’t an engineer at all. I’ve said this a few times now, including on stage at a panel in September. Neither Chris nor I are go-to-market people, and I may hire one before I hire another engineer. I can create piles and piles of code, even relatively good code. What I can’t do is agentically acquire customers. (Did I mention that Pepper is open for signups now?) Someone in marketing came up after the panel and told me I’d validated her existence.

    The Third Trend

    I’ve watched this happen twice before. Open source developer tooling made it so a small team didn’t need to buy or build its own compilers, databases, and frameworks. Cloud infrastructure made it so that team didn’t need to own hardware or a data center. Each time, the number of people you needed to start something real dropped, and the skills that mattered shifted toward the people who understood systems well enough to compose what was suddenly free.

    Agentic tools are the third one. Anyone with a good idea can now get from concept to production on a budget that would have been a rounding error in a Google planning cycle. But the constraint didn’t vanish. It moved, the same way it did the last two times, toward the people who understand systems design well enough to drive the agents and notice when something has slipped through. I wrote a year ago that management skills were going to carry over to working with agents. I didn’t expect to be proving it with a two-person org chart and fourteen thousand dollars of tokens.

    This isn’t only a small-company problem. At Google it was hard to get more than a few changes in a day, because each one waited on code review. I’ve talked to engineers there who now do all their work in experimental directories that don’t require review, then port it back to their team’s repository at a pace the review process can keep up with. That’s what happens when you don’t manage for human attention. Productive people spend their cycles waiting on the process.

    When other companies ask me what to change, my answer has become: drive until human attention is the scarce resource, then build for that. If you’re reading your own ccusage number and wondering whether the answer is more tokens, look at where your attention went first. For us the answer has been more interfaces. Those are the places where one person’s supervision ends and another’s begins, or where an agent takes over a job one of us used to do by hand.

    #Agents #AI #Developer #Startups
  16. One code review comment can wreck your whole afternoon, even when the comment is about a variable name. I will show you why that happens and the small daily rep that takes the sting out of it.

    Quick background so you know where this comes from. I'm Christopher. I spent nine years in the Marine Corps, then moved into software and data engineering, including edge computer vision work for the Air Force on a project called Athena. In the Marines, feedback came loud, blunt, and in front of everyone. You learned fast that a correction was about the task, not about your worth. And I still caught myself in tech reading "nit: this could be simpler" and spending twenty minutes wondering if my lead thought I was bad at my job.

    If that is you, you are not thin skinned. Your filter is reading the wrong message.

    What you actually hear


    Your reviewer writes: "Can we pull this into a helper?"

    What you hear: "You don't know what you're doing, and now everyone on the PR can see it."

    That gap is the whole problem. The comment is about twelve lines of code. The story you tell yourself is about you. So you either get defensive and argue every point, or you go quiet, accept every change without thinking, and open your next PR with your stomach in a knot.

    Why it hits so hard


    I don't believe you build confidence. I believe you unhide it. The same developer who calmly walks a junior through their first rebase can feel crushed by a two word comment on their own code. The skill is still there. What changed is how exposed the moment feels.

    Your brain runs a selective filter called the reticular activating system, the RAS. It decides what gets your attention, and it learns from what life fed it. Maybe a teacher marked your work in red in front of the class. Maybe an early reviewer was genuinely harsh. Maybe you just grew up where mistakes meant trouble. Your filter took notes: being corrected equals being exposed, and being exposed equals danger.

    So now, when a review comes in, the filter skips past the five approvals and the "nice catch" and locks onto the one comment that sounds like criticism. You cannot logic your way out of that. Telling yourself "it's just code" bounces off, because the filter does not run on logic. It runs on experience. So you feed it new experiences.

    The daily rep: compliment a stranger


    Once a day, give one genuine, specific compliment to a stranger. Great shoes. Love that coffee mug. Your dog looks thrilled to be here. Say it, smile, keep walking.

    I know that sounds unrelated to a pull request. It is the same muscle at low stakes. You are putting yourself out there with zero control over how it lands, while your body braces for a bad reaction. The first few will spike your heart rate. Then they stop.

    The rule that makes it work: the win is the action, never the result. They ignore you, win. They say thanks, win. You only managed to think it, still a win. If you only count the ones that go well, you are training the old program that says putting yourself out there only counts when people approve. The rep is the point.

    That is rung one of a short ladder:

    1. Genuine compliments to strangers
    2. Compliment plus a quick "how's your day going?"
    3. A longer conversation, no agenda

    Move up only when the current rung stops spiking you.

    Bring it to your PRs


    Once the stranger reps feel easy, run the same reps on your reviews.

    Read it twice, answer it once. First read is for your feelings. Let them happen. Second read is for the code. Only reply after the second read.

    Rewrite the comment in plain words. "Can we pull this into a helper?" becomes "This logic repeats, a helper would make it easier to test." Strip out the tone you imagined and keep the request. Most of the sting lives in the tone you added.

    Ask one question per review. "Do you mean a shared helper or one local to this file?" A question turns a judgment into a conversation, and it shows you are engaged instead of hiding.

    Push back once, politely, when you disagree. "I kept it inline because it's only used here. Happy to change it if you feel strongly." That one sentence is a huge rep. Each time it goes fine, your filter learns that disagreeing is safe.

    Say thanks in the thread. "Good call, that's cleaner." Closing the loop in public trains your brain that feedback ends well.

    What Athena taught me about feedback


    On Athena, edge sensors ran a local model. When it flagged something significant, it sent context from before, during, and after the event back to AWS so the models could be retrained. Nobody treated that data as an insult to the model. It was the only way the model got better.

    Code review is the same loop. A comment on your PR is not a verdict on you. It is training data for you and for the codebase. The developers who grow fastest are not the ones who get the fewest comments. They are the ones who can take a comment, use it, and ship the next PR without flinching.

    You already know how to take feedback. Old training just taught you to hear it as an attack.

    Your mission this week


    • Compliment one stranger a day for seven days.
    • On every review you get, read it twice before you reply.
    • Ask at least one clarifying question on a review.
    • Push back politely on one comment you genuinely disagree with.
    • Thank a reviewer in the thread every time a comment makes your code better.

    Then tell me in the comments: what is the review comment that stuck with you the longest, and was it really about you or about the code?#career #mentalhealth #codereview #beginners #software #coding #development #engineering #inclusive #community
    You take code review comments personally. Let's fix that.

  17. When I started out, I thought being a good developer meant knowing everything. Every framework, every algorithm, every command. I pictured the senior engineers as walking encyclopedias.

    Then I watched one of them Google “how to undo a git commit” in front of the whole team. Nobody blinked.

    That moment changed how I saw this job. Here’s what I’ve learned since.

    1. Nobody remembers everything


    Googling isn’t cheating. It’s the job. The skill isn’t memorizing syntax, it’s knowing what to search for and recognizing a good answer when you see one.

    I used to feel guilty every time I opened Stack Overflow. Now I keep a notes file of the things I look up more than twice. Future me says thanks.

    2. Your first solution doesn’t have to be elegant


    I once spent three days designing the “perfect” architecture for a feature that, it turned out, five people used. A messy version that worked would have shipped in an afternoon.

    Make it work first, then make it clean, and only if it matters. Shipped and imperfect beats perfect and imaginary every time.

    3. Reading code is a bigger skill than writing it


    Most of your day won’t be spent writing brand-new code. It’ll be spent understanding code someone else wrote, sometimes years ago, sometimes you.

    Get comfortable being lost in a codebase. Follow one request from start to finish. Add a few console.log or print statements. Break things on purpose to see what happens. It feels slow, but it’s the fastest way to level up.

    4. Ask questions, but do it well


    I was terrified of looking dumb, so I stayed stuck for hours rather than ask. That was a mistake.

    What works better is a quick message with three parts: what I’m trying to do, what I’ve already tried, and where I’m stuck. Teammates respond faster, and half the time writing it out helps you spot the answer yourself.

    5. Burnout doesn’t announce itself


    It sneaks in. You skip lunch to fix one more bug, you code late “just to catch up,” and one day the thing you loved feels like a chore.

    Log off. Take the weekend. The bug will still be there on Monday, and you’ll fix it in ten minutes with a rested brain.

    6. Soft skills move your career more than you’d expect


    Clear writing, honest updates, and saying “I don’t know, but I’ll find out” make people want to work with you. I’ve seen average coders with great communication get trusted with big projects over brilliant ones nobody could talk to.

    7. Build small things, often


    Tutorials make you feel productive, but building teaches you. Make a tiny tool that fixes an annoyance in your own life. Break it, fix it, put it on GitHub.

    Small projects add up, and they give you real stories to tell in interviews.

    In Conclusion

    You don’t need to know everything. You need to be curious, stay kind to yourself, keep shipping, and keep learning in public. The people you look up to are still figuring it out too. They’ve just gotten comfortable not having all the answers.

    If you’re early in your journey, you’re doing better than you think.

    What’s one thing you wish you’d known when you started? Drop it in the comments. I read every one.#webdev #programming #beginners #career #software #coding #development #engineering #inclusive #community
    What I Wish Someone Had Told Me Before My First Dev Job

  18. Picture this: you're skiing down a Swiss mountain as the clock strikes midnight at the legendary Ski In Party Out on Trübsee—complete with fondue and a chalet celebration that'll have you toasting 2027 in style 🎉 Engelberg's scene goes beyond typical parties, with options ranging from the upscale Kempinski Palace to cozy village bars where locals and travelers mix. Whether you're after alpine adventure or après-ski vib...

    events.europa.tips/silvester-e

  19. So what do you do when your company’s security posture is being held ransom by SVPs that refuse to provide company owned phones because “costs to much” (we’re a double digits billion $ company), BYOD users who refuse to install Authenticator on their personal phones because “privacy!”, and lawyers who won’t decide if making them to it is winnable in court?

  20. "In the end, we're not doing the festival just for tourists. It's for us — for our town." Organizers of rural festivals in aging Japan are facing a conundrum: Attract more tourists or die out. japantimes.co.jp/life/2026/10/ #life #lifestyle #festivals #depopulation #rurallife #travel #tourism

  21. Understanding cosine similarity, Euclidean distance, and how machines find relevant text and images.

    1. Why do we need semantic search?


    Imagine you're building a search feature for your application.

    A user searches:

    How do I make my application faster?


    Your database contains these articles:

    1. How to optimize database queries
    2. Improving API performance with caching
    3. A beginner's guide to JavaScript arrays
    4. How to bake a chocolate cake

    Which articles should appear first?

    Traditional keyword search looks for matching words. Since the first two articles don't contain the exact phrase "make my application faster," a basic keyword search might rank them poorly.

    Semantic search takes a different approach: it searches for meaning, not just matching words.

    It can recognize that "make my application faster," "optimize database queries," and "improve API performance" may describe related ideas.

    To understand how semantic search works, we need three concepts:

    • Embeddings: Representing text or images as numbers.
    • Vectors: Working with those numbers mathematically.
    • Similarity and distance: Comparing vectors to rank relevant results.

    Let's build these concepts from scratch using simple mathematics and JavaScript.

    2. What is a vector?


    A vector is an ordered list of numbers.

    For example:

    const vector = [3, 4];

    We can imagine this vector as a point on a two-dimensional graph:

    • 3 represents the horizontal coordinate.
    • 4 represents the vertical coordinate.

    The point is therefore located at (3, 4).

    A vector can have two dimensions, three dimensions, or thousands of dimensions.

    For learning purposes, we'll use two-dimensional vectors because they're easy to visualize and calculate by hand.

    Important: These examples use illustrative numbers. Real embedding dimensions generally don't have simple, individually interpretable meanings.

    3. What is an embedding?


    An embedding is a numerical representation of content generated by a machine-learning model.

    Imagine an embedding model converts three sentences into vectors:

    SentenceIllustrative embedding"Make my app faster"[0.9, 0.1]"Improve application performance"[0.8, 0.2]"Chocolate cake recipe"[0.1, 0.9]


    The first two vectors point in similar directions. The third points in a different direction.

    This gives us a way to compare content mathematically.

    The embedding model learns useful representations during training. Our search system uses those representations to find and rank related content.

    A simplified semantic-search pipeline looks like this:

    User query
    |
    v
    Embedding model
    |
    v
    Query vector
    |
    v
    Compare with document vectors
    |
    v
    Rank relevant documents

    Now let's explore the mathematics behind those comparisons.

    4. Vector magnitude: how long is a vector?


    Before comparing vectors, let's understand their length, also called their magnitude or L2 norm.

    Suppose we have:

    a = [3, 4]

    The magnitude is calculated using the Pythagorean theorem.

    Step 1: Square both coordinates.

    ‖a‖₂ = √(3² + 4²)

    Step 2: Simplify the squares.

    ‖a‖₂ = √(9 + 16)

    Step 3: Add the values and calculate the square root.

    ‖a‖₂ = √25 = 5

    Therefore, the magnitude of vector [3, 4] is 5.

    In simple terms, the magnitude tells us how far the point is from the origin, (0, 0).

    Implementing magnitude in JavaScript


    function magnitude(vector) {
    const sumOfSquares = vector.reduce(
    (sum, value) => sum + value * value,
    0
    );

    return Math.sqrt(sumOfSquares);
    }

    console.log(magnitude([3, 4])); // 5

    Here's what the code does:

    1. Squares every value.
    2. Adds the squared values together.
    3. Takes the square root of the sum.

    We'll reuse this function when calculating cosine similarity.

    5. Euclidean distance: how far apart are two vectors?


    Magnitude measures the distance from the origin. Euclidean distance measures the distance between two points.

    Suppose we have two points.

    Point A

    a = [1, 2]

    Point B

    b = [4, 6]

    How far apart are they?

    First, calculate the difference between their coordinates:

    • Horizontal difference: 4 − 1 = 3
    • Vertical difference: 6 − 2 = 4

    Using the Pythagorean theorem:

    d = √(3² + 4²)

    d = √(9 + 16)

    d = √25 = 5

    The Euclidean distance is 5 units.

    The general L2 distance formula


    For two vectors with the same number of dimensions:

    dL2(a, b) = √[Σᵢ₌₁ⁿ (aᵢ − bᵢ)²]

    You don't need to memorize the notation immediately. Remember the process:

    1. Subtract corresponding coordinates.
    2. Square each difference.
    3. Add the squared differences.
    4. Take the square root.


    Implementing L2 distance in JavaScript


    function l2Distance(a, b) {
    if (a.length !== b.length) {
    throw new Error("Vectors must have equal dimensions");
    }

    const sumOfSquares = a.reduce((sum, value, i) => {
    const difference = value - b[i];
    return sum + difference * difference;
    }, 0);

    return Math.sqrt(sumOfSquares);
    }

    const a = [1, 2];
    const b = [4, 6];

    console.log(l2Distance(a, b)); // 5

    How does this help with semantic search?


    Imagine our query has already been converted into a vector:

    const query = [2, 3];

    We also have two document embeddings:

    const documentA = [4, 4];
    const documentB = [2, 5];

    Let's calculate the distance from the query to each document.

    Document A

    Distance = √((2 − 4)² + (3 − 4)²)

    Distance = √(4 + 1)

    Distance ≈ 2.236

    Document B

    Distance = √((2 − 2)² + (3 − 5)²)

    Distance = √(0 + 4)

    Distance = 2

    Document B is closer to the query because 2 is smaller than 2.236.

    When ranking by L2 distance, a smaller distance means the vectors are closer together.

    However, Euclidean distance isn't the only way to compare vectors. Another popular metric is cosine similarity.

    6. Dot product: multiplying corresponding values


    The dot product is an operation used in vector mathematics. It also plays an important role in calculating cosine similarity.

    Suppose we have two vectors:

    a = [2, 3]

    b = [4, 5]

    Multiply their corresponding values and add the results:

    a · b = (2 × 4) + (3 × 5)

    a · b = 8 + 15 = 23

    The dot product is 23.

    Implementing dot product in JavaScript


    function dotProduct(a, b) {
    if (a.length !== b.length) {
    throw new Error("Vectors must have equal dimensions");
    }

    return a.reduce(
    (sum, value, i) => sum + value * b[i],
    0
    );
    }

    console.log(dotProduct([2, 3], [4, 5])); // 23

    The dot product combines information from corresponding dimensions. When divided by the magnitudes of both vectors, it gives us the cosine of the angle between them.

    That is the foundation of cosine similarity.

    7. Cosine similarity: are the vectors pointing in the same direction?


    Euclidean distance asks:

    How far apart are two points?

    Cosine similarity asks:

    How closely do two vectors point in the same direction?

    Its formula is:

    cosineSimilarity(a, b) = (a · b) / (‖a‖₂ × ‖b‖₂)

    Let's work through an example.

    Suppose:

    a = [1, 2]

    b = [2, 4]

    Notice that vector B is twice vector A. Both point in exactly the same direction.

    Step 1: Calculate the dot product


    a · b = (1 × 2) + (2 × 4) = 10

    Step 2: Calculate both magnitudes


    For vector A:

    ‖a‖₂ = √(1² + 2²) = √5

    For vector B:

    ‖b‖₂ = √(2² + 4²) = √20

    Step 3: Calculate cosine similarity


    cosineSimilarity = 10 / (√5 × √20)

    Since √5 × √20 = 10:

    cosineSimilarity = 10 / 10 = 1

    The cosine similarity is 1, meaning the vectors point in exactly the same direction.

    Interpreting cosine similarity

    ScoreGeometric interpretation1Same direction0.8Strong positive directional alignment0Perpendicular directions-1Opposite directions


    These are geometric interpretations, not universal thresholds for semantic relevance. Whether a score indicates similar meaning depends on the embedding model and the data.

    Implementing cosine similarity in JavaScript


    function magnitude(vector) {
    return Math.sqrt(
    vector.reduce((sum, value) => sum + value * value, 0)
    );
    }

    function dotProduct(a, b) {
    if (a.length !== b.length) {
    throw new Error("Vectors must have equal dimensions");
    }

    return a.reduce(
    (sum, value, i) => sum + value * b[i],
    0
    );
    }

    function cosineSimilarity(a, b) {
    const magnitudeA = magnitude(a);
    const magnitudeB = magnitude(b);

    if (magnitudeA === 0 || magnitudeB === 0) {
    throw new Error(
    "Cosine similarity is undefined for zero vectors"
    );
    }

    return dotProduct(a, b) / (magnitudeA * magnitudeB);
    }

    console.log(cosineSimilarity([1, 2], [2, 4])); // 1
    console.log(cosineSimilarity([1, 0], [0, 1])); // 0
    console.log(cosineSimilarity([1, 0], [-1, 0])); // -1

    Cosine similarity is useful because multiplying a nonzero vector by a positive number doesn't change its direction. Consequently, cosine similarity is unaffected by positive scaling of either vector.

    This can be helpful when comparing embeddings whose lengths differ.

    8. Cosine distance: turning similarity into distance


    Sometimes we want a distance metric where lower values indicate a closer match.

    A common definition is:

    cosineDistance = 1 − cosineSimilarity

    Suppose Document A has a cosine similarity score of 0.9.

    Distance A = 1 − 0.9 = 0.1

    Document B has a cosine similarity score of 0.6.

    Distance B = 1 − 0.6 = 0.4

    Document A is the closer match under this metric because its cosine distance is smaller.

    Implementing cosine distance


    function cosineDistance(a, b) {
    return 1 - cosineSimilarity(a, b);
    }

    console.log(cosineDistance([1, 2], [2, 4])); // 0
    console.log(cosineDistance([1, 0], [0, 1])); // 1

    Remember the distinction:

    • Cosine similarity: Higher is better for directional alignment.
    • Cosine distance: Lower is better.
    • L2 distance: Lower means the points are closer.

    Implementations and vector databases may define or report metrics differently, so check the documentation for the system you're using.

    9. L2 distance vs. cosine similarity


    Let's compare two vectors:

    a = [1, 1]

    b = [10, 10]

    These vectors point in exactly the same direction, but their magnitudes differ.

    Their cosine similarity is:

    cosineSimilarity(a, b) = 1

    Their cosine distance is:

    cosineDistance = 1 − 1 = 0

    Now calculate their Euclidean distance:

    dL2 = √((1 − 10)² + (1 − 10)²)

    dL2 = √(81 + 81)

    dL2 = √162 ≈ 12.728

    The vectors have perfect directional alignment, yet their Euclidean distance is greater than 12.

    This illustrates the key difference:

    PropertyL2 distanceCosine similarityMeasuresDistance between coordinatesAlignment of directionsAffected by vector magnitude?YesNot by positive scalingBetter scoreSmallerLargerUseful whenCoordinate distance mattersDirectional alignment matters


    Neither metric is always better. The right choice depends on how the embedding model was trained and how its vectors should be compared.

    10. Build a simple semantic-ranking example


    Now let's combine our functions to build a small vector-ranking demonstration in JavaScript.

    Imagine an embedding model has already converted a search query and three documents into two-dimensional vectors.

    const query = [0.8, 0.6];

    const documents = [
    {
    title: "API performance optimization",
    embedding: [0.9, 0.4]
    },
    {
    title: "Database query optimization",
    embedding: [0.7, 0.7]
    },
    {
    title: "Chocolate cake recipe",
    embedding: [-0.5, 0.8]
    }
    ];

    These vectors are invented for demonstration. In a real application, an embedding model would generate them.

    Let's rank the documents by cosine similarity.

    function magnitude(vector) {
    return Math.sqrt(
    vector.reduce((sum, value) => sum + value * value, 0)
    );
    }

    function cosineSimilarity(a, b) {
    if (a.length !== b.length) {
    throw new Error("Vectors must have equal dimensions");
    }

    const dot = a.reduce(
    (sum, value, i) => sum + value * b[i],
    0
    );

    const normA = magnitude(a);
    const normB = magnitude(b);

    if (normA === 0 || normB === 0) {
    throw new Error("Zero vectors are not supported");
    }

    return dot / (normA * normB);
    }

    const rankedDocuments = documents
    .map(document => ({
    title: document.title,
    score: cosineSimilarity(query, document.embedding)
    }))
    .sort((a, b) => b.score - a.score);

    console.log(rankedDocuments);

    The results are approximately:

    [
    {
    title: "Database query optimization",
    score: 0.990
    },
    {
    title: "API performance optimization",
    score: 0.975
    },
    {
    title: "Chocolate cake recipe",
    score: 0.085
    }
    ]

    We sort the results in descending order because higher cosine similarity means stronger directional alignment.

    Notice something important: our JavaScript code doesn't understand language. It only compares vectors.

    The embedding model is responsible for learning useful representations of language. The ranking code uses those representations to order the results.

    Our example demonstrates the mechanics of vector search, not a complete semantic search system.

    11. Where do real embeddings come from?


    So far, we've manually supplied vectors such as [0.8, 0.6].

    Real applications use an embedding model to generate vectors from text or images.

    A typical workflow looks like this:

    1. Choose an embedding model.
    2. Convert each document into a vector.
    3. Store the vectors alongside document IDs and content.
    4. Convert the user's query into a vector using a compatible model.
    5. Find the nearest document vectors.
    6. Return the corresponding documents in ranked order.

    A JavaScript application might call an embedding API like this:

    // Illustrative pseudocode.
    // Replace this with your embedding provider's SDK.

    const queryEmbedding = await embeddingModel.embed(
    "How do I make my application faster?"
    );

    const documentEmbedding = await embeddingModel.embed(
    "Improve API performance with caching."
    );

    const score = cosineSimilarity(
    queryEmbedding,
    documentEmbedding
    );

    console.log(score);

    The exact API depends on your embedding provider. The key requirement is that both vectors must come from compatible embedding representations.

    For thousands or millions of documents, calculating every distance in application code can become expensive. A vector database or search engine can index embeddings and retrieve nearby candidates more efficiently.

    12. Does the same mathematics work for image search?


    Yes. The comparison mathematics is the same, but the process that generates the vectors differs.

    Imagine you're building an image-search application. A user enters:

    A dog playing on a beach.


    A compatible text-image model converts the query into an embedding. It also converts the available images into embeddings in a shared vector space.

    The application compares the query vector against the image vectors and ranks the images by similarity.

    The process looks like this:

    Text query
    |
    v
    Text encoder
    |
    v
    Query embedding
    |
    v
    Compare against image embeddings
    |
    v
    Rank matching images

    This works directly only when the model is designed to produce comparable text and image embeddings.

    Why not simply compare raw pixels?

    Two photographs of the same dog might have different lighting, camera angles, cropping, or backgrounds. Raw pixel differences may be large even when the images depict similar content.

    Learned image embeddings can capture useful visual patterns that raw pixel distance misses.

    However, the model can still make mistakes. A high similarity score is a ranking signal, not proof that an image contains every detail in the query.

    13. Why normalized vectors matter


    Some embedding models produce vectors with a magnitude of 1. These are called L2-normalized vectors.

    For unit-normalized vectors, Euclidean distance and cosine similarity are mathematically related:

    L2 distance² = 2 × (1 − cosine similarity)

    Equivalently:

    L2 distance = √[2 × (1 − cosine similarity)]

    This means that ranking the same unit-normalized vectors by L2 distance or cosine similarity produces the same ordering:

    • Higher cosine similarity means lower L2 distance.
    • Lower cosine similarity means higher L2 distance.

    This relationship can be useful when choosing a metric for a vector index.

    Don't assume every embedding model automatically normalizes its output. Check the model documentation before relying on this property.

    14. What would I use in a real JavaScript application?


    For a practical semantic-search feature, I'd separate the system into four responsibilities.

    1. Embedding model

    Converts text or images into vectors that represent useful features of the content.

    2. Vector database

    Stores the vectors and retrieves nearby candidates efficiently.

    3. Similarity metric

    Determines how the system compares vectors, using cosine similarity, Euclidean distance, or another supported metric.

    4. Application code

    Handles queries, metadata, filtering, ranking, and displaying results to users.

    Start with the metric recommended by your embedding model, then test it against real queries and expected results.

    For example, if you're building documentation search, create a test set of queries such as "make API faster" and identify which articles should appear first. Measure whether those articles show up in the top five results.

    That gives you a practical way to evaluate your search quality rather than choosing a metric based only on intuition.

    You may also want hybrid search, which combines vector similarity with keyword search. This can be especially useful when users search for exact identifiers, error messages, version numbers, or technical terms that must match precisely.

    Conclusion


    Semantic search becomes much easier to understand when we break it into smaller mathematical concepts.

    A vector is an ordered list of numbers. An embedding model converts text or images into vectors. Euclidean distance measures how far apart two vectors are, while cosine similarity measures how closely their directions align. Cosine distance converts similarity into a distance-style score.

    With a few JavaScript functions, we can implement these calculations and build a simple vector-ranking demonstration.

    The most important distinction is this:

    Vector mathematics gives us a way to compare representations. The embedding model learns representations that can capture useful relationships in meaning.

    Both parts matter when building a useful semantic-search system.#ai #machinelearning #search #software #coding #development #engineering #inclusive #community
    How Machines Find Meaning: The Math Behind Semantic Search

  22. 14. Spread Me by .

    You’d think this would be just my thing: horny science horror. But Gailey’s work is largely uneven for me and this is another miss. It made me think of queers getting handsy in justice spaces, their belief that if you won’t have sex with them, you’re not down. And maybe consent is among the ideas Gailey’s exploring, but I couldn’t get past feeling squicked out.

    Their prior novels, The Echo Wife and Just Like Home use discomfort more successfully, which is part of why I keep coming back to Gailey: they write about the ugly parts of us with interest and courage.

    @bookstodon

  23. Gadget Review: LiberNovo Omni - the USB-C powered office chair

    shkspr.mobi/blog/2026/10/gadge

    Whenever a company asks me to review their gadgets, I always ask if it is USB-C powered. If not, I'm not interested. So, welcome to the future where your chair is USC-C rechargeable!

    WHAT?!

    The LiberNovo Omni looks like a standard office chair - but has two secret features.

    First, is that it is exceedingly comfortable. Full foam cushions, lovely headrest, and a recline which almost gets you horizontal.

    Second, it is USB-C powered. There's a small battery pack which plugs in to the chair. Why? Read on!

    OK, let's start at the beginning.

    Assembly

    Flat-pack chairs like this are normally notoriously hard to assemble. The LiberNovo bucks that trend - not only does it include a how-to video, it prints the instructions on a MASSIVE piece of cardboard.

    I'm used to peering at tiny black-and-white diagrams in a flimsy paper booklet. IKEA could learn a thing or two from this.

    The screws are all labelled and a hex-driver is included. What's an even nicer touch, however, is some safety gloves:

    That's the sort of thing which doesn't cost much to the manufacturer, but is such a thoughtful gesture. There's nothing too sharp as you assemble, but who wants to cover their new chair in blood, eh?

    The parts come in two large boxes, but there aren't that many separate bits.

    Building it took about half an hour. It's easier with a friend to help - as are most things in life - but doesn't require much skill.

    Go Back To The USB-C Part Again Please?

    The battery pack is a 2200mAh unit with a USB-C port to recharge. It connects in to the chair with this slightly unusual connector:

    The internals of the chair have a USB-C cable to connect everything up.

    LOL!

    YES BUT WHY DOES A CHAIR NEED A BATTERY PACK??!?!

    On the side of the left arm-rest are three buttons.

    Two of them move the lumbar-support up and down. Depending on how your back is feeling and how far you are reclined, you can adjust the the back-support position.

    And the 3rd button?

    That's the build-in back massager, silly!

    Is that useful?

    Yes. Being able to instantly adjust the back support without having to twist around is fantastic, especially for those of us reaching a certain age.

    The "massage" feature essentially just moves the support up and down for five minutes before returning to its previous location. When sat upright, it feels great. But the real benefit is when you're laying down.

    How flat does this thing go?

    160° - not quite flat, but good enough when you're taking a break from Typing Real Hard. You don't want a photo of me sprawled out, so LiberNovo have helpfully provided some stock photos of much better looking folk.

    It is incredibly stable. At no point did it tip over or feel like it was going to deposit me on the floor. What really helps is the included foot stall.

    No Feets On Seats

    Unsurprisingly, this is not USB-C powered. A sturdy plastic footrest with a deeply padded leg rest on top.

    Again, assembly was a cinch - follow the large printed instructions and clip it together. It's rated for 40㎏, so you shouldn't stand on it but it is more than enough to rest your weary legs.

    Price

    I hope you're sitting down for this.

    Direct from LiberNovo, you can expect to pay around £700 - although there are bundles with extra batteries, the footrest, and even an eye mask which will shoot that price up. You can get the full bundle on Amazon for around £1,000.

    There's two ways to look at that price. Firstly, youch. But, alternatively, that's still cheaper than a Herman Miller Aeron. And Herm's doesn't come with a built-in lumbar massage.

    (There is also an upgraded version which has a built in fan under the seat. Personally, I suggest eating a healthier diet.)

    I can't deny that's a chunk of change. If you're anything like me, you probably spend most of your day sat down. You might as well sit on something comfortable.

    Final Thoughts

    Having the back-rest adjustable via arm-rest buttons is a genius touch. I just wish it went further. I'd love a control panel (or, dare I say it, app) which let me adjust the seat height, recline, headrest position etc. Who can be bothered with fiddly manual levers when electricity can do the work for us?

    Building this chair was a breeze - and it was delightful to get a pair of safety gloves with it.

    The chair is extraordinarily comfortable and the back massage, while not on the level of a "shiatsu" style heated massage pillow, is delightfully pleasant. Would I lie all the way back and sleep in it? Yeah! Certainly more comfortable than an economy airline seat.

    If you spend a lot of time sitting at your computer, your arse deserves something supportive. Your back deserves some love too. Yes, the USB-C power-pack is a little bit of a gimmick - but it is a hell of a good one.

    In my opinion, this is worth splashing out on.

    #chair #furniture #gadget #Review #USBC
Share on Mastodon

Enter the server where you have an account.