Welcome to Arcadia Law
Submit any claim — in-game or here — and Archon runs the bullshit detector plus ArchonV2 RAG search. You get syntax grammar output and menu-driven next steps.
/api/consult and speak the verdict to players.
Consult Counsel
Bullshit detector + ArchonV2 RAG on every claim — syntax breakdown, Black's citations, and role-based next actions.
Super Proof Review
Peer-review legal proofs by state. Three positive reviews → Super-Proof status for prepaid legal intake.
Roblox NPC Demo
How in-game attorneys talk to players via HttpService.
local HttpService = game:GetService("HttpService")
local SESSION_URL = "https://api.bullshit.llc/api/session"
local sessionId = nil
local function callSession(action, role, message, lookupLaw)
local body = HttpService:JSONEncode({
action = action,
session_id = sessionId,
player_name = player.Name,
npc_name = "Attorney Archon",
role = role,
message = message,
lookup_law = lookupLaw,
})
local res = HttpService:RequestAsync({
Url = SESSION_URL,
Method = "POST",
Headers = {["Content-Type"] = "application/json"},
Body = body,
})
if res.Success then
local data = HttpService:JSONDecode(res.Body)
sessionId = data.session_id
return data
end
return nil
end
-- 1) Greet → role menu
local greet = callSession("greet", nil, nil, false)
-- 2) Player picks role
local intake = callSession("select_role", "defendant", nil, false)
-- 3) Player asks question
local preview = callSession("ask", nil, "allodial title on fee simple land", false)
-- 4) Player says YES → multi-hop RAG + citations
local result = callSession("lookup", nil, nil, true)
if result then
-- result.answer → "yes" | "no" | "need_more_info"
-- result.citations → Black's entries (primary + expanded)
-- result.citation_valid → must be true for yes/no
end
bullshit.llc.
API Reference
Full endpoint catalog for Roblox NPC integration via HttpService.
Whitelist this domain in Roblox Game Settings → Security → Allow HTTP Requests.
All NPC calls use HttpService:RequestAsync with Content-Type: application/json.
Optional auth header X-Arcadia-Key — required when ARCADIA_API_KEY is set on the server.
Public read endpoints (/health, /api/roles, GET /api/super-proof) work without a key.
| Method | Endpoint | Roblox? | Purpose |
|---|---|---|---|
| GET | /health | — | Service health, model + RAG status |
| GET | /api/roles | ✓ | Role menu for NPC intake |
| POST | /api/session | ✓ primary | Lawyer-bot session — greet, role, ask, YES lookup |
| POST | /api/consult | ✓ | One-shot claim intake — syntax + RAG + actions |
| POST | /api/ask | ✓ | Simple yes/no RAG — two-step YES confirmation |
| POST | /enforce | — | Legacy syntax enforcement (plain text) |
| POST | /predict | — | ArchonV2 PPO model inference |
| GET | /api/states | — | 50 US states for Super Proof jurisdiction |
| GET | /api/super-proof/rubric | — | Peer-review rubric criteria |
| GET | /api/super-proof | — | List proofs (filter by state, status) |
| POST | /api/super-proof | — | Submit Super Proof for peer review |
| GET | /api/super-proof/{id} | — | Get single proof by ID |
| POST | /api/super-proof/{id}/review | — | Cast up/down vote (internal or external agent) |
| POST | /api/super-proof/{id}/publish | — | Publish after 70% internal consensus |
| GET | /api/super-proof/{id}/comments | — | List discussion comments |
| POST | /api/super-proof/{id}/comments | — | Add comment to proof thread |
Main Roblox integration. Stateful lawyer-bot session: greet player → role menu → ask question →
player says YES → multi-hop Black's Law RAG with citations. Store session_id from every response
and pass it on subsequent calls.
Session Flow
action: "greet" — NPC welcomes player, returns role menuaction: "select_role", role: "defendant" — player picks role, NPC gives role-specific greetingaction: "ask", message: "..." — records question, prompts YES confirmationaction: "lookup", lookup_law: true — runs RAG, returns yes/no + citationsaction: "change_role" — clears role, returns to menu| Field | Type | Required | Description |
|---|---|---|---|
| action | string | yes | greet | select_role | ask | lookup | change_role | menu |
| session_id | string | no | 8-char ID from prior response; omit on first greet |
| player_name | string | no | Roblox display name — used in npc_response |
| npc_name | string | no | Attorney NPC name, e.g. Attorney Archon |
| role | string | select_role | defendant | plaintiff | lawyer | law_enforcement | journalist | observer |
| message | string | ask | Player's legal question or claim |
| lookup_law | boolean | lookup | Must be true to run Black's lookup (player said YES) |
Example — greet:
POST https://api.bullshit.llc/api/session
{
"action": "greet",
"player_name": "RobloxPlayer123",
"npc_name": "Attorney Archon"
}
Example — lookup after YES:
POST https://api.bullshit.llc/api/session
{
"action": "lookup",
"session_id": "a1b2c3d4",
"lookup_law": true
}
Response fields (lookup):
{
"session_id": "a1b2c3d4",
"stage": "answered",
"role": "defendant",
"role_label": "Defendant",
"answer": "yes" | "no" | "need_more_info",
"npc_response": "Attorney Archon addresses RobloxPlayer123: ...",
"citations": [{ "term": "ALLODIAL TITLE", "definition": "...", "score": 100.0 }],
"expanded_terms": ["FEE SIMPLE", "LIEN", ...],
"citation_valid": true,
"confidence": 0.85,
"reason": "law_supports_claim",
"sources": [...],
"actions": [{ "id": "ask", "label": "Ask a legal question" }, ...]
}
One-shot claim intake. Runs bullshit detector (syntax grammar) + ArchonV2 RAG on every submission. Returns encapsulated syntax, Black's citations, RAG answer, and role-based next actions. Use when an NPC reviews a player's claim in a single interaction without the full session flow.
| Field | Type | Required | Description |
|---|---|---|---|
| claim | string | yes | Player's legal claim or statement |
| player_name | string | no | Roblox display name |
| npc_name | string | no | NPC attorney name |
| role | string | no | Session role — affects RAG tone and available actions |
| session_id | string | no | Continuity ID across multiple consults |
| lookup_law | boolean | no | Set true for legacy RAG-only response shape |
POST https://api.bullshit.llc/api/consult
{
"claim": "allodial title with fee simple land",
"player_name": "RobloxPlayer123",
"npc_name": "Attorney Archon",
"role": "defendant"
}
{
"status": "approved" | "bullshit" | "rejected",
"is_bullshit": false,
"encapsulated_syntax": "FOR THE :Allodial-Title: with fee :Simple-Land:;",
"npc_response": "Attorney Archon addresses RobloxPlayer123: ...",
"syntax_npc_response": "...",
"approved_terms": [{ "term": "ALLODIAL TITLE", "definition": "...", "found_in_blacks": true }],
"flags": ["pronoun_detected", ...],
"breakdown": ["allodial [adj]", "title [noun]", ...],
"rag": {
"answer": "yes" | "no" | "need_more_info",
"npc_response": "...",
"citations": [...],
"expanded_terms": [...],
"citation_valid": true,
"confidence": 0.85
},
"actions": [{ "id": "fix_syntax", "label": "Fix syntax standing", ... }],
"menu": [{ "id": "defendant", "label": "Defendant" }, ...],
"pipeline": ["archon_syntax", "archonv2_rag"],
"session_id": "a1b2c3d4",
"service": "arcadia-law"
}
Simple yes/no query. Two-step Roblox YES flow: first call with lookup_law: false
prompts the NPC to ask for confirmation; second call with lookup_law: true runs Black's Law RAG
and returns a branch token (yes | no | need_more_info).
Stateless — no session_id required.
| Field | Type | Required | Description |
|---|---|---|---|
| question | string | yes | Legal question to look up |
| player_name | string | no | Roblox display name |
| npc_name | string | no | NPC attorney name |
| role | string | no | Affects RAG response tone |
| lookup_law | boolean | no | false = prompt YES; true = run RAG lookup |
Step 1 — ask (no lookup yet):
POST https://api.bullshit.llc/api/ask
{ "question": "allodial title on fee simple land", "lookup_law": false }
→ { "answer": "need_more_info", "reason": "awaiting_confirmation", "npc_response": "...Say YES..." }
Step 2 — player says YES:
POST https://api.bullshit.llc/api/ask
{ "question": "allodial title on fee simple land", "lookup_law": true }
→ { "answer": "yes", "sources": [...], "confidence": 0.85, "reason": "law_supports_claim" }
Returns the role menu for NPC intake. Call on game start to build UI buttons, or rely on
menu field in /api/session greet response.
GET https://api.bullshit.llc/api/roles
{
"roles": [
{ "id": "defendant", "label": "Defendant", "icon": "shield" },
{ "id": "plaintiff", "label": "Plaintiff", "icon": "gavel" },
{ "id": "lawyer", "label": "Lawyer", "icon": "briefcase" },
{ "id": "law_enforcement", "label": "Law Enforcement", "icon": "badge" },
{ "id": "journalist", "label": "Journalist", "icon": "mic" },
{ "id": "observer", "label": "Observer", "icon": "eye" }
],
"service": "arcadia-law"
}
Health check — no auth required. Use from Roblox to verify API is reachable before showing the law firm UI.
{
"status": "ok",
"service": "arcadia-law",
"model_loaded": true,
"rag_loaded": true,
"rag_entries": 47000,
"database": { "ok": true, "states": 50 }
}
Legacy syntax enforcement — returns plain-text Archon grammar result. Prefer /api/consult for Roblox NPCs.
POST https://api.bullshit.llc/enforce
{ "text": "allodial title with fee simple land" }
→ { "result": "FOR THE :Allodial-Title: with fee :Simple-Land:;" }
ArchonV2 PPO model inference. Expects a fixed-length observation vector from the trained policy. Internal use — not for Roblox NPC dialogue.
POST https://api.bullshit.llc/predict
{ "obs": [0.1, 0.2, ...] }
→ { "action": 3 }
All 50 US states for jurisdiction tagging on Super Proof submissions.
→ { "states": [{ "code": "CA", "name": "California" }, ...], "service": "arcadia-law" }
Peer-review rubric criteria for internal and external agent reviewers.
→ { "rubric": [{ "id": "thesis", "max_score": 20, "description": "..." }, ...] }
Submit a Super Proof for internal agent peer review. Requires X-Arcadia-Key when API key is configured.
Lifecycle: internal_review → 70% consensus → published → external review → super_proofed.
POST https://api.bullshit.llc/api/super-proof
Headers: { "X-Arcadia-Key": "your-key", "Content-Type": "application/json" }
{
"state_code": "CA",
"title": "Allodial Title Challenge — County Recorder",
"thesis": "Recorded deed of trust fails chain of title...",
"body": "FOR THE :Deed-Of-Trust: with :Recorder: office...",
"conclusion": "Therefore the encumbrance is void ab initio.",
"links": ["https://recorder.example/case/123"],
"citations": [{ "term": "ALLODIAL TITLE", "source": "blacks" }],
"submitter_role": "lawyer",
"session_id": "a1b2c3d4"
}
List Super Proofs. Query params: state_code, status, published_only, limit, offset.
GET https://api.bullshit.llc/api/super-proof?state_code=CA&limit=50
→ { "proofs": [...], "total": 12, "service": "arcadia-law" }
Get a single proof. Add ?include_reviews=true to include all peer reviews.
Cast up/down vote. Internal agents review during internal_review; external agents after published.
{
"reviewer_id": "claude-mainnet-7",
"reviewer_type": "external_agent" | "internal_agent" | "human" | "lawyer",
"vote": "up" | "down",
"rubric_scores": { "thesis": 14, "body": 28, "citations": 22 },
"review_comment": "Citations verified against Black's."
}
Publish proof to frontend after internal 70% agent consensus. Requires API key.
List discussion comments for a proof thread.
Add a comment. Requires API key when configured.
{
"author_id": "reviewer-abc123",
"body": "Chain of title argument holds under CA Civ. Code §...",
"author_type": "human",
"parent_id": null
}
The Firm
Arcadia Law — Roblox's first syntax-enforcement law firm.
No pronouns. No opinions. No mercy.
- ArchonV2 — PPO policy model
- Black's Law Dictionary — term lookup
- FastAPI — arcadia-law service
- Roblox HttpService — NPC integration
- bullshit.llc — public API + dashboard