QEAGENTS ← Back to site

Requirements Intelligence

Finding the sentence two engineers would build differently

Requirements Intelligence AI - Agent

Most requirements defects are not caused by missing requirements. They are caused by requirements that read as finished, pass review, and mean two different things to two different engineers. Nobody notices until the wrong one has been built.

A story that looks finished

This one has a user story, three acceptance criteria and an estimate. It was refined, pointed and pulled into a sprint without a question being raised.

ORD-2147 Ready for development

Archive historical orders

As a platform engineer, I want old orders archived, so that the orders table stays performant as volume grows.

Acceptance Orders older than 24 months are archived
Archived orders are not returned by order search
Archiving runs nightly
Estimate 5 points

Two readings, both correct

The agent does not scan for vague words. It builds every implementation the sentence permits, then runs them against production shape to see whether they agree. Here the first criterion alone yields two.

Reading A · age from creation
SELECT id FROM orders
WHERE created_at < now() - INTERVAL '24 months';
1,240,880 orders archived
Reading B · age from last activity
SELECT id FROM orders
WHERE updated_at < now() - INTERVAL '24 months';
889,402 orders archived
351,478
orders the two readings disagree on
3 / 3
acceptance criteria passed by both
0
questions raised at refinement

Both implementations satisfy every written criterion. Both would pass code review. Both would pass QA, because the test cases were written from the same sentence. The 351,478 orders in the gap are ones created long ago but touched recently — refunds, disputes, warranty claims. Under reading A they vanish from search while still under active handling.

Ambiguity is not vague writing. It is a sentence two competent engineers implement differently, and both are right.

What the agent returns

Not a list of unclear words. A list of decisions that are currently being made by accident, each with the consequence of getting it wrong attached.

01 Which date defines age? Blocking

created_at or updated_at?

351,478 orders differ between the two. If age runs from creation, orders under active dispute disappear from search while agents are still working them. This is the only question of the three that changes the shape of the query.

02 What counts as “order search”? Blocking

Internal search only, or every read path?

There are four consumers: the support console, the customer’s own order history, the finance reconciliation export, and the returns service. Excluding archived orders from the finance export changes the month-end numbers. Excluding them from customer history is arguably a regulatory problem. The criterion names none of them.

03 What about orders that are not settled? Unstated

No criterion mentions open backorders, refunds in flight, or unsettled payments.

Nothing in the story excludes them, so the literal implementation archives them. An order with an open backorder that leaves the active table stops being picked up by the nightly allocation job — a silent failure with no error and no alert.

The traceability line

Once the three are answered, each criterion carries an identifier that survives into the branch, the tests and the review. The question at review stops being “does this code look right” and becomes “which criterion does this satisfy”.

CriterionDecisionSatisfied byVerified by
AC-1 Age thresholdAge runs from updated_at ArchiveQuery.olderThan()ArchiveQueryTest · 4 cases
AC-2 Search exclusionSupport console only; finance and customer history unchanged OrderSearchFilterSearchExclusionTest · 3 cases
AC-3 Nightly runUnchanged ArchiveJobArchiveJobTest · 2 cases
AC-4 Settlement guardAdded — exclude open backorders and refunds in flight ArchiveQuery.settledOnly()SettlementGuardTest · 5 cases

What this caught

Left as writtenConsequenceWhen it would surface
Age from creation Orders under active dispute drop out of the support console First support escalation after release
Blanket search exclusion Archived revenue missing from the finance export Month end, during reconciliation
No settlement guard Open backorders silently leave the nightly allocation job Never, until a customer asks where their order went

A fourth criterion was added that nobody had written, and two that existed were given meanings they did not have. The cost of asking was one refinement session. The cost of not asking was a month-end reconciliation and an unknown number of stranded backorders.

Requirements Intelligence AI - Agent · QEAGENTS