Inspiration

Money in a small project moves on paper. A progress report says 100 units were delivered. Behind that sentence sit four documents: an approval, a purchase order, the invoice, the delivery note. Nobody ever puts all four on one table and subtracts, because each one looks reasonable on its own and the report gets filed on the strength of that feeling.

That is the gap SENTINEL goes after. Not a general "chat with your files" tool. One narrow job: tell me whether the records already sitting on the NAS back the claim I am about to sign.

I write frontend for a living, so I opened this thinking it was an interface problem. Wrong. A UGREEN Skill is a Markdown file with no screen in it at all. The chat is the product. Turns out that constraint was the most interesting part of the whole hackathon.

What it does

Point it at one folder you are authorized to read and ask it to check the claims inside. You get three outcomes. Supported. Discrepancy. Evidence gap. Nothing else.

Every finding names the two files its values came from. It shows the subtraction behind the difference. And it stops at the one next check a human should do. Fifteen units between an invoice and a delivery note is a discrepancy. A payment certificate that is not in the folder is an evidence gap, and those have to be different sentences, because "I did not find it here" is not the same claim as "it does not exist."

Refusals took longer to write than the workflow. SENTINEL never says fraud or misconduct, since records disagreeing tells you nothing about intent. Two supplier names that look alike stay two entities, even when their amounts match nicely. Read-only throughout, unless a write gets approved in that same conversation.

How I built it

Six stages, and every one of them is a delegate call to an agent the platform already registers, because the parent Skill is not permitted to do any of the reading itself. file-agent inventories the folder through ug-filesystem, then runs the ug-filemgr duplicate scan, which is the unglamorous stage that keeps one invoice saved under two names from being counted twice. document-agent pulls fields through ug-document and has to return the source file beside every value it hands back. Same agent reconciles the pairs that ought to correspond. Last, knowledge-agent sweeps for supporting evidence with ug-knowledge and reports which expected record types were not located. The Skill itself opens no file. It only composes the report from what came back, and stops when a stage returns nothing worth working with.

Proving any of this without a NAS was the interesting problem, so I built the evidence myself. First, 17 synthetic records across three folders and an answer key I checked by hand. Next, a Python script replays all six stages against stand-ins for the delegated agents. It scores what comes out. 64 checks, passing today.

Green runs mean nothing until you watch one fail. Drop the duplicate scan and the scorer catches it. Shift a distinct count by one and it catches that too. I broke these on purpose before trusting anything, which is the only reason the pass means something to me. Static checker from the Skill Creation Tool: no errors, no warnings.

What I learned

Two surprises were structural. The checker allows only SKILL.md plus a references/ directory at the package root, nothing else, which is how my README ended up living outside the ZIP I submit. And answer-mode is a request you make to the document agent, not a layout you control, so the report format had to be written as a policy with a fallback instead of as a template.

Deeper lesson, and it came late. Orchestration was never the hard part. Vocabulary was. Deciding exactly what a finding is allowed to say, then keeping words like "suspicious" and "unverified" out of the output entirely, did more design work than any stage in the pipeline.

What is next

Three questions I can only answer on the device. The real extract and reconcile response shapes, for one. Second, how a reviewer nominates an authorized folder in UGOS, which the documentation does not spell out. And whether a follow-up question really opens the passage it claims to cite. Naming those now beats pretending they are done.

Everything here got built during the hackathon. Records are synthetic. No third-party service is called at runtime, and nothing about a real organization appears in the case pack.

Built With

Share this project:

Updates

Submission history