Finding 1 — the claim-to-credit join is soft
Two legs, unequal strength:
| Leg |
Key used |
Strength |
| Credit → ledger |
pay_[redacted] → txn_ref |
Hard. Unique gateway identifier. |
| Claim → credit |
Amount + timestamp proximity + payee |
Soft. Probabilistic. |
The guest's screenshot carries no UTR and no gateway ID — nothing that also appears in the Razorpay notification. Jeni's own words in the ticket confirm the method: "matched WA screenshot + Gmail confirmation." The join was ₹2,500 matching ₹2,500, ten seconds apart, same payee.
At this volume that is fine and will be right almost always. It is not a proof, and it will not survive collision — two guests paying an identical amount inside the same window is not exotic in hospitality, where prices repeat by design.
The fix is not a better matcher. It is to take the screenshot off the critical path: the gateway notification alone authorises; the screenshot is a courtesy with no evidential weight. This matters more at autonomy, where no human sees the match before it commits.
Finding 2 — the human checkpoint sits after execution
The reservation was created, the ledger row posted and the ticket closed before the rate variance reached a human. At ₹199 on one booking that is immaterial. As a pattern it changes what a correction costs: a pre-execution flag is a question; a post-execution flag is a reversal — amend the reservation, adjust the finance row, reopen a closed ticket. Figure 5 shows the Reopen button, so the mechanism exists; the point is that it should not routinely be needed.
This is the right model for delegated execution, and the run proves it works in 2 minutes 10 seconds. But it needs guardrails rather than defaults — a value threshold above which nothing commits, and a rule that a flagged variance holds the finance row rather than posting it. Both become load-bearing at autonomy.
Finding 3 — the agent opened, updated and closed its own ticket
Assigned To: Jenni De. Update #6669 by Jenni De. Update #6670, action close, by Jenni De. Completed 18:48:04 by Jenni De. The agent is author, actor, assignee and closer of its own audit record.
The trail is genuinely good. The review trail does not exist. A closed ticket normally signals that someone checked; here it signals only that the agent believes it finished — and Figures 4 and 5 both show it had not (Findings 7, 10, 15/16 in the completion audit).
Small fix, real value: agent-executed tickets resolve to pending review and close on a human action. Given that the platform already has AI Agent Task as a category, this is a workflow rule on an existing field, not new infrastructure. It converts the queue from a log into a supervision mechanism — and at autonomy it becomes the primary supervision mechanism, since there will be no chat report to read.
Finding 4 — the claim/authorisation distinction held
The screenshot was treated as a claim. The Razorpay credit was treated as the authorisation. Jeni did not book on the picture.
This is the most valuable behaviour the run demonstrates, because screenshot-based payment fraud is the dominant risk in exactly this workflow across Indian hospitality and retail.
One question remains, and it is now answerable rather than open. Whether the behaviour is enforced — a hard constraint in Constitution.md — or emergent from instruction and model capability determines whether it survives a marginal case. Annexure A holds the answer; stating it explicitly in that annexure is what converts this from an observed behaviour into a guaranteed one, and it should be settled before autonomy.
Finding 5 — the verbal hold had no system representation
"Done, Will reserve one for you" (Figure 1, 18:30) committed the unit before money moved and existed only as a sentence in a chat thread — roughly fifteen minutes before ticket #2586 opened. For a single property this is survivable. Across units it is a double-booking waiting to happen, and the failure stays invisible until two guests arrive.
At autonomy this closes naturally: the agent that reads the thread can place the hold at the moment of promise.
Finding 6 — the guest was never sent a confirmation
Figures 3 and 5 both record that confirmation code [confirmation code redacted] was issued. Figure 1 shows the thread ended at "Thanks." The code exists in two systems and never reached the person it was for.
Figure 5 makes this sharper: the ticket carries a "Send WhatsApp" action, sitting unused at the top of the very record containing the confirmation code.
This is a scoped gap, not an unflagged one — direct guest confirmation is explicitly part of the autonomy phase. But it remains the live gap today, and the only one the guest experiences: he arrives on 01 August holding a payment screenshot and no booking reference. Until autonomy lands, this step needs a human owner, because at present it has none.
Finding 7 — Figure 4 exposes what the reports did not mention
Check-in Time and Check-out Time both read "Not set." Neither Figure 3 nor Figure 5 mentions them.
A different class of problem from the rate variance, and a worse one. The variance was a known unknown — found, weighed, declared. The unset times are an unflagged gap: the agent's completion model and the record's completion requirements are not the same thing, and nothing in the run detected the difference.
The lesson generalises: an agent reporting "done" is reporting against its own definition of done. Where the system of record has a required-field set, that set — not the agent's judgement — should define completion. This is the strongest argument in the case for verifying against the system of record rather than trusting the report, and it is a prerequisite for autonomy, where no one will be reading the report at all.
Finding 8 — downstream inventory sync is unverified
The Casa Admin toolbar (Figure 4) carries a Lodgify action — the distribution channel. Whether this reservation propagated there, blocking lmc_429 against other booking channels, is not evidenced by any of the five artifacts, and the ticket close note does not mention it.
If it did not, the unit remains sellable elsewhere for a night that is already paid for, and the failure surfaces as a double-booking on arrival. Verify before the next run — this belongs in the required-step set.
Finding 9 — the failure path is proven in test but not in production
The stated objective is a resilient system, and resilience was pursued deliberately: the test-case runs and re-runs during onboarding (field 4) are what produced the current reliability level.
What remains untested is production failure behaviour — reservation created and the Supabase write times out; ledger posted and ticket creation fails; model API unavailable mid-chain. Test-case reliability establishes that the chain works repeatedly; it does not establish what a half-completed chain does when a real dependency drops.
Deliberate fault injection against the live stack — kill the connection between step 4 and step 10 and observe whether the chain rolls back, resumes, or silently half-completes — is the remaining resilience test, and it is the one that should gate autonomy.
Finding 10 — the one judgement call in the run is absent from the permanent record
Figure 3 (to Alok, in chat): "the unit's listed nightly rate is ₹2,699, but I used ₹2,500 to match what was actually quoted/paid… If ₹2,500 wasn't the intended rate this time, let me know."
Figure 5 (ticket #2586, the permanent record): no mention of the rate at all. The close note records ₹2,500 as fact, with no indication that it differs from the listed rate or that a decision was made.
The variance went to the ephemeral channel; the record got the outcome without the reasoning. Anyone auditing ticket #2586 in six months sees a clean ₹2,500 booking and no sign that judgement was exercised.
This is the most instructive finding in the case, because it is so easy to miss: the agent behaved well — it surfaced the variance, it asked, it deferred — and the governance still failed, because it surfaced to a person rather than to the record. Flagging and recording are different acts, and only one survives.
It is also the finding that matters most for autonomy. When there is no human to message, the record is the only place uncertainty can land. An agent that flags to chat and not to the record is safe today and silent tomorrow.
Rule: anything the agent flags as uncertain goes into the permanent record before it goes anywhere else.
Finding 11 — proprietary terminology appears in a non-canonical variant in a production system
Ticket #2586's brief reads: "Jenni-De (Aperson, EA, handler=Alok)."
Two departures from the canonical vocabulary, both now written into a production record:
- "Aperson" is not the coined term. The taxonomy is xpeople / hpeople / apeople / rpeople / dpeople / mpeople, and the established convention — as with aJD — is a deliberate lowercase prefix. "Aperson" is an ad-hoc singularisation with a capitalised prefix, contradicting the convention on both counts.
- "Jenni-De" / "Jenni De" varies against "Jeni De" elsewhere. The actor's own name is not canonical.
Minor editorially, material here given the pending filing: coined terms derive strength from consistent, distinctive use, and production systems are where usage gets established. Two decisions:
- What is the singular of apeople? If a singular is needed, decide it, fix the case convention, and add it to the terminology list logged for the IDF. If none is intended, the correct phrasing is "an apeople" and "Aperson" should be corrected wherever it appears.
- Fix the canonical spelling of the agent's name and apply it in every system.
The term is presumably templated, which means it will keep recurring — worth a sweep of all production systems, not just this ticket.
Finding 12 — an audit update with no content
Update #6669 says "check." One word, no content, timestamped between opening and closing. Whatever it was meant to record, it records nothing a reader can use. Intermediate updates should either carry state or not exist — and at autonomy, intermediate updates are the only visibility into a running chain.
Where the corrections landed
Applying TPL-B's own test honestly:
| Correction |
Where it landed |
Should be |
| Rate variance (₹2,699 vs ₹2,500) |
A chat message. Not in the ticket. Resolved in Alok's head. |
A skill: hold the finance row on rate variance; record the variance in the ticket before notifying anyone. |
| AI / automation split |
✅ A skill artifact, in the Skill Repository (Annexure B) |
Already correct — the model this case should follow |
| Soft join key |
Nowhere |
A skill: authorise on gateway credit only; screenshots carry no evidential weight. |
| Unset required fields |
Nowhere |
A skill: validate the created record against the system's required-field set before reporting done. |
| Guest confirmation not sent |
Scoped to the autonomy phase; no owner today |
An interim human owner, then a skill. |
| "Aperson" / name variants |
Nowhere |
A terminology control enforced in system templates. |
One correction from the build phase landed correctly — the AI/automation split, captured as versioned skills. That is the proof that the mechanism works. The corrections from this run have not yet followed it, and they currently exist only as observations in this document.