Confirming a value chain fact
One fact, three moments: entered, confirmed by a second administrator, then read-only
FY2025 GRI report·Jan 2025 to Dec 2025·Khlong Toei Retort Processing (Bangkok, TH)·contract-processor
Annotation · not proposed UIThe same fact is drawn three times, in order: entered and viewed by the person who entered it, then viewed by a second administrator with the confirmation dialog open, then after confirmation. The three states differ only by who is signed in and what has already happened, which is the whole point of the control. The signed-in person is stated on each state; the top bar of the page shell is not part of the proposal.
Annotation · not proposed UIWording proposal the PM can veto: the spec's internal word for this step is attestation. The UI words drawn here are "confirm" and "confirmed", because the people doing it are administrators signing off a figure, not lawyers. The audit record, the endpoint, and the digest keep the spec's names.
State 1 · entered by Mei Tan, viewed by Mei Tan · annotation frame only, the white card is the proposal
The confirm action is present but unavailable, and it says why in the same place the reader is looking. Editing is still allowed, because nothing is confirmed yet.
Signed in as Mei Tan (Sustainability Admin) · she recorded this fact on 19 Jun 2026
entered
Signed in as Mei Tan
Revision 1 · the only revision so far
RelationshipKhlong Toei Retort ProcessingBangkok, TH · outside the reporting boundary
Relationship typecontract-processor
Value3,120 t of 3,400 ttonnage processed under the toll agreement
PeriodJan 2025 to Dec 2025taken from the cycle
ScopeCanned tuna lines only. Retort capacity used for other customers is excluded.
MethodMonthly toll invoices summed, cross-checked against plant despatch notes.
ProvenanceToll agreement TH-2025-04, invoice set Jan 2025 to Dec 2025.
Entered byMei Tan, 19 Jun 2026, 10:16 UTC
Server-enforced, not a hidden button: the same request from the person who entered the fact is refused at the API. The reason is drawn next to the control rather than in a tooltip, because a disabled button with no explanation is the state people file tickets about.
State 2 · the same fact, viewed by Priya Nair, with the confirmation dialog open · annotation frame only
Confirm is available because Priya Nair did not record this entry. The dialog states what confirming means and shows exactly what is being confirmed.
Signed in as Priya Nair (Sustainability Admin) · 20 Jun 2026
entered
Signed in as Priya Nair
Edit Confirm
Confirm this value chain fact
Khlong Toei Retort Processing · FY2025 GRI report · entered by Mei Tan on 19 Jun 2026
What confirming means.
1. The entry becomes read-only. Nobody edits it in place after this, including you.
2. Any later edit creates a new revision. The new revision starts unconfirmed and needs confirming again; this revision stays on record, still showing your confirmation. The next revision may be confirmed by you again, as long as you did not enter it.
3. Your name and the time are stored with the entry, and the report shows the figure as confirmed.
4. A fingerprint of the exact content below, the unit included, is stored with the confirmation, so if any of it ever differs from what you confirmed, the difference can be shown.
You are able to confirm this entry because you did not record it. The person who records a fact can never confirm their own entry.
Exactly what you are confirming
Value3,120 t of 3,400 tnumerator 3,120 · denominator 3,400 · unit tonnes
PeriodJan 2025 to Dec 2025
ProvenanceToll agreement TH-2025-04, invoice set Jan 2025 to Dec 2025
ScopeCanned tuna lines only. Retort capacity used for other customers is excluded.
MethodMonthly toll invoices summed, cross-checked against plant despatch notes.
Cancel
Confirm entry
The dialog is drawn over the dimmed fact page, the same treatment the spec i wireframe set uses for the lock-change dialog. Nothing in the dialog is editable: it is a read-back of what is about to be signed off.
State 3 · after confirmation · annotation frame only
Read-only, with the edit path kept visible and honestly labeled. This is a moment later than the fact list on page 10 of this wireframe set, where the same fact still shows as entered.
Viewed by anyone with access · 20 Jun 2026 onwards
confirmed
read-only
Revision 1 · current
Confirmed by Priya Nair, 20 Jun 2026, 04:32 UTC. Entered by Mei Tan on 19 Jun 2026. This entry is read-only and the figure can be reported as confirmed.
Value3,120 t of 3,400 t
PeriodJan 2025 to Dec 2025
ScopeCanned tuna lines only. Retort capacity used for other customers is excluded.
MethodMonthly toll invoices summed, cross-checked against plant despatch notes.
Entered byMei Tan, 19 Jun 2026, 10:16 UTC
Confirmed byPriya Nair, 20 Jun 2026, 04:32 UTC
Revision historyRevision 1, currentno earlier revision exists for this fact
Review scaffolding · not proposed UI · spec ii 4.1Confirmation stores a DIGEST of the exact confirmed content, so any later divergence from what was signed off is detectable. It is drawn here rather than on the card above because it is an implementation guarantee and not an affordance:
9f2c1a4b...e40b is nothing a user copies, checks, or acts on, and a definition row on a white card invites all three. If the PM wants divergence surfaced to users, that is a separate state ("this fact no longer matches what was confirmed"), not a hash on a card.The edit affordance is deliberately not hidden. Hiding it would leave a correction with no visible route; labeling it states the price of the correction up front.
Annotation · not proposed UISpec ii 4.1 and ruling D-ii-6(a), decided 2026-08-24 · the different-person rule is server-enforced and universal.
attestedBy must differ from enteredBy, enforced at the API rather than in the client. The PM kept the rule for every workspace with no small-tenant exception, so a workspace with a single administrator needs a second user before any confirmation can complete. State 1 is therefore the permanent state of such a workspace until a second admin exists, which is why the copy names the next action instead of only refusing.Annotation · not proposed UISpec ii 4.1 · the confirmation stores a digest of the exact confirmed content, unit included. The digest covers numerator, denominator, UNIT, scope, methodology, period, and provenance. Unit was added to the field list and to the digest in spec v2.2, at this wireframe round, because this drawing showed a unit inside "exactly what you are confirming" while the spec's digest list did not carry it: a unit changes what a number means, so a unit outside the digest would have let 3,120 t become 3,120 kg without the confirmation noticing. The dialog above is therefore contract-true as drawn. Divergence is detectable; no user action depends on the digest, which is why it appears in this wireframe set only in scaffolding.
Annotation · not proposed UISpec ii 4.1 · immutability and revisions. A fact row becomes immutable once confirmed. An edit creates a new revision row, the prior revision is retained with a
supersededByRevision pointer, and confirmation is cleared on the new revision. Acceptance case 9.5 covers the whole chain: different-actor enforced, edit-after-confirmation creates a new unconfirmed revision, and the digest matches the confirmed content.Annotation · not proposed UISpec ii 4.1 · roles and access. Entering a fact is the entry role; confirming a fact and administering the relationship-type codes are the admin role. Framework access is NOT required for these endpoints, because the value chain and stakeholder bones are framework-agnostic. Lookups are tenant-scoped
{_id, companyId} with cross-tenant 404. Both people in this flow hold the admin role, which is what makes confirmation possible at all.Annotation · not proposed UITwo details this page used to raise as questions, both now stated in the contract. (1) The refusal constant for the different-person rule is
ATTESTATION_ACTOR_INVALID, 422, named in the spec ii 6.6 error contract and deliberately distinct from a role 403 so a client can tell "you lack the role" from "you cannot confirm your own entry". The disabled state above still carries words rather than the constant, because the person reading it is a site administrator, not an integrator. (2) The rule binds PER REVISION, and the SAME second person MAY confirm a later revision: spec ii 4.1 says so in as many words, precisely so the build does not invent a fresh-pair rule. Priya Nair confirming revision 2 after confirming revision 1 is legal, as long as she did not enter it.