Specira sample artefact. Rendered from the governed default template on a fictional company. Names, figures and dates are illustrative.All artefacts →
SAMPLE
seeded demo data · specira.ai
Specira FRD: Governed Template Rendering
Governed template rendering reference: FRD default v2 (draft) definition 22362e58…a11e
Functional Requirements Document · Requirement artifact SPECIRA

Functional spec: Recommendation rules

Meridian Field Services · Dispatch Modernization: instructional example, not project evidence

Draft · watermark policy: draft_only template frd v2 · pack: specira_default_delivery depth: standard
§1

Overview & Traceability

mandatory1 decision

What this document specifies, where it sits in the chain, and how to read it. Identifiers here are the one place system notation belongs in body content.

This document specifies the assignment-recommendation behavior of the dispatch board, the feature committed in the project PRD[1] and justified by the dispatch-board business case[2]. Behavior statements are numbered FR-nnn; acceptance criteria AC-nnn reference their parent statement; error catalog entries are ERR-nn. Verification methods come from a closed set: inspection (read it), analysis (calculate it), demonstration (watch it), test (automate it).

Decision: specification boundary This document covers recommendation generation, presentation, and override recording. Board layout and refresh behavior are specified in Board refresh & resilience[3]; compliance reporting is a second-slice specification.
§2

Roles & Permissions

mandatory1 decision

Who may do what. Denial is behavior too: every "may not" row has a defined refusal in the error catalog.

ActionDispatcherOperations managerField technician
Request recommendations for a jobYesNo: ERR-04No: ERR-04
Accept a proposed assignmentYesNo: ERR-04No: ERR-04
Override with a different technicianYesNo: ERR-04No: ERR-04
View recommendation & override historyOwn hubAll hubsOwn assignments only

Roles reuse the project's role definitions by reference; this requirement invents no local roles.

§3

Functional Requirements

mandatory 2 decisions1 evidence rule validator: every_requirement_has_id_fit_criterion_and_verification_method

The atomic behavior statements. Each carries its identifier, priority, fit criterion (the one-sentence way to prove it false), and how it will be verified. One behavior per statement; the system is always the subject.

IDThe system shall…PriorityFit criterionVerify
FR-010 propose exactly three candidate technicians for each new job, ranked by suitability Must Three candidates render in every case, or the defined shortfall behavior (§4) applies test
FR-011 display, per candidate, the plain-language reasons for the ranking Must Every proposal renders at least two reasons a dispatcher recognizes as true demonstration
FR-012 record every override together with the dispatcher's selected reason Must An override without a stored reason cannot complete test
FR-013 exclude unqualified technicians from proposals entirely, never merely down-rank them Must No proposal ever contains a technician lacking the job's required skill test

Each statement traces to a business requirement in the dispatch-board case[2]; statements name no services, components, or vendors: that freedom belongs to engineering.

§4

Behavior, Calculations & Decision Logic

mandatory 1 decision1 evidence rule validator: branch_closure_in_logic

The ranking rule with every branch closed. "To be decided" is not a branch outcome; the template rejects open branches. Worked examples are part of the specification.

Suitability ranking. Qualification is a gate, not a weight: unqualified candidates are excluded first (FR-013). Qualified candidates then rank by weighted score: 50% proximity band + 30% calendar availability + 20% response-window urgency; weights are fixed in this version. Proximity bands (historical drive time): A under 10 minutes, B 10 to 20, C 20 to 40, D over 40. Ties break on earlier availability, then employee number. One or two qualified: propose all who qualify with a shortfall notice (ERR-06). Zero qualified: ERR-02.

Decision: logic closure Response-window urgency (time remaining on the customer's contractual response promise) is the third ranking input at 20% weight and appears in the reasons, required by contractual response windows[5].
Worked example: commercial HVAC job, site X
Candidates: A (qualified, band B at 12 min, free now, window comfortable) · B (qualified, band A at 8 min, busy until 15:00, window tight) · C (unqualified, band A at 3 min). Expected: C excluded by the gate; B ranks above A, since band A proximity (50%) plus tight-window urgency (20%) outweigh A's availability edge (30%); reasons render all three facts. Branch coverage: exclusion, all three weights, urgency, tie-free ordering. Shortfall example: only B qualified → propose B alone with "1 of 3: no other technician holds commercial HVAC today" (ERR-06).
§5

Use-Case Flows

conditional · active: multi-step flows 1 decision

The interaction as a sequence diagram and the assignment lifecycle as a state diagram, both produced through Specira's diagram service, the same path exports use. The numbered steps under each diagram are its accessibility fallback. Exception flows here and the error catalog in §8 must agree; the template checks that they do.

Interaction: request to confirmed assignment

Recommendation behaviorDispatch boardRecommendation behaviorDispatch boardalt[within 2 s (p95 threshold, section 10)][late · ERR-01]alt[accepts a proposal][overrides · FR-012]DispatcherTechnicianCreate job (skill, site)Request candidates (job id)Ranked candidates + reasons (3, or fewer with ERR-06 shortfall)Proposals with reasonsFull technician list (manual path)Accept candidateSelect other technician + reason codeRecord assignment (idempotent by job id)Assignment notificationConfirmDispatcherTechnician

Fallback: 1 Dana creates the job → 2 candidates requested → 3 within 2 s, ranked candidates render with reasons (fewer than three carries the ERR-06 shortfall notice; late falls to the full list, ERR-01) → 4 Dana accepts, or overrides with a reason code (FR-012) → 5 assignment recorded, idempotent by job id → 6 Marcus notified and confirms. Postcondition: exactly one active assignment for the job.

Assignment lifecycle

job created

candidates rendered

manual path (ERR-01)

accept, or override with stored reason (FR-012)

technician confirms

no-show flagged

reassignment requested (flagged urgent)

work done

Created

Proposed

Assigned

InProgress

Returned

Completed

Fallback: Created → Proposed (candidates rendered) → Assigned (accept or stored-reason override) → In Progress (technician confirms) → Completed. Created reaches Assigned directly on the manual path (ERR-01); Assigned returns to Proposed through Returned when a no-show is flagged.

§6

Data & Validation Rules

mandatory1 decision

What must be true of the data: meaning, validation, and what the user experiences on failure. Storage design (keys, tables, indexes) is deliberately absent.

Data elementRequiredValidationOn failure
Job skill requirementYes One of the governed skills taxonomy (taxonomy[6]) Hard rejection: ERR-03
Site locationYes Resolvable to coordinates Warning; manual placement allowed
Technician statusFrom tracking feed At most five minutes stale Candidate flagged "location uncertain"; ranking proceeds without proximity
§7

Interface & Integration Behavior

conditional · active: interfaces exposed 1 decision validator: idempotency_declared_per_state_change

Operations at behavior altitude. Every state-changing operation answers the retry question explicitly; a blank idempotency cell fails validation.

OperationInput → outputState-changingRetry safetyErrors
Recommendation request Job identifier → ranked candidates with reasons NoAlways safe (read-only) ERR-01 · ERR-02 · ERR-03
Assignment acceptance Proposal → recorded assignment + notification Yes Idempotent by job identifier: repeating the same acceptance returns the original result, creates nothing new ERR-04 · ERR-05
§8

Error Catalog

mandatory 1 decision validator: error_path_completeness

Every failure with its defined response: four fields per entry, none blank. The catalog is checked against flows, validations, and interfaces above: a negative path defined anywhere must appear here.

IDTriggerSystem responseMessage classClass
ERR-01 Recommendation exceeds response threshold Render full technician list immediately; flow continues manually Informationalrecoverable
ERR-02 No qualified technician for the job's skill Shortfall notice naming the unmet skill Action neededrecoverable
ERR-03 Unknown skill value on job Rejection naming the offending value Correctionrecoverable
ERR-04 Actor lacks permission Standard denial; event logged Denialterminal for actor
ERR-05 Assignment attempted via retired legacy screen after cutover Rejection pointing to the board (§13) Correctionterminal
ERR-06 Qualified shortfall: only one or two candidates hold the required skill Propose all who qualify; shortfall notice names the count and the missing skill (§4) Informationalrecoverable

Degradation: the mechanism, not a promise. The board keeps the last-received technician list client-side; if the recommendation service or the tracking feed is unavailable, it falls back to manual assignment against that local list, visibly flagged as degraded. With only the tracking feed absent, proximity leaves the ranking and candidates are flagged "location uncertain." The board never blanks because the fallback list is already local; no network round-trip stands between Dana and an assignment.

§9

Business Rules Applied · §10 Quality Thresholds

mandatory ×2 · condensed for the reference validator: threshold_has_percentile_window_method

Rules link to their governed knowledge-base entries with the behavioral consequence stated here; thresholds carry percentile, window, and method, each linked to the PRD constraint it makes measurable. The 95th percentile is the experience of the slowest one-in-twenty requests.

Rule / constraintConsequence here
Union assignment-ordering rule[4] Recommendations are advisory; no assignment completes without dispatcher action (FR-012; automation posture per PRD §10[1])
Contractual response windows[5] Remaining response time is the 20%-weight ranking input (§4) and appears in the reasons
ThresholdValueWindow · methodOperationalizesOn breach
Recommendation render time p95 ≤ 2s 7-day · measured at the board PRD: "suggestions appear while the intake call is still going"[1] ERR-01 path per request + alert to E. Sandoval (engineering lead); two consecutive breach-days go to the weekly pilot review. Latency is not itself a PRD guardrail; sustained breach surfaces through the assignment-speed guardrail the PRD governs
§11

Acceptance Criteria

mandatory validators: ac_references_parent_id · then_asserts_observable_outcome

Pass/fail without interpretation. Given/When/Then for flows, checklists for rules; every criterion names its parent statement, and every Then asserts something observable that isn't just the trigger restated.

AC-010FR-010 · verify: test Given a job with a known skill and three or more qualified technicians When recommendations are requested Then exactly three candidates render, ranked, each with visible reasons
AC-012FR-012 · verify: test Given a rendered proposal When the dispatcher selects a different technician Then the assignment completes only after a reason code is stored with the override
Checklist (validation & permissions)ParentVerify
Unknown skill value rejected, offending value named FR-013 / §6test
Location staleness beyond five minutes flags the candidate §6test
Permission denial logs an auditable event §2 / ERR-04test
§12 to §14

Conditionals & Open Questions

condensed for the reference

Two conditional sections legitimately omitted (with their rationale rendered, not silently skipped), one active compatibility section, and the owned question list.

§12 Localization omitted: single-locale deployment (English, Canada) per the business case[2]; revisit at the localization initiative. Rationale recorded.

§13 Scheduled & bulk behavior omitted: all behavior in this requirement is interactive; the nightly telemetry summary belongs to the reporting requirement. Rationale recorded.

Compatibility & transition. The legacy assignment screen goes read-only at the October 1, 2026 pilot cutover; assignments attempted there afterwards are rejected (ERR-05). In-flight jobs keep their assignments unchanged. The breaking change, retiring direct assignment, was accepted in the pilot cutover decision, July 10, 2026[7].

Open questionOwnerAnswer byBlocks
Are override reason codes tenant-configurable or fixed? A. Reyes (product lead)Jul 25, 2026 FR-012 reason-code list only
Note: union question does not block this spec The project-level union question (PRD open questions[1]) affects how much may later be automated; propose-only behavior is fully specified above and can ship regardless.
Refs

References & Package Contents

Package items travel in the same export bundle; workspace items link into Specira where the governed record lives.

In this export package

package [1] Product Requirements Document: Dispatch Modernization ./prd-dispatch-modernization.docx
package [2] Business requirements: Dispatch board ./brd-dispatch-board.docx
package [3] Functional spec: Board refresh & resilience ./frd-board-refresh.docx

In the Specira workspace

specira [4] Knowledge base: Union assignment-ordering rule app.specira.ai/kb/entries/union-assignment-ordering
specira [5] Knowledge base: Contractual response windows app.specira.ai/kb/entries/contractual-response-windows
specira [6] Knowledge base: Skills taxonomy app.specira.ai/kb/entries/skills-taxonomy
specira [7] Decision: Pilot cutover plan (accepted July 10, 2026) app.specira.ai/projects/dispatch-modernization/decisions/93
Generated by Specira · template frd v2 (draft) · pack specira_default_delivery lineage 22362e58…a11e · page 1 of 11