Account status

Riverbend Water District's access is suspended

This is an administrative hold on the account, not a fault with the tool and not something you did. Ingestion, review and search are paused for this utility until the hold is lifted.

What happened to your work
Anything already submitted or committed is safe and unchanged.
Decisions you made in this session but had not submitted are not kept. We are telling you plainly rather than promising to hold them: review state only exists once submitted. If you were part-way through a bundle, you will start that pass again.
Who can lift this
Your APAS account contact — Priya Menon, priya.menon@apas.io
tenant_suspended · 403 {{ suspReqId }}
No retry is offered, on purpose: retrying cannot change an administrative hold.
{{ chip.initials }} {{ chip.prefix }} {{ chip.name }} {{ chip.badge }}
{{ chip.scope }}

{{ pageTitle }}

{{ pageSub }}

Step 1 · Describe it

Tell us what the document is, in your words

Local names, model numbers, nicknames — all fine. We do the translating.

Attach the source document (optional)
The classifier reads it. Submitting without one still works — the result will say the document was not read.
{{ upErrMsg }}
or pick one already staged on the server
{{ doc.kind }} {{ doc.name }} {{ doc.mark }}
Opens the document this classification was made from. A reviewer who is not convinced by the reasoning should read the source before confirming.
{{ docErrMsg }}
Nothing classified yet. Describe the document on the left, attach it, and press Classify this document — where it should be stored, why, and what else it might be about all appear here.
{{ subSourceLabel }}
{{ sampleLine }}
The classifier routed this as a reference lookup, not a new asset. Confirming will close the request without writing anything to the registry. If this really is a new asset, rephrase the description and classify again.
{{ err.title }}
{{ err.code }}

{{ err.cause }}

{{ err.todo }}

This is not “No match found”
“No match found” means we searched the vocabulary and nothing fitted — a real answer, and the route to an ontology gap. This is the search itself failing to run. Raising a gap here would report a missing class that may well exist.
Support reference {{ err.reqId }}
Step 2 · Proposed by AI

{{ heroClass }}

{{ heroCode }}
{{ subRouteNote }}
{{ subAbout }}
{{ heroBandLabel }}
{{ bandMotion }}
Why the AI said this Machine-written · shown as plain text

{{ rationale }}

Other subjects it considered
{{ alt.name }}
{{ alt.path }}
{{ alt.label }}

You're overruling the AI

Your correction wins. It is recorded against your name, shown to the APAS reviewer alongside the original proposal, and fed back into the model.

AI proposed
Submersible Pump
OW-AST-PMP-SUB
→
Your classification
OW-AST-PMP-GRD · 3 sibling classes
Why is the proposal wrong? Required
{{ ovHint }}
Layer 2 · APAS

This is the step that writes to the registry — nothing before it touches the graph. It needs an APAS token; the operator's own token is refused here with a 403.

Committed

Written to the registry. Both approvals are on record, and the document now has a permanent address.

{{ committedIri }}
Nothing is committed on the AI's say-so
1 · You confirm
You know the yard. {{ step1Note }}
2 · APAS reviews
They know the ontology. {{ step2Note }}
3 · Committed
Permanent, versioned, auditable. {{ step3Note }}
Preview state:
{{ bulkPanelTitle }}
{{ bulkPanelSub }}
{{ ir.left }}
{{ ir.mid }}
{{ ir.state }}
Draft contents · 34 assets
Not submitted
Your tag
What you wrote
Proposed class
Confidence
Status
{{ row.tag }}
{{ row.said }}
{{ row.klass }}
{{ row.label }}
{{ row.status }}
{{ row.err.title }}
{{ row.err.cause }} It failed on this row only — the other 33 are unaffected.
{{ row.err.reqId }}
+ 24 more rows
{{ bundleTitle }}
{{ bundleSub }}
Decided
{{ decidedN }} / {{ decidedTotal }}
A accept O override J / K move
Sample check — {{ sampleN }} drawn from {{ highN }}
Pass the sample and the remaining 16 are accepted as a batch, logged as a sampled acceptance. Fail any one and all {{ highN }} drop to individual review.
{{ s.tag }}
{{ s.klass }}
{{ s.said }}
{{ s.label }}
Recorded as: sampled acceptance, {{ sampleN }} of {{ highN }} inspected.
{{ m.tag }}
{{ m.klass }}
Operator wrote: {{ m.said }}
{{ m.label }}
Machine rationale · plain text
{{ m.why }}
Layer 1 · customer
{{ m.layer1 }}
Manual mapping · 4 assets
The model has no usable proposal here. You map these by hand, or say the ontology is missing a class.
BRUTE-3 · Riverbend
“the old brute out back, off-line since 2011”
Map to a class
Decommissioned Equipment (generic)
Standby Pump · retired
Or escalate
Nothing in the vocabulary fits. Raise it with the ontology group; the asset parks in unmapped and stays out of the registry.
Ask the operator instead →
{{ banner.title }}
{{ banner.body }}
{{ banner.ref }}
{{ banner.code }} Support reference {{ banner.reqId }}
What you decided
{{ d.n }}
{{ d.label }}
!
Tenant boundary violation — sign-off is blocked

While verifying this bundle, a relationship was found that links a Riverbend asset to an asset belonging to another utility. Tenant isolation is enforced before anything reaches the graph, so a relationship like this should not have been possible to create.

Relationships for this bundle are not shown, because a partial list would look like a normal one. This is not something you can correct from here, and retrying will not clear it — it may make it harder to trace. It has been escalated as a data-isolation incident.

The offending edge
LS7-P2 · Riverbend Water District dischargesTo FM-88 · Harbour Sanitation Authority
cross_tenant_edge_detected · 409 · not retryable
Give support this reference {{ xtReqId }}
Proposed relationships
How these assets connect to each other and to what's already in the registry.
{{ rel.a }}
Relation between {{ rel.a }} and {{ rel.b }}
Only verbs the ontology allows between these two classes.
{{ p.label }} unconstrained in the ontology inverse: {{ p.inverse }}
{{ p.comment }}
{{ p.scope }}
{{ vocabCount }} properties loaded · {{ vocabUnconstrained }} leave domain or range unstated
{{ rel.b }} {{ rel.label }}
Verbs come from the loaded ontology — OneWater v5.4, {{ vocabCount }} properties. Tap a verb to see what it means and where it is valid.
Read-only access. You can search and export; submit, confirm and override are hidden.
{{ searchCountAssets }} {{ searchCountDocs }} {{ searchScope }}
Matching runs over how each thing was named and described when it was committed, not over the text inside the documents. Nothing here reads a PDF into the index yet, so a clause buried on page 40 of a permit will not be found by quoting it.
{{ serr.title }}
{{ serr.code }}

{{ serr.cause }}

{{ serr.todo }}

This is not “No match found”
“No match found” means we searched the vocabulary and nothing fitted — a real answer, and the route to an ontology gap. This is the search itself failing to run. Raising a gap here would report a missing class that may well exist.
Support reference {{ serr.reqId }}
{{ r.tag }} {{ r.name }} {{ r.score }}
{{ r.sub }}
{{ c.t }}

Information architecture

Five milestone pages become three task areas plus a shared object. Navigation is filtered by role, never by capability shipped.

{{ ia.k }}
{{ ia.v }}

One rendering paradigm: server JSON, client renders

FastAPI stays a pure JSON API; every pixel is rendered client-side from that JSON. Python emits no HTML strings — that path is deleted, not deprecated.

{{ w.t }}

Confidence language

Operators never see the word “confidence” or a raw probability. They see what to do.

{{ b.label }}
{{ b.desc }}

One error envelope, three tiers of treatment

Every failure arrives in the same shape. The UI branches on error, never on message, and request_id is on screen and one click from the clipboard in every single state.

{{ e.k }}
{{ e.v }}

Changed on the brief's instruction

{{ x.k }}
{{ x.v }}

States designed, not assumed

{{ s.k }}
{{ s.v }}