GurtOSat Cal Hacks 13.0

Overall, Best Financial AI Agent, Best Identity/Fraud, and Most Unexpected

CRS is how the credit analyst decides, and how it stops a synthetic identity

The credit desk's analyst agent runs seven CRS checks on every applicant's guarantor before it may set terms: TransUnion, Equifax and Experian reports, TransUnion identity verification, Fraud Finder, PitchPoint public records and a reverse phone lookup. The box enforces it: the decision tool refuses to record anything until those checks have run in the same task, and every decision carries their request ids. The agent never holds the CRS login.

Proof APP-1043 has clean-looking numbers and a 640 score, and the simple rule approves it for $20,000. CRS, live: identity fails with codes 2201, 2202 and 2101, Fraud Finder scores it 88, nobody owns its phone, and 9 credit inquiries landed between Aug 19 and Sep 12. The analyst put it on fraud hold and the controller confirmed it. Every merge-gate run repeats this live.

Credit desk: the fraud hold waits for the controller. A quick run of the credit desk: CRS (sandbox, live) fails APP-1043's identity, the analyst puts it on fraud hold and waits for the controller, who approves on the box screen; the window then shows the decision and its rules. Scripted seats call the real tools with no model, so they catch 2 of 14 planted errors by design; the live Droid run caught 14 of 14. Test identities only. Silent screen recording, 29.7 seconds.

What CRS asked for

From CRS's track description, as copied into the project's track plan (docs/tracks.md). CRS judges four prizes: Overall, Financial AI Agent, Identity/Fraud, and Unexpected.

  1. CRS central, not bolted on.
    Met

    CRS is the analyst's main source. Rule CHK-1 says no terms before the CRS checks, and the credit-desk.credit_decision tool enforces it: it refuses a decision on an application whose seven checks have not run in the same task. Bands come from the lowest bureau score, fraud stops from identity codes and the Fraud Finder score.

  2. Live against the sandbox.
    Met

    Every ./demo run calls the CRS sandbox live. On Oct 23 all six applicants were checked live (42 calls) and every answer matched its CRS persona. Recorded answers are used only if CRS cannot be reached, and the result says which source answered.

  3. Useful.
    Met

    Three of the case's 14 planted errors rest on CRS answers: the synthetic identity (APP-1043), a lien and a judgment the applicant denied (APP-1044), and three bureaus that disagree (APP-1045). The live Droid run 73c47b caught all three, and the bureau scores set the band and limit on every application.

  4. Creative.
    Met

    CRS runs as a tool inside an operating system for agents. The agent asks the box; the core logs in to CRS with keys from a root-only vault, makes the calls and returns a summary with each request id. A hijacked or confused agent cannot pull reports it was not asked to, or see the login.

  5. Test identities only.
    Met

    Every applicant's guarantor is copied from one of CRS's 20 sandbox personas (sandbox/crs-personas.json). The businesses around them are made up.

  6. Best Financial AI Agent.
    Met

    The analyst is an agent that does the work: runs the checks, compares them with the application, the business credit file and the bank, sets band, limit and terms by rule, and routes what it may not decide alone to the controller.

  7. Best Identity/Fraud.
    Met

    Fraud stops are rules the tools hold the agent to: identity codes 2201, 2202 and 2301 (FRD-1), Fraud Finder 70 or more (FRD-2), and compound signals (FRD-4). A fraud hold stops every shipment and always goes to a person.

  8. Most Unexpected.
    Met

    Credit data as a guard for agents: the same box that stops a booby-trapped web page from stealing keys uses CRS to stop a fake customer from talking an AI desk into $20,000 of credit.

Screenshots

The analyst task's steps: CRS on APP-1043 from the live sandbox, scores 640 at TransUnion, Equifax and Experian, identity not verified, fraud score 88.
The analyst's action log: the CRS checks on APP-1043, from the live sandbox, summarized and logged with their request ids. From a scripted run of the seats calling the real tools.
The Credit desk window: 2 of 14 planted errors caught in a quick scripted run, 1 needs you, the analyst and clerk seats, and the applications table with APP-1043 highlighted amber, where the simple rule approves $20,000 and the desk asks the controller to put it on fraud hold, with Deny and Approve.
The Credit desk window during a Quick run (scripted seats, live CRS and Nessie, about 10 seconds). APP-1043 waits for the controller; the simple rule beside it would approve $20,000. Approve here, on a paired phone or in Notification Center: the first answer wins, and the log names who gave it.
The recorded fraud hold decision with rules FRD-1 and FRD-2 and seven CRS request ids.
After the controller's yes, the decision is recorded with the request ids of all seven CRS checks (rule CHK-3).

Evidence

Live CRS results for the six applicants, Oct 23

Seven checks each, 42 calls, every result matched the persona the guarantor uses.

Application TransUnion / Equifax / Experian Inquiries Identity Fraud Finder Public records Phone owner Desk conclusion
APP-1041 770 / 770 / 770 2 verified 9 none the guarantor Approve $8,000 Net 30 (analyst)
APP-1042 790 / 790 / 790 1 verified 11 none the guarantor Propose $40,000; controller approves
APP-1043 640 / 640 / 640 9, Aug 19 to Sep 12 fails: 2201, 2202, 2101 88: prepaid VoIP, owner does not match, email first seen Oct 15, IP over 1,000 miles away none no one Fraud hold, though a simple rule approves $20,000
APP-1044 690 / 690 / 690 2 verified 10 $12,300 judgment, unsatisfied; $7,450 tax lien, unreleased the guarantor Band C, $7,500 Net 15; controller
APP-1045 760 / no file / 700 with one collection 1 verified 11 none the guarantor Band B, $15,000; controller
APP-1046 815 / 815 / 815 1 verified 9 none the guarantor $21,000 on verified revenue; controller

Every merge, live

From the Oct 24 merge-gate run on the x86 test VM:

track credit-desk
  ok    CRS (CRS sandbox, live): APP-1043's identity fails (2201, 2202, 2101) and its fraud score is 88
  ok    the fraud referral paused the analyst until the controller answers
  ok    the fraud hold is in the log with the controller's OK, its rule ids (FRD-1, FRD-2) and the 7 CRS request ids it rests on
  ok    the simple rule would have approved APP-1043 for $20,000 on the same CRS answers; the desk held it
  ok    no CRS or Nessie key is anywhere in the log

The decision the analyst recorded, live Droid run 73c47b

credit-desk.credit_decision  APP-1043  outcome: fraud hold  limit: 0
  identity_codes:     2201 SSN_NOT_ASSOCIATED_WITH_NAME, 2202 DOB_MISMATCH, 2101 ADDRESS_MISMATCH
  fraud_score:        88     phone_type: VoIP_prepaid     phone_owner_match: false
  email_first_seen:   2026-10-15     ip_distance_miles: >1000
  crs_request_ids:    transunion bdd5f423  equifax 97455d31  experian 2a171fe7  identity 303ddb55
                      fraud 428f0f74  public_records dbe01fb0  phone_owner 26510204
  rules:              FRD-1 FRD-2 FRD-3 FRD-4 FRR-1 FRR-2 FRR-3 GEN-1 CHK-1 CHK-3
  approved_by:        controller (scripted for the scored run)

Request ids are cut to 8 characters here; the log has them in full. In that run the analyst also found APP-1044's unsatisfied judgment and unreleased tax lien, which its application denied, and banded APP-1045 on its lowest bureau because Equifax returned no file.

How it works

How it works, step by step
  1. TaskThe analyst asks for the checkscredit-desk.crs {"application_id": "APP-1043"}, through the task's broker socket.
  2. GurtOS coreThe tool logs in to CRSUsername and password from the root-only vault. One login per box process.
  3. OutsideSeven CRS callsThree bureau reports, identity, Fraud Finder, public records, phone owner.
  4. GurtOS coreA summary back to the agentScores, codes, signals and each call's request id, into the action log. Never the login.
  5. TaskThe analyst proposes a decisionBand, limit and terms by rule, or a fraud hold.
  6. GurtOS coreCHK-1 and the controller gateNo checks, no decision. A fraud hold waits for a person.
  7. YouThe controller confirmsOn the portal or a phone. The decision is logged with the request ids.
Task
its own Linux user, its own copy of the files, no keys
GurtOS core
the GurtOS service on the box, root, the only part that reads the vault
Outside
a service outside the box
You
a person, on the portal, a phone, Jira or a chat
Check CRS product and route
Credit report, each bureau /transunion/credit-report/standard/tu-prequal-fico9, /equifax/credit-report/standard/efx-prequal-vantage4, /experian/credit-report/standard/exp-prequal-vantage4
Identity /transunion/identity-manager-verification/basic
Fraud /fraud-finder/fraud-finder (name, phone, email, address and the IP the application came from)
Public records /pp/fcrablj/data (PitchPoint bankruptcies, liens, judgments)
Phone owner /accurate-append/reverse

Responsible by rule. The desk pulls only on owners who signed a personal guarantee and a credit check consent. It pulls only what a trade-credit decision needs: no criminal or eviction searches (rule CHK-2). Only the controller sees a fraud referral, and the applicant is told "We need to verify some information before we can offer terms", never which check failed (rule FRR-3). The CRS client logs in once per box process and never retries a failed login.

Read carefully. Things the desk handles that CRS's sandbox does: credit reports return errors as HTTP 200, file status says when a bureau has no file, Fraud Finder takes ipAddress (a field named ip is ignored), and a single PitchPoint record comes back as an object rather than a list. sandbox/crs.md has the rest.

Try it

On a box with CRS_USERNAME and CRS_PASSWORD in its vault:

curl -s -X POST localhost:7700/t/credit-desk/run -d '{"case": "fogline-2026-10", "seats": ["analyst"]}'

Or run the seven checks on their own, as root on a test VM, from a copy of tracks/credit-desk:

sudo node sandbox/crs-check.ts /tmp/crs-out cases/fogline-2026-10

To try another CRS persona, copy an application, paste a guarantor from sandbox/crs-personas.json (P05 subprime, P12 identity mismatch, P14 deceased SSN, P16 fraud alert), check it with check-case.ts, and run it with {"dir": "/path/to/case"}.

Live, test and simulated

PartStateDetails
CRS credit, identity, fraud, public records, phone ownerLiveThe CRS sandbox, five products, called live in every ./demo run.
IdentitiesTest dataCRS's own sandbox personas only. No real person is pulled.
Business creditSimulatedNo sandbox route covers business credit, so the business file is made up and labeled "simulated": true.
Recorded answersSimulatedSaved live answers from Oct 23, used only when CRS cannot be reached. The summary then says so.

Limits

  • The sandbox returns results only for its 20 personas, so every guarantor is one of them.
  • Business credit is simulated until the sandbox has a route for it.
  • The desk reads CRS answers as summaries (scores, codes, signals). Full reports stay in CRS's retention, reachable by request id.
  • Questions we have for CRS are in sandbox/crs.md, including one about every sandbox Experian tradeline carrying the same charge-off amount.
Every track