Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
159435 stories
·
33 followers

Beautiful T-SQL Queries: Three Could Delete the Company

1 Share

AI writes genuinely beautiful T-SQL queries. Aligned, aliased, commented, indented like a textbook. Beautiful has never meant correct, but we have spent thirty years treating it as a signed affidavit.

Beautiful T-SQL Queries: Three Could Delete the Company 00-ai-database-cleanup

Here is a thing I only noticed recently, having relied on it my entire career without ever saying it out loud.

Bad code used to look bad. It dressed for the occasion.

Not always. But usually. The query written at midnight by somebody who had stopped caring looked like it had been written at midnight by somebody who had stopped caring. Ragged indentation. Aliases called a, b and aa. A comment that said -- fix later dated 2017. The file might be called final_v6_ACTUAL_FINAL.sql. You could feel the fatigue coming off it before you read a single line, and you slowed down accordingly.

That was not laziness on my part. It was a useful signal for thirty years.

It does not work now. Dangerous code arrives beautifully formatted, correctly aliased, sensibly commented, and looking exactly like something out of official documentation. It looks as though it has references. The signal has been severed from the thing it was signalling. Nobody told my instincts, which continue to give it a visitor badge.

A quick note. Every example below is real in shape and changed in detail. Do not run any of them anywhere you care about, including the server everybody says is only staging.

Exhibit A: The One That Can Delete the Company

I asked for a query to clean up customers with no recent activity. This came back with the posture of something that had already passed review.

-- Remove customers whose orders are all historical
DELETE c
FROM   dbo.Customers AS c
JOIN   dbo.Orders    AS o ON o.CustomerID = c.CustomerID
WHERE  o.OrderDate < '20200101';

Beautiful T-SQL Queries: Three Could Delete the Company 01-delete-beautiful

Look at that: aligned columns, aliases on both sides, and a comment explaining the intent. If a junior on my team sent me that I’d think, good, somebody is finally reading the style guide. I might even add a thumbs-up, which is how many modern incidents receive formal approval.

It deletes every customer who has any order before 2020. Or it tries to. The word any is doing the work the comment assigned to all.

A normal foreign key using NO ACTION will stop the delete, loudly, and you should thank whoever created it. The constraint is now employee of the month. With ON DELETE CASCADE, disabled constraints, or no foreign key at all, your best client can be gone. They ordered every month since 2016 and again this morning. The database rewards that loyalty by removing the evidence. If cascades are enabled, the deletion keeps walking, professionally and without raising its voice.

The comment says the right thing. The query does not. And the comment is what your eye reads first, because comments are the code’s version of events.

Exhibit B: The One That Silently Returns Nothing

SELECT c.CustomerID,
       c.CustomerName
FROM   dbo.Customers AS c
WHERE  c.CustomerID NOT IN (SELECT o.CustomerID FROM dbo.Orders AS o);

Beautiful T-SQL Queries: Three Could Delete the Company 02-not-in-null

Textbook. It is the query in the textbook. The textbook is now face down and not taking calls.

If a single row in Orders has a NULL CustomerID, this returns zero rows, promptly and forever. One NULL has veto power over the entire customer base, which is more authority than the change advisory board.

No error, no warning. Just zero rows delivered with total composure, because NOT IN against a set containing NULL evaluates to unknown, and unknown is not true.

Somebody will look at that empty result and say, ah good, every customer has ordered. That statement will go into a report. The report will go into a meeting. The slide will be green. This is how a NULL in one row in one table becomes a strategy.

Exhibit C: The One That Gives a Different Answer Every Time

UPDATE p
SET    p.Price      = s.Price,
       p.ModifiedOn = SYSUTCDATETIME()
FROM   dbo.Products AS p
JOIN   dbo.PriceStaging AS s ON s.SKU = p.SKU;

Beautiful T-SQL Queries: Three Could Delete the Company 03-two-prices

Perfectly reasonable. I’ve written this query, and so have you.

If PriceStaging contains two rows for the same SKU, and staging tables always eventually contain two rows for the same SKU, SQL Server does not complain. Every staging table begins life with standards and ends life accepting a file called prices_FINAL_final_use_this_2.xlsx. SQL Server raises no error, picks no newest row, and offers no warning. Microsoft’s documentation calls the result undefined, which is a very calm word for choosing a price by accident.

Run it again and it may pick the other one. Same query, same data, new answer. The database has developed a position.

You’ve now got a non-deterministic pricing process. You’ll find out when somebody in finance asks why the same import produced two different numbers on two different days, and you spend a Tuesday discovering that the answer is a shrug written into the engine.

Exhibit D: The One Everybody Has Shipped

SELECT SUM(o.OrderTotal) AS MonthlyRevenue
FROM   dbo.Orders AS o
WHERE  o.OrderDate BETWEEN '20260101' AND '20260131';

Beautiful T-SQL Queries: Three Could Delete the Company 04-the-lost-day

Clean, readable, and in production somewhere near you right now, probably inside a report with the word certified in its filename.

If OrderDate is a datetime, this includes exactly midnight on the 31st and then closes for the day. The monthly revenue report has given the final day of January office hours of zero seconds.

You’ve just quietly excluded one day in thirty one, or roughly three percent of your revenue, from a number that somebody is going to make a decision with. It will not look wrong. Three percent never looks wrong. It looks like January.

The safe range is >= '20260101' and < '20260201'. BETWEEN includes both endpoints, and a date without a time means midnight. January is already difficult enough without asking the database what time the month closes.

This mistake predates AI by decades and we’ve always made it slowly, one developer at a time. Now it can arrive in beautiful formatting, in forty places, before lunch. Lunch then becomes the incident call.

Exhibit E: The One That Is Fine Until the Server Is Busy

BEGIN TRY
    BEGIN TRANSACTION;

    UPDATE dbo.Accounts SET Balance = Balance - @Amount WHERE AccountID = @From;
    UPDATE dbo.Accounts SET Balance = Balance + @Amount WHERE AccountID = @To;

    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
END CATCH

Beautiful T-SQL Queries: Three Could Delete the Company 05-hole-in-the-floor

This is the most reassuring block of code in the entire post. It has a transaction and error handling. It is wearing a high-visibility vest and carrying a clipboard. It has the shape of safety, and shape is what we’re pattern matching on.

The CATCH block rolls back and then says nothing at all. No rethrow, no log, no alert. The error is caught in the sense that a hole in the floor catches things. It has been handled and is now in the basement.

Money leaves one account, the second statement fails, everything rolls back correctly, and the calling application can continue as though the operation succeeded because nothing was ever raised. A receipt may even be sent. This is a financial system with excellent manners and no memory of transferring money.

The boring safe version checks XACT_STATE(), rolls back an active transaction, and uses THROW; to return the original error. That final line is the only thing in the block willing to admit something happened.

Why Our Instincts Are Now Working Against Us

The argument is not really about SQL. I trusted formatting because it used to cost somebody an afternoon. Aligning columns, naming aliases properly, and writing a comment took care. If somebody spent that care on presentation, I assumed they’d also thought about the join, or at least stared at it long enough to become cautious. Sometimes I was wrong, but it was a useful shortcut.

Now that finish can be generated for free. A query can look as though it has passed review before it has even met the data. Our instincts were trained when care and presentation came welded together, so code that looks like documentation still gets a lighter review than code that looks like a Tuesday.

What I Actually Do Now

Nothing clever. Four habits and one rule, all of them boring, all of them cheap. None requires a steering committee, which is probably why they work.

Read the FROM clause first. Before the SELECT, before the comment, before anything. Most catastrophic data changes are catastrophic in the join, and the join is the part your eye skips because it looks like plumbing. Exhibit A is a FROM clause problem. The word DELETE merely gets the press coverage. The join did the planning.

Turn every DELETE and UPDATE into a SELECT first. Select the target key, keep the same FROM and WHERE clauses, then count both joined rows and distinct target keys. If those numbers differ, explain why. If either surprises you, stop. The acceptable number of surprises in a DELETE preview is zero. This policy has never required a meeting. Exhibit A would have returned a number that made somebody say “that seems like a lot of customers,” which is the entire safety mechanism and it costs eleven seconds. Most organisations can still afford it.

Ignore the comment. The comment tells you what the author meant. You’re not reviewing intentions. The comment is an alibi. Read the evidence first. If the two disagree, one of them is lying, and it’s usually not the code.

Ask what happens when the data is worse than expected. A NULL where you didn’t expect one. Two rows where you assumed one. A datetime where you pictured a date. Every exhibit above looks correct against the data the author imagined. Real data arrives with food stains and a column called Temp2. Yours has been accumulating character since 2011.

Then the rule. Review it as though it were written by somebody extremely confident who has never met your data. That is not an insult to anybody. It’s a precise description of what actually happened.

The Half of This That Is Good News

I don’t want to leave you thinking I’ve stopped using it, because I haven’t and I’m not going to.

Every one of those five queries is a fine first draft. Four took seconds to produce and would’ve taken me a few minutes each. The fifth is better structured than what I’d have typed at half past five on a Friday, when an alias called x2 begins to feel sufficiently descriptive.

The work moved rather than disappeared. Writing and reviewing used to share the load. Now it has collapsed almost entirely into reviewing, which was always the harder part. We’ve automated the fun bit and kept the part where you stare at a NULL for forty minutes.

The elegant version is free now. The skill worth having is being able to look at it and stay suspicious for another ninety seconds. Those ninety seconds have no logo, launch event, or dashboard, which is why nobody has scheduled them.

That’s roughly the argument running through all thirty essays in my book AI: Nobody’s in There. But we’re still in here. All thirty are free to read at pinaldave.com, and the book is available in paperback, Kindle and audiobook on Amazon.

By the way, the title of this post isn’t really a joke. Of the five queries above, exhibit A can delete your customers, exhibit C can corrupt your prices, and exhibit E can lose money silently.

Three of them could delete the company. They just wouldn’t all do it on the same afternoon.

The machine made beauty free, and it turns out a worrying amount of code review was just us admiring the tailoring.

Reference: Pinal Dave (https://blog.sqlauthority.com/), AI Generated SQL, X

First appeared on Beautiful T-SQL Queries: Three Could Delete the Company

Read the whole story
alvinashcraft
2 hours ago
reply
Pennsylvania, USA
Share this story
Delete

Qwen 3.8 27B is excellent, but it defaults to wildly overthinking things

1 Share

Friday's big release was Qwen 3.8 27B, an Apache 2 licensed 27B parameter vision-capable LLM from Alibaba's Qwen research lab. I've been looking forward to this one: 27B is an excellent size for running a model on a reasonably specced laptop, and its predecessor Qwen 3.6 27B was impressive.

Qwen's self-reported benchmarks for this model are eye-opening. They show a boost from both Qwen 3.6 27B and the closed-weight Qwen 3.7-Plus, which was one of Qwen's strongest models of any size as recently as May this year. It will be interesting to hear what independent benchmarks have to say about the model.

I've been running the model on two different machines: my 128GB M5 Max MacBook Pro, and an NVIDIA DGX Spark. On both machines I'm running LM Studio and their 17GB Q4_K_M quantized build. I also tried using llama-server directly on the Spark.

The default of extra high results in spectacular over-thinking

Qwen's documentation describes the model as defaulting to xhigh for the reasoning effort, and the LM Studio GGUF I've been trying preserves that default:

Qwen3.8 comes with official support for reasoning_effort, which can be used to adjust reasoning depth and control cost:

  • xhigh (default): for complex tasks demanding thorough analysis
  • medium: balancing accuracy and speed
  • low: efficient reasoning optimizing for speed and cost

This is a hilarious default. It's absolutely not a good way to run the model, especially on consumer hardware. I've been finding the results extremely entertaining.

I quickly ran into problems with LM Studio's default context limit of 8,192 tokens - Qwen was using them all up thinking about even the most mundane of problems. I loaded the model with the full 262,144 maximum context length and that problem went away.

Here's the pelican riding a bicycle SVG I got from my first attempt with that increased context length. It took 21 minutes to generate, using 22,276 reasoning tokens to produce 3,223 tokens of output. You can read the reasoning trace here.

A very pleasing image of a pelican riding a bicycle. The bicycle is red and has the correct frame shape. The pelican looks like a pelican and has its wing extended to the handlebars.

This is by far the best pelican SVG I've been able to generate with a model that runs on a local machine - and this Qwen is pretty small, just a 17GB file on disk. There's a lot to like about this:

  1. The bicycle frame is the right shape
  2. It has legs on each side of the bike - that's very rare
  3. Good, clear pelican pouch
  4. The wings extend to touch the handlebars!
  5. The motion lines are behind, not in front
  6. It has a tasteful background - nice sun, clouds, hill, flowers and grass.

Was that worth waiting 21 minutes for? Absolutely not.

Here's that same prompt run with reasoning turned off - transcript here. This one produced 3,715 tokens and took 137s - just over two minutes.

The bicycle frame is a bad shape now. The pelican remains recognizable but has a less obvious pouch. The feet miss the pedal, there is no attempt to hold the handlebars. And just for completeness, I used OpenRouter to run the same prompt through the much larger Qwen 3.8 2.4T-A95B (released last week) and got this snazzy animated SVG:

I said Qwen at xhigh has a tendency to over-think things, but how bad really is it?

I tried a much simpler prompt, again with that default extra high setting:

draw an svg of a circle

Qwen's reasoning trace started like this:

The user is asking for an SVG drawing of a circle. Simple request — but I want it to be a carefully crafted piece. Let me make something that goes beyond just <circle>: a single self-contained SVG file with character — maybe a geometric "circle study," with subtle animation, layered rings, and a distinctive palette.

Keep the scope right: they asked for an SVG of a circle. So the core is a circle. But I can add craft: concentric guide circles (like a compass/geometry drawing), tick marks, a soft gradient fill on the main circle, restrained ambient motion (a slowly rotating dashed ring, pulsing glow). Respect prefers-reduced-motion? That's more for CSS; SVG SMIL or CSS inside SVG will do.

Palette options: deep teal ink on warm paper? Or bold vermilion circle on off-white with navy construction lines — Bauhaus/compass-drawing vibe. Let me go with a "geometric study" look: cool slate background, or bright paper white? Paper white is fine if it's not the cream-and-terracotta combo. [...]

Several minutes later it produced this absolutely beautiful animated circle, which was entirely not what I had asked for!

My strong recommendation: ignore that default. Run Qwen 3.8 27B on low or even no reasoning levels at first. It's a great model, but wow that default setting is a bad place to start.

It's very good at bounding boxes

A fun way to test a vision model is to see how well it can return bounding boxes around items in a photograph. I've seen previous Qwen models deal well with this, so I decided to put it to the test drawing bounding boxes around some pelicans.

I've seen asking for 0-1000 scale produce good results in the past. I tried this:

llm -a https://static.inaturalist.org/photos/714731804/large.jpg \
  -m lmstudio/qwen/qwen3.8-27b \
  'Return JSON bounding boxes for the pelicans in this photo, 0-1000 scale for each dimension'

Here's the reasoning trace, which produced this:

[
  {"bbox_2d": [195, 290, 370, 780], "label": "pelicans"},
  {"bbox_2d": [445, 320, 675, 850], "label": "pelicans"}
]

This is such a good match. Here are those boxes rendered on top of the photo:

A photograph of two pelicans on a rocky outcrop, with three other smaller birds. The pelicans both have bounding boxes exactly surrounding them, each with a label that says pelican.

Building a tool to label bounding boxes

That visualization of the bounding boxes was taken using a new custom tool that I had Qwen 3.8 27B build for me, running offline on my laptop.

I forgot to dial down the thinking effort so it was massively over-engineered, but it did manage to produce this full interface from this single prompt:

[
   {"bbox_2d": [195, 290, 370, 780], "label": "pelicans"},
   {"bbox_2d": [445, 320, 675, 850], "label": "pelicans"}
]

Build an HTML page which has an input box for accepting the URL to an image and a textarea for accepting the above style of JSON.

It appends the image to the page, measures its width and height, then treats the coords in the bbox_2d as scaled from 0-1000 and scales them against the actual width and height, then it renders labelled boxes over the image.

This screenshot shows one of the features I did not ask for - a demo scene, for if you don't have a photograph to test the tool with:

Screenshot of bbox·lab, a dark-themed web tool that overlays object-detection bounding boxes on an image, with an input panel on the left and a stage on the right showing two labeled boxes around stylized pelicans in a sunset illustration. Header: bbox·lab — normalized 0–1000 coords → pixel overlay; status indicator: RENDERED · 2 BOXES. Panel 01 INPUT (URL + detections) contains an IMAGE URL field reading data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+, a DETECTIONS — JSON textarea reading  {"bbox_2d": 195, 290, 370, 780, "label": "pelicans"}, {"bbox_2d": 445, 320, 675, 850, "label": "pelicans"} , an orange RENDER BOXES button, and dashed boxes labeled DEMO SCENE and CLEAR. Panel 03 STAGE header: display 661 × 661 px · 1 unit = 0.661px x 0.661px · nat 1000×1000. The stage shows a flat-style illustration of two dark pelican silhouettes with orange beaks standing in calm water against an orange-to-purple sunset sky with a pale yellow sun and distant birds; an orange bounding box labeled 1 · pelicans surrounds the left pelican and a cyan bounding box labeled 2 · pelicans surrounds the right pelican. Footer: move the cursor over the image to read grid coords; boxes map 0–1000 → displayed px.

Here's the relevant segment of the thinking trace, where it decided to draw its own pelicans purely because I had used the label "pelicans" in the example JSON I gave it in the prompt:

Also a "load sample" that uses a known image? Can't depend on external images, but… the image URL input is user-provided; I could add a "try with sample" button [...] Hmm, I can draw a simple scene on canvas, export it as a data URL, and load it into the image — that's self-contained and demo-able! [...] But the user's coords are for an actual pelican image; a generated placeholder can still demo the scaling. Generate a 1000x1000 placeholder: gradient water + two blob-like "pelican" silhouettes placed at the given bboxes (using the same scale — cute: silhouettes at the exact 0-1000 positions, showing the boxes align). This makes for a fun, self-contained demo. Keep it simple: sky gradient, sun, water, two pelican-ish shapes (ellipse body, circle head, beak). Place at bbox centers.

(I'm slightly nervous that models around the world might have a bias towards drawing pelicans at any chance they can get, brought on by nearly two years of exposure to my own stupid benchmark.)

Is all that over-thinking necessary? Maybe it is, at least a bit. I tried with reasoning turned off and got this version, (transcript here), which nearly works but shows the boxes in the wrong place:

BBox Studio screenshot - a solid UI but the yellow and green boxes do not cover the pelicans.

So without reasoning it didn't quite one-shot a working tool. I'm sure it could get there with some follow-up prompts, but this is a good example of how reasoning can make a difference.

Yes, it can drive coding agents

One of the biggest questions around local models is whether or not they have enough horsepower to successfully run a coding agent loop. Coding agents require long context, strong code generation support and reliable tool-calling. On paper Qwen 3.8 27B has all three of these, so is it up to the task?

My initial experiments with Pi have been very promising. I chose Pi because it has a shorter system prompt than most other options, making it a better fit for trying out smaller models.

I configured Pi to use Qwen 3.8 27B running in LM Studio on the Spark (shared via tailscale serve) by adding this to ~/.pi/agent/models.json:

{
  "providers": {
    "spark": {
      "baseUrl": "https://spark-18b3.tail68a31.ts.net/v1",
      "api": "openai-responses",
      "apiKey": "dummy",
      "models": [
        {
          "id": "qwen3.8-27b",
          "reasoning": true
        }
      ]
    }
  }
}

Then ran pi --provider spark --model qwen3.8-27b in my ~/dev/datasette folder and prompted:

how does auth work?

After a sequence of reasoning and tool calls that accessed a bunch of different files it produced this reply, which is very solid.

Just one problem: I wanted to share that transcript. So I pointed Pi and Qwen 3.8 27B at the JSONL transcript file in ~/.pi/agent/sessions/--Users-simon-Dropbox-dev-datasette-- and prompted:

Write Python code to convert this jsonl to markdown

And it built and tested this pi_jsonl_to_md.py, which did exactly what I needed. Here's that session transcript, published using the tool that it created.

The quest for speed

So far this is all looking very promising. We have a 17GB model that runs on high-end consumer hardware and can write code, drive tools, annotate images and generally do everything that I need from an LLM for getting real work done.

There's one very significant catch: it feels slow - especially when it starts over-thinking, but even without that it's not particularly sprightly.

I've been getting around 15-30 tokens a second from LM Studio. That's not terrible, but it's slow enough that it's going to be hard to win me away from hosted API models, which can return results a whole lot faster. Artificial Analysis track token speed and show OpenAI 5.6 Sol at 74 tokens/second and 5.6 Luna at an impressive 184/second.

The good news is that the community have been exploring ways to speed things up since the model was first released two days ago.

One of the most promising optimizations is baked into the model itself. Qwen supports Multi-Token Prediction, an architecture trick where a cheaper mechanism guesses several tokens ahead and the main model can then quickly verify if the guesses were correct. This can have quite a dramatic effect on inference performance.

Based on this tweet from llama.cpp creator Georgi Gerganov I tried running the model with MTP like this on the Spark:

llama serve \
 -hf  ggml-org/Qwen3.8-27B-GGUF:Q4_K_M \
 -hfd ggml-org/Qwen3.8-27B-GGUF:Q4_0 \
 --spec-default \
 --spec-type draft-mtp \
 --reasoning-preserve

And sure enough, this gave me a significant boost. I had GPT-5.6 in Codex run a comparative benchmark on the Spark and the --spec-type draft-mtp server outperformed the LM Studio default GGUF by around 72%.

I expect we'll see a whole lot more innovation around serving this model faster over the next few weeks. The MLX community likely have some tricks brewing as well.

Some observations

The fact that a 17GB file can do all of this stuff on my home machines is a miracle. Once again, I'm delighted and amazed at how much progress local models have made this year. A year ago this would have been competitive with the best and most expensive of the proprietary models - today it can run on a capable laptop.

The only thing holding this back from being a daily driver is performance. It feels pretty slow on both the M5 Mac and the DGX Spark. That's the catch with these dense (non-Mixture-of-Experts) models - they require a whole lot of memory bandwidth to perform well, and neither of the machines I have access to are top performers in that regard.

The most important thing about Qwen 3.8 27B is what it demonstrates. We can have an open weights general purpose model with a long context, effective tool calling, strong vision ability, and competent code generation, and we can fit the whole thing in just a 17GB file.

The models at this size continue to get better at an impressive rate. We don't need to spend half a million dollars on datacenter-class hardware just to run a competent model.

Tags: ai, generative-ai, local-llms, llms, qwen, pelican-riding-a-bicycle, llm-reasoning, llama-cpp, llm-release, coding-agents, lm-studio, ai-in-china, nvidia-spark, pi

Read the whole story
alvinashcraft
2 hours ago
reply
Pennsylvania, USA
Share this story
Delete

AI vs CI: Nobody Told the Pipeline

1 Share

CI is so commonplace these days, we don’t often think about why it’s there. And that reasoning really matters these days, because of how we use it.

Especially when you’re writing AI agents and expect the CI system to run a regression test suite, and sound the alarm when something goes wrong.

Here’s a funny story you may not know. CI – Continuous Integration – was not originally a tool category. It’s a process – it’s how you continuously integrate pieces of code together.

Anyway, why do you need this process anyway? Because you’re scared. You’re terrified that integration broke something.

So what do you do? You look for approval. An automation system that runs all the tests all the time is our approval of choice.

That’s how CI became a tool category. Because in its heart, it’s a simple automation pipeline.

So, that automation’s holy grail is speed, right?

Wrong.

The mission was to kill “Works on my machine”

Remember when we wrote software in a cave, and we had a sticker on our computers – “Works on my machine. Don’t run it on another cave”?

Ah, the good old days.

Because the CI automation #1 OG mission was to kill “Works on my machine”. How? By creating a repeatable process. Independent of all the weird installs on my machine. Multiple versions of libraries. And different configurations. And admin hacks.

The CI builds, packages, runs and tests the software every time the same way. That way, if a test turns red, you know something bad happened, because it was green until now. And why your stomach turns, when it flakes between red and green – that’s the feeling of lost repeatability.

Yes, repeatability brings bliss. Well, it did, before AI.

Then AI showed up

If your app does not touch AI (although building with code agents, can sometimes count as “touch”), you’ll continue to feel that bliss.

But if you’re developing AI-based features, or agents, or vibe-coding, you’re in for a new experience every time you push your code (or prompts) into CI.

Things are not repeatable anymore. Models change, sometimes without warning. And always under your feet. And when a model changes, does it trigger a run?

You wish! Your alert system is malfunctioning.

And the worst part is not a regression. Although if it’s a bug in a prompt, you may not be able to fix it.

No, the worst part is that Green today doesn’t tell you what kind of Green it is. Things are no longer Working or not, they are Work-ish. But even that’s not the same work-ish every day.

So we’ve got fewer triggers, results we can’t read, and on top of it – every run means something else.

What’s the solution?

Repeatability gives us confidence. CI is the process, and tools, that give us the approval we seek, and the confidence we have comes from that repeatability.

We can’t rely on the trigger anymore, but we can initiate our own runs. And since one run is not enough, we need to run more and look at the trends. Catch drift before it ships.

What happens to quality when AI meets CI? We need to get back to the reasoning, and change how we manage quality.


I write about this stuff every week. What AI does to the things we built to keep quality steady, and what to do about it.

Subscribe here.

The post AI vs CI: Nobody Told the Pipeline first appeared on TestinGil.
Read the whole story
alvinashcraft
2 hours ago
reply
Pennsylvania, USA
Share this story
Delete

Writing A Memoir? Narrow Your Focus

1 Share

Writing a memoir? Learn why narrowing your focus and sticking to your theme can help you tell a more focused memoir.

Writing A Memoir?

If you want to write a memoir, you need to learn to focus on what you need to include. You need to limit extraneous storylines and narrow your focus. You need to stick to your memoir type.

Narrow Your Focus & Stick To Your Theme

As I explained in a previous post, a memoir is not an autobiography. A memoir focuses on a time, an event or a series of events, or a choice tied to a theme. It is not your entire life story.

If you remember this, you will be able to focus on what is important to the book you are writing. Every scene you include in the memoir should have something important to show about this part of your life.

For example:
  1. Julian Barnes focuses on the period of grief following his wife’s death in Levels of Life. It is a memoir of love and grief and he ties it together with a theme of ballooning and photography. He asks what happens when you put two things together and then tear them apart? It is a powerful book that is only 140 pages long.
  2. Tara Westover’s Educated covers much of her life, from her childhood in a strict, isolated family to her education at university and beyond. But it is not a record of everything that happened to her. The events support the central themes of education, independence, and creating your own identity. It is 352 pages long but still manages to focus on the theme.
  3. In When Breath Becomes Air, neurosurgeon Paul Kalanithi writes about being diagnosed with terminal cancer. He reflects on his medical career, his relationships, and fatherhood. The memoir is held together by the theme of what makes a life meaningful when death is certain. It is 256 pages and sticks to the theme.

A memoir can have a short or long time span. The events could happen over a few days or many years. What matters is that you choose the events that show your theme.

How Does Narrowing The Focus In A Memoir Help?

If you can narrow your focus in your memoir and figure out what your theme is, you should ask:

  1. Is this scene important to my theme?
  2. Does this person show something new about my theme? Have I already shown this through another person?
  3. Does this conversation relate to my theme?
  4. Does this memory help me explore my theme?
  5. Does this event show how I changed, or help explain why I changed?
  6. Does this chapter move my story forward, or does it repeat something I have already shown?
  7. Am I including this because it is important to the story, or simply because it happened?

This will help you to decide what is important and what is superfluous to your story. You do not need to include everything that happened in your life – only the parts that resonate with the memoir.

The Last Word

When you write a memoir, you cannot include every detail of your life. Narrow your focus and choose the story, theme, or experience that matters most. A clear focus will make your memoir more engaging and easier for readers to follow.

Top Tip: If you want to learn how to write a memoir, look into our Secrets of a Memoirist course.
Book For Secrets Of A https://www.writerswrite.co.za/wp-content/uploads/2020/01/Company-Writers-Write-1.jpg


by Amanda Patterson
© Amanda Patterson

More posts from Amanda:
  1. How To Write A Query Letter In 12 Easy Steps (With Examples)
  2. 5 Essential Exercises For Creating Characters
  3. 7 Reasons Introverts Make Great Writers
  4. What Is Anger? 37 Ways To Write About Anger
  5. How To Write A One-Page Synopsis (With Examples)
  6. 9 Ways To Set Up A Believable Fictional Breakup
  7. 3 Ways Sidekicks Strengthen Your Novel
  8. Have You Chosen The Wrong Character As A Protagonist?
  9. Does Your Character Fight, Freeze, Flee, Or Fawn?
  10. 30 Character Motivations To Kickstart Your Story

Top Tip: Sign up for our free daily writing links.

The post Writing A Memoir? Narrow Your Focus appeared first on Writers Write.

Read the whole story
alvinashcraft
2 hours ago
reply
Pennsylvania, USA
Share this story
Delete

OpenAI reportedly disbanded its preparedness team

1 Share
Maroon OpenAI logo on yellow background

According to the Financial Times, OpenAI disbanded its preparedness team at the end of last month. The job of the preparedness team was to assess if models posed serious risks and develop ways to mitigate those risks. (You know, like the possibility that it could go rogue and hack another company.) According to FT, responsibility has instead been divided up for specific areas like bio and cyber, then moved into existing teams.

This is the latest change at the company, which has been in upheaval as it heads towards what is expected to be a massive IPO. Over the last few years, it's slowly torn down its more reach-led model, dissolving its AG …

Read the full story at The Verge.

Read the whole story
alvinashcraft
13 hours ago
reply
Pennsylvania, USA
Share this story
Delete

Modeling Legal Emancipation for Healthcare Access Control with FHIR Consent

1 Share

 Legal emancipation can change who may make healthcare decisions and who may access a minor's health information. It is not, however, a simple demographic attribute. Its meaning depends on the jurisdiction, the court order or other legal instrument, its effective period, and any conditions or exceptions contained in that instrument. A healthcare system should not infer emancipation from a patient's age, living situation, or an unsupported assertion.

The Emancipation Consent implementation guide explores a FHIR R4 pattern for representing the access-control consequences of a verified legal emancipation. The legal order, decree, or other recognized instrument remains the authoritative record. The FHIR resources make the organization's current interpretation of that evidence visible and enforceable.

The pattern uses Patient for the emancipated minor and DocumentReference, with Binary when appropriate, to retain the legal instrument and its metadata. The Consent references that source document through Consent.sourceReference, identifies the organization applying the policy, and carries only the rules that the organization can actually enforce.

Parents and guardians are represented as RelatedPerson resources. This matters because a relationship is still a positive fact even when the emancipation changes that person's access rights. The Consent.provision.actor references the relevant parent or guardian, while the provision expresses the resulting access rule. In FHIR R4, the single root provision establishes the overall deny or permit direction; nested provisions express exceptions by alternating that direction. This lets an implementation start with a baseline rule and then represent only the legally supported exceptions.



This approach does not claim that every emancipation denies every parent access, nor that it grants a minor unrestricted authority in every context. It creates a place to record the healthcare organization's actionable decision, trace it to the legal evidence, and apply it consistently in an access-control engine. Jurisdiction, legal authority, effective period, verification details, and restrictions should remain available in the source document or in well-defined extensions when they must be exchanged as structured data.

The guide is experimental and intended to encourage discussion. For the profile, examples, and implementation details, see:


Read the whole story
alvinashcraft
13 hours ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories