Executable requirement coverage

Generated by scripts/check-coverage.py from collected pytest metadata and Node test names. This inventory establishes executable links, not full-criterion coverage or passing results. Criterion review and final execution evidence remain separate; see Project maturity, Release test executions and Behavioral state machines.

System/software requirement inventory

Requirement

Acceptance criterion assessed

Executable cases / explicit gap

Register the RST entry point (STV_SWR_001)

Zero-, one- and multiple-ID fixtures produce distinct placeholders recording the supplied seed list or project-root mode and each invocation’s source location.

docs/test-scripts/test_build.py::test_cross_page_bundle; docs/test-scripts/test_build.py::test_seed_capacity_at_directive[200-True]; docs/test-scripts/test_build.py::test_seed_capacity_at_directive[201-False]; docs/test-scripts/test_build.py::test_unsupported_builder_fails_clearly

Resolve seeds after collection (STV_SWR_002)

A visible seed defined on a later-read document resolves for each fixture type; hidden seeds are rejected as specified in STV_SWR_048.

docs/test-scripts/test_build.py::test_cross_page_bundle

Initialize collapsed state (STV_SWR_003)

Without a restored snapshot, one seed produces one node; multiple distinct seeds within the capacity limit produce their corresponding nodes; no seeds produces the project node and at most five stakeholder entries. Every case has an empty ordinary expansion set; project entries are the sole automatic expansion exception.

docs/test-scripts/test_release_seeds.py::test_seed_selection_release[file]; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[http]; docs/test-scripts/test_remembered_view.py::test_remembered_view_roundtrip_disable_isolation_and_card_order[file]; docs/test-scripts/test_remembered_view.py::test_remembered_view_roundtrip_disable_isolation_and_card_order[http]; frontend/src/state/tests/state.test.js :: STV_SWR_003 STV_SWR_007 STV_SWR_020 STV_SWR_024 STV_SWR_025: rooted diamond and isolated cycle

Expose plus controls (STV_SWR_004)

The fixture exposes one control per nonempty group and activating it dispatches its group key.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]

Expand complete target groups (STV_SWR_005)

Expanding a group displays every target or rejects the entire transition at the cap.

frontend/src/state/tests/state.test.js :: STV_SWR_005 STV_SWR_043 STV_SWR_044: 199/200/201 atomic capacity

Traverse without depth cutoff (STV_SWR_006)

A path crossing document boundaries can be followed beyond three hops from either end.

frontend/src/state/tests/state.test.js :: STV_SWR_006 STV_SWR_013: reverse traversal has no depth cutoff

Collapse relationship groups (STV_SWR_007)

A collapsed group can be reopened and does not remain as a visibility root.

frontend/src/state/tests/state.test.js :: STV_SWR_003 STV_SWR_007 STV_SWR_020 STV_SWR_024 STV_SWR_025: rooted diamond and isolated cycle

Render fixed node summaries (STV_SWR_008)

Long-title nodes retain the complete ID and expose their full title in details; the two-line summary clamp is tested without making its field set configurable.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]

Order requirement ranks (STV_SWR_009)

Their node bounding boxes remain vertically ordered after each expansion.

frontend/src/layout/tests/layout.test.js :: STV_SWR_009 STV_SWR_010 STV_SWR_011 STV_SWR_012 STV_SWR_037 STV_SWR_053: semantic bands and shared test lane

Insert system architecture ... (STV_SWR_010)

A fixture with all three categories has nonoverlapping ordered rank bands.

frontend/src/layout/tests/layout.test.js :: STV_SWR_009 STV_SWR_010 STV_SWR_011 STV_SWR_012 STV_SWR_037 STV_SWR_053: semantic bands and shared test lane

Place software architecture... (STV_SWR_011)

Expanding architecture preserves the required rank order.

frontend/src/layout/tests/layout.test.js :: STV_SWR_009 STV_SWR_010 STV_SWR_011 STV_SWR_012 STV_SWR_037 STV_SWR_053: semantic bands and shared test lane

Place classified test evide... (STV_SWR_012)

Nine-category, shared cross-level test and multiple execution fixtures retain fixed classified rows, alignment, identity and safe routes across expansion/collapse and different seeds. The owner-selected common fallback row retains unclassified/conflicting evidence. Existing legacy-role fixtures still satisfy their right-side/median-rank constraints. Later occurrence mode remains deferred; this change does not claim to deliver it.

docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[file]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[http]; frontend/src/layout/tests/classified-rows.test.js :: STV_SWR_012 STV_SWR_037 STV_SWR_058: classified rows align and stay stable during navigation; frontend/src/layout/tests/classified-rows.test.js :: STV_SWR_012 STV_SWR_037: 200 classified nodes keep row alignment and safe cyclic routes; frontend/src/layout/tests/layout.test.js :: STV_SWR_009 STV_SWR_010 STV_SWR_011 STV_SWR_012 STV_SWR_037 STV_SWR_053: semantic bands and shared test lane

Index both trace directions (STV_SWR_013)

A single authored relationship appears in both directional indexes with one canonical edge identity.

src/sphinx_traceability_view/graph/tests/test_graph.py::test_hidden_parts_external_and_missing_targets; docs/test-scripts/test_build.py::test_cross_page_bundle; frontend/src/state/tests/state.test.js :: STV_SWR_006 STV_SWR_013: reverse traversal has no depth cutoff

Normalize replacement mappings (STV_SWR_014)

Replacing types and mapping names changes the view without modifying extension code. A project-root invocation requires at least one type designated as stakeholder; no matching objects is a valid empty project, while a missing designation produces an entry-located model error.

src/sphinx_traceability_view/model/tests/test_model.py::test_host_normalization; docs/test-scripts/test_build.py::test_alternate_host_schema_external_metadata_and_parts

Publish full rendered details (STV_SWR_015)

A cross-page Need with custom metadata, formatted body and local images has equivalent information in details; hidden internal fields are not exposed. Remote media/CSS fixtures show the fallback and preserve the original URL without automatic network requests.

src/sphinx_traceability_view/bundle/tests/test_bundle.py::test_detail_assets_preserve_full_identity_with_compact_deduplicated_paths; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_static_details_and_remote_fallback; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_srcset_data_images_and_css_resources; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_active_embed_urls_are_not_retained_as_navigation; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_reserved_transport_attributes_are_never_copied_from_authored_html; src/sphinx_traceability_view/directive/tests/test_lifecycle.py::test_failed_finalization_retains_pending_page_and_previous_assets; docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]; docs/test-scripts/test_build.py::test_incremental_body_change_hidden_and_deleted_objects; docs/test-scripts/test_detail_transport.py::test_authored_transport_markers_stay_inert[file]; docs/test-scripts/test_detail_transport.py::test_authored_transport_markers_stay_inert[http]; docs/test-scripts/test_windows_paths.py::test_nested_windows_detail_loading_and_retry; frontend/src/inspect/tests/inspect.test.js :: STV_SWR_015 STV_SWR_017: concurrent detail requests share one load and retain build identity; frontend/src/inspect/tests/inspect.test.js :: STV_SWR_015 STV_SWR_017: failed local detail loading can retry without a stale rejection; frontend/src/inspect/tests/urls.test.js :: STV_SWR_015 STV_SWR_017: restored CSS rejects noncanonical and remote resource paths

Open canonical object links (STV_SWR_016)

Activation from file and HTTP output opens the correct cross-page object and preserves exploration.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]; docs/test-scripts/test_persistent_details.py::test_detail_metadata_controls_width_and_artifact_navigation[file]; docs/test-scripts/test_persistent_details.py::test_detail_metadata_controls_width_and_artifact_navigation[http]

Avoid runtime network loading (STV_SWR_017)

With network disabled, file-URL output supports expansion, details and local links with no missing runtime assets.

src/sphinx_traceability_view/bundle/tests/test_bundle.py::test_classic_registration_treats_prototype_keys_and_script_text_as_data; src/sphinx_traceability_view/bundle/tests/test_bundle.py::test_detail_assets_preserve_full_identity_with_compact_deduplicated_paths; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_static_details_and_remote_fallback; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_srcset_data_images_and_css_resources; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_active_embed_urls_are_not_retained_as_navigation; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_reserved_transport_attributes_are_never_copied_from_authored_html; src/sphinx_traceability_view/directive/tests/test_lifecycle.py::test_failed_finalization_retains_pending_page_and_previous_assets; docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]; docs/test-scripts/test_detail_transport.py::test_authored_transport_markers_stay_inert[file]; docs/test-scripts/test_detail_transport.py::test_authored_transport_markers_stay_inert[http]; docs/test-scripts/test_windows_paths.py::test_nested_windows_detail_loading_and_retry; frontend/src/inspect/tests/inspect.test.js :: STV_SWR_015 STV_SWR_017: concurrent detail requests share one load and retain build identity; frontend/src/inspect/tests/inspect.test.js :: STV_SWR_015 STV_SWR_017: failed local detail loading can retry without a stale rejection; frontend/src/inspect/tests/urls.test.js :: STV_SWR_017 STV_SWR_018: restored detail paths stay inside the output root; frontend/src/inspect/tests/urls.test.js :: STV_SWR_015 STV_SWR_017: restored CSS rejects noncanonical and remote resource paths

Use portable output URLs (STV_SWR_018)

The same nested-page bundle works below a non-root HTTP prefix and through file URLs.

src/sphinx_traceability_view/bundle/tests/test_bundle.py::test_classic_registration_treats_prototype_keys_and_script_text_as_data; src/sphinx_traceability_view/bundle/tests/test_bundle.py::test_detail_assets_preserve_full_identity_with_compact_deduplicated_paths; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_static_details_and_remote_fallback; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_portable_paths_preserve_queries_and_fragments; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_srcset_data_images_and_css_resources; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_reserved_transport_attributes_are_never_copied_from_authored_html; docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]; docs/test-scripts/test_build.py::test_incremental_body_change_hidden_and_deleted_objects; docs/test-scripts/test_detail_transport.py::test_authored_transport_markers_stay_inert[file]; docs/test-scripts/test_detail_transport.py::test_authored_transport_markers_stay_inert[http]; docs/test-scripts/test_persistent_details.py::test_detail_metadata_controls_width_and_artifact_navigation[file]; docs/test-scripts/test_persistent_details.py::test_detail_metadata_controls_width_and_artifact_navigation[http]; docs/test-scripts/test_windows_paths.py::test_nested_windows_detail_loading_and_retry; frontend/src/inspect/tests/urls.test.js :: STV_SWR_017 STV_SWR_018: restored detail paths stay inside the output root

Offer occurrence mode later (STV_SWR_019)

A two-parent fixture changes between one shared node and two occurrences using the selector.

Deferred occurrence-mode release; no runtime delivered.

Use shared identity initially (STV_SWR_020)

Opening two paths to the same Need produces one node with both revealed connections.

frontend/src/state/tests/state.test.js :: STV_SWR_003 STV_SWR_007 STV_SWR_020 STV_SWR_024 STV_SWR_025: rooted diamond and isolated cycle

Retain state across later m... (STV_SWR_021)

A round trip between modes restores previously different expansion sets for two occurrences.

Deferred occurrence-mode release; no runtime delivered.

Key later expansions by occ... (STV_SWR_022)

Expanding one of two copies changes only that copy.

Deferred occurrence-mode release; no runtime delivered.

Project later shared expans... (STV_SWR_023)

Two copies with disjoint expanded groups produce one shared node with both groups expanded.

Deferred occurrence-mode release; no runtime delivered.

Close repeated paths safely (STV_SWR_024)

Self-links, reverse traversal and A-B-C-A terminate without repeated branch growth.

frontend/src/state/tests/state.test.js :: STV_SWR_003 STV_SWR_007 STV_SWR_020 STV_SWR_024 STV_SWR_025: rooted diamond and isolated cycle; frontend/src/state/tests/state.test.js :: STV_SWR_024: self-loop terminates and collapse restores the only seed

Compute seed-rooted visibility (STV_SWR_025)

A diamond retains the shared target until the last path closes; a disconnected cycle is removed. A multi-seed fixture retains every seed and objects still reached from any other seed.

frontend/src/state/tests/state.test.js :: STV_SWR_003 STV_SWR_007 STV_SWR_020 STV_SWR_024 STV_SWR_025: rooted diamond and isolated cycle

Report invalid invocation s... (STV_SWR_026)

An unknown ID supplied alone or among valid IDs fails with that ID, invocation file and line. An invocation without IDs selects project-root mode without an invalid-seed error. Repeated IDs are deduplicated before initial capacity validation; more than 200 distinct explicit seeds fails with an invocation-located capacity error, without dropping or truncating supplied IDs.

docs/test-scripts/test_build.py::test_cross_page_bundle; docs/test-scripts/test_build.py::test_invalid_seed_source_location[UNKNOWN]; docs/test-scripts/test_build.py::test_invalid_seed_source_location[ROOT_A UNKNOWN]; docs/test-scripts/test_build.py::test_invalid_seed_source_location[HIDDEN_A]; docs/test-scripts/test_build.py::test_seed_capacity_at_directive[200-True]; docs/test-scripts/test_build.py::test_seed_capacity_at_directive[201-False]

Tolerate host broken traces (STV_SWR_027)

A dangling target does not prevent generation of valid view data; host broken-link validation still controls build status.

src/sphinx_traceability_view/bundle/tests/test_bundle.py::test_classic_registration_treats_prototype_keys_and_script_text_as_data; src/sphinx_traceability_view/directive/tests/test_lifecycle.py::test_failed_finalization_retains_pending_page_and_previous_assets; src/sphinx_traceability_view/directive/tests/test_lifecycle.py::test_prior_fatal_exception_is_not_replaced_by_bundle_generation; src/sphinx_traceability_view/graph/tests/test_graph.py::test_hidden_parts_external_and_missing_targets; docs/test-scripts/test_browser.py::test_missing_placeholder_and_detail_error[file]; docs/test-scripts/test_browser.py::test_missing_placeholder_and_detail_error[http]; docs/test-scripts/test_build.py::test_host_owns_broken_trace_failure

Create missing-target nodes (STV_SWR_028)

Expanding a genuine missing-target group shows the target ID, missing-object text and source connection without relying on color. No valid original-object link is offered. Hidden targets do not become placeholders.

docs/test-scripts/test_browser.py::test_missing_placeholder_and_detail_error[file]; docs/test-scripts/test_browser.py::test_missing_placeholder_and_detail_error[http]; docs/test-scripts/test_build.py::test_host_owns_broken_trace_failure

Indicate empty adjacency (STV_SWR_029)

An isolated node has the indication and no controls; a dangling target group still has a control.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]; docs/test-scripts/test_browser.py::test_missing_placeholder_and_detail_error[file]; docs/test-scripts/test_browser.py::test_missing_placeholder_and_detail_error[http]

Resolve type palette (STV_SWR_030)

Explicit colors survive mixed configured/unconfigured fixtures and omitted colors are consistent per type.

src/sphinx_traceability_view/model/tests/test_model.py::test_host_normalization

Apply acceptance borders (STV_SWR_031)

Draft, reviewed and empty statuses are red; configured accepted statuses have no red status border.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]

Normalize accepted values (STV_SWR_032)

An approved override changes styling without requiring field-level tooltip settings.

src/sphinx_traceability_view/model/tests/test_model.py::test_host_normalization

Constrain and retain detail... (STV_SWR_033)

A long object at a viewport corner remains readable and scrollable without closing.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]

Provide keyboard interaction (STV_SWR_034)

The shared-mode workflow is completable without a pointer; later mode controls meet the same rule when delivered.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]

Label directional controls (STV_SWR_035)

An object with both directions of one relation can toggle each independently using distinguishable labels.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]

Reject invalid model entries (STV_SWR_036)

Malformed fixtures fail before asset generation while omitted optional colors and acceptance values receive defaults.

src/sphinx_traceability_view/model/tests/test_model.py::test_host_normalization; src/sphinx_traceability_view/model/tests/test_model.py::test_invalid_model[change0-levels]; src/sphinx_traceability_view/model/tests/test_model.py::test_invalid_model[change1-types.goal]; src/sphinx_traceability_view/model/tests/test_model.py::test_invalid_model[change2-types]; src/sphinx_traceability_view/model/tests/test_model.py::test_invalid_model[change3-accepted_statuses]; src/sphinx_traceability_view/model/tests/test_model.py::test_invalid_directional_labels[]; src/sphinx_traceability_view/model/tests/test_model.py::test_invalid_directional_labels[ ]; src/sphinx_traceability_view/model/tests/test_model.py::test_invalid_directional_labels[None]; src/sphinx_traceability_view/model/tests/test_model.py::test_invalid_directional_labels[1]; docs/test-scripts/test_build.py::test_alternate_host_schema_external_metadata_and_parts; docs/test-scripts/test_build.py::test_invalid_mapping_has_entry_path_and_location

Honor resolved declared lev... (STV_SWR_037)

Added hardware, nine classified categories, fallback and problem rows respect the declared indices. Nodes in one classified row align at their top edges; hidden/missing and legacy-role behavior remains usable.

docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[file]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[http]; frontend/src/layout/tests/classified-rows.test.js :: STV_SWR_012 STV_SWR_037 STV_SWR_058: classified rows align and stay stable during navigation; frontend/src/layout/tests/classified-rows.test.js :: STV_SWR_012 STV_SWR_037: 200 classified nodes keep row alignment and safe cyclic routes; frontend/src/layout/tests/layout.test.js :: STV_SWR_009 STV_SWR_010 STV_SWR_011 STV_SWR_012 STV_SWR_037 STV_SWR_053: semantic bands and shared test lane

Scope state to view roots (STV_SWR_038)

Two views remain independent after navigation and viewport commands; later selectors are independent too.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]; docs/test-scripts/test_browser.py::test_interactive_seed_smoke[file]; docs/test-scripts/test_browser.py::test_interactive_seed_smoke[http]; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[file]; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[http]

Implement view-local zoom (STV_SWR_039)

Pointer and keyboard zoom preserve state and do not change another view.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]

Implement view-local pan (STV_SWR_040)

All off-screen nodes can be brought into view by pointer or keyboard.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]

Verify Firefox on Windows (STV_SWR_041)

All in-scope interaction checks pass in both file and HTTP contexts; the release record states the exact stable Firefox and Windows versions and actual results.

docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]

Package for the pinned tool... (STV_SWR_042)

A clean Python 3.10 environment with pinned Sphinx dependencies installs the wheel and builds the fixture.

docs/test-scripts/test_ci_security.py::test_workflow_policy_accepts_reviewed_files_and_rejects_privilege_drift; docs/test-scripts/test_ci_security.py::test_candidate_checksums_detect_changed_artifact_bytes; docs/test-scripts/test_legal_guard.py::test_build_rejects_unaudited_elk_and_missing_notices; docs/test-scripts/test_package.py::test_clean_wheel_host; docs/test-scripts/test_publication.py::test_clean_publication_removes_obsolete_assets; docs/test-scripts/test_publication.py::test_failed_build_preserves_published_tree; docs/test-scripts/test_publication.py::test_failed_promotion_restores_previous_tree; docs/test-scripts/test_publication.py::test_failed_audit_cleans_temporary_output[False]; docs/test-scripts/test_publication.py::test_failed_audit_cleans_temporary_output[True]; docs/test-scripts/test_publication.py::test_failed_rollback_preserves_recoverable_backup; docs/test-scripts/test_sdist.py::test_sdist_excludes_local_evidence_and_rebuilds_wheel

Enforce visible occurrence ... (STV_SWR_043)

Candidate sizes 199 and 200 pass, 201 fails; 200 distinct explicit seeds initialize, 201 fail before publication; a tens-of-thousands graph fixture remains addressable through adjacency indexes.

docs/test-scripts/test_build.py::test_seed_capacity_at_directive[200-True]; docs/test-scripts/test_build.py::test_seed_capacity_at_directive[201-False]; docs/test-scripts/test_capacity.py::test_large_project_at_visible_capacity[file]; docs/test-scripts/test_capacity.py::test_large_project_at_visible_capacity[http]; frontend/src/state/tests/state.test.js :: STV_SWR_005 STV_SWR_043 STV_SWR_044: 199/200/201 atomic capacity; frontend/src/state/tests/state.test.js :: STV_SWR_051 STV_SWR_052 STV_SWR_043 STV_SWR_044: page boundaries, root capacity and independent views

Reject over-limit transitio... (STV_SWR_044)

An over-limit expansion adds no partial targets and explains that branches must be collapsed first.

docs/test-scripts/test_browser.py::test_async_layout_failure_and_stale_completion[file]; docs/test-scripts/test_browser.py::test_async_layout_failure_and_stale_completion[http]; docs/test-scripts/test_capacity.py::test_large_project_at_visible_capacity[file]; docs/test-scripts/test_capacity.py::test_large_project_at_visible_capacity[http]; docs/test-scripts/test_release_seeds.py::test_seed_layout_replacement_failure_and_staleness[file]; docs/test-scripts/test_release_seeds.py::test_seed_layout_replacement_failure_and_staleness[http]; frontend/src/state/tests/state.test.js :: STV_SWR_005 STV_SWR_043 STV_SWR_044: 199/200/201 atomic capacity; frontend/src/state/tests/state.test.js :: STV_SWR_051 STV_SWR_052 STV_SWR_043 STV_SWR_044: page boundaries, root capacity and independent views

Reuse canonical host defini... (STV_SWR_045)

Changing a host type label or relation label is reflected without duplicate definitions in extension configuration.

src/sphinx_traceability_view/model/tests/test_model.py::test_host_normalization; src/sphinx_traceability_view/model/tests/test_model.py::test_invalid_directional_labels[]; src/sphinx_traceability_view/model/tests/test_model.py::test_invalid_directional_labels[ ]; src/sphinx_traceability_view/model/tests/test_model.py::test_invalid_directional_labels[None]; src/sphinx_traceability_view/model/tests/test_model.py::test_invalid_directional_labels[1]; docs/test-scripts/test_build.py::test_alternate_host_schema_external_metadata_and_parts; docs/test-scripts/test_build.py::test_host_default_directional_labels_are_used

Expose an installable entry... (STV_SWR_046)

A separate project enables the installed module and renders a seeded view without repository imports.

docs/test-scripts/test_package.py::test_clean_wheel_host; docs/test-scripts/test_sdist.py::test_sdist_excludes_local_evidence_and_rebuilds_wheel

Inspect external Needs with... (STV_SWR_047)

With external networking disabled, an external Need without local full content has inspectable metadata and the indication. Its original link is available, but opening that external destination is not represented as an offline capability. No external page download is attempted.

src/sphinx_traceability_view/graph/tests/test_graph.py::test_hidden_parts_external_and_missing_targets; src/sphinx_traceability_view/graph/tests/test_graph.py::test_external_original_url_rejects_executable_or_nonportable_navigation[javascript:bad()]; src/sphinx_traceability_view/graph/tests/test_graph.py::test_external_original_url_rejects_executable_or_nonportable_navigation[data:text/html,bad]; src/sphinx_traceability_view/graph/tests/test_graph.py::test_external_original_url_rejects_executable_or_nonportable_navigation[file:///private.html]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]; docs/test-scripts/test_build.py::test_alternate_host_schema_external_metadata_and_parts

Respect host-hidden Need ob... (STV_SWR_048)

A visible Need tracing to a hidden Need exposes neither the hidden node nor that connection or a missing-target placeholder in the view or generated graph/detail data. A directive seeded with the hidden ID fails with its source filename and invocation location. Visible objects and their other relationships remain explorable.

src/sphinx_traceability_view/detail_build/tests/test_details.py::test_static_details_and_remote_fallback; src/sphinx_traceability_view/graph/tests/test_graph.py::test_hidden_parts_external_and_missing_targets; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]; docs/test-scripts/test_build.py::test_invalid_seed_source_location[UNKNOWN]; docs/test-scripts/test_build.py::test_invalid_seed_source_location[ROOT_A UNKNOWN]; docs/test-scripts/test_build.py::test_invalid_seed_source_location[HIDDEN_A]; docs/test-scripts/test_build.py::test_incremental_body_change_hidden_and_deleted_objects; docs/test-scripts/test_build.py::test_alternate_host_schema_external_metadata_and_parts; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[file]; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[http]

Preserve static third-party... (STV_SWR_049)

A fixture with a widget containing static rendered text and an image retains that content in details without executing copied widget scripts. The original-object link opens its documentation page. No interactive parity or generated snapshot of script-only content is claimed.

src/sphinx_traceability_view/detail_build/tests/test_details.py::test_static_details_and_remote_fallback; src/sphinx_traceability_view/detail_build/tests/test_details.py::test_active_embed_urls_are_not_retained_as_navigation; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]; docs/test-scripts/test_detail_transport.py::test_authored_transport_markers_stay_inert[file]; docs/test-scripts/test_detail_transport.py::test_authored_transport_markers_stay_inert[http]

Separate transient hover an... (STV_SWR_050)

Sustained/brief hover, pointer travel and scrolling, viewport-edge placement, Escape cancellation and immediate keyboard Details pass independently. Both show equivalent static content; persistent boxes survive graph changes while hover retains its dismissal behavior.

docs/test-scripts/test_browser.py::test_usability_smoke[file]; docs/test-scripts/test_browser.py::test_usability_smoke[http]; docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[None-file]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[None-http]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[3-file]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[3-http]

Provide the artificial proj... (STV_SWR_051)

A seedless fixture initially displays the project node and first stakeholder entries through the project-page contract of STV_SWR_052 while retaining the existing 200-node capacity limit. The project node remains visible during collapse, counts toward the visible-node limit and is distinguished from real Needs without a fabricated original-Need link. Replacing the input model’s stakeholder type names does not require source-code changes.

docs/test-scripts/test_browser.py::test_project_paging[file]; docs/test-scripts/test_browser.py::test_project_paging[http]; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[file]; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[http]; docs/test-scripts/test_release_seeds.py::test_empty_seed_catalog[file]; docs/test-scripts/test_release_seeds.py::test_empty_seed_catalog[http]; frontend/src/state/tests/state.test.js :: STV_SWR_051 STV_SWR_052: project pages preserve independent expansion and collapsed root; frontend/src/state/tests/state.test.js :: STV_SWR_051 STV_SWR_052: cross-page targets do not acquire synthetic root edges; frontend/src/state/tests/state.test.js :: STV_SWR_051 STV_SWR_052 STV_SWR_043 STV_SWR_044: page boundaries, root capacity and independent views

Page stakeholder entry links (STV_SWR_052)

A 201-stakeholder fixture offers 41 pages and every stakeholder ID appears on exactly one entry page. The initially open root reveals at most five entries. Page changes retain the project root, show only the selected page’s rooted exploration and restore that page’s independent accepted expansion state when revisited. Hidden entries and Need parts are not listed as top-level stakeholder roots. An empty project shows a no-stakeholder-requirements indication without an empty plus control.

docs/test-scripts/test_browser.py::test_project_paging[file]; docs/test-scripts/test_browser.py::test_project_paging[http]; docs/test-scripts/test_browser.py::test_async_layout_failure_and_stale_completion[file]; docs/test-scripts/test_browser.py::test_async_layout_failure_and_stale_completion[http]; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[file]; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[http]; docs/test-scripts/test_release_seeds.py::test_empty_seed_catalog[file]; docs/test-scripts/test_release_seeds.py::test_empty_seed_catalog[http]; frontend/src/state/tests/state.test.js :: STV_SWR_051 STV_SWR_052: project pages preserve independent expansion and collapsed root; frontend/src/state/tests/state.test.js :: STV_SWR_051 STV_SWR_052: cross-page targets do not acquire synthetic root edges; frontend/src/state/tests/state.test.js :: STV_SWR_051 STV_SWR_052 STV_SWR_043 STV_SWR_044: page boundaries, root capacity and independent views

Prefer direct facing-edge r... (STV_SWR_053)

Geometry smoke cases cover upward/downward links, clear fan-in, a blocked skipped level, test-lane links and a self-link, with endpoints on boundaries and no segment crossing a box interior.

frontend/src/layout/tests/layout.test.js :: STV_SWR_009 STV_SWR_010 STV_SWR_011 STV_SWR_012 STV_SWR_037 STV_SWR_053: semantic bands and shared test lane; frontend/src/layout/tests/layout.test.js :: STV_SWR_053: clear facing ports and fan-in avoid outer detours; frontend/src/layout/tests/layout.test.js :: STV_SWR_053: blocked skipped-level edges retain safe detours

Set enlarged standard viewport (STV_SWR_054)

The rendered viewport reports a computed height of 975px.

docs/test-scripts/test_browser.py::test_usability_smoke[file]; docs/test-scripts/test_browser.py::test_usability_smoke[http]

Order controls using target... (STV_SWR_055)

Upward incoming and outgoing groups precede neutral and downward groups with stable ties. Replacement level mappings drive the order without relation-name assumptions. Expansion and collapse retain order and the existing keyboard/focus behavior.

docs/test-scripts/test_browser.py::test_control_order_smoke[file]; docs/test-scripts/test_browser.py::test_control_order_smoke[http]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[file]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[http]; frontend/src/layout/tests/classified-rows.test.js :: STV_SWR_055: controls use resolved case and execution rows; frontend/src/render/tests/groups.test.js :: STV_SWR_055: upward controls precede neutral and downward controls regardless of authorship; frontend/src/render/tests/groups.test.js :: STV_SWR_055: replacement level mappings drive ordering without relation-name assumptions

Center parent boxes with co... (STV_SWR_056)

A five-child star centers exactly. Competing parents, shared children, cycles, reverse-authored links and isolated nodes preserve finite geometry, nonoverlap, semantic levels, shared identity and safe routes.

docs/test-scripts/test_browser.py::test_interactive_seed_smoke[file]; docs/test-scripts/test_browser.py::test_interactive_seed_smoke[http]; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[file]; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[http]; frontend/src/layout/tests/layout.test.js :: STV_SWR_056: competing parents do not displace a separate centered parent; frontend/src/layout/tests/layout.test.js :: STV_SWR_056: cyclic shared geometry with isolated nodes remains deterministic and separated; frontend/src/layout/tests/layout.test.js :: STV_SWR_056: parent and project center over five visible children; frontend/src/layout/tests/layout.test.js :: STV_SWR_056: shared children keep unique nodes and conflicting parents do not overlap

Confirm local interactive s... (STV_SWR_057)

ID/title search, exact-ID confirmation, keyboard suggestions, invalid/hidden input, empty catalogs, repeated changes, overview return, layout failure/staleness and independent views pass file/HTTP checks. Runtime seed replacement requires neither source edits nor a Sphinx rebuild.

docs/test-scripts/test_browser.py::test_interactive_seed_smoke[file]; docs/test-scripts/test_browser.py::test_interactive_seed_smoke[http]; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[file]; docs/test-scripts/test_release_seeds.py::test_seed_selection_release[http]; docs/test-scripts/test_release_seeds.py::test_empty_seed_catalog[file]; docs/test-scripts/test_release_seeds.py::test_empty_seed_catalog[http]; docs/test-scripts/test_release_seeds.py::test_seed_layout_replacement_failure_and_staleness[file]; docs/test-scripts/test_release_seeds.py::test_seed_layout_replacement_failure_and_staleness[http]; frontend/src/render/tests/seeds.test.js :: STV_SWR_057: local suggestions match IDs and titles and bound results; frontend/src/state/tests/state.test.js :: STV_SWR_057: runtime reseeding is atomic and clears exploration

Stabilize committed navigat... (STV_SWR_058)

Expansion, collapse, repeated identical input, upward band growth, shared-test reranking, project root toggles and a 200-node scene remain finite and nonoverlapping. Surviving ordinary horizontal slots and clicked node coordinates stay unchanged; unrelated views and viewport transforms stay unchanged. Failure/stale completion preserves the previous committed geometry. Fresh initialization, seed, overview and page commands omit prior geometry.

docs/test-scripts/test_browser.py::test_async_layout_failure_and_stale_completion[file]; docs/test-scripts/test_browser.py::test_async_layout_failure_and_stale_completion[http]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[file]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[http]; docs/test-scripts/test_position_stability.py::test_group_navigation_keeps_existing_nodes_still[file]; docs/test-scripts/test_position_stability.py::test_group_navigation_keeps_existing_nodes_still[http]; docs/test-scripts/test_position_stability.py::test_project_root_preserves_anchor[file]; docs/test-scripts/test_position_stability.py::test_project_root_preserves_anchor[http]; frontend/src/layout/tests/classified-rows.test.js :: STV_SWR_012 STV_SWR_037 STV_SWR_058: classified rows align and stay stable during navigation; frontend/src/layout/tests/stability.test.js :: STV_SWR_058: expand and collapse preserve existing primary slots; frontend/src/layout/tests/stability.test.js :: STV_SWR_058: existing test lane is stable while new primary nodes fit beside it; frontend/src/layout/tests/stability.test.js :: STV_SWR_058: a growing earlier band makes room above the clicked lower band; frontend/src/layout/tests/stability.test.js :: STV_SWR_058: reranked shared tests remain unique and honor either anchor role; frontend/src/layout/tests/stability.test.js :: STV_SWR_058: project root stays anchored through collapse and reopening; frontend/src/layout/tests/stability.test.js :: STV_SWR_058: 200-node incremental geometry remains finite and stable

Render complete edge bounds... (STV_SWR_059)

Firefox file/HTTP upward and downward negative-route fixtures contain every polyline point and align endpoints with node borders within 2 screen px. Empty geometry has finite positive SVG bounds. Reset fits the scene and focus does not move it; pan/zoom and independent views still work.

docs/test-scripts/test_position_stability.py::test_arrow_viewport_covers_negative_routes[down-file]; docs/test-scripts/test_position_stability.py::test_arrow_viewport_covers_negative_routes[down-http]; docs/test-scripts/test_position_stability.py::test_arrow_viewport_covers_negative_routes[up-file]; docs/test-scripts/test_position_stability.py::test_arrow_viewport_covers_negative_routes[up-http]; frontend/src/render/tests/edge-viewport.test.js :: STV_SWR_059: SVG bounds include negative routes, detours and node boxes; frontend/src/render/tests/edge-viewport.test.js :: STV_SWR_059: an empty edge scene still has a finite SVG viewport

Use natural ID order for fr... (STV_SWR_060)

Shuffled REQ_20, REQ_10, REQ_3, REQ_2, REQ_1 seeded and project-entry rows use natural order; expanding REQ_2 preserves all seed slots. Different ranks and the separate test lane remain intact.

docs/test-scripts/test_position_stability.py::test_initial_numeric_seed_order[file]; docs/test-scripts/test_position_stability.py::test_initial_numeric_seed_order[http]; frontend/src/layout/tests/stability.test.js :: STV_SWR_060: initial seed and project rows use natural numeric ID order

Resolve configurable per-ob... (STV_SWR_061)

Renamed host types/tags/relations, zero/one/conflicting tags, orphan/multiple owners, mixed owner classes, hidden owners and execution seeds produce their explicit row or configured fallback deterministically. Owners already resolved to fixed/tag rows can supply execution placement; chained owner-derived links are not inferred and use fallback/strict handling. Host data remains unmodified, output is deterministic and classification requires O(N + E) indexing.

src/sphinx_traceability_view/graph/tests/test_graph.py::test_classification_is_complete_graph_based_portable_and_deterministic; src/sphinx_traceability_view/graph/tests/test_graph.py::test_unclassified_records_without_fallback_fail_with_need_identity[records0]; src/sphinx_traceability_view/graph/tests/test_graph.py::test_unclassified_records_without_fallback_fail_with_need_identity[records1]; src/sphinx_traceability_view/graph/tests/test_graph.py::test_outgoing_owner_mapping_and_malformed_tags_use_defined_policy; src/sphinx_traceability_view/graph/tests/test_graph.py::test_large_classified_graph_resolves_every_execution_from_its_case; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_is_portable_and_does_not_mutate_input; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_rejects_invalid_selectors[placement0-levels_by_tag]; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_rejects_invalid_selectors[placement1-levels_by_tag]; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_rejects_invalid_selectors[placement2-levels_by_tag]; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_rejects_invalid_selectors[placement3-types.case]; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_rejects_invalid_selectors[placement4-types.case]; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_rejects_invalid_selectors[placement5-types.case]; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_rejects_invalid_selectors[placement6-fallback_level]; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_rejects_invalid_selectors[placement7-level_from.relation]; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_rejects_invalid_selectors[placement8-level_from]; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_rejects_invalid_selectors[placement9-level_from]; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_rejects_invalid_selectors[placement10-level_from.levels]; src/sphinx_traceability_view/model/tests/test_model.py::test_classified_model_rejects_invalid_selectors[placement11-fixed level]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[file]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[http]

Mark the viewport clipping ... (STV_SWR_062)

Firefox file/HTTP checks reproduce a node crossing the real clip edge. Hit tests above/on the border exclude the node while a point just inside the content hits it. Pan/zoom retain the border’s position, resize follows control wrapping/width, client height remains 975 px, and keyboard expansion/Reset and independent-view behavior remain usable.

docs/test-scripts/test_viewport_boundary.py::test_viewport_boundary_tracks_clipping_and_controls[file]; docs/test-scripts/test_viewport_boundary.py::test_viewport_boundary_tracks_clipping_and_controls[http]

Own a per-view persistent d... (STV_SWR_063)

Default/override/one-slot capacity, reuse versus reopen, FIFO after focus, independent close/all, independent views, delayed completion, eviction/close races, explicit failure/retry and graph replacement pass. Channeling rationale: Inspection state is browser-local with no new system interface, persistence service or domain graph mutation.

docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[None-file]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[None-http]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[3-file]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[3-http]; docs/test-scripts/test_persistent_details.py::test_persistent_completion_identity_eviction_and_retry[file]; docs/test-scripts/test_persistent_details.py::test_persistent_completion_identity_eviction_and_retry[http]; docs/test-scripts/test_remembered_view.py::test_remembered_view_roundtrip_disable_isolation_and_card_order[file]; docs/test-scripts/test_remembered_view.py::test_remembered_view_roundtrip_disable_isolation_and_card_order[http]; frontend/src/inspect/tests/collection.test.js :: STV_SWR_063: persistent collection reuses identity without refreshing FIFO age; frontend/src/inspect/tests/collection.test.js :: STV_SWR_063: default, one-slot and independent detail collections enforce their own capacity

Present and focus persisten... (STV_SWR_064)

Keyboard traversal/read/scroll/close, responsive layout, long bodies/stack, unique fragment IDs, fallback focus after artifact removal, non-stealing async content, surviving collection during graph changes and a current-width Reset, folded metadata/toggle keyboard behavior and canonical header-ID navigation pass on file/HTTP. No modal focus trap or graph overlay. Channeling rationale: Presentation and focus remain within renderer/inspector responsibilities, without new deployment or system boundary.

docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[None-file]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[None-http]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[3-file]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[3-http]; docs/test-scripts/test_persistent_details.py::test_persistent_completion_identity_eviction_and_retry[file]; docs/test-scripts/test_persistent_details.py::test_persistent_completion_identity_eviction_and_retry[http]; docs/test-scripts/test_persistent_details.py::test_detail_metadata_controls_width_and_artifact_navigation[file]; docs/test-scripts/test_persistent_details.py::test_detail_metadata_controls_width_and_artifact_navigation[http]

Validate and publish the pe... (STV_SWR_065)

Default, 1 and 3 serialize and drive actual eviction; invalid types/bounds fail clearly. Rebuilds reflect changed configuration. The runtime does not require Node, a service or reader-side configuration.

src/sphinx_traceability_view/model/tests/test_model.py::test_details_limit_defaults_and_exact_bounds; src/sphinx_traceability_view/model/tests/test_model.py::test_details_limit_rejects_invalid_author_values[0]; src/sphinx_traceability_view/model/tests/test_model.py::test_details_limit_rejects_invalid_author_values[-1]; src/sphinx_traceability_view/model/tests/test_model.py::test_details_limit_rejects_invalid_author_values[True]; src/sphinx_traceability_view/model/tests/test_model.py::test_details_limit_rejects_invalid_author_values[False]; src/sphinx_traceability_view/model/tests/test_model.py::test_details_limit_rejects_invalid_author_values[3]; src/sphinx_traceability_view/model/tests/test_model.py::test_details_limit_rejects_invalid_author_values[1.0]; src/sphinx_traceability_view/model/tests/test_model.py::test_details_limit_rejects_invalid_author_values[None]; src/sphinx_traceability_view/model/tests/test_model.py::test_details_limit_rejects_invalid_author_values[9007199254740992]; docs/test-scripts/test_persistent_details.py::test_persistent_limit_is_published_by_real_host[None]; docs/test-scripts/test_persistent_details.py::test_persistent_limit_is_published_by_real_host[1]; docs/test-scripts/test_persistent_details.py::test_persistent_limit_is_published_by_real_host[3]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[None-file]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[None-http]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[3-file]; docs/test-scripts/test_persistent_details.py::test_persistent_stack_fifo_scope_navigation_and_responsive_layout[3-http]

Reset view-local exploratio... (STV_SWR_066)

Multiple seeds, interactive reseeding, shared paths/cycles, empty/fewer-than-five project entries and a previously closed entry group reset to their defined initial states. Returning to another project page cannot restore old expansions. Other views and persistent entries/order are unchanged. Repeated resets remain valid within the existing 200-node limit.

docs/test-scripts/test_extended_controls.py::test_reset_stale_layout_failure_retry_and_independent_views[file]; docs/test-scripts/test_extended_controls.py::test_reset_stale_layout_failure_retry_and_independent_views[http]; docs/test-scripts/test_extended_controls.py::test_reset_overview_boundaries_and_page_restoration_cache[0]; docs/test-scripts/test_extended_controls.py::test_reset_overview_boundaries_and_page_restoration_cache[3]; docs/test-scripts/test_extended_controls.py::test_reset_overview_boundaries_and_page_restoration_cache[12]; docs/test-scripts/test_extended_controls.py::test_reset_uses_interactive_seed_and_retains_hidden_artifact_card[file]; docs/test-scripts/test_extended_controls.py::test_reset_uses_interactive_seed_and_retains_hidden_artifact_card[http]; docs/test-scripts/test_extended_export_resources.py::test_extended_reset_command_sequences; docs/test-scripts/test_view_controls.py::test_collapse_all_keeps_current_roots_and_open_details[file]; docs/test-scripts/test_view_controls.py::test_collapse_all_keeps_current_roots_and_open_details[http]; frontend/src/state/tests/collapse-all.test.js :: STV_SWR_066 reset retains current roots and clears every restoration cache

Validate and serialize inde... (STV_SWR_067)

Default, 1.0 and independent 0.8/0.6 values are published unchanged. Zero, negative, boolean, string, NaN and infinite values fail deterministically. Missing presentation fields in older bundles mean 1.0, preserving their pre-change appearance; new builds always publish explicit defaults.

src/sphinx_traceability_view/model/tests/test_font_scale.py::test_invalid_font_scale_names_the_setting[True]; src/sphinx_traceability_view/model/tests/test_font_scale.py::test_invalid_font_scale_names_the_setting[False]; src/sphinx_traceability_view/model/tests/test_font_scale.py::test_invalid_font_scale_names_the_setting[0]; src/sphinx_traceability_view/model/tests/test_font_scale.py::test_invalid_font_scale_names_the_setting[-1]; src/sphinx_traceability_view/model/tests/test_font_scale.py::test_invalid_font_scale_names_the_setting[0.7]; src/sphinx_traceability_view/model/tests/test_font_scale.py::test_invalid_font_scale_names_the_setting[nan]; src/sphinx_traceability_view/model/tests/test_font_scale.py::test_invalid_font_scale_names_the_setting[inf]; src/sphinx_traceability_view/model/tests/test_font_scale.py::test_invalid_font_scale_names_the_setting[10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]; src/sphinx_traceability_view/model/tests/test_font_scale.py::test_independent_font_scales_remain_exact; docs/test-scripts/test_extended_controls.py::test_typography_nested_units_late_children_and_repeat_scaling; docs/test-scripts/test_extended_controls.py::test_font_defaults_legacy_fallback_reuse_resize_and_host_isolation[file]; docs/test-scripts/test_extended_controls.py::test_font_defaults_legacy_fallback_reuse_resize_and_host_isolation[http]; docs/test-scripts/test_extended_export_resources.py::test_font_settings_defaults_identity_and_named_build_errors; docs/test-scripts/test_view_controls.py::test_font_scales_are_independent_and_applied_once

Scale copied detail typogra... (STV_SWR_068)

At identical browser zoom, representative text computed sizes are 0.7 times their scale-1.0 baselines within 0.5 CSS px rounding. Independent overrides affect only the intended presentation. Reuse, reopen and delayed content do not compound scaling; scrolling, disclosure and visible focus remain usable.

docs/test-scripts/test_extended_controls.py::test_typography_nested_units_late_children_and_repeat_scaling; docs/test-scripts/test_extended_controls.py::test_font_defaults_legacy_fallback_reuse_resize_and_host_isolation[file]; docs/test-scripts/test_extended_controls.py::test_font_defaults_legacy_fallback_reuse_resize_and_host_isolation[http]; docs/test-scripts/test_extended_controls.py::test_real_font_and_selected_local_media_are_self_contained[file]; docs/test-scripts/test_extended_controls.py::test_real_font_and_selected_local_media_are_self_contained[http]; docs/test-scripts/test_extended_export_resources.py::test_font_settings_defaults_identity_and_named_build_errors; docs/test-scripts/test_view_controls.py::test_font_scales_are_independent_and_applied_once; frontend/src/inspect/tests/typography.test.js :: STV_SWR_068 descendant typography is scaled once from unmodified baselines

Control rendered page metad... (STV_SWR_069)

Mixed open/closed sections, several types, out-of-viewport Needs and absent metadata behave deterministically. Repeated initialization adds no duplicate controls/handlers. Pointer and Enter/Space work, titles/body stay visible, and host individual toggles still work after either bulk operation. Pages without rendered host Needs have no bulk controls; Needs without metadata retain disabled controls and an explanation.

docs/test-scripts/test_extended_controls.py::test_host_bulk_mixed_rows_reinitialization_and_native_toggle[file]; docs/test-scripts/test_extended_controls.py::test_host_bulk_mixed_rows_reinitialization_and_native_toggle[http]; docs/test-scripts/test_extended_controls.py::test_page_metadata_excludes_copies_and_handles_empty_pages; docs/test-scripts/test_view_controls.py::test_page_metadata_without_a_graph[file]; docs/test-scripts/test_view_controls.py::test_page_metadata_without_a_graph[http]; docs/test-scripts/test_view_controls.py::test_page_controls_disclose_unsupported_markup_without_partial_success; docs/test-scripts/test_view_controls.py::test_page_controls_disclose_missing_host_handler_dependency; frontend/src/render/tests/page-metadata.test.js :: STV_SWR_069 bulk state normalizes mixed rows and repeated actions never invert them

Capture a clipped inert vis... (STV_SWR_070)

A panned graph with clipped nodes, scrolled long cards, folded attributes, narrow stacked layout and a visible transient tooltip exports the same visible crop. XML parses, SVG reopens independently in Firefox, and script/event/form behavior and graph datasets are absent. A concurrent layout commit cannot mix revisions; a new attempt captures the new revision.

docs/test-scripts/test_extended_controls.py::test_snapshot_clipping_immutable_text_resources_and_readiness; docs/test-scripts/test_extended_controls.py::test_export_pointer_snapshot_cancel_keyboard_and_serialization_recovery; docs/test-scripts/test_extended_controls.py::test_real_font_and_selected_local_media_are_self_contained[file]; docs/test-scripts/test_extended_controls.py::test_real_font_and_selected_local_media_are_self_contained[http]; docs/test-scripts/test_extended_controls.py::test_export_resource_retry_and_pending_fonts_refuse_capture; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[1-file]; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[1-http]; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[10-file]; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[10-http]; frontend/src/export/tests/snapshot.test.js :: STV_SWR_070 visible crop intersects screen and never invents dimensions

Save and release SVG downlo... (STV_SWR_071)

Location-prompt mode allows saving to a chosen folder or cancelling. Automatic download mode is identified in user guidance without claiming that the app can force a dialog or detect completion. Export failure preserves the live view and permits retry; repeated exports and pagehide do not leak object URLs.

docs/test-scripts/test_extended_controls.py::test_download_expiry_pagehide_and_error_ownership; docs/test-scripts/test_extended_controls.py::test_export_pointer_snapshot_cancel_keyboard_and_serialization_recovery; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[1-file]; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[1-http]; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[10-file]; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[10-http]; frontend/src/export/tests/download.test.js :: STV_SWR_071 download uses safe filenames and releases owned URLs

Bundle safe export resource... (STV_SWR_072)

Local PNG/SVG, srcset selection, CSS image/font resources and paths containing non-ASCII characters work under file and HTTP. Traversal, remote URLs, active SVG and malformed resources cannot execute or access outside files. Missing required visible resources fail visibly; off-screen content is not loaded for capture. Hidden Needs and transport/graph data are not export payloads.

src/sphinx_traceability_view/detail_build/tests/test_export_resources.py::test_export_resources_embed_local_content_and_reject_active_svg; src/sphinx_traceability_view/detail_build/tests/test_export_resources.py::test_unreferenced_images_do_not_enter_the_graph_resource_record; src/sphinx_traceability_view/detail_build/tests/test_export_resources.py::test_inline_detail_font_faces_embed_local_bytes; src/sphinx_traceability_view/detail_build/tests/test_export_resources.py::test_svg_entity_declarations_are_rejected_before_parsing[utf-8]; src/sphinx_traceability_view/detail_build/tests/test_export_resources.py::test_svg_entity_declarations_are_rejected_before_parsing[utf-16]; docs/test-scripts/test_extended_controls.py::test_snapshot_clipping_immutable_text_resources_and_readiness; docs/test-scripts/test_extended_controls.py::test_real_font_and_selected_local_media_are_self_contained[file]; docs/test-scripts/test_extended_controls.py::test_real_font_and_selected_local_media_are_self_contained[http]; docs/test-scripts/test_extended_controls.py::test_export_resource_retry_and_pending_fonts_refuse_capture; docs/test-scripts/test_extended_export_resources.py::test_svg_resource_escape_and_remote_targets_never_read_outside[../outside.png]; docs/test-scripts/test_extended_export_resources.py::test_svg_resource_escape_and_remote_targets_never_read_outside[%2e%2e/outside.png]; docs/test-scripts/test_extended_export_resources.py::test_svg_resource_escape_and_remote_targets_never_read_outside[https://example.invalid/beacon.png]; docs/test-scripts/test_extended_export_resources.py::test_svg_resource_escape_and_remote_targets_never_read_outside[//example.invalid/beacon.png]; docs/test-scripts/test_extended_export_resources.py::test_svg_resource_escape_and_remote_targets_never_read_outside[javascript:alert(1)]; docs/test-scripts/test_extended_export_resources.py::test_real_symlink_escape_does_not_read_target; docs/test-scripts/test_extended_export_resources.py::test_nested_svg_cycles_are_explicit_failures; docs/test-scripts/test_extended_export_resources.py::test_active_svg_elements_attributes_and_imports_are_rejected[<script/>]; docs/test-scripts/test_extended_export_resources.py::test_active_svg_elements_attributes_and_imports_are_rejected[<foreignObject/>]; docs/test-scripts/test_extended_export_resources.py::test_active_svg_elements_attributes_and_imports_are_rejected[<rect onclick="alert(1)"/>]; docs/test-scripts/test_extended_export_resources.py::test_active_svg_elements_attributes_and_imports_are_rejected[<style>@import "remote.css";</style>]; docs/test-scripts/test_extended_export_resources.py::test_css_import_cycle_encoded_names_srcset_fonts_and_deterministic_records; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[1-file]; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[1-http]; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[10-file]; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[10-http]; frontend/src/export/tests/resources.test.js :: STV_SWR_072 snapshot resources reject remote paths and inherited dictionary entries

Store opt-in snapshots inde... (STV_SWR_073)

Independent keys, initial off/enabled reload, updates, removal, last-save-wins and blocked/quota failures behave as specified; other view state and live exploration are unchanged.

docs/test-scripts/test_remembered_view.py::test_remembered_view_roundtrip_disable_isolation_and_card_order[file]; docs/test-scripts/test_remembered_view.py::test_remembered_view_roundtrip_disable_isolation_and_card_order[http]; docs/test-scripts/test_remembered_view.py::test_remembered_view_stale_corrupt_and_reduced_capacity; docs/test-scripts/test_remembered_view.py::test_remembered_view_storage_failure_and_pending_layout; docs/test-scripts/test_remembered_view.py::test_remembered_overview_pages_and_last_save_wins_between_tabs; docs/test-scripts/test_remembered_view.py::test_remembered_view_survives_browser_restart; frontend/src/state/tests/persistence.test.js :: STV_SWR_073 isolation/removal/last-save-wins and guarded getter/quota errors

Validate and reconstruct re... (STV_SWR_074)

Seeded and overview round trips, cycles/shared paths, stale objects, changed page/card capacity, invalid schema and coordinates, hidden objects and 200/201-node boundaries restore or reject atomically.

docs/test-scripts/test_remembered_view.py::test_remembered_view_roundtrip_disable_isolation_and_card_order[file]; docs/test-scripts/test_remembered_view.py::test_remembered_view_roundtrip_disable_isolation_and_card_order[http]; docs/test-scripts/test_remembered_view.py::test_remembered_view_stale_corrupt_and_reduced_capacity; docs/test-scripts/test_remembered_view.py::test_remembered_overview_pages_and_last_save_wins_between_tabs; frontend/src/state/tests/persistence.test.js :: STV_SWR_074 exploration/page/card/viewport round trip; frontend/src/state/tests/persistence.test.js :: STV_SWR_074 stale/hidden IDs and reduced card limit; frontend/src/state/tests/persistence.test.js :: STV_SWR_074 malformed schema/state/page/transform rejected atomically; frontend/src/state/tests/persistence.test.js :: STV_SWR_074 200/201-node limits apply to seeds and expansions

Restore presentation withou... (STV_SWR_075)

A real reload preserves nodes, placement, open-card order and viewport; subsequent FIFO, collapse/reseed, zoom and card close work. Failed/stale layouts do not overwrite a committed snapshot. Restore does not focus/scroll the page and browser back/forward retains the same live view.

docs/test-scripts/test_remembered_view.py::test_remembered_view_roundtrip_disable_isolation_and_card_order[file]; docs/test-scripts/test_remembered_view.py::test_remembered_view_roundtrip_disable_isolation_and_card_order[http]; docs/test-scripts/test_remembered_view.py::test_remembered_view_stale_corrupt_and_reduced_capacity; docs/test-scripts/test_remembered_view.py::test_remembered_view_storage_failure_and_pending_layout; docs/test-scripts/test_remembered_view.py::test_remembered_overview_pages_and_last_save_wins_between_tabs; docs/test-scripts/test_remembered_view.py::test_remembered_view_survives_browser_restart; frontend/src/state/tests/persistence.test.js :: STV_SWR_075 geometry reuse requires current dimensions and ranks

Author and resolve embedded... (STV_SYS_001)

Zero-, one- and multiple-ID invocations resolve independently. Zero IDs selects the project root; multiple valid IDs select every specified object. Any invalid explicit ID fails with the ID, filename and invocation location.

docs/test-scripts/test_build.py::test_cross_page_bundle; docs/test-scripts/test_build.py::test_invalid_seed_source_location[UNKNOWN]; docs/test-scripts/test_build.py::test_invalid_seed_source_location[ROOT_A UNKNOWN]; docs/test-scripts/test_build.py::test_invalid_seed_source_location[HIDDEN_A]

Integrate the host data model (STV_SYS_002)

Two differently named host schemas generate correctly mapped views without duplicate type definitions; an unknown level or missing required mapping fails with its entry path.

docs/test-scripts/test_build.py::test_alternate_host_schema_external_metadata_and_parts; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[file]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[http]

Deliver a self-contained do... (STV_SYS_003)

The same output supports navigation and local-object inspection under file URLs with networking disabled and under static HTTP hosting.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]; docs/test-scripts/test_windows_paths.py::test_nested_windows_detail_loading_and_retry

Expose the complete host tr... (STV_SYS_004)

A cross-document chain can be followed from either end; a missing target appears as a placeholder and host validation determines overall build failure.

docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]; docs/test-scripts/test_browser.py::test_missing_placeholder_and_detail_error[file]; docs/test-scripts/test_browser.py::test_missing_placeholder_and_detail_error[http]

Preserve semantic layout (STV_SYS_005)

Software-, test- and execution-seeded views preserve nine-category order and same-row top alignment. Custom hardware rows retain their configured index. Shared identity, finite nonoverlap and endpoint identity hold in both classified-row and legacy-role configurations.

docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[file]; docs/test-scripts/test_classified_rows.py::test_published_classified_rows_and_fallback_navigation[http]

Provide original-object ins... (STV_SYS_006)

A locally rendered object on another page has equivalent displayed metadata/body in hover or keyboard details and opens at its original anchor from file and HTTP URLs. An external object without a local body shows metadata, its original link and the unavailable-details indication; widget-specific script behavior is not required. Uncached remote embedded media uses the owner-approved unavailable-offline indication and explicit resource link, without automatic retrieval; local bundled media remains available.

docs/test-scripts/test_browser.py::test_usability_smoke[file]; docs/test-scripts/test_browser.py::test_usability_smoke[http]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]; docs/test-scripts/test_windows_paths.py::test_nested_windows_detail_loading_and_retry

Isolate view sessions (STV_SYS_007)

Expanding, zooming and panning one of two views leaves the other unchanged.

docs/test-scripts/test_browser.py::test_offline_exploration[file]; docs/test-scripts/test_browser.py::test_offline_exploration[http]

Bound exploration of large ... (STV_SYS_008)

A tens-of-thousands fixture remains explorable; a transition to 200 succeeds and one to 201 leaves prior state unchanged with an explanation.

docs/test-scripts/test_capacity.py::test_large_project_at_visible_capacity[file]; docs/test-scripts/test_capacity.py::test_large_project_at_visible_capacity[http]

Deliver the reusable extension (STV_SYS_009)

A built wheel installs into a clean host environment and produces an embedded HTML view without copying repository implementation files.

docs/test-scripts/test_ci_security.py::test_workflow_policy_accepts_reviewed_files_and_rejects_privilege_drift; docs/test-scripts/test_ci_security.py::test_candidate_checksums_detect_changed_artifact_bytes; docs/test-scripts/test_legal_guard.py::test_build_rejects_unaudited_elk_and_missing_notices; docs/test-scripts/test_package.py::test_clean_wheel_host; docs/test-scripts/test_publication.py::test_clean_publication_removes_obsolete_assets; docs/test-scripts/test_publication.py::test_failed_build_preserves_published_tree; docs/test-scripts/test_publication.py::test_failed_promotion_restores_previous_tree; docs/test-scripts/test_publication.py::test_failed_audit_cleans_temporary_output[False]; docs/test-scripts/test_publication.py::test_failed_audit_cleans_temporary_output[True]; docs/test-scripts/test_publication.py::test_failed_rollback_preserves_recoverable_backup; docs/test-scripts/test_sdist.py::test_sdist_excludes_local_evidence_and_rebuilds_wheel

Support the initial executi... (STV_SYS_010)

All in-scope MVP interaction checks pass on recorded stable Firefox and Windows versions against file and static HTTP output.

docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[file]; docs/test-scripts/test_browser.py::test_alternate_model_geometry_details_and_external[http]

Deliver a standalone visibl... (STV_SYS_011)

A saved SVG reopens in the supported browser after the original documentation directory is unavailable, under file and HTTP hosting. It preserves the captured crop and visible content/styles, contains no executable behavior or required external resource requests, and neither cancellation nor failure changes exploration state. Missing required local resources produce a readable export failure rather than a misleading success.

docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[1-file]; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[1-http]; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[10-file]; docs/test-scripts/test_view_controls.py::test_standalone_svg_visible_details[10-http]

Executable sources

  • src/sphinx_traceability_view/bundle/tests/test_bundle.py

  • src/sphinx_traceability_view/detail_build/tests/test_details.py

  • src/sphinx_traceability_view/detail_build/tests/test_export_resources.py

  • src/sphinx_traceability_view/directive/tests/test_lifecycle.py

  • src/sphinx_traceability_view/graph/tests/test_graph.py

  • src/sphinx_traceability_view/model/tests/test_font_scale.py

  • src/sphinx_traceability_view/model/tests/test_model.py

  • docs/test-scripts/test_browser.py

  • docs/test-scripts/test_build.py

  • docs/test-scripts/test_capacity.py

  • docs/test-scripts/test_ci_security.py

  • docs/test-scripts/test_classified_rows.py

  • docs/test-scripts/test_detail_transport.py

  • docs/test-scripts/test_extended_controls.py

  • docs/test-scripts/test_extended_export_resources.py

  • docs/test-scripts/test_legal_guard.py

  • docs/test-scripts/test_method_publication.py

  • docs/test-scripts/test_package.py

  • docs/test-scripts/test_persistent_details.py

  • docs/test-scripts/test_position_stability.py

  • docs/test-scripts/test_publication.py

  • docs/test-scripts/test_release_publication.py

  • docs/test-scripts/test_release_seeds.py

  • docs/test-scripts/test_remembered_view.py

  • docs/test-scripts/test_sdist.py

  • docs/test-scripts/test_view_controls.py

  • docs/test-scripts/test_viewport_boundary.py

  • docs/test-scripts/test_windows_paths.py

  • frontend/src/export/tests/download.test.js

  • frontend/src/export/tests/resources.test.js

  • frontend/src/export/tests/snapshot.test.js

  • frontend/src/inspect/tests/collection.test.js

  • frontend/src/inspect/tests/inspect.test.js

  • frontend/src/inspect/tests/typography.test.js

  • frontend/src/inspect/tests/urls.test.js

  • frontend/src/layout/tests/classified-rows.test.js

  • frontend/src/layout/tests/layout.test.js

  • frontend/src/layout/tests/stability.test.js

  • frontend/src/render/tests/edge-viewport.test.js

  • frontend/src/render/tests/groups.test.js

  • frontend/src/render/tests/page-metadata.test.js

  • frontend/src/render/tests/seeds.test.js

  • frontend/src/state/tests/collapse-all.test.js

  • frontend/src/state/tests/persistence.test.js

  • frontend/src/state/tests/state.test.js