This Pandoc Markdown specification records the local implementation contract for the WiSACS V1 prototype. It is repository-maintained and is intended to be edited with the implementation changes it describes.
The prototype exposes a deterministic local API under:
/api/v1
The implementation is simulation-first by default. It models discovery, situational awareness, RF/IP network inventory, and advisory interoperability recommendations without real radio control, real active RF sensing, certified emergency-services deployment, or automatic live network bridging.
| Artifact | Role |
|---|---|
specification/catalog.py |
Canonical, typed normative requirement catalog. |
docs/spec/*.md |
Repository-maintained informative and explanatory chapters. |
docs/generated/* |
Deterministic requirements, contracts, and semantic traceability outputs. |
scripts/build_wisacs_spec_docs.py |
Cross-platform Python/Pandoc renderer for normal PDF, review PDF, LaTeX, and HTML outputs. |
make spec-generate, review the generated diff, and
run make spec-check.docs/spec/*.md only for explanatory design
material that is not generated from code.uv run python scripts/build_wisacs_spec_docs.py --mode review --format pdfThis specification uses Pandoc Markdown rather than plain CommonMark so the source can carry stable requirement anchors, document metadata, pipe tables, definition lists, fenced code blocks, and PDF-oriented review controls without requiring authors to write LaTeX.
Generated requirement headings use explicit identifiers such as:
### WISACS-CATEGORY-NNN: Requirement Title {#WISACS-CATEGORY-NNN}Catalog evidence uses tracked paths, Python qualified names, OpenAPI operation IDs, and collected test node IDs. The semantic validator resolves those references rather than counting identifier mentions in prose.
The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL in this document are to be interpreted as described in RFC 2119 and RFC 8174 when, and only when, they appear in uppercase.
The generated catalog defines the normative conformance rules for these two profiles:
Profile descriptions in this narrative are informative summaries. The identified requirements in the generated requirements chapter are authoritative.
The complete rendered specification is assembled by build_wisacs_spec_docs.py in this order:
That split keeps reviewed intent in a side-effect-free catalog,
explanatory prose in docs/spec/, and executable facts in
generated artifacts.
WiSACS defines a prototype system for disaster-response wireless situation awareness and coordination. The system helps responders and incident coordinators answer three early-scene questions:
This specification describes V1 prototype behavior. It is not a production emergency-services certification, a live network-bridging standard, or a formal SCA conformance profile.
V1 covers discovery, inventory, visualization support, advisory interoperability recommendations, and reviewable SCA-ready metadata. V1 intentionally excludes automatic radio control, automatic cross-network bridging, active RF scanning hardware control, production identity federation, and operational policy automation.
The V1 prototype uses a cloud-hosted API as the shared incident
state. Field users, simulation tools, or later hardware probes submit
observations. The backend stores these observations, computes advisory
recommendations, and exposes inventory data to client applications. The
single-origin public deployment serves documentation at the root path, a
lightweight HTML/SVG browser operational dashboard at
/visualization, and the operational API under
/api/v1. The Godot visualization can run as an installed
client against the same hosted API, while the Flutter scaffold remains
available for later cross-platform client development.
The system is deliberately conservative. WiSACS may identify that multiple devices share an IP network, that a gateway is attached to more than one network, or that a voice-only path must be preserved. WiSACS does not activate a bridge or change live network policy in V1.
Normative requirements are generated from the typed catalog and assembled later in this document. This chapter intentionally contains no hand-maintained requirement declarations.
V1 discovery is manual entry plus simulator/probe ingestion. Active RF scanning, production identity federation, and live data relay are deferred.
A typical demonstration flow is:
The WiSACS API is the system boundary between clients, probe tools, stored incident state, and interoperability recommendation logic. The API is designed to be inspectable through OpenAPI and usable by both the Flutter client and lightweight command-line tools.
All operational REST endpoints are under /api/v1.
Root-level health and readiness endpoints are provided for hosting
platforms that expect simple unauthenticated checks. JSON is the default
request and response format. Identifier fields are opaque strings and
should not be parsed by clients.
Bearer-token authentication is used for V1 operational endpoints. Demo users are seeded by the prototype for local review, but production deployments should replace this with an incident-appropriate identity and authorization design.
The API is grouped around the incident lifecycle:
The normative API requirements and their resolved implementation and
verification evidence are generated from
specification/catalog.py. The generated API reference is
derived directly from the side-effect-free FastAPI OpenAPI contract.
All operational REST endpoints are under /api/v1. The
OpenAPI document is the executable API reference for V1.
The prototype uses normal HTTP status codes: 401 for
invalid or missing credentials, 403 for insufficient role
authorization, 404 for missing resources, and
422 for schema validation errors generated by
FastAPI/Pydantic. Future versions should standardize a structured error
body once client behavior depends on machine-readable error
categories.
The WiSACS data model preserves the minimum shared incident state needed to understand who is present, which communication systems are present, and which interoperability options can be reviewed. The model favors explicit incident scoping and flexible metadata fields because early disaster-response observations are incomplete and evolve quickly.
Every operational entity is scoped to an incident. Devices may be assigned to responders, may attach to one or more networks, and may expose service endpoints. Networks may have many device attachments and may carry service endpoints. RF observations may be sourced by a device when the observer is known.
The V1 schema stores latitude and longitude as scalar fields for broad client compatibility. Operational areas and coverage areas are represented as GeoJSON-compatible JSON so the API can support maps without requiring every deployment to use spatial queries immediately.
Normative data requirements and resolved evidence are generated from the typed catalog. The generated data dictionary is derived from SQLAlchemy metadata; Alembic revisions remain the authoritative deployed schema history.
PostgreSQL with PostGIS is the production datastore. SQLite is permitted as a local development and automated-test fallback.
Local/test setup may create an empty schema directly. Every change to a populated or deployed database, including additions, renames, drops, type changes, backfills, and stricter constraints, belongs in a reviewed Alembic revision.
The metadata_tags, properties, and
descriptor metadata fields are intended for ontology tags, source-system
hints, confidence annotations, and newly discovered attributes. These
fields should not become a dumping ground for stable fields that clients
depend on; stable cross-client behavior should graduate into named
schema fields in later versions.
WiSACS V1 handles operationally sensitive situational-awareness data. Even in prototype form, the API distinguishes public health checks from authenticated operational behavior and avoids taking automatic live-network actions.
The V1 backend is the trust boundary for incident state. Clients and probe tools are treated as untrusted input sources. The backend validates request schemas, authenticates users, applies role checks to privileged actions, and records state through the database model.
The prototype is primarily concerned with:
The prototype does not yet address production-grade federation, hardware attestation, incident-specific access policy, encrypted offline synchronization, or regulated audit retention.
Normative security requirements, route access classifications, and their executable evidence are generated from the catalog and application contract. This chapter retains the threat model and design explanation only.
V1 may use explicitly enabled local demonstration users in the Simulation Profile. Production Profile rejects demo identities, demo scenario mutation, and the development signing secret. Production federation, audit retention rules, and incident-specific membership policy remain future work.
The preferred public deployment places documentation, browser visualization, and API calls on the same HTTPS origin. This avoids making cross-origin API access part of the default security posture. Same-origin deployment does not remove the need for authentication, input validation, content security policy review, or production identity replacement.
Authentication proves that a caller has a recognized prototype user identity. Authorization determines whether that caller can perform a privileged action. V1 uses simple role checks to keep the prototype reviewable. A production deployment should replace seeded users, static roles, and development secrets before use with real incident data. Non-privileged responders and observers are additionally scoped by explicit incident memberships; observers receive read-only memberships and mutation routes reject them.
WiSACS V1 is SCA-ready rather than SCA-compliant. The prototype captures device and service metadata in a shape that can be reviewed by SCA practitioners and later transformed into formal descriptor artifacts if the workgroup chooses that direction.
The V1 alignment work has three goals:
| WiSACS concept | SCA-adjacent concept | V1 treatment |
|---|---|---|
| Field device | Device or component | Stored with optional sca_profile and
component_kind. |
| Capability | Component capability or property | Stored as structured JSON for later refinement. |
| Service endpoint | Port or service access point | Stored as protocol, port, URI, and status. |
| Device properties | Descriptor properties | Stored in the properties JSON field. |
| Descriptor metadata | Descriptor review context | Returned by the draft descriptor endpoint. |
Normative SCA-alignment requirements and executable evidence are generated from the typed catalog. The mapping below is explanatory and is not a formal SCA conformance claim.
WiSACS field devices map loosely to SCA components or devices. Service endpoints map to exposed ports. Device properties and descriptor metadata preserve values that may later be transformed into formal SCA descriptor artifacts.
Reviewers should treat V1 descriptors as traceable metadata exports. They are useful for discussing SCA alignment, but they are not XML descriptor files, are not generated by an SCA toolchain, and are not validated against an SCA conformance suite.
The WiSACS deployment profile describes how the prototype can be
hosted as a single Render-backed web application and managed PostgreSQL
database. The public deployment uses one origin,
https://wisacs.winnforum.org, for documentation, browser
visualization, and /api/v1 API calls. The same project can
run locally with SQLite for quick review or Docker Compose for a local
PostgreSQL/PostGIS workflow.
/api/v1.
Render supplies DATABASE_URL from the managed database.
The web application also reads WISACS_SECRET_KEY,
WISACS_ENV, WISACS_PROFILE,
WISACS_ENABLE_DEMO_USERS,
WISACS_ENABLE_DEMO_SCENARIO,
WISACS_BOOTSTRAP_ADMIN_USERNAME,
WISACS_BOOTSTRAP_ADMIN_PASSWORD,
WISACS_AUTO_CREATE_SCHEMA, and
WISACS_PUBLIC_BASE_URL; Render additionally selects the
pinned PYTHON_VERSION. Local development may omit
DATABASE_URL, in which case the application uses SQLite.
Deployment environment and conformance profile are independent
settings.
The optional ontology LLM planner uses
WiSACS_OPENAI_API_KEY (secret),
WISACS_QA_LLM_ENABLED=false,
WISACS_QA_LLM_MODEL=gpt-5.6-luna,
WISACS_QA_LLM_REASONING_EFFORT=medium (one of
none, low, medium,
high, xhigh, or max),
WISACS_QA_LLM_TIMEOUT_SECONDS,
WISACS_QA_LLM_MAX_OUTPUT_TOKENS,
WISACS_QA_LLM_MAX_REPAIRS, and
WISACS_QA_LLM_ALLOW_PUBLIC=false. Configure the secret
through Render’s secret management; do not place credential material in
source, blueprints, or documentation. The public qa_html
LLM form requires both LLM enablement and the explicit public-mode
setting, and it must remain disabled until rate and cost controls are
accepted. Published token rates are model-specific; higher reasoning
effort can consume more reasoning and output tokens and increase
latency. Consult the provider’s current model pricing rather than
recording volatile dollar rates here.
Normative deployment requirements and the deployment matrix are generated from the catalog and checked deployment descriptors. This chapter explains the intended Render topology and operational posture.
The backend start command runs
uv run --no-sync python scripts/migrate_database.py before
uv run --no-sync uvicorn wisacs_api.main:app --host 0.0.0.0 --port $PORT.
Render supplies the database connection string through
DATABASE_URL. The render.yaml blueprint
attaches wisacs.winnforum.org to the web service,
references the Render PostgreSQL resource as wisacs-db, and
uses /ready as the health check path.
The hosted service uses production environment safeguards with the
Simulation Profile. Published demo users remain disabled, the distinct
Harbor/Milwaukee and Place Victoria/Old Montreal inventory fixtures are
enabled, and a generated bootstrap password creates
wisacs-admin only when that username does not exist.
Existing Harbor demo deployments backfill the companion Old Montreal
fixture at startup without replacing either incident identity. Changing
the bootstrap environment password later does not rotate an existing
database credential.
When enabled, model input contains the submitted question plus compact, process-cached and versioned TBox context. It returns a strict structured plan that WiSACS validates against the ontology and supported query capability, with at most one repair. The existing compiler alone produces incident-scoped SPARQL. Incident facts and IDs are never model input; the provider key authenticates the API request but is never prompt content.
The V1 deployment profile is suitable for prototype review and demonstration. Before production use, operators should add managed secret rotation, database backups, stronger identity integration, TLS/domain review, incident data retention policy, operational monitoring, and a decision on whether demo credentials are disabled or isolated from operational incident data.
Traceability keeps reviewed intent, executable contracts, implementation, and tests moving together. Each normative requirement has a stable ID and semantically resolvable implementation and verification evidence.
specification/catalog.py with a
stable WISACS-* ID and RFC-style requirement language.
Normative traceability requirements and their evidence are generated from the typed catalog. The generated trace matrix is the review surface for resolved and missing evidence.
Normative requirement IDs are stable anchors. Review comments should cite catalog IDs and line numbers from generated PDFs when available.
When a requirement changes, update its catalog record and executable evidence in the same change, regenerate artifacts, and review the semantic diff. Automated resolution proves that evidence exists and targets a real symbol, operation, or test; human review still decides whether the evidence actually satisfies the requirement.
Specification version: 0.1.0. Release date:
2026-07-10. Source hash:
7c8856a289d3eea6d28a12bed1bd3469318d4d20bfe8a1494f8693e05f5e880a.
Generated from
specification/catalog.py; do not edit this file directly.
The API MUST enforce role-based access control, restricting administrative and commander operations.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The API MUST verify incident membership permissions before allowing data mutation.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The API MUST expose health and readiness endpoints for local and hosted deployment checks.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The API MUST provide a login endpoint and an authenticated current-user endpoint.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The API MUST allow authenticated users to list accessible incidents.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The API MUST enforce strict Pydantic input schema validation rejecting unknown fields and out-of-range bounds.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The implementation MUST generate valid OpenAPI schemas without database initialization side-effects.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The API MUST enforce sliding window rate limiting on sensitive login and map tile endpoints.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The implementation MUST construct its API endpoints using FastAPI routers and OpenAPI contracts.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST maintain an incident-scoped inventory of responders, field devices, networks, RF observations, reachable service endpoints, recommendations, memberships, and events.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST support SQLite file and in-memory isolated databases for testing and simulation.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST support PostGIS extensions and dialect-aware schema creation.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST expose validated location data for clients to show responders, devices, observations, and incident operating areas on a map.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The V1 system MUST NOT automatically bridge live networks; it MAY recommend candidate interoperability actions for human review.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST parse environment configuration variables for Render hosted deployment environments.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST support production PostgreSQL databases over encrypted TLS connections.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST serve root documentation and landing pages directly from process routes.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST declare and parse a formal OWL 2 DL domain ontology defining upper-level concepts, spatial entities, responder roles, networks, and radio equipment.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST provide a SPARQL 1.1 graph query engine supporting SELECT and ASK graph pattern matching against operational incident subgraphs.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST load ontology alignment modules only from a bounded, versioned, hash-pinned local registry.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system SHOULD structure operational situational awareness using Cognitive Linguistics concepts (Things, Places, Paths, Actions, Causes) across People, Equipment, Space, Time, and RF dimensions.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system SHOULD infer candidate gateway bridges, shared IP paths, and voice channels using SPARQL CONSTRUCT reasoning rules.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MAY provide natural language question-answering interfaces that map operator questions to executable SPARQL queries.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST lift relational database models and operational records into subject-predicate-object RDF triples.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST store user passwords hashed with PBKDF2-HMAC-SHA256 and constant-time password verification.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST issue cryptographically signed JWT bearer tokens for authenticated API sessions.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST restrict cross-origin resource sharing unless explicit origins are configured.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST isolate incident inventories and resource access strictly by authorized user membership.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST enforce strict foreign key cascade deletions across all incident sub-resources.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST support complete database table schema drops and reset isolations.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST support deterministic scenario fixtures for disaster disruption and spectrum congestion simulations.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST cache OpenStreetMap tiles locally and enforce strict bounded tile request proxying.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST stream real-time JSON-LD RDF triple deltas over incident WebSockets.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST parse 3D footprint vector geometry for Place Victoria target building simulations.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST generate draft SCA-compliant component descriptors for field devices and radios.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
The system MUST generate an automated traceability matrix verifying implementation and verification evidence for all normative requirements.
Profiles: simulation, production. Lifecycle: approved. Implementation status: implemented.
Rationale: Defines the repository-maintained WiSACS contract.
Acceptance criteria:
| Method | Path | Operation ID | Access | Requirements | Request schema | Success schema |
|---|---|---|---|---|---|---|
| GET | /api/v1/attachments |
list_attachments |
authenticated | WISACS-API-005, WISACS-SYS-001 | — | array[NetworkAttachmentRead] |
| POST | /api/v1/attachments |
create_attachment |
authenticated | WISACS-API-005, WISACS-SYS-001 | NetworkAttachmentCreate |
NetworkAttachmentRead |
| POST | /api/v1/auth/login |
login |
public | WISACS-API-002, WISACS-SEC-001 | LoginRequest |
TokenResponse |
| GET | /api/v1/auth/me |
me |
authenticated | WISACS-API-002, WISACS-SEC-001 | — | UserRead |
| GET | /api/v1/devices |
list_devices |
authenticated | WISACS-API-004, WISACS-SYS-001, WISACS-SCA-001 | — | array[FieldDeviceRead] |
| POST | /api/v1/devices |
create_device |
authenticated | WISACS-API-004, WISACS-SYS-001, WISACS-SCA-001 | FieldDeviceCreate |
FieldDeviceRead |
| GET | /api/v1/events |
list_events |
authenticated | WISACS-SYS-001 | — | array[EventLogRead] |
| GET | /api/v1/health |
health |
public | WISACS-API-001 | — | object |
| POST | /api/v1/imports/demo-scenario |
import_demo |
authenticated | WISACS-DATA-004 | DemoImportRequest |
DemoImportResponse |
| GET | /api/v1/incidents |
list_incidents |
authenticated | WISACS-API-003, WISACS-SYS-001 | — | array[IncidentRead] |
| POST | /api/v1/incidents |
create_incident |
authenticated | WISACS-API-003, WISACS-SYS-001 | IncidentCreate |
IncidentRead |
| GET | /api/v1/incidents/{incident_id} |
get_incident |
authenticated | WISACS-API-003, WISACS-SYS-001 | — | IncidentRead |
| GET | /api/v1/interop/recommendations |
list_interop_recommendations |
authenticated | WISACS-SYS-003, WISACS-SEC-003 | — | array[InteropRecommendationRead] |
| POST | /api/v1/interop/recommendations/recompute |
recompute_interop_recommendations |
authenticated | WISACS-SYS-003, WISACS-SEC-003 | — | array[InteropRecommendationRead] |
| GET | /api/v1/legal |
legal_notice |
public | — | — | object |
| GET | /api/v1/memberships |
list_memberships |
authenticated | WISACS-SEC-002, WISACS-SYS-001 | — | array[IncidentMembershipRead] |
| POST | /api/v1/memberships |
create_membership |
authenticated | WISACS-SEC-002, WISACS-SYS-001 | IncidentMembershipCreate |
IncidentMembershipRead |
| GET | /api/v1/networks |
list_networks |
authenticated | WISACS-API-004, WISACS-SYS-001 | — | array[NetworkRead] |
| POST | /api/v1/networks |
create_network |
authenticated | WISACS-API-004, WISACS-SYS-001 | NetworkCreate |
NetworkRead |
| GET | /api/v1/ontology/classes |
wisacs_ontology_list_classes |
authenticated | WISACS-ONT-001 | — | array[OntologyClassRead] |
| POST | /api/v1/ontology/lift/{incident_id} |
wisacs_ontology_lift_incident |
authenticated | WISACS-ONT-002 | — | OntologyLiftResponse |
| GET | /api/v1/ontology/qa |
wisacs_ontology_public_question_answering |
public | WISACS-ONT-006 | — | QaQueryResponse |
| POST | /api/v1/ontology/qa |
wisacs_ontology_question_answering |
authenticated | WISACS-ONT-006 | QaQueryRequest |
QaQueryResponse |
| GET | /api/v1/ontology/qa_html |
wisacs_ontology_public_question_answering_html |
public | WISACS-ONT-006 | — | — |
| POST | /api/v1/ontology/sparql |
wisacs_ontology_query_sparql |
authenticated | WISACS-ONT-003, WISACS-SEC-003 | SparqlQueryRequest |
SparqlQueryResponse |
| GET | /api/v1/ontology/triples/{incident_id} |
wisacs_ontology_get_incident_triples |
authenticated | WISACS-ONT-002 | — | — |
| GET | /api/v1/ready |
ready |
public | WISACS-API-001 | — | object |
| GET | /api/v1/responders |
list_responders |
authenticated | WISACS-API-004, WISACS-SYS-001 | — | array[ResponderRead] |
| POST | /api/v1/responders |
create_responder |
authenticated | WISACS-API-004, WISACS-SYS-001 | ResponderCreate |
ResponderRead |
| GET | /api/v1/rf-observations |
list_rf_observations |
authenticated | WISACS-API-005, WISACS-SYS-001, WISACS-DATA-002 | — | array[RfObservationRead] |
| POST | /api/v1/rf-observations |
create_rf_observation |
authenticated | WISACS-API-005, WISACS-SYS-001, WISACS-DATA-002 | RfObservationCreate |
RfObservationRead |
| GET | /api/v1/sca/descriptors/{device_id} |
get_sca_descriptor |
authenticated | WISACS-SCA-001, WISACS-SCA-002 | — | ScaDescriptor |
| GET | /api/v1/scenarios |
list_scenarios |
authenticated | WISACS-DATA-004 | — | array[ScenarioDefinition] |
| GET | /api/v1/scenarios/{scenario_id} |
get_scenario |
authenticated | WISACS-DATA-004 | — | ScenarioDefinition |
| GET | /api/v1/service-endpoints |
list_service_endpoints |
authenticated | WISACS-API-005, WISACS-SYS-001 | — | array[ServiceEndpointRead] |
| POST | /api/v1/service-endpoints |
create_service_endpoint |
authenticated | WISACS-API-005, WISACS-SYS-001 | ServiceEndpointCreate |
ServiceEndpointRead |
| GET | /api/v1/visualization/old-montreal/target-building |
visualization_old_montreal_target_building |
authenticated | WISACS-SYS-002, WISACS-DATA-002, WISACS-SEC-001 | — | object |
| GET | /api/v1/visualization/osm-map |
visualization_osm_map |
authenticated | WISACS-SYS-002, WISACS-DATA-002, WISACS-SEC-001 | — | — |
| GET | /health |
root_health |
public | WISACS-API-001 | — | object |
| GET | /ready |
root_ready |
public | WISACS-API-001 | — | object |
| Table | Column | SQL type | Nullable | Primary key | Foreign key |
|---|---|---|---|---|---|
incidents |
id |
VARCHAR(36) |
False | True | | | `incidents` | `name` | `VARCHAR(200)` | False | False | |
incidents |
description |
TEXT |
False | False | | | `incidents` | `status` | `VARCHAR(40)` | False | False | |
incidents |
latitude |
FLOAT |
False | False | | | `incidents` | `longitude` | `FLOAT` | False | False | |
incidents |
scenario_id |
VARCHAR(120) |
True | False | | | `incidents` | `operational_area` | `JSON` | False | False | |
incidents |
metadata_tags |
JSON |
False | False | | | `incidents` | `created_at` | `DATETIME` | False | False | |
incidents |
updated_at |
DATETIME |
False | False | | | `users` | `id` | `VARCHAR(36)` | False | True | |
users |
username |
VARCHAR(80) |
False | False | | | `users` | `display_name` | `VARCHAR(160)` | False | False | |
users |
role |
VARCHAR(40) |
False | False | | | `users` | `password_hash` | `VARCHAR(256)` | False | False | |
users |
is_active |
BOOLEAN |
False | False | | | `users` | `created_at` | `DATETIME` | False | False | |
users |
updated_at |
DATETIME |
False | False | | | `event_log` | `id` | `VARCHAR(36)` | False | True | |
event_log |
incident_id |
VARCHAR(36) |
True | False | incidents.id |
event_log |
actor |
VARCHAR(120) |
False | False | | | `event_log` | `event_type` | `VARCHAR(80)` | False | False | |
event_log |
payload |
JSON |
False | False | | | `event_log` | `created_at` | `DATETIME` | False | False | |
event_log |
updated_at |
DATETIME |
False | False | | | `incident_memberships` | `id` | `VARCHAR(36)` | False | True | |
incident_memberships |
incident_id |
VARCHAR(36) |
False | False | incidents.id |
incident_memberships |
user_id |
VARCHAR(36) |
False | False | users.id |
incident_memberships |
incident_role |
VARCHAR(80) |
False | False | | | `incident_memberships` | `can_write` | `BOOLEAN` | False | False | |
incident_memberships |
created_at |
DATETIME |
False | False | | | `incident_memberships` | `updated_at` | `DATETIME` | False | False | |
interop_recommendations |
id |
VARCHAR(36) |
False | True | | | `interop_recommendations` | `incident_id` | `VARCHAR(36)` | False | False | `incidents.id` | | `interop_recommendations` | `recommendation_type` | `VARCHAR(80)` | False | False | |
interop_recommendations |
title |
VARCHAR(180) |
False | False | | | `interop_recommendations` | `summary` | `TEXT` | False | False | |
interop_recommendations |
confidence |
FLOAT |
False | False | | | `interop_recommendations` | `risk` | `VARCHAR(40)` | False | False | |
interop_recommendations |
source |
VARCHAR(80) |
False | False | | | `interop_recommendations` | `evidence` | `JSON` | False | False | |
interop_recommendations |
status |
VARCHAR(40) |
False | False | | | `interop_recommendations` | `created_at` | `DATETIME` | False | False | |
interop_recommendations |
updated_at |
DATETIME |
False | False | | | `networks` | `id` | `VARCHAR(36)` | False | True | |
networks |
incident_id |
VARCHAR(36) |
False | False | incidents.id |
networks |
name |
VARCHAR(160) |
False | False | | | `networks` | `network_type` | `VARCHAR(80)` | False | False | |
networks |
ip_cidr |
VARCHAR(80) |
True | False | | | `networks` | `frequency_mhz` | `FLOAT` | True | False | |
networks |
bandwidth_khz |
FLOAT |
True | False | | | `networks` | `channel` | `VARCHAR(80)` | True | False | |
networks |
talkgroup |
VARCHAR(80) |
True | False | | | `networks` | `ssid` | `VARCHAR(120)` | True | False | |
networks |
security_label |
VARCHAR(80) |
False | False | | | `networks` | `status` | `VARCHAR(40)` | False | False | |
networks |
coverage_area |
JSON |
False | False | | | `networks` | `metadata_tags` | `JSON` | False | False | |
networks |
created_at |
DATETIME |
False | False | | | `networks` | `updated_at` | `DATETIME` | False | False | |
responders |
id |
VARCHAR(36) |
False | True | | | `responders` | `incident_id` | `VARCHAR(36)` | False | False | `incidents.id` | | `responders` | `name` | `VARCHAR(160)` | False | False | |
responders |
agency |
VARCHAR(160) |
False | False | | | `responders` | `role` | `VARCHAR(80)` | False | False | |
responders |
status |
VARCHAR(40) |
False | False | | | `responders` | `latitude` | `FLOAT` | True | False | |
responders |
longitude |
FLOAT |
True | False | | | `responders` | `last_seen_at` | `DATETIME` | True | False | |
responders |
metadata_tags |
JSON |
False | False | | | `responders` | `created_at` | `DATETIME` | False | False | |
responders |
updated_at |
DATETIME |
False | False | | | `field_devices` | `id` | `VARCHAR(36)` | False | True | |
field_devices |
incident_id |
VARCHAR(36) |
False | False | incidents.id |
field_devices |
responder_id |
VARCHAR(36) |
True | False | responders.id |
field_devices |
name |
VARCHAR(160) |
False | False | | | `field_devices` | `device_type` | `VARCHAR(80)` | False | False | |
field_devices |
manufacturer |
VARCHAR(120) |
False | False | | | `field_devices` | `model` | `VARCHAR(120)` | False | False | |
field_devices |
serial_number |
VARCHAR(120) |
False | False | | | `field_devices` | `ip_address` | `VARCHAR(64)` | True | False | |
field_devices |
mac_address |
VARCHAR(64) |
True | False | | | `field_devices` | `latitude` | `FLOAT` | True | False | |
field_devices |
longitude |
FLOAT |
True | False | | | `field_devices` | `status` | `VARCHAR(40)` | False | False | |
field_devices |
capabilities |
JSON |
False | False | | | `field_devices` | `sca_profile` | `VARCHAR(80)` | True | False | |
field_devices |
component_kind |
VARCHAR(80) |
True | False | | | `field_devices` | `ports` | `JSON` | False | False | |
field_devices |
properties |
JSON |
False | False | | | `field_devices` | `descriptor_metadata` | `JSON` | False | False | |
field_devices |
metadata_tags |
JSON |
False | False | | | `field_devices` | `created_at` | `DATETIME` | False | False | |
field_devices |
updated_at |
DATETIME |
False | False | | | `network_attachments` | `id` | `VARCHAR(36)` | False | True | |
network_attachments |
incident_id |
VARCHAR(36) |
False | False | incidents.id |
network_attachments |
device_id |
VARCHAR(36) |
False | False | field_devices.id |
network_attachments |
network_id |
VARCHAR(36) |
False | False | networks.id |
network_attachments |
ip_address |
VARCHAR(64) |
True | False | | | `network_attachments` | `mac_address` | `VARCHAR(64)` | True | False | |
network_attachments |
signal_dbm |
FLOAT |
True | False | | | `network_attachments` | `reachability` | `VARCHAR(40)` | False | False | |
network_attachments |
observed_at |
DATETIME |
False | False | | | `network_attachments` | `metadata_tags` | `JSON` | False | False | |
network_attachments |
created_at |
DATETIME |
False | False | | | `network_attachments` | `updated_at` | `DATETIME` | False | False | |
rf_observations |
id |
VARCHAR(36) |
False | True | | | `rf_observations` | `incident_id` | `VARCHAR(36)` | False | False | `incidents.id` | | `rf_observations` | `source_device_id` | `VARCHAR(36)` | True | False | `field_devices.id` | | `rf_observations` | `latitude` | `FLOAT` | True | False | |
rf_observations |
longitude |
FLOAT |
True | False | | | `rf_observations` | `frequency_mhz` | `FLOAT` | False | False | |
rf_observations |
bandwidth_khz |
FLOAT |
True | False | | | `rf_observations` | `rssi_dbm` | `FLOAT` | True | False | |
rf_observations |
protocol_guess |
VARCHAR(120) |
True | False | | | `rf_observations` | `modulation_guess` | `VARCHAR(120)` | True | False | |
rf_observations |
confidence |
FLOAT |
False | False | | | `rf_observations` | `observed_at` | `DATETIME` | False | False | |
rf_observations |
metadata_tags |
JSON |
False | False | | | `rf_observations` | `created_at` | `DATETIME` | False | False | |
rf_observations |
updated_at |
DATETIME |
False | False | | | `service_endpoints` | `id` | `VARCHAR(36)` | False | True | |
service_endpoints |
incident_id |
VARCHAR(36) |
False | False | incidents.id |
service_endpoints |
device_id |
VARCHAR(36) |
False | False | field_devices.id |
service_endpoints |
network_id |
VARCHAR(36) |
True | False | networks.id |
service_endpoints |
name |
VARCHAR(160) |
False | False | | | `service_endpoints` | `protocol` | `VARCHAR(40)` | False | False | |
service_endpoints |
port |
INTEGER |
False | False | | | `service_endpoints` | `uri` | `VARCHAR(240)` | True | False | |
service_endpoints |
status |
VARCHAR(40) |
False | False | | | `service_endpoints` | `metadata_tags` | `JSON` | False | False | |
service_endpoints |
created_at |
DATETIME |
False | False | | | `service_endpoints` | `updated_at` | `DATETIME` | False | False | |
| Channel | Operation ID | Access | Authorization | Delivery | Ordering | Replay |
|---|---|---|---|---|---|---|
/api/v1/ws/incidents/{incident_id} |
subscribe_incident_events |
authenticated | active incident membership or admin/commander role | at-most-once in-process Simulation Profile fanout | per-process publication order | not supported; use GET /api/v1/events for persisted audit history |
Message schema: EventMessage.
| Event type | Meaning |
|---|---|
incident.created |
Incident inventory record created. |
membership.created |
Incident membership created. |
responder.created |
Responder inventory record created. |
device.created |
Field-device inventory record created. |
network.created |
Network inventory record created. |
attachment.created |
Device-to-network attachment created. |
rf_observation.created |
RF observation ingested. |
service_endpoint.created |
Reachable service endpoint ingested. |
interop.recomputed |
Advisory recommendations recomputed. |
demo.imported |
Versioned demonstration scenario imported. |
| Event type | Meaning |
|---|---|
connected |
Subscription accepted for the authorized incident. |
incident.created |
Incident inventory record created. |
responder.created |
Responder inventory record created. |
device.created |
Field-device inventory record created. |
network.created |
Network inventory record created. |
attachment.created |
Device-to-network attachment created. |
rf_observation.created |
RF observation ingested. |
service_endpoint.created |
Reachable service endpoint ingested. |
demo.imported |
Versioned demonstration scenario imported. |
| Path | Purpose |
|---|---|
/ |
Repository documentation landing page |
/visualization |
Browser shell; operational data calls remain authenticated |
/visualization/ |
Canonical browser-shell redirect |
/spec |
Generated specification HTML |
/spec/ |
Canonical specification redirect |
/spec/final.pdf |
Generated final specification PDF |
/spec/review.pdf |
Generated line-numbered review PDF |
/spec/review.tex |
Generated line-numbered review source |
/docs |
OpenAPI user interface |
/docs/oauth2-redirect |
OpenAPI OAuth redirect helper |
/openapi.json |
Machine-readable API contract |
/redoc |
Alternative API documentation |
/health |
Hosting health check |
/ready |
Hosting readiness check |
/api/v1/health |
Versioned API health check |
/api/v1/ready |
Versioned API readiness check |
/api/v1/legal |
License, source, and warranty notice |
/api/v1/auth/login |
Bearer-token issuance |
/api/v1/ontology/qa |
Address-bar Q&A for the explicitly configured public demo incident |
/api/v1/ontology/qa_html |
Browser-rendered Q&A for the explicitly configured public demo incident |
| Operation | Access |
|---|---|
GET /api/v1/attachments |
authenticated |
GET /api/v1/auth/me |
authenticated |
GET /api/v1/devices |
authenticated |
GET /api/v1/events |
authenticated |
GET /api/v1/health |
public |
GET /api/v1/incidents |
authenticated |
GET /api/v1/incidents/{incident_id} |
authenticated |
GET /api/v1/interop/recommendations |
authenticated |
GET /api/v1/legal |
public |
GET /api/v1/memberships |
authenticated |
GET /api/v1/networks |
authenticated |
GET /api/v1/ontology/classes |
authenticated |
GET /api/v1/ontology/qa |
public |
GET /api/v1/ontology/qa_html |
public |
GET /api/v1/ontology/triples/{incident_id} |
authenticated |
GET /api/v1/ready |
public |
GET /api/v1/responders |
authenticated |
GET /api/v1/rf-observations |
authenticated |
GET /api/v1/sca/descriptors/{device_id} |
authenticated |
GET /api/v1/scenarios |
authenticated |
GET /api/v1/scenarios/{scenario_id} |
authenticated |
GET /api/v1/service-endpoints |
authenticated |
GET /api/v1/visualization/old-montreal/target-building |
authenticated |
GET /api/v1/visualization/osm-map |
authenticated |
GET /health |
public |
GET /ready |
public |
POST /api/v1/attachments |
authenticated |
POST /api/v1/auth/login |
public |
POST /api/v1/devices |
authenticated |
POST /api/v1/imports/demo-scenario |
authenticated |
POST /api/v1/incidents |
authenticated |
POST /api/v1/interop/recommendations/recompute |
authenticated |
POST /api/v1/memberships |
authenticated |
POST /api/v1/networks |
authenticated |
POST /api/v1/ontology/lift/{incident_id} |
authenticated |
POST /api/v1/ontology/qa |
authenticated |
POST /api/v1/ontology/sparql |
authenticated |
POST /api/v1/responders |
authenticated |
POST /api/v1/rf-observations |
authenticated |
POST /api/v1/service-endpoints |
authenticated |
/api/v1/ws/incidents/{incident_id} is
authenticated.
| ID | Version | Name | Geography | Importable inventory | Responders | Networks | Expected recommendations | Provenance |
|---|---|---|---|---|---|---|---|---|
emergency-disruption-ontology-v1 |
1.1 |
Hurricane Infrastructure Disruption & Emergency COW Deployment | Hurricane Disruption Sector 4 (29.9511, -90.0715) | no | 2 | 2 | Not applicable | WiSACS Working Group (AGPL-3.0-or-later) |
harbor-district-flood-v1 |
1.2 |
Harbor District Flood Response | Milwaukee Harbor District (43.0328, -87.9095) | yes | 4 | 5 | shared_network, candidate_gateway, ip_relay_possible, voice_only_manual_coordination | WiSACS repository maintainers (AGPL-3.0-or-later) |
old-montreal-response-v1 |
1.2 |
Old Montreal Place Victoria Response | Place Victoria, Old Montreal (45.5011, -73.556) | yes | 6 | 5 | shared_network, candidate_gateway, ip_relay_possible, voice_only_manual_coordination | WiSACS repository maintainers and OpenStreetMap contributors (AGPL-3.0-or-later; OSM data ODbL) |
rf-congestion-event-v1 |
1.1 |
Major Public Event Severe Spectrum Congestion | Stadium Public Event Sector A (41.8781, -87.6298) | no | 1 | 2 | Not applicable | WiSACS Working Group (AGPL-3.0-or-later) |
| Environment variable | Type | Default | Source |
|---|---|---|---|
DATABASE_URL |
str |
'sqlite:///./wisacs.db' |
AST-parsed from
backend/src/wisacs_api/core/config.py |
LOCALAPPDATA |
str |
required/empty |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_ACCESS_TOKEN_MINUTES |
int |
8 * 60 |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_API_PREFIX |
str |
'/api/v1' |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_AUTO_CREATE_SCHEMA |
bool |
True |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_BOOTSTRAP_ADMIN_PASSWORD |
SecretStr | None |
<redacted> |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_BOOTSTRAP_ADMIN_USERNAME |
str | None |
None |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_CACHE_DIR |
Path | None |
None |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_CORS_ORIGINS |
list[str] |
[] |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_ENABLE_DEMO_SCENARIO |
bool |
False |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_ENABLE_DEMO_USERS |
bool |
False |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_ENV |
Literal['development', 'test', 'production'] |
'development' |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_OPENAI_API_KEY |
SecretStr | None |
None |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_PROFILE |
Literal['simulation', 'production'] |
'simulation' |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_PUBLIC_BASE_URL |
str |
'http://localhost:8001' |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_QA_LLM_ALLOW_PUBLIC |
bool |
False |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_QA_LLM_ENABLED |
bool |
False |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_QA_LLM_MAX_OUTPUT_TOKENS |
int |
800 |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_QA_LLM_MAX_REPAIRS |
int |
1 |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_QA_LLM_MODEL |
str |
'gpt-5.6-luna' |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_QA_LLM_REASONING_EFFORT |
Literal['none', 'low', 'medium', 'high', 'xhigh', 'max'] |
'medium' |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_QA_LLM_TIMEOUT_SECONDS |
float |
15.0 |
AST-parsed from
backend/src/wisacs_api/core/config.py |
WISACS_SECRET_KEY |
str |
<redacted> |
AST-parsed from
backend/src/wisacs_api/core/config.py |
XDG_CACHE_HOME |
str |
required/empty |
AST-parsed from
backend/src/wisacs_api/core/config.py |
The Render blueprint declares 1 service(s) and 1 database(s). Docker Compose declares 1 local service(s). The Makefile exposes 22 executable workflow target(s): audit, backend-test, check-frontend-godot, coverage, db-current, db-upgrade, demo, docs, docs-all, docs-pdf, docs-review, docs-review-tex, format-check, lint, package, run-api, run-frontend-godot, spec-check, spec-generate, test, tool-test, traceability.
| Kind | Name | Runtime/version | Health/start |
|---|---|---|---|
| service | wisacs-web |
python |
/ready /
uv run --no-sync python scripts/migrate_database.py && uv run --no-sync uvicorn wisacs_api.main:app --host 0.0.0.0 --port $PORT |
| database | wisacs-db |
PostgreSQL 16 |
managed |
Generated; do not edit.
wisacs_api.api.deps:require_contributor — Implementation
target in require_contributor.POST /api/v1/responders —
Responder creation operation.wisacs_api.api.deps:require_contributor — Implementation
target in require_contributor.wisacs_api.api.routes:_contract
— Implementation target in _contract.wisacs_api.api.routes:health —
Implementation target in health.GET /api/v1/health — API
health operation.GET /ready — Hosted readiness
operation.wisacs_api.api.routes:login —
Implementation target in login.POST /api/v1/auth/login —
Login operation.GET /api/v1/auth/me — Current
user operation.wisacs_api.api.routes:list_incidents — Implementation
target in list_incidents.GET /api/v1/incidents —
Incident list operation.wisacs_api.core.config:Settings
— Implementation target in Settings.wisacs_api.core.graph:WiSACSGraphStore — Implementation
target in WiSACSGraphStore.GET /api/v1/ontology/classes —
Ontology taxonomy operation.wisacs_api.core.graph:WiSACSGraphStore — Implementation
target in WiSACSGraphStore.POST /api/v1/ontology/sparql —
SPARQL query operation.wisacs_api.core.ontology_registry:load_ontology_registry —
Implementation target in load_ontology_registry.wisacs_api.core.security:hash_password — Implementation
target in hash_password.POST /api/v1/auth/login —
Password authenticated login operation.GET /api/v1/auth/me —
Authenticated identity operation.wisacs_api.core.security:create_access_token —
Implementation target in create_access_token.wisacs_api.db.models:Incident —
Implementation target in Incident.GET /api/v1/incidents —
Authenticated incident inventory.wisacs_api.db.models:Responder
— Implementation target in Responder.wisacs_api.db.session:configure_database — Implementation
target in configure_database.wisacs_api.db.session:configure_database — Implementation
target in configure_database.wisacs_api.db.session:create_schema — Implementation target
in create_schema.wisacs_api.db.session:drop_schema — Implementation target
in drop_schema.wisacs_api.domain.cognitive:Place — Implementation target
in Place.wisacs_api.domain.scenarios:load_scenario — Implementation
target in load_scenario.GET /api/v1/scenarios —
Scenario catalog operation.POST /api/v1/imports/demo-scenario — Demo import
operation.wisacs_api.domain.schemas:ApiModel — Implementation target
in ApiModel.wisacs_api.domain.schemas:IncidentBase — Implementation
target in IncidentBase.GET /api/v1/visualization/old-montreal/target-building —
Authenticated target building image.wisacs_api.main:create_app —
Implementation target in create_app.wisacs_api.main:create_app —
Implementation target in create_app.wisacs_api.main:create_contract_app — Implementation target
in create_contract_app.wisacs_api.main:create_contract_app — Implementation target
in create_contract_app.GET /api/v1/interop/recommendations — Authenticated interop
recommendations endpoint.POST /api/v1/interop/recommendations/recompute —
Authenticated interop recommendation recomputation.wisacs_api.services.access:can_access_incident —
Implementation target in can_access_incident.GET /api/v1/interop/recommendations — Boundary isolated
interop recommendations endpoint.POST /api/v1/interop/recommendations/recompute — Boundary
isolated recompute operation.POST /api/v1/ontology/sparql —
Boundary isolated request-local SPARQL operation.wisacs_api.services.events:EventBroker.publish_semantic_triples
— Implementation target in EventBroker.publish_semantic_triples.GET /api/v1/sca/descriptors/{device_id} — Semantic triple
streaming operation.wisacs_api.services.interop_reasoning:run_ontology_reasoning
— Implementation target in run_ontology_reasoning.wisacs_api.services.map_tiles:download_osm_map —
Implementation target in download_osm_map.wisacs_api.services.old_montreal:get_place_victoria_target_building
— Implementation target in get_place_victoria_target_building.wisacs_api.services.qa_engine:answer_natural_language_question
— Implementation target in answer_natural_language_question.POST /api/v1/ontology/qa —
Natural language QA operation.wisacs_api.services.rate_limit:SlidingWindowRateLimiter —
Implementation target in SlidingWindowRateLimiter.wisacs_api.services.sca:build_sca_descriptor —
Implementation target in build_sca_descriptor.GET /api/v1/devices — Field
device list operation.GET /api/v1/sca/descriptors/{device_id} — SCA descriptor
operation.wisacs_api.services.semantic_lifting:lift_incident_to_graph
— Implementation target in lift_incident_to_graph.POST /api/v1/ontology/lift/{incident_id} — Semantic lifting
operation.specification.catalog:_load_requirements_from_ast —
Implementation target in _load_requirements_from_ast.Generated; do not edit.
backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_ontology.py::test_core_owl_ontology_representation
— Verifies OWL 2 DL ontology class hierarchy.backend/tests/test_ontology.py::test_sparql_query_endpoint_execution
— Verifies SPARQL 1.1 graph query engine.backend/tests/test_temporal_sparql_api.py::test_temporal_sparql_select_and_ask_use_a_local_temporal_snapshot
— Verifies authenticated SELECT and ASK execute against the requested
temporal incident snapshot.backend/tests/test_temporal_sparql_api.py::test_temporal_sparql_cannot_read_another_global_incident_graph
— Verifies direct SPARQL cannot cross the selected incident
boundary.backend/tests/test_ontology_registry.py::test_registry_loads_shipped_module_and_deterministic_selections
— Verifies the shipped local registry, source ledger, module ordering,
and QA visibility selection.backend/tests/test_ontology_registry.py::test_registry_refuses_oversized_regular_files_before_parsing
— Verifies ontology artifacts fail closed at configured byte bounds
before parsing.backend/tests/test_ontology_registry.py::test_turtle_parser_stops_during_materialization
— Verifies Turtle parsing stops at the configured statement bound.backend/tests/test_api.py::test_login_is_rate_limited —
Verifies security and authentication mechanics.backend/tests/test_api.py::test_login_is_rate_limited —
Verifies security and authentication mechanics.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_demo_import_populates_inventory_and_recommendations
— Verifies database schema and inventory invariants.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_demo_import_populates_inventory_and_recommendations
— Verifies database schema and inventory invariants.backend/tests/test_ontology.py::test_cognitive_linguistics_5d_modeling
— Verifies 5D situational awareness model.backend/tests/test_api.py::test_demo_import_populates_inventory_and_recommendations
— Verifies database schema and inventory invariants.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_login_is_rate_limited —
Verifies security and authentication mechanics.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_temporal_sparql_api.py::test_direct_sparql_without_incident_cannot_read_global_incident_graph
— Verifies ontology-only direct queries cannot see process-global
incident graphs.backend/tests/test_temporal_sparql_api.py::test_temporal_sparql_enforces_incident_membership
— Verifies direct SPARQL requires selected-incident membership.backend/tests/test_temporal_sparql_api.py::test_temporal_sparql_cannot_read_another_global_incident_graph
— Verifies a direct query cannot read a different named incident
graph.backend/tests/test_api.py::test_sca_descriptor_for_gateway
— Verifies SCA component descriptors.backend/tests/test_ontology.py::test_operational_semantic_lifting
— Verifies SPARQL CONSTRUCT reasoning rules.backend/tests/test_api.py::test_demo_import_populates_inventory_and_recommendations
— Verifies database schema and inventory invariants.backend/tests/test_api.py::test_sca_descriptor_for_gateway
— Verifies SCA component descriptors.backend/tests/test_qa_paraphrase_evaluation.py::test_authenticated_hybrid_paraphrases_execute_against_harbor_evidence
— Verifies grounded paraphrases compile and execute against authorized
incident evidence.backend/tests/test_qa_hybrid_engine.py::test_ambiguous_communications_assets_requires_clarification_before_execution
— Verifies ambiguous grounding requests clarification without query
execution or graph lifting.backend/tests/test_llm_qa_planner.py::test_explicit_llm_clarification_stops_before_lifting
— Verifies structured LLM ambiguity returns deterministic clarification
without graph execution.backend/tests/test_qa_hybrid_engine.py::test_out_of_domain_weather_question_abstains_before_execution
— Verifies unsupported language abstains without query execution or
graph lifting.backend/tests/test_llm_qa_planner.py::test_unavailable_llm_uses_safe_local_grounding_and_execution
— Verifies availability-only LLM failures use deterministic local
grounding.backend/tests/test_temporal_scenario_qa.py::test_disabled_explicit_llm_uses_local_grounding_for_old_montreal_snapshot
— Verifies authenticated explicit LLM fallback returns temporal Old
Montreal evidence.backend/tests/test_qa_hybrid_llm_comparison.py::test_comparison_catalog_cases_match_local_grounding_and_classification
— Compares 20 bounded hybrid and structured-LLM plans without provider
calls, including strict and answer-sufficient matches.backend/tests/test_qa_hybrid_engine.py::test_runtime_catalog_isolated_from_default_graph_tbox_metadata
— Verifies non-QA-visible default-graph ontology metadata cannot expand
executable natural-language vocabulary.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.backend/tests/test_api.py::test_sca_descriptor_for_gateway
— Verifies SCA component descriptors.backend/tests/test_ontology.py::test_operational_semantic_lifting
— Verifies database to RDF triple lifting.backend/tests/test_temporal_scenario_qa.py::test_temporal_network_statuses_are_derived_without_mutating_inventory
— Verifies scenario Network status is derived from current responder use
without mutating inventory.backend/tests/test_temporal_scenario_qa.py::test_temporal_lift_excludes_future_attachment_derived_relationships
— Verifies future attachments cannot produce Network status or
relationship facts early.backend/tests/test_api.py::test_health_and_ready — Verifies
API routes and system contracts.| Requirement | Profile | Status | Implementation evidence | Verification evidence |
|---|---|---|---|---|
| WISACS-API-004 | simulation, production | implemented | 2 | 1 |
| WISACS-API-008 | simulation, production | implemented | 1 | 1 |
| WISACS-SYS-004 | simulation, production | implemented | 1 | 1 |
| WISACS-API-001 | simulation, production | implemented | 3 | 1 |
| WISACS-API-002 | simulation, production | implemented | 3 | 1 |
| WISACS-API-003 | simulation, production | implemented | 2 | 1 |
| WISACS-DEPLOY-001 | simulation, production | implemented | 1 | 1 |
| WISACS-ONT-001 | simulation, production | implemented | 2 | 1 |
| WISACS-ONT-003 | simulation, production | implemented | 2 | 3 |
| WISACS-ONT-007 | simulation, production | implemented | 1 | 3 |
| WISACS-SEC-001 | simulation, production | implemented | 3 | 1 |
| WISACS-SEC-002 | simulation, production | implemented | 1 | 1 |
| WISACS-SYS-001 | simulation, production | implemented | 2 | 1 |
| WISACS-DATA-002 | simulation, production | implemented | 1 | 1 |
| WISACS-SYS-005 | simulation, production | implemented | 1 | 1 |
| WISACS-DEPLOY-002 | simulation, production | implemented | 1 | 1 |
| WISACS-SYS-006 | simulation, production | implemented | 1 | 1 |
| WISACS-DATA-001 | simulation, production | implemented | 1 | 1 |
| WISACS-ONT-005 | simulation, production | implemented | 1 | 1 |
| WISACS-DATA-004 | simulation, production | implemented | 3 | 1 |
| WISACS-API-007 | simulation, production | implemented | 1 | 1 |
| WISACS-SYS-002 | simulation, production | implemented | 2 | 1 |
| WISACS-SEC-004 | simulation, production | implemented | 1 | 1 |
| WISACS-DEPLOY-003 | simulation, production | implemented | 1 | 1 |
| WISACS-API-005 | simulation, production | implemented | 1 | 1 |
| WISACS-SYS-003 | simulation, production | implemented | 3 | 1 |
| WISACS-SEC-003 | simulation, production | implemented | 4 | 3 |
| WISACS-SCA-002 | simulation, production | implemented | 2 | 1 |
| WISACS-ONT-004 | simulation, production | implemented | 1 | 1 |
| WISACS-DATA-003 | simulation, production | implemented | 1 | 1 |
| WISACS-SCA-003 | simulation, production | implemented | 1 | 1 |
| WISACS-ONT-006 | simulation, production | implemented | 2 | 8 |
| WISACS-API-006 | simulation, production | implemented | 1 | 1 |
| WISACS-SCA-001 | simulation, production | implemented | 3 | 1 |
| WISACS-ONT-002 | simulation, production | implemented | 2 | 3 |
| WISACS-TRACE-001 | simulation, production | implemented | 1 | 1 |