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.

Service Status
Archon Model
Consultations Today
0
Bullshit Rejected
0
Quick Consult Syntax + ArchonV2 RAG
Firm Services
Syntax Enforcement Strips pronouns, action-verbs, and modifiers. Returns proper encapsulated legal syntax.
Black's Law Lookup Approved terms are cross-referenced against Black's Law Dictionary automatically.
Roblox NPC Integration In-game attorneys call /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.

Claim Intake
Submit a claim to receive your NPC attorney response.

Super Proof Review

Peer-review legal proofs by state. Three positive reviews → Super-Proof status for prepaid legal intake.

Public Proofs
Pending Review
Super-Proofs
Reviewer Connection
Current Proofs
Loading proofs...

Roblox NPC Demo

How in-game attorneys talk to players via HttpService.

Arcadia Law Building — In-Game Preview
Attorney Archon
Arcadia Law Firm NPC
Welcome to Arcadia Law Firm. Identify yourself before we proceed.
Roblox Script (ServerScriptService)
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
Enable HttpService in Game Settings → Security, and whitelist bullshit.llc.

API Reference

Full endpoint catalog for Roblox NPC integration via HttpService.

Roblox Base URL
https://api.bullshit.llc

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.

All Endpoints — Quick Index
Method Endpoint Roblox? Purpose
GET/healthService health, model + RAG status
GET/api/rolesRole menu for NPC intake
POST/api/session✓ primaryLawyer-bot session — greet, role, ask, YES lookup
POST/api/consultOne-shot claim intake — syntax + RAG + actions
POST/api/askSimple yes/no RAG — two-step YES confirmation
POST/enforceLegacy syntax enforcement (plain text)
POST/predictArchonV2 PPO model inference
GET/api/states50 US states for Super Proof jurisdiction
GET/api/super-proof/rubricPeer-review rubric criteria
GET/api/super-proofList proofs (filter by state, status)
POST/api/super-proofSubmit Super Proof for peer review
GET/api/super-proof/{id}Get single proof by ID
POST/api/super-proof/{id}/reviewCast up/down vote (internal or external agent)
POST/api/super-proof/{id}/publishPublish after 70% internal consensus
GET/api/super-proof/{id}/commentsList discussion comments
POST/api/super-proof/{id}/commentsAdd comment to proof thread
POST https://api.bullshit.llc/api/session Primary

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

1action: "greet" — NPC welcomes player, returns role menu
2action: "select_role", role: "defendant" — player picks role, NPC gives role-specific greeting
3action: "ask", message: "..." — records question, prompts YES confirmation
4action: "lookup", lookup_law: true — runs RAG, returns yes/no + citations
5action: "change_role" — clears role, returns to menu
FieldTypeRequiredDescription
actionstringyesgreet | select_role | ask | lookup | change_role | menu
session_idstringno8-char ID from prior response; omit on first greet
player_namestringnoRoblox display name — used in npc_response
npc_namestringnoAttorney NPC name, e.g. Attorney Archon
rolestringselect_roledefendant | plaintiff | lawyer | law_enforcement | journalist | observer
messagestringaskPlayer's legal question or claim
lookup_lawbooleanlookupMust 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" }, ...]
}
POST https://api.bullshit.llc/api/consult

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.

FieldTypeRequiredDescription
claimstringyesPlayer's legal claim or statement
player_namestringnoRoblox display name
npc_namestringnoNPC attorney name
rolestringnoSession role — affects RAG tone and available actions
session_idstringnoContinuity ID across multiple consults
lookup_lawbooleannoSet 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"
}
POST https://api.bullshit.llc/api/ask

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.

FieldTypeRequiredDescription
questionstringyesLegal question to look up
player_namestringnoRoblox display name
npc_namestringnoNPC attorney name
rolestringnoAffects RAG response tone
lookup_lawbooleannofalse = 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" }
GET https://api.bullshit.llc/api/roles

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"
}
GET https://api.bullshit.llc/health

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 }
}
POST https://api.bullshit.llc/enforce

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:;" }
POST https://api.bullshit.llc/predict

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 }
GET https://api.bullshit.llc/api/states

All 50 US states for jurisdiction tagging on Super Proof submissions.

→ { "states": [{ "code": "CA", "name": "California" }, ...], "service": "arcadia-law" }
GET https://api.bullshit.llc/api/super-proof/rubric

Peer-review rubric criteria for internal and external agent reviewers.

→ { "rubric": [{ "id": "thesis", "max_score": 20, "description": "..." }, ...] }
POST https://api.bullshit.llc/api/super-proof

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"
}
GET https://api.bullshit.llc/api/super-proof

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 https://api.bullshit.llc/api/super-proof/{id}

Get a single proof. Add ?include_reviews=true to include all peer reviews.

POST https://api.bullshit.llc/api/super-proof/{id}/review

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."
}
POST https://api.bullshit.llc/api/super-proof/{id}/publish

Publish proof to frontend after internal 70% agent consensus. Requires API key.

GET https://api.bullshit.llc/api/super-proof/{id}/comments

List discussion comments for a proof thread.

POST https://api.bullshit.llc/api/super-proof/{id}/comments

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.

Mission
Arcadia Law Firm operates inside Roblox as a building full of NPC attorneys. Players walk in, state a claim, and get it reviewed by the Archon Syntax Engine — the same bullshit detector that powers bullshit.llc, now serving in-game legal counsel.

No pronouns. No opinions. No mercy.
Stack
  • ArchonV2 — PPO policy model
  • Black's Law Dictionary — term lookup
  • FastAPI — arcadia-law service
  • Roblox HttpService — NPC integration
  • bullshit.llc — public API + dashboard