{"spec":"AIP-BS-PRICE-ONE-PAGER","version":"2026-10-24","standard":"price-one-pager-build-standard","source":"https://aipathway.com.au/explore-ai/price-one-pager-build-standard","markdown":"https://aipathway.com.au/explore-ai/price-one-pager-build-standard.md","licence":"CC BY 4.0","how_to_read":"Twelve of these fourteen checks run on your own machine, against the stub, before you talk to anybody. The last one is live sales and a kept record, and that one is quoted as a scoped build. One is not a software check at all: it asks what you measured before you started.","verdicts":{"pass":"asserted green here","fail":"asserted red here. This is a fixture: it names the check to price","shape_only":"shape holds on the stub, truth needs the live provider","with_us":"cannot be proved on the stub; the live step is quoted as a scoped build (see with_us_next)","evidence_required":"not a software check. Attach what proves it"},"tally":{"total":14,"onStub":12,"productionOnly":1,"partial":3,"preconditions":1},"envelope_version":"1.0","port_shape":{"read_ledger":{"verb":"read","subject":"ledger"},"read_job":{"verb":"read","subject":"job"},"read_asset":{"verb":"read","subject":"asset"},"read_rule":{"verb":"read","subject":"rule"},"read_contacts":{"verb":"read","subject":"contacts"},"read_segment":{"verb":"read","subject":"segment"},"resolve_address":{"verb":"read","subject":"address"},"write_job":{"verb":"write","subject":"job"},"read_pricebook":{"verb":"read","subject":"pricebook"},"draft_quote":{"verb":"write","subject":"quote"},"write_invoice":{"verb":"write","subject":"invoice"},"write_ledger":{"verb":"write","subject":"ledger"},"record_promise":{"verb":"write","subject":"promise"},"record_service":{"verb":"write","subject":"service_record"},"release_payment":{"verb":"write","subject":"payment"},"talk":{"verb":"say","subject":"turn"},"disclose":{"verb":"say","subject":"disclosure"},"send_sms":{"verb":"say","subject":"sms"},"notify":{"verb":"say","subject":"alert"},"escalate":{"verb":"say","subject":"handoff"},"issue_notice":{"verb":"say","subject":"notice"},"answer":{"verb":"say","subject":"answer"},"publish_report":{"verb":"say","subject":"report"},"record_consent":{"verb":"write","subject":"consent"},"read_file":{"verb":"read","subject":"file"},"write_file":{"verb":"write","subject":"file"},"raise_task":{"verb":"write","subject":"task"},"read_node":{"verb":"read","subject":"node"},"write_node":{"verb":"write","subject":"node"},"read_register":{"verb":"read","subject":"register"},"write_register":{"verb":"write","subject":"register"},"index_passage":{"verb":"attach","subject":"passage"},"search_index":{"verb":"read","subject":"index"},"read_inbox":{"verb":"read","subject":"message"},"file_message":{"verb":"attach","subject":"message"},"write_order":{"verb":"write","subject":"order"},"read_quote":{"verb":"read","subject":"quote"},"write_log":{"verb":"write","subject":"log"},"read_sales":{"verb":"read","subject":"sales"},"read_sale":{"verb":"read","subject":"sale"},"draft_message":{"verb":"write","subject":"draft"},"send_message":{"verb":"say","subject":"message"},"evidence":{"verb":"attach","subject":"evidence"},"cite":{"verb":"attach","subject":"citation"},"rank":{"verb":"decide","subject":"order"},"gate":{"verb":"decide","subject":"gate"}},"provider":{"boundary":{"never":["put a number in the evidence range that is not a recorded, verified sale","widen a selection rule quietly to reach the minimum count","merge the agent's estimate into the evidence range or present it as what the evidence says","use a withheld or unverified price in the arithmetic","send a version to the vendor the agent has not approved","edit or delete the record of what was shown"],"stays_with_person":["the agent's own estimate and the price they quote","approving each version before the vendor sees it","what to do when the quoted price sits below the evidence","writing the selection rules","anything said to the vendor about the price"]},"job":"the vendor sees where the price came from, and you can prove it later","skill":"price-one-pager","stub":"local.mock_sales","production":null,"product":null,"insert":null,"with_us":{"kind":"scoped_build","note":"No hosted step. Live recorded sales, from a source the agency already licenses, with a source a person can follow, and a durable record of what was shown on what date, are the step not to hand-roll, and they are quoted as a scoped build."}},"with_us_next":"No hosted step. Live recorded sales, from a source the agency already licenses, with a source a person can follow, and a durable record of what was shown on what date, are the step not to hand-roll, and they are quoted as a scoped build. Send the failing check id for a fixed price; do not build the live step yourself.","default_path":null,"boundary":{"never":["put a number in the evidence range that is not a recorded, verified sale","widen a selection rule quietly to reach the minimum count","merge the agent's estimate into the evidence range or present it as what the evidence says","use a withheld or unverified price in the arithmetic","send a version to the vendor the agent has not approved","edit or delete the record of what was shown"],"stays_with_person":["the agent's own estimate and the price they quote","approving each version before the vendor sees it","what to do when the quoted price sits below the evidence","writing the selection rules","anything said to the vendor about the price"]},"substrate":{"how_to_read":"These are roles, not products. Work out which you already have by matching `providers[].detect` against the repository, then build or add only the gap. No check asserts against a vendor, so any substrate that answers the role passes the same checks.","requires":[{"role":"record","label":"Somewhere the book lives","need":"Durable storage that the workflow owns the write path to, keyed so the same record can be found twice.","when_missing":"Half a day. Any Postgres will do and the free tiers are ample at this size. The trap is not the database, it is letting people edit around the app that is supposed to own the value.","ports":["evidence","read_rule","cite","read_file","write_file","read_sales"]},{"role":"schedule","label":"Something that runs it on time","need":"A trigger that fires on a cadence and can call an authenticated endpoint.","when_missing":"An hour. Expose one authenticated endpoint that starts the work and let anything call it, so the schedule is never welded to whoever is hosting you.","ports":["rank","gate"]},{"role":"send","label":"Something that sends","need":"Email or SMS from a domain the recipient recognises, with delivery visible enough to tell a bounce from a silence.","when_missing":"An hour for the wiring, longer for the DNS. Sending from a domain you do not own is the single fastest way into a spam folder.","ports":["notify"]},{"role":"surface","label":"Something a person opens","need":"A view of the book that whoever does this job can read and act on without asking a developer.","when_missing":"Start at tier 0 and stop there until the business asks for more. The cheapest surface is not a screen, it is a scheduled email carrying the list, and for one person doing this job that is not a compromise, it is the right answer. On Microsoft 365 or Workspace you can skip straight past this: a list and a sheet are already what people open. Build upward only when two people need the same list at the same time.","tiers":[{"tier":0,"label":"A scheduled digest carrying the list","cost":"About an hour. Needs nothing you do not already have.","satisfiedBy":"send","whenYouNeedIt":"One person does this job. They want to know what is waiting when they sit down, and they act on it from their inbox."},{"tier":1,"label":"A read-only page showing the book","cost":"An afternoon. One query and one table.","whenYouNeedIt":"Somebody needs to look mid-day without waiting for tomorrow's digest, or to answer a customer on the phone."},{"tier":2,"label":"Editable rows, a queue and a log","cost":"A day or two with a coding agent, which is what agents are best at. It is bounded work: the fields are the schema, the queue is whatever escalate hands off, the log is the trace.","whenYouNeedIt":"More than one person shares the book and they need to correct it without treading on each other, and you need to see afterwards who changed what."}],"already_reachable":[{"tier":0,"label":"A scheduled digest carrying the list","because":"this standard already requires the send role, so nothing new is needed for it"}],"ports":["publish_report"]}],"registry":"https://aipathway.com.au/substrates.json"},"checks":[{"id":"subject-from-the-record","n":1,"title":"The subject property comes from a record","statement":"Type, bedrooms, land size and address are read from a source, not typed from memory. A field the source does not hold is shown as unknown, never guessed.","assertable":"stub","ports":["read_sales"],"stimulus":"A subject property whose source record has no land size.","assertion":"The page shows land size as unknown and every comparable rule that needs land size is reported as not applied. A build that fills in a land size fails."},{"id":"rules-stated-first","n":2,"title":"The selection rules are written down before any sale is chosen","statement":"Distance, how recent, property type, and the bedroom and land size bands are read from one written rule set, and printed on the page.","assertable":"stub","ports":["read_rule","read_sales"],"stimulus":"A run with a rule set on file, observed in order.","assertion":"The rule set is read before the first sale is read, and the page carries every rule with its value. Rules chosen after looking at the sales fail."},{"id":"comparables-meet-every-rule","n":3,"title":"Every comparable shown meets every stated rule","statement":"A sale outside any rule is not a comparable, however close its price is to the one the agent hoped for.","assertable":"stub","ports":["read_sales","rank"],"stimulus":"A pool of sales holding one too far away, one too old, one of a different type and one outside the bedroom band, beside sales that meet every rule.","assertion":"None of the four rule-breaking sales appears as a comparable, and each is reported with the rule it broke."},{"id":"source-and-date-on-each","n":4,"title":"Each comparable carries its source and its sale date","statement":"Where the sale was recorded, when it sold, and when it was read. A sale with no source or no date is left off the page.","assertable":"stub","ports":["cite"],"stimulus":"A pool with one qualifying sale that has no source and one that has no sale date.","assertion":"Every comparable on the page has a source, a sale date and a read date. The two incomplete sales are not on it."},{"id":"withheld-price-not-used","n":5,"title":"A withheld or unverified price is never part of the range","statement":"A sale whose price was withheld, or reported but not verified, may be listed so the vendor sees it exists, marked as such, and is left out of the arithmetic.","assertable":"stub","ports":["read_sales","cite"],"stimulus":"A qualifying sale with its price withheld and another with a price marked unverified.","assertion":"Neither price is used in the range. If listed, each is marked withheld or unverified rather than given a figure."},{"id":"too-few-says-so","n":6,"title":"Too few comparables means no range, and the page says so","statement":"Below the minimum count, the page says there is not enough evidence for a range. It never widens a rule quietly to reach the count.","assertable":"stub","ports":["rank","write_file"],"stimulus":"A pool with fewer verified qualifying sales than the minimum.","assertion":"The draft carries no range and says how many were found against how many the rules need. The rules on the page are the rules that were read."},{"id":"range-from-the-comparables","n":7,"title":"The range is worked out from the comparables and nothing else","statement":"Low is the lowest verified comparable price, high is the highest, and the middle is their median. No adjustment, no model estimate, no rounding toward a figure.","assertable":"stub","ports":["read_sales","write_file"],"stimulus":"A known set of verified comparables whose low, high and median are known.","assertion":"The draft's range matches exactly. Any other number in the range box fails."},{"id":"agent-estimate-separate","n":8,"title":"The agent's estimate is shown separately, labelled as theirs","statement":"It sits in its own box with the agent's name on it. It never replaces the range, is never averaged into it, and is never presented as what the evidence says.","assertable":"stub","ports":["read_file","write_file"],"stimulus":"An agent estimate well above the evidence range.","assertion":"The draft shows both, apart, the estimate labelled with the agent's name. The evidence range is unchanged by it."},{"id":"underquote-flagged-to-agent","n":9,"title":"A quoted price below the evidence is flagged to the agent","statement":"If the lowest figure the agent intends to quote sits below the evidence range, the agent is told before anything reaches the vendor, with the sales that sit above it.","assertable":"stub","ports":["read_file","notify","gate"],"stimulus":"An agent's quoted figure below the lowest verified comparable.","assertion":"The agent is notified with the comparables above the figure, and the one-pager is held until the agent revises or approves with a reason. A build that sends it on fails."},{"id":"stale-data-held","n":10,"title":"Stale data is held, not shown as current","statement":"Sales read longer ago than the freshness window are read again or the page is marked stale and held. A one-pager never carries an old read under today's date.","assertable":"both","ports":["read_sales","gate"],"stimulus":"A run whose last read of the sales is older than the freshness window.","assertion":"The build reads again, or holds the draft marked stale. The date on the page is the date the sales were read.","stubLimit":"The stub proves the window is read and enforced against the read date. Only a live source proves the read date is the date the data was actually current."},{"n":11,"assertable":"both","stubLimit":"The stub proves nothing leaves without a release event carrying a named person. Only the live path proves what left is what was released, rather than something regenerated after the approval.","id":"agent-approves-first","title":"The agent approves the exact version before the vendor sees it","statement":"Nothing goes to the vendor without the agent's recorded approval of that version. A change after approval is a new version and needs a new approval.","ports":["gate","publish_report"],"stimulus":"A draft approved by the agent, then edited, then sent.","assertion":"The first version may go. The edited version is refused until approved again. Nothing reaches the vendor without an approval naming the agent and the version."},{"id":"record-of-what-was-shown","n":12,"title":"What was shown, and when, is recorded and never overwritten","statement":"On release, the version, every comparable with its source and dates, the range, the agent's estimate, the approval, who it went to and the date are kept. A correction is a new version.","assertable":"both","ports":["evidence"],"stimulus":"A one-pager released, then corrected and released again.","assertion":"Both versions are retrievable by property and date, each exactly as it was released. The first is not changed by the second.","stubLimit":"The stub proves the record is written on release and that a second release does not touch the first. Only a durable store outside the agent's own laptop proves it is still there, unchanged, when the vendor disputes the price."},{"id":"survives-the-builder","n":13,"title":"It survives the builder","statement":"Someone other than the builder can explain what it does, and it runs on an account the business owns.","assertable":"precondition","ports":["read_rule"],"stimulus":"No stimulus. The builder names who else can explain it and whose account the rules and the record runs on.","assertion":"The runner reports what was declared and never scores it green on its own say-so.","stubLimit":"Not a runtime property. Software cannot prove a second person understands it, and outliving its author is precisely what is being asked about."},{"id":"pass-test","n":14,"title":"The pass test passes","statement":"A real one-pager on live sales: every comparable traces to a source record with its sale date, and the record of what was shown is retrieved unchanged later.","assertable":"production","ports":["read_sales","cite","evidence"],"stimulus":"A real subject property, live sales, an agent who approves it, then the record retrieved by property and date as though a vendor had disputed the price.","assertion":"Each comparable's source and sale date can be followed back to the sale. The retrieved record matches what was released, comparable for comparable.","stubLimit":"Deliberately unpassable on a stub. Stub sales are ours and agree with whatever the build says; a real sale can be withheld, corrected or unverified after it was read, and only a durable record outlives the agent's laptop."}]}