hamsa software

THE HAMSA SOFTWARE BLOG / WEEKLY NOTES

Notes from
the work.

Notes on AI, connected systems and the decisions behind useful software. What works, what gets awkward, and what we can learn from the difference.

Subscribe via RSS

EXPLORE THE COLLECTION

The reading room.

118 articles across AI, automation, integrations, and thoughtful engineering.

118 articles

AI tooling8 min read

Ten minutes with your AI assistant’s permissions

An assistant that drafts invoice reminders needs three read permissions in Xero. Here is a one-page review of what it can read, change and refuse, and why a payment scope turns a customer’s email into a ledger entry.

AI developments7 min read

Why replacing a compromised key may not end an incident

A saved replacement, a running service and an attacker’s existing access can change at different times. Railway’s guidance explains why that matters; PingCAP and PHP show where the next job differs.

Integrations7 min read

A valid signature still needs a trust decision

An Oprindo sample had a matching asset hash and a valid signature, alongside an untrusted credential result. The useful story is in those separate answers.

Project notes7 min read

The agent can fetch the code without holding the key

You need the repository; the host keeps the reusable key. WardOS checks what the agent asks to do—and whether a passing test still describes the files being reviewed.

AI developments7 min read

What did the browser actually confirm?

Computer use needs an observation contract for account, object and outcome, especially when a visible click produces only partial completion.

Integrations6 min read

Should this old instruction still run?

Repairing a consumer makes replay possible. Current state, dependencies and recovery admission decide whether it is still appropriate.

AI tooling7 min read

The prompt did not change. The system did.

Version the resolved configuration around an AI response so comparisons, investigations and rollback refer to the system that actually ran.

Automation6 min read

A budget that three workers can share

Enforce task limits through atomic reservations and repeat-safe settlement, including the uncomfortable case where a timed-out operation may still be spending.

Integrations7 min read

The backfill arrived after the live update

Historical work needs a population boundary, revision policy and crash-safe checkpoint strategy before its final page can mean done.

AI developments7 min read

What comes with an AI model on your laptop?

Local inference offers a different operating boundary. Evaluate the completed task, data routes and maintenance responsibility before buying into it.

Engineering7 min read

What does £240 belong to?

A readable table preserves relationships between values, row labels, column headings and actions across different ways of reading.

Automation7 min read

What exactly did that approval authorise?

Bind an assistant’s approval to the action, target and material revision, then enforce that binding when the write happens.

AI tooling7 min read

How a sentence in a PDF becomes a button

External instructions can gain apparent legitimacy through summaries and approval screens. Keep the proposal’s origin and actual effect visible.

Engineering7 min read

When two calculations agree on the wrong answer

A shadow comparison exposes differences. Independent rule examples explain whether those differences are bugs, corrections or changed assumptions.

Automation7 min read

You can close the tab now

A useful waiting screen represents a durable job: accepted work, defensible progress, cancellation and a result you can return to.

Automation7 min read

What the 08:45 alert needs to know

A stock feed due at 09:00 shows why deadlines, missing evidence and recovery belong in the alert rule itself.

AI tooling7 min read

When the documents disagree

A citation proves where a sentence came from. It does not settle which source governs the decision.

Integrations7 min read

The timestamp changed its meaning

An unchanged API schema can still alter a weekly report. Define events, corrections and compatibility from the consumer’s side.

Engineering7 min read

The route back from a form error

Readable error text is only the beginning. Three failures show how focus, retained input and the next action complete the recovery.

AI developments7 min read

What would justify changing the model?

A model launch invites a paired migration experiment. The revealing result is often the case that got worse.

AI tooling7 min read

Who chooses the next step?

A service-desk case set separates uncertain wording, missing evidence, exploratory research and absent authority—four reasons a workflow can stop, with different architectural answers.

Integrations7 min read

How a bulk import shares an API limit

A worked 120-call budget shows what an import costs interactive work, why retries consume the same capacity and how completion promises change with the scheduling rule.

Engineering7 min read

A passing test can share the code’s mistake

A fixed-discount example, selected wrong implementations and an executable fixture show what generated tests can establish—and what they can agree to misunderstand.

AI developments7 min read

What tool discovery changes in a maintenance brief

A maintenance brief needs seventy-five reads whichever interface performs them. Tool discovery changes what the model sees; it does not automatically reduce the work behind it.

Automation7 min read

Who has time for the exception queue?

Thirty daily exceptions and eighteen review slots create a growing backlog. A worked capacity ledger shows what it takes to recover before waiting changes the job.

AI tooling7 min read

A blank field can be the correct answer

Twelve synthetic invoices reveal the trade between automatic coverage, unsupported accepted values and the review work an extraction policy creates.

Engineering7 min read

The page around the paragraph

A worked viewport budget and a reference-return fixture reveal how navigation, promotion and source checking compete with sustained reading.

Automation7 min read

Whose afternoon did the automation improve?

A generated answer can be quick while review, repairs and maintenance absorb the saving. A one-week enquiry model follows the human work before asking what value was created.

AI developments7 min read

What the second look is for

Constitutional Classifiers++ combines contextual checks with selective expensive review. An original cascade example explains why escalation, refusal, missed cases and compute overhead must not be treated as the same result.

AI tooling7 min read

Revocation needs to reach cached answers

A permitted answer for Alice is not a permitted cache hit for Ben. Revocation also reaches search indexes, old conversation context and links, where a retrieval-only check can be bypassed.

Engineering7 min read

The annual job behind an apparently unused credential

An old credential has eleven quiet months of logs and an annual job just outside the window. A retirement inventory shows how to remove unnecessary access without guessing what still depends on it.

Automation7 min read

What a zero-job dashboard can establish

No completed jobs might mean no incoming work, a stalled process or lost monitoring. A small state model separates those possibilities before asking someone to respond.

Engineering7 min read

A dependency update that changes 0017 to 17

A dependency can install cleanly and return the wrong business meaning. A fictional normalisation change shows where an application contract test earns its place in routine upgrades.

AI tooling7 min read

The mapping decision missing from the diagram

A neat line from file to done can hide the decision that matters. Four mapping cases show how to make a diagram explain a contract rather than merely decorate it.

Integrations7 min read

Reconcile entitlement, rather than payment status alone

A payment-to-access join would revoke a trial, misunderstand refund grace and overlook duplicate grants. A six-member cutoff example shows how to reconcile the business rule instead.

Engineering7 min read

When text spacing hides a condition in a card

A card that looks tidy at the default settings can hide instructions when text spacing changes. An identical-text specimen makes the layout decision and its repair inspectable.

Automation7 min read

Reconciling the CRM record that already exists

A useful runbook says how to recognise the case, what evidence permits the action, when to stop and what proves completion. A CRM timeout gives those instructions something concrete to do.

AI tooling7 min read

A correct routing label can lose part of the request

Two reviewers can disagree because one is naming the queue and the other is naming every issue. Six messages reveal why changing the model cannot resolve an undefined task.

Engineering7 min read

What the failed rollback revealed

An importer rejects some rows after a change. A synthetic incident record shows how a configuration, an input feature and a failed mitigation can produce a better explanation than “bad deployment”.

Integrations7 min read

Why an optional field can break an old consumer

Adding a JSON property can leave one reader unchanged, make another reject the response and shift a third consumer’s CSV. Compatibility depends on what the recipient actually does.

AI tooling7 min read

When an agent cannot identify the account

A workflow can include branches, judgement and AI-written drafts. The useful reason to add an agent is that evidence must change the plan, not that one input is inconvenient.

Automation7 min read

A notification does not own the work

Sending a case to someone is different from their accepting responsibility. A versioned handoff shows how to keep work owned while offers expire, context changes and old notifications return.

Engineering7 min read

A filled form still needs its questions

When two fields contain the same email address, the values cannot tell you which sends invoices and which sends delivery updates. Labels, hints and errors each have a different job.

AI developments7 min read

What a coding checkpoint leaves behind

Claude Code’s checkpoint launch made experimentation easier. A catalogue-export example shows why restoring a source file is only one part of returning a workflow to a known state.

AI tooling7 min read

A real source can still leave a claim unsupported

A primary source can establish a release date, report a case and make a vendor judgement. Those are different kinds of evidence, and the sentence beside the link needs to say which one it uses.

Integrations6 min read

Resolving a stale save without losing either edit

A stale-save warning protects the record only halfway if it throws away the person’s draft. A three-way quote example shows how to preserve edits without silently choosing a new commercial meaning.

Engineering7 min read

Where did this order spend its time?

A fast request and a fast worker can still leave a customer waiting. Two equal-duration order histories show how queue time, execution and missing evidence lead to different investigations.

Automation7 min read

The missing Tuesday

Wednesday’s successful run does not prove Tuesday’s work happened. A period ledger makes missed work selectable, catch-up deliberate and completion something more useful than a green scheduler.

AI tooling7 min read

The cheap route has a hidden decision in it

Sending easy work to a smaller model can save money. A hundred-task example shows how the router’s mistakes, detection and repair can change that conclusion.

Integrations6 min read

The second click may mean something different

Retrying a purchase, editing its basket and deliberately buying the same thing again can look remarkably similar to a request logger. The intent model has to distinguish them.

Engineering7 min read

Give each colour a job it can do

A warm accent can make a good background and a poor small-text colour. Five calculated pairs show how to preserve a palette while repairing the information people need to read.

AI developments7 min read

A launch-day benchmark cannot answer your support inbox

GPT-5’s arrival was a reason to run a useful trial. An export-support reply shows why factual restraint, practical help and a promise the team can keep need separate attention.

Automation6 min read

Before you press redrive

A dead-letter queue can give a failed message another journey without making its payload correct, its outcome known or its business action new.

Engineering7 min read

Read the change before its explanation

A reassuring summary cannot tell you whether a validator preserves old identifiers, rejects trailing text or understands the contract. Eight small inputs can.

Integrations7 min read

Where the extra penny came from

Three small discounted items produce 15p when each line is rounded and 14p when the total is rounded. Follow the difference into a provider payload and a partial refund.

AI tooling7 min read

There may be no policy to find

An assistant finds travel reimbursement and an equipment form, then invents a home-monitor rule between them. Four source-and-question cases show a more useful response.

Engineering7 min read

One report can expose the real migration

An old report and its replacement both show £200. Comparing six underlying records reveals two differences that the matching total has concealed.

Automation7 min read

What did the reviewer actually approve?

Follow a purchase request whose destination changes while the reviewer is reading it, and the server rule that keeps the final action tied to the decision.

AI tooling8 min read

Twenty awkward emails can change the decision

Two routing policies, one small teaching dataset: the more accurate policy misses critical requests, while the other needs more capacity than the team may have.

Integrations7 min read

A deadline cannot cancel an order

When a late supplier acknowledgement arrives after the customer asks to cancel, one status field is not enough to describe what the business knows and wants.

Engineering7 min read

Choosing a font with real content on the page

A controlled specimen puts the same paragraph, reference code, figures and completed field in two font stacks, so the decision has something concrete to rest on.

AI developments7 min read

Claude 4 made the long task more tempting

The May 2025 launch promised stronger sustained coding. Here is a concrete way to test the work left behind, using two patches and six independent contract cases.

AI tooling8 min read

When an invoice extractor borrows the wrong date

An extractor finds a valid date on an invoice and assigns it to the wrong field. The mistake survives a format check; following the cited line explains what the next check needs to establish.

Automation7 min read

A runbook for the colleague who was doing something else

A late import has three unresolved records with three different meanings. The useful runbook starts with a current observation, then makes authority, escalation and closure explicit.

Integrations7 min read

The order and the promise to tell the warehouse

An outbox preserves an unfinished obligation. A worked crash ledger shows what that buys, where duplicates remain and why the receiver needs its own boundary.

AI tooling7 min read

The old test is passing a new question

A six-case onboarding-rule diff shows which expectations change, which remain valid and why old and new scores need different task identities.

Integrations7 min read

What makes two cached answers equivalent?

A two-account preference example separates storage, validation and current access, including the case where an old ETag must not produce 304.

Engineering7 min read

After the deployment is an observation

A constructed write-permission failure shows how controlled comparisons change the next decision without proving more than their evidence supports.

AI tooling7 min read

When another check adds no evidence

A twelve-step sequential controller separates repeated evidence, hard limits, blocked access and the work needed to hand over.

Automation7 min read

1250 is not a complete amount

A bounded GBP/JPY converter shows why currency, scale and source representation must survive each interface, even when the arithmetic is exact.

Engineering7 min read

The form should remember the work you did

A retained eighty-word enquiry and one rejected email expose why error recovery needs state, labels, associations and a usable correction route.

Integrations7 min read

The API response still parses

Five mixed-version records expose the difference between valid JSON, representable unknown states and safe status-dependent actions.

Engineering7 min read

The switch that outlived its recovery plan

A reader/index compatibility matrix shows why a release flag can remain operable after the old route stops being a valid fallback.

AI tooling7 min read

The draft can be ready before the decision is

A three-sentence customer reply becomes a concrete evidence review: label creation, a missing delivery estimate and a replacement still awaiting approval.

Automation7 min read

Find the repeated work worth removing

A time-only reporting example compares two improvements, their upkeep and the frequency at which either earns its setup effort.

AI developments7 min read

Where does the next step come from?

Two explicit control paths separate difficult interpretation inside a known process from investigation whose next action depends on new evidence.

AI tooling7 min read

The right paragraph from the wrong handbook

An invented three-policy corpus shows why applicability must constrain retrieval before attractive passages displace eligible evidence.

Integrations7 min read

What did the update mean to change?

Omitted, empty and null fields express different edits. A contact example adds the version check that prevents an old form from silently overwriting newer work.

AI developments7 min read

What MCP standardised in November 2024

A source-checked illustrative transcript separates the original protocol’s common lifecycle and tool calls from source-specific meaning.

Engineering7 min read

A trace should answer a support question

An order-to-operation crosswalk shows how useful correlation survives a new attempt, a new trace and a missing context field.

Automation7 min read

A pause needs more than one meaning

Three booking requests expose why intake, automatic writes and manual handling need distinct fallback decisions.

Engineering7 min read

The green check has a definition

An executed two-command example shows how a familiar test job can turn green by selecting less evidence rather than fixing a defect.

AI tooling7 min read

The attachment cannot expand the job

A small invoice-draft gate shows how tool and argument policy can reject unwanted effects independently of a model’s wording.

Integrations7 min read

One deadline for the whole request

A worked 2,500-millisecond lookup shows why retries, backoff and response preparation must spend the same allowance.

Engineering7 min read

The extra line is part of the design

A service-card specimen exposes the choice between preserving a tidy rectangle and preserving the words and link inside it.

Integrations7 min read

What the webhook receipt actually promises

Durable receipt, a membership transition and a welcome pack are separate obligations. Give each the identity and recovery boundary it needs.

AI tooling7 min read

What an empty date can tell you

A missing availability date may mean silence, a relative statement or a conflict. Preserve the difference when it changes the next action.

Engineering8 min read

Choose a migration small enough to disagree with

A read-only search slice can reveal whether a replacement preserves permission boundaries before the whole business depends on it. Six worked queries separate a useful ranking change from an unauthorised result.

Automation8 min read

The exception queue is where the process becomes visible

A duplicate delivery, a repeated attachment and a corrected invoice are different events. A worked case model shows how one reviewer can keep them connected without confusing delivery with resolution.

AI developments8 min read

What a valid JSON response can promise

The August 2024 announcement made output shape more dependable. A worked repairs enquiry shows why structure, evidence and diary availability still need different checks.

Integrations8 min read

One purchase, several attempts

A retry key is a promise about a particular purchase. A worked request ledger and tested failure cases show what has to remain true when calls overlap, answers disappear and the payload changes.

Something on your mind?

If a workflow, a system, or a stubborn bit of software is getting in the way, let’s talk it through.

Start a conversation