Requirements traceability — Karsa
Generated by docs/ba/build_pack.py from the recorded runs in docs/ba/evidence/ (code at a701e92). 67 automated checks found, 67 passed.
| FR | Requirement | Rule | Persona | UAT script | Automated checks | Status |
|---|---|---|---|---|---|---|
| FR-01 | Intake keeps the original brief with a hash | — | Analyst | UAT-01 | test_brief_text_is_stored_with_hashtest_pdf_upload_keeps_pages_and_rejects_scanstest_eml_upload |
Passed |
| FR-02 | Extraction with exact evidence; nothing invented | BR-009, AC-01 | Analyst | UAT-01 | test_every_span_is_a_real_substring_of_the_sourcetest_aster_brief_extracts_values_and_leaves_gaps_missingtest_model_output_without_verbatim_quote_is_discardedtest_per_lead_rate_is_not_read_as_budget |
Passed |
| FR-03 | Conflicting values are surfaced, not resolved silently | AC-02 | Analyst | UAT-02 | test_conflicting_budget_is_flagged_with_both_sources |
Passed |
| FR-04 | Brief text is untrusted data | — | Analyst | UAT-02 | test_instruction_text_is_flagged_as_datatest_injected_instructions_do_not_change_permissions_or_state |
Passed |
| FR-05 | Versioned requirement review; stale edits refused | — | Analyst | UAT-01 | test_stale_versions_get_409test_reextract_keeps_human_decisions |
Passed |
| FR-06 | Clarification answers carry their evidence | — | Analyst | UAT-01 | test_clarification_evidence_is_labelled_by_verification |
Passed |
| FR-07 | Deterministic integer-rupiah pricing | BR-002, AC-03 | Analyst | UAT-03 | test_reference_scenario_is_exacttest_margin_rounds_half_up_in_basis_pointstest_repeating_decimal_margintest_negative_margin_is_reported_not_hiddentest_zero_fee_is_rejected_instead_of_dividing_by_zerotest_invalid_inputs_are_listed_per_fieldtest_large_values_have_no_float_error |
Passed |
| FR-08 | Capacity check and scenario comparison | FR-008 | Analyst | UAT-03 | test_capacity_blocks_package_and_options_are_compared |
Passed |
| FR-09 | Package gate blocks incomplete decisions | BR-001 | Analyst | UAT-03 | test_package_is_blocked_while_critical_requirements_are_missingtest_approve_endpoint_rechecks_blockers_on_the_frozen_content |
Passed |
| FR-10 | Approval binds one exact snapshot | BR-003, AC-04 | Approver | UAT-04 | test_approval_records_the_exact_snapshot_hash_and_versiontest_stale_hash_or_version_gets_409test_tampered_snapshot_still_fails_closed_without_the_trigger |
Passed |
| FR-11 | Change after approval creates a new version | BR-004 | Analyst, Approver | UAT-05 | test_change_after_approval_creates_new_version_and_keeps_old_snapshot |
Passed |
| FR-12 | Segregation of duties and mandatory notes | — | Approver | UAT-04 | test_package_author_cannot_review_own_packagetest_reject_and_request_changes_need_a_notekeyboard-only approver can open a package, compare changes and reject it (AC-10) |
Passed |
| FR-13 | High risk needs an exception and two approvers | BR-006 | Approver | UAT-06 | test_below_floor_needs_exception_and_two_different_approversmobile second approver completes a high-risk dual approval |
Passed |
| FR-14 | Approval is not execution | — | Approver | UAT-07 | test_execution_requires_approval_and_separate_authorization |
Passed |
| FR-15 | Connector allowlist | BR-005 | Admin | UAT-07 | test_disabled_connector_blocks_authorization |
Passed |
| FR-16 | Expired rate card blocks approval and execution | BR-013 | Admin | UAT-03 | test_expired_rate_card_blocks_approval_and_execution |
Passed |
| FR-17 | Idempotent retry | BR-007, AC-05 | Automation Engineer | UAT-08 | test_retry_after_timeout_does_not_duplicate_sandbox_recordstest_duplicate_delivery_and_lease_expiry_do_not_duplicate_writes |
Passed |
| FR-18 | Unknown outcome needs reconciliation | AC-06 | Automation Engineer | UAT-08 | test_unknown_outcome_blocks_blind_retry_and_reconciles_without_second_write |
Passed |
| FR-19 | Recovery: exception queue, manual resolution, cancel, reopen | — | Automation Engineer | UAT-08 | test_manual_resolution_continues_the_runtest_cancelled_run_lists_compensation_and_case_can_be_reopenedtest_rejected_case_is_locked_until_reopened |
Passed |
| FR-20 | Server-side roles and tenant isolation | AC-08 | All | UAT-09 | test_unauthorized_roles_are_denied_and_auditedtest_other_tenant_cannot_see_or_touch_casestest_password_login_session_and_csrfpassword sign-in, role-based navigation and tenant isolation |
Passed |
| FR-21 | Append-only audit with request IDs | — | All | UAT-09 | test_audit_is_append_only_and_tracedtest_database_refuses_to_change_frozen_package_content |
Passed |
| FR-22 | Evaluation Lab with held-out gate | — | AI Evaluation Analyst | UAT-10 | test_eval_run_scores_all_cases_and_reports_real_failurestest_eval_splits_gate_and_adjudication |
Passed |
| FR-23 | Keyboard and automated accessibility checks | AC-10 | All | UAT-09 | keyboard-only approver can open a package, compare changes and reject it (AC-10)no serious accessibility violations ×12 |
Passed |
| FR-24 | End-to-end critical path in the browser | — | All | UAT-01..08 | intake → requirements → clarification → pricing → package → approval → authorization → async sandbox run |
Passed |
Checks not mapped to a requirement (5): test_alembic_migration_builds_schema, test_exports_carry_the_hash, test_input_validation_errors_are_helpful, test_notifications_follow_the_workflow, test_pagination
Published from the Karsa project repository on 13 Nov 2026. Fictional organisation and synthetic data; nothing here describes a real client or result.