Agent eligibility check · The decision corpus

Choose what cycle one delivers

docs/records/2026-09-19-cycle-one-delivery-scope.md · ae-2026-09-19-cycle-one-delivery-scope · revision 1 · open / active

This is the development record, published as it was written. It is amended by revision, including where the work went wrong. Nothing here has been rewritten for the web.

Record header

created_at: 2026-09-19T19:38:00-06:00
format: perspicuity-work/1
id: ae-2026-09-19-cycle-one-delivery-scope
next_check: 2026-10-03
record_status: open
revision: 1
skill_version: 0.4.0
updated: 2026-09-19
updated_at: 2026-09-19T19:38:00-06:00
work_status: active

Choose what cycle one delivers

Current position

Parent: RECORD.md, revision 6.

Principal: David. Decider: Rook for the cycle-one delivery scope and the reversible implementation choices inside it, under the delegation in RECORD.md; David for the price, the outreach, the site's domain, the go-live word and anything published about a supplier. Work owner: Rook. Decision: selectedA2, the closed journey: today's product plus the minimum that lets a stranger arrive, submit, read, take the files away and share, and nothing else. selected_at 2026-09-19T19:42:00-06:00, by Rook, against revision 1 of this record, which was registered and committed at 72c1810 before the comparison was written. Authorisation: David's instruction of 2026-09-19 to start the next phase from the core delivery decisions, inside the delegation in RECORD.md. Work scope: what cycle one builds and runs, what it deliberately does not build, and what "live" means for the registered market test. It does not own the price, the outreach message, the domain choice or the go-live word. Work: registered at 19:38 with the frame, the objectives, the conditions and the alternatives; selected at 19:42 after three real supplier audits were run as U1. U1's evidence is in Act. No product code has been written in this increment. Outcome: unknown, and nothing is claimed. No supplier has submitted a domain; the site is not hosted; no supplier has paid. Next: Rook — build U3–U5, holding the corpus in step, and report to David at go-live. David — choose the domain and give the go-live word; both remain his, and the domain is the only thing on the critical path that this record cannot move. Dependency: the site's domain (David, parent uncertainty U3) gates U5 but not U3 or U4. Nothing else blocks. Review due: 2026-10-03, the scope cap registered in the parent's plan; the parent's test window opens at publication.

Stagebegan_atregistered_at / exact basis revisionfinished_at
Frame and Decide2026-09-19T19:37:00-06:002026-09-19T19:38:00-06:00 / revision 1, committed at 72c18102026-09-19T19:42:00-06:00
Act2026-09-19T19:42:00-06:002026-09-19T19:42:00-06:00 / this revisionpending
Reviewpendingpendingpending

Registration note. This file was committed at 72c1810 with the frame, the objectives, the conditions and the alternatives, and *without* a recommendation or a selection. The comparison and the selection were written afterwards, at 19:42, from evidence gathered in between. The two commits are the evidence that the basis was saved before the evaluation: git show 72c1810 is the registered basis, and the diff to this revision is what the evidence changed. This is the practice docs/RECORDS.md asks for, and unlike the previous increment it was followed.

Frame and Decide

David accepted the process increment on 2026-09-19 and instructed Rook to start the next phase, beginning with the core decisions about what the project will actually deliver. The inherited material is the parent's selection and scope decisions S1–S7, which are not repeated here.

The question this record answers:

What is the smallest delivery that makes a real small supplier able to get a useful report, take the files away, and share it — without adding a dependency, an account, a model or a claim we cannot support?

The framing that matters, and why it is narrower than it first appears. The product's parts are not equally proven. The check engine exists and is deterministic. The report exists and renders. The journey — a stranger arriving, entering a domain, waiting, reading, acting, sharing — has never been walked end to end by anyone outside this project, and walking it is what produces the ten real audits the market test counts. So cycle one is not "finish the product". It is close the journey and get out of the way of the test.

Fundamental objectives

#Fundamental objectiveSourceMeasure, direction and horizon
O1The registered market test becomes runnableRECORD.md and the parent: ten real audits including two unprompted enquiries; passes at one payer or ten audits plus two enquiries, fails at ten audits and zero enquiriesTen audits by non-project people; up; from go-live to the review
O2A stranger can walk the whole journey unaidedCONTEXT.md: free, dated, shareable, private by defaultA supplier who has never spoken to us submits, reads and acts without asking a question; at the first real audit
O3The claim boundary survives contact with usersStanding constraint; ClaimBoundaryTestsNo wording that promises a finding, a ranking or an agent's behaviour; continuous, checked by CI
O4The corpus keeps pace with the workThe project's second required outcomeEvery consequential choice in a record before the work; at the 2026-10-03 review
O5The free tier costs nothing to run and nothing to maintainStanding constraint: standard library only, no paid API, no accountsMarginal cost per audit; flat; until the review

Material conditions

Material conditionTypeBasisAffects
The scope cap is 2026-10-03GivenParent's plan, registered before any outcome was observedEvery alternative below; today is 2026-09-19, so 14 days
The site's domain is unchosenGivenTODO.md; parent uncertainty U3Go-live only. Build, test and self-audit are not blocked
The engine, report renderer, queue, worker and fix-file generator exist and pass CIGiveneligibility/, make ci at 80b70d6; 17 checks, 111 testsAlternatives differ in what they *add*, not in whether the core works
Reports are private, unguessable and noindexGiveneligibility/render.py, eligibility/audit.py; the privacy stance in CONTEXT.mdAny "share" feature has to change this deliberately, and the report-directory question is a publication decision
No accounts, cookies, tracking or paid API in the coreGivenStanding constraintsRules out e-mail capture, login-gated sharing and any paywall in the core
The market test needs ten audits from external peopleGivenParent's registered testThe journey must work for someone who is not David, and outreach is his
Whether small suppliers will find this unaidedUncertaintyNo traffic, no outreach, no evidenceWhether O1 is reachable from the site alone or needs David's outreach to carry it
Whether the report is legible to a supplier who is not a developerUncertaintyIt has never been read by oneWhether the report needs a plain-language pass before, or after, the first real audits
Whether a hosted report directory is safe to exposeUncertaintyThe path /r/<id>/ is served from build/ by Caddy; a listing or a sitemap entry would break the privacy stanceThe shape of the share feature; whether directory listing must be closed explicitly
Self-serve submission is the right intakeAssumptionAsserted in CONTEXT.md; unverifiedChallenged by the first alternative below; if audits arrive only through outreach, the form is not the bottleneck
The price is not yet a product decisionAssumptionKept with David; the monitoring tier has no price and no buyerCycle one should not build a payment path; it should make the paid tier describable

Alternatives and consequences

The four courses registered before evaluation, now compared against the objectives and the conditions.

#CourseO1 test runnableO2 stranger's journeyO5 free to runCost inside 14 daysFits the standing constraints
A1Service only: engine and fix files, audits run by hand for named suppliers, nothing hostedYes, and fastest. Ten audits can start as soon as David names ten suppliersNo. There is no journey to walk, so O2 is untested and the corpus cannot show a real oneYesSmall: no new surfaceYes
A2The closed journey: today's product, plus a worked example, a share action and a first-run experienceYes. The form already enqueues; the missing half is that a stranger cannot get *out* with anything shareableYes — this is the only course that makes the journey walkable, which is what produces auditsYes: static files, no new serviceModerate: one endpoint, one page section, one new published pathYes, with one deliberate decision about what publishing means
A3The journey plus the paid tierPartly: the free journey ships, but attention and the window go to the tierYesNo: monitoring implies storage of a supplier's history over time, and a payment pathDoes not fit. A payer, a price and a retention rule are not knowable before the first auditsConflicts with "no accounts" and needs a data-retention record before any code
A4The journey plus a machine interfacePartly, as A3YesYesModerate, but it is a second product surface with no consumerYes on paper; unverifiable in practice

The decisive tradeoff. A1 and A2 both make the test runnable; A2 costs more and is the only one that tests O2 at all. The preference it rests on is that a walkable journey is worth more than a smaller build, because the journey is the thing being sold and the thing the market test measures — ten audits by people who are not us. A1 would produce ten audits too, but as a consultancy, and the finding would be about David's outreach rather than about whether a supplier can use the thing unaided.

A3 is rejected for the window, not for the idea: it is the revenue hypothesis, and building it before a single supplier has seen a report would be building the paid answer to an unasked question. A4 is deferred rather than rejected — an agent-facing interface is the product's own logic, but building one with no consumer is the same mistake in a different shape.

What would warrant reconsideration. If the domain cannot be chosen within a few days, A1 becomes the better course: it is the only one that can start the test without the domain, and the window is the binding constraint. If, at the first real audits, suppliers consistently cannot find or use the report unaided, the answer is not a bigger build but a plainer report — recorded as a revision here rather than as scope.

Selection

selected_at 2026-09-19T19:42:00-06:00, by Rook, against revision 1 committed at 72c1810. A2.

Three things are chosen with it, and they are the consequential part:

  1. Publishing is a server action, not a link copy. A supplier who chooses to publish gets a stable, human-readable, indexed URL for a *copy* of the report, taken at a recorded instant; the original report stays at its unguessable id and stays out of the index. This changes what we publish, so it is the decision in this record that most deserves its own paragraph. It also means the "private by default" stance survives with its meaning intact: nothing becomes public without an explicit action by the supplier, and the public copy is dated so a reader can tell how old it is.
  2. The report's share state is visible on the report. A published report says so and says when. A supplier who has not published sees that it has not — which is both honest and the prompt that makes the action discoverable.
  3. The paid tier is described, not built, and described as unavailable. One paragraph on the landing page, no price, no date, no mechanism. Building a "notify me" field would be collecting contact details from people we have promised not to track, and agreeing a price is David's. The consequence to accept: cycle one produces no revenue path at all, and the market test's revenue half can only be observed through enquiries that arrive by whatever means David opens.

Rejected within A2, deliberately: an on-site index of published reports (a distribution decision disguised as a feature, and one that makes us a directory of our customers' weaknesses — David's to decide, not this record's); a plain-language pass over the report before any supplier has read one (we would be guessing at the confusion); and any e-mail capture (a standing constraint).

Act

U1 — the audit evidence this selection rests on

Run 2026-09-19 with python3 -m eligibility audit <domain>, at commit 72c1810, against three real supplier sites. The three were chosen from public domains already named in this workspace, not from a market sample.

DomainCoreDetail
goodmeat.co6 of 9No JSON-LD at all; no structured contact; no product, price or availability markup. Sitemap lists one URL; no llms.txt
quorn.co.uk7 of 9Organization JSON-LD present and named; contact partial (address only); no offer markup; **robots.txt declares a sitemap that returns 404**
myprotein.com6 of 9Organization JSON-LD present; no structured contact; no offer markup; sitemap returns 403; llms.txt present

Determinism, measured rather than asserted. goodmeat.co was audited twice, two seconds apart. The two outputs are byte-identical apart from the timestamp line: diff reports no differences across 19 lines.

What this establishes. The engine runs end to end on real supplier-shaped sites, the same input gives the same output, and the checks find things that are genuinely absent rather than merely unusual. The quorn.co.uk result — a declared sitemap that 404s — is the kind of finding a supplier cannot see by looking at their own site, which is the product's reason to exist.

What this does not establish, and the honest limit of U1: two of the three are large brands with in-house web teams, not small suppliers. The third is a small producer. So this is evidence that the tool works, not evidence about the target market, and it does not upgrade O1 or the payer hypothesis in any way. The small-supplier sample remains unrun.

The plan

#ResultInputs / dependenciesOwner / timingDone whenActual evidence
U1Three real supplier audits, deterministicNetwork; the shipped CLIRook, 2026-09-19Same input gives the same output on a site that sells somethingMet for the engine; not met as a small-supplier sample. Above
U2The cycle-one scope chosen and registeredU1; the parent's testRook, 2026-09-19A selection with its alternatives, before any dependent codeMet: the comparison and selection above; the registered basis precedes them in Git
U3The first-run experiencepublic/index.html, eligibility/render.py, eligibility/server.pyRook, before go-liveA person who has never seen the site reaches a finished report and knows what happened, what it cost them and what to do next — with no JavaScript and no accountPending
U4Publish: a share action that produces a stable public copyU3; the publish decision aboveRook, before go-liveA supplier can publish; the published copy carries a publication date; the original stays unguessable and unindexed; the report states which state it is in; the action is reversiblePending
U5Go liveU3, U4, the domain, David's release wordRook builds; David chooses the domain and gives the wordThe site is reachable at the chosen domain, passes its own rubric, and serves a published worked examplePending
U6Run the registered market testU5; David's outreachDavid owns outreach; Rook owns the tooling and the corpusTen real audits and two unprompted enquiries, or ten audits and zero, read at the reviewNot started, and correctly so

What is deliberately not in this increment, recorded so that the scope fence is auditable: the monitoring tier (A3), any agent-facing interface (A4), an on-site index of published reports, any e-mail capture, any payment path, any plain-language report rewrite before a real reader has seen one, and any change to the 17 checks. Each is either David's or waits on evidence.

Acceptance criteria for the increment, registered before the work

  1. make ci exits 0 and make records is clean at every commit.
  2. U3 and U4 ship with tests that fail if the privacy stance is broken: a published copy is dated, and an unpublished report is neither indexed nor listed.
  3. The site passes its own rubric once hosted, or the failure is recorded with its reason.
  4. Every choice in U3–U5 that meets the admission test is in a record *before* the code that depends on it.
  5. The published worked example is our own domain, audited by this tool, with its weaknesses shown.

Units registered before their implementation

U3–U5 are registered here as results and acceptance criteria. Their *design* choices — the publish endpoint's shape, what the published copy is, what the first-run experience says — meet the admission test and will be registered before the code that depends on them, in this record or in a linked one. This section is the plan, not the design.

Review

CriterionEvidence sourceOwner, window or triggerFindingResponse
The test becomes runnableTen audits by people who are not usDavid, from go-live to 2026-10-03PendingA1 is the fallback if the domain cannot be chosen
A stranger can walk the journey unaidedThe first real audit; the supplier's own wordsRook, at the first real auditPending, and unobservable before go-liveIf it fails, simplify the report rather than widen the scope
Publishing does not break the privacy stanceU4's tests; a review of what the published path exposesRook, at U4PendingThe negative test is part of the definition of done
The free tier stays free to runThe host's resource use; no paid APIRook, at the reviewPendingA cost that appears would be a recorded choice, not a surprise
The corpus keeps pacemake records; this record's own registration orderRook, continuousMet so far: the basis was committed at 72c1810 before the comparison that used itNone
Delivery is not benefitNothing here has been delivered to a supplier, and no supplier has paidThe first row is the only one that can establish benefit, and it cannot report before go-live

Changes

Revision 1, 2026-09-19T19:38:00-06:00. Created with the frame, objectives, material conditions and four candidate courses of action, and no selection. Source: David's acceptance of the process increment and his instruction to start the next phase from the core delivery decisions. Reason: the choice of what cycle one delivers governs every unit that follows, so its basis had to be saved before the comparison and before any code. Affects: the cycle-one plan, the units derived from it, and the domain decision's place on the critical path. No code was written and nothing was published, spent or sent.

Revision 2, 2026-09-19T19:42:00-06:00. Adds the comparison, the selection of A2, the plan and the review criteria. Source: three real supplier audits run between the two revisions, and the registered basis at 72c1810 read against them. Reason: the frame asked what the smallest delivery is that makes the journey walkable; the audits establish that the engine is not the constraint, so the journey is, and A2 is the only course that closes it. Changes: Alternatives and consequences replaces its placeholder with a comparison against the objectives and conditions; Selection records A2 and the three choices taken with it, including the publish decision that changes what the project may publish; Act carries U1's evidence, the U1–U6 plan, the acceptance criteria and the explicit scope fence; the Review criteria are registered. Revision 1 is preserved at 72c1810. No objective or material condition in revision 1 is altered. Nothing is published, spent or sent; no product code was written.

How this record connects

It builds on or points to: RECORD, RECORD § authority, RECORDS § registration order, CONTEXT.

It is referenced by: Make small suppliers eligible to AI agents.