Test Specification

Test specifications for the affirmatrix requirements (SEG-TS-nnn). Each one is the docstring of a test under tests/: its first line is the title, the paragraphs beneath it state the claim, and two docstring fields carry its identity (:test-id:) and the requirements it verifies (:verifies:). This page is generated from those docstrings at every build, so it always shows the tests as they are. The verifies links point at the requirement specification, whose pages show each requirement’s tests under “is verified by”; the test report links each result back here under “is reported by”.

tests/specification/test_case_evidence_removal.py

Test Specification: The affirmation store refuses a write that names a test outcome node or an evidence edge. SEG-TS-098
nodeid: tests/specification/test_case_evidence_removal.py::test_the_store_refuses_test_outcomes_and_evidence_edges
verifies: SEG-SREQ-227
is reported by: SEG-OUT-C8F05277DDDC

A case holds nothing. A write of a requirement node together with a test outcome node is refused, and no file of the case changes. A write of a Confirms edge, a Witnesses edge or an Excuses edge is refused, and no file changes. A write of a Refines edge together with a Confirms edge is refused, and the Refines edge is not written. A write of a waiver node and a write of a Refines edge are accepted.

Test Specification: Case sync removes every stored outcome and evidence edge, after it writes the derived stream. SEG-TS-099
nodeid: tests/specification/test_case_evidence_removal.py::test_case_sync_removes_the_stored_evidence_and_names_it
verifies: SEG-SREQ-228
is reported by: SEG-OUT-E0DAE59F9D52

The legacy case holds 10 test outcome nodes, 10 Confirms edges and 12 Witnesses edges. Case sync runs from a stream of the design alone and exits with status 0. Afterwards the case holds no test outcome node and no Confirms or Witnesses edge. The report names each of the 10 outcomes, and each of the 22 edges by its two ends and its kind. The documents of the strong edges, the review events, the stored package and the other node documents are byte for byte as before. The six affirmed edges keep their hashes.

Test Specification: A case that holds no evidence is changed by no further case sync. SEG-TS-100
nodeid: tests/specification/test_case_evidence_removal.py::test_a_second_sync_removes_nothing_and_changes_nothing
verifies: SEG-SREQ-228
is reported by: SEG-OUT-248A4201C4BC

The legacy case is synced from a stream of the design alone. A second sync from the same stream exits with status 0. Every file of the case is byte for byte as it was after the first sync, and the report names none of the removed outcomes.

Test Specification: A case sync that cannot write the derived stream changes nothing, evidence included. SEG-TS-101
nodeid: tests/specification/test_case_evidence_removal.py::test_a_refused_sync_removes_nothing
verifies: SEG-SREQ-212
is reported by: SEG-OUT-2C5ADD5EB392

The stream of the design holds one Refines edge that the case does not store, from FX-SREQ-2 to FX-SREQ-1. The legacy case’s copy of the Refines schema does not allow an edge that ends at FX-SREQ-1, and every record the case stores is still valid. Case sync exits with status 2. Every file of the case is byte for byte as before, so the 10 outcomes and the 22 evidence edges are still stored.

Test Specification: Case sync reports a vanished strong edge and keeps it, and reports no vanished evidence edge. SEG-TS-102
nodeid: tests/specification/test_case_evidence_removal.py::test_a_vanished_strong_edge_is_reported_and_kept_and_evidence_is_not_reported
verifies: SEG-SREQ-074
is reported by: SEG-OUT-E6A8AD72C66A

The stream of the design lacks the Refines edge from FX-SREQ-2 to FX-SYS-1, which the legacy case stores as pending. Case sync exits with status 0. It reports exactly one vanished edge, that Refines edge, and reports no vanished edge of kind Confirms, Witnesses or Excuses, although the stream holds none of the 22 evidence edges the case stored. The Refines edge is still in the case.

Test Specification: A package stored before run bundles were recorded is read back as written. SEG-TS-103
nodeid: tests/specification/test_case_evidence_removal.py::test_a_stored_package_without_run_bundle_digests_still_reads
verifies: SEG-SREQ-020
is reported by: SEG-OUT-CD38029D5C6C

The legacy case stores one package of four documents, and its evidence manifest has no field for run bundles. The store reads the package and returns the four documents. After a refresh of the case’s schema copy to the packaged schemas, the store reads the same package again and returns the same four documents.

tests/specification/test_cli_producer_reports.py

Test Specification: case check says why a producer cannot be read, in both renderings. SEG-TS-180
nodeid: tests/specification/test_cli_producer_reports.py::test_case_check_says_why_the_producer_cannot_be_read
verifies: SEG-SREQ-290
is reported by: SEG-OUT-2108911437AD

The configured producer names a requirement export that does not exist. The reason is the message the library gives when it builds that producer. The output of case check holds that message in full. The output of case check with the machine-readable rendering is a JSON object with that message in one of its string values.

Test Specification: graph check names what it checked by its location, in both renderings. SEG-TS-181
nodeid: tests/specification/test_cli_producer_reports.py::test_graph_check_says_which_stream_it_checked
verifies: SEG-SREQ-291
is reported by: SEG-OUT-2FE2A79D0663

A case is synced from a current stream. So the case and the stream hold the same graph, and every count in the two outputs is the same. The output of graph check over the case holds the root of the case. The output of graph check with the current stream holds the location given to –current. In the machine-readable rendering, each location is in one of the string values of the JSON object. The two outputs differ, and running either command twice gives the same output twice.

Test Specification: A reader with no usable repository cannot be judged, and the reader is named. SEG-TS-182
nodeid: tests/specification/test_cli_producer_reports.py::test_a_reader_with_no_usable_repository_cannot_be_judged
verifies: SEG-SREQ-292
is reported by: SEG-OUT-5CBA771F700F

The requirements and test readers name usable repositories. In one file the implementation reader names none and the file names no default repository. In another file the implementation reader names the repository ghost, which the repository map lacks. For each file, case sync and graph status exit with status 2 and their output names the reader implementations. The case is unchanged.

Test Specification: case sync cannot judge a stream that cannot be built, or a graph that cannot be built. SEG-TS-183
nodeid: tests/specification/test_cli_producer_reports.py::test_case_sync_over_a_stream_that_cannot_be_built_writes_nothing
verifies: SEG-SREQ-136
is reported by: SEG-OUT-7903AE8E6527

The case is initialized. A configured producer names a requirement export that does not exist. Running case sync with it exits with status 2 and leaves every file of the case as it was. Running case sync with a current stream that holds a refines cycle does the same.

tests/specification/test_commitment.py

Test Specification: The edge hash binds both endpoints. SEG-TS-004
nodeid: tests/specification/test_commitment.py::test_the_edge_hash_binds_endpoints_type_and_both_node_hashes
verifies: SEG-SREQ-002
is reported by: SEG-OUT-FA40A912EB12

Computing an edge’s hash from a fixed baseline of endpoint identifiers, edge type, and both node hashes, then independently varying each of the five inputs in turn — the source identifier, the target identifier, the edge type, the source node hash, and the target node hash — changes the resulting hash on every variation. No single input can move without the edge hash moving with it.

Test Specification: The design root seals the whole design set. SEG-TS-005
nodeid: tests/specification/test_commitment.py::test_the_design_root_seals_the_whole_design_set
verifies: SEG-SREQ-003
is reported by: SEG-OUT-1E4D6D3F3EBD

Computing a design root over a fixed set of node hashes, edge tuples, and caller metadata, then reordering the node hashes and edges before recomputing, yields the same root — the canonical sort absorbs input order. Independently varying one node hash, one edge’s endpoint or type, or the metadata changes the root; no single member of the design set can move without the root moving with it.

Test Specification: The node hash derives from type and content hashes alone. SEG-TS-006
nodeid: tests/specification/test_commitment.py::test_the_node_hash_derives_from_type_and_content_hashes_alone
verifies: SEG-SREQ-005
is reported by: SEG-OUT-B74D3D9649C4

Computing a node hash from a fixed node type and one named content hash, then independently varying the node type, the content digest, and the content-hash field name, changes the resulting hash on every variation; and the node hash of a single content hash never equals that content hash’s own digest — the type and the name are folded in, not merely passed through.

tests/specification/test_config_need_ids.py

Test Specification: The loader carries the list of need identifiers of the implementations block. SEG-TS-415
nodeid: tests/specification/test_config_need_ids.py::test_the_loader_carries_the_list_of_need_identifiers
verifies: SEG-SREQ-357
is reported by: SEG-OUT-7C42FD03E9D8

A file gives the key need-ids in the implementations block as the list IMPL-ONE, IMPL-TWO. The loaded inputs of the implementations block carry the identifiers IMPL-ONE and IMPL-TWO and no others. A file that gives the same list in another order, and one that gives an identifier twice, carry the same identifiers. A file that does not give the key loads, and its loaded inputs carry no list at all, which is not the same as an empty list.

Test Specification: A list of need identifiers that is empty or not a list of non-empty text is refused. SEG-TS-416
nodeid: tests/specification/test_config_need_ids.py::test_need_identifiers_that_are_empty_or_not_text_are_refused_naming_the_block
verifies: SEG-SREQ-362

A file gives the key need-ids in the implementations block as the empty list, as a list that holds a number, as a list that holds the empty text, as a list of one good identifier and the empty text, as a list of one good identifier and a number, as one text that is no list, as an object, as a number or as a boolean, one at a time. Loading each file raises a configuration error that names the block producer.implementations. A control that gives the list IMPL-ONE loads.

Test Specification: A null list of need identifiers is the same as a list that is not given. SEG-TS-417
nodeid: tests/specification/test_config_need_ids.py::test_a_null_list_of_need_identifiers_is_a_list_that_is_not_given
verifies: SEG-SREQ-370
is reported by: SEG-OUT-B609CA805FB1

A file gives the key need-ids in the implementations block with no value, so that the value is null. The file loads, and its loaded inputs carry what the inputs of a file without the key carry. A control that gives the list IMPL-ONE carries that identifier. The null key does not narrow the needs: it is not read as an empty list, which would be refused.

Test Specification: The key need-ids is refused in the requirements block and in the specifications block. SEG-TS-418
nodeid: tests/specification/test_config_need_ids.py::test_the_list_of_need_identifiers_is_refused_outside_the_implementations_block
verifies: SEG-SREQ-376

A file gives the key need-ids with the list IMPL-ONE in the requirements block, or in the specifications block, one at a time. The key is known only in the implementations block, so loading each file raises a configuration error that names the block that holds the key and names the key need-ids. A control that gives the same list in the implementations block loads.

tests/specification/test_config_need_types.py

Test Specification: A configuration that names an empty list of need types is refused, naming the block. SEG-TS-325
nodeid: tests/specification/test_config_need_types.py::test_an_empty_list_of_need_types_is_refused_naming_the_block
verifies: SEG-SREQ-341

A file gives the types of one reader block as an empty list. This is tried for the requirements block, the specifications block and the implementations block, one at a time. Loading the file raises a configuration error that names the block. A control that gives the list [kind] for the same block loads, and the loaded inputs carry the type kind.

Test Specification: A configuration whose need types are not a list of text is refused, naming the block. SEG-TS-326
nodeid: tests/specification/test_config_need_types.py::test_need_types_that_are_not_a_list_of_text_are_refused_naming_the_block
verifies: SEG-SREQ-341

A file gives the types of one reader block as a list that holds a number, [1], or as a text that is no list, test_case. This is tried for the requirements block, the specifications block and the implementations block, one at a time. Loading each file raises a configuration error that names the block. A control that gives the list [kind] for the same block loads.

tests/specification/test_config_path_root.py

Test Specification: The loader carries the path root of a specifications block and of an implementations block. SEG-TS-374
nodeid: tests/specification/test_config_path_root.py::test_the_loader_carries_the_path_root_of_a_doxygen_block
verifies: SEG-SREQ-348

A file gives the key path-root as include/ in one block, the specifications block or the implementations block, one at a time. The loaded inputs of that block carry a path root that is the text include, with or without its trailing separator. The text is the one the file gives. It does not begin with the directory of the file, so it is not resolved against it. A file that does not give the key, one that gives it as the empty text and one that gives it as null load, and the loaded path root is then empty or none, the same in each of the three cases.

Test Specification: A path root that is not text is refused, naming the block. SEG-TS-375
nodeid: tests/specification/test_config_path_root.py::test_a_path_root_that_is_not_text_is_refused_naming_the_block
verifies: SEG-SREQ-348

A file gives the key path-root as a number, a list, an object or a boolean in one block, the specifications block or the implementations block, one at a time. Loading the file raises a configuration error that names the block. A control that gives the text include/ for the same block loads.

Test Specification: A configuration whose need types hold an empty text is refused, naming the block. SEG-TS-376
nodeid: tests/specification/test_config_path_root.py::test_a_need_type_that_is_empty_text_is_refused_naming_the_block
verifies: SEG-SREQ-341

A file gives the types of one reader block as the list that holds only the empty text, or as the list impl and the empty text. This is tried for the requirements block, the specifications block and the implementations block, one at a time. Loading each file raises a configuration error that names the block. A control that gives the list impl for the same block loads, and the loaded inputs carry the type impl.

Test Specification: Null need types on a specifications block or an implementations block are not given. SEG-TS-377
nodeid: tests/specification/test_config_path_root.py::test_null_need_types_of_a_doxygen_block_are_not_given
verifies: SEG-SREQ-369

A file gives the key types of one block, the specifications block or the implementations block, with no value, so that it is null. Loading the file succeeds, and the loaded inputs carry no need types: the same as the inputs loaded from a file that does not give the key. A control that gives the list impl carries the type impl.

Test Specification: Null need types on the requirements block are refused, naming the block. SEG-TS-378
nodeid: tests/specification/test_config_path_root.py::test_null_need_types_of_the_requirements_block_are_still_refused
verifies: SEG-SREQ-341
is reported by: SEG-OUT-919AD9CA0A90

A file gives the key types of the requirements block with no value, so that it is null. Loading the file raises a configuration error that names the block, because the requirements block needs its types. A control that gives the list req loads.

tests/specification/test_config_reader_shapes.py

Test Specification: The name of the parent-link field is carried. SEG-TS-174
nodeid: tests/specification/test_config_reader_shapes.py::test_the_parent_field_is_carried
verifies: SEG-SREQ-284
is reported by: SEG-OUT-9BAB3D140F82

A file whose requirements block names the parent field trace and the source directory reqs gives requirements inputs that carry the name trace.

Test Specification: The need types of the test-case and implementation exports are carried. SEG-TS-175
nodeid: tests/specification/test_config_reader_shapes.py::test_the_types_of_test_cases_and_implementations_are_carried
verifies: SEG-SREQ-285
is reported by: SEG-OUT-23DE4BD20A2A

A file names the types test_case and test_manual in its specifications block. It names the type impl in its implementations block. The loaded inputs carry each of those sets of types and no other type.

Test Specification: A reader's own repository name is carried. SEG-TS-176
nodeid: tests/specification/test_config_reader_shapes.py::test_a_reader_may_name_its_own_repository
verifies: SEG-SREQ-286
is reported by: SEG-OUT-392442C5961C

A file names the default repository suite, and the requirements block names the repository docs. The requirements inputs carry docs. The specifications block names none, and its inputs carry no repository of their own.

Test Specification: The Doxygen path prefix is carried for each Doxygen output, as written. SEG-TS-177
nodeid: tests/specification/test_config_reader_shapes.py::test_the_doxygen_prefix_is_carried_for_each_output
verifies: SEG-SREQ-287
is reported by: SEG-OUT-D2B560AE8B52

A file gives the prefix tree-root/ to the test output and the prefix lib-src/ to the implementation output. The loaded inputs carry each prefix as the text written, and the loader does not join either with the directory of the file.

Test Specification: The map from need docnames to source files is carried. SEG-TS-178
nodeid: tests/specification/test_config_reader_shapes.py::test_the_source_map_is_carried
verifies: SEG-SREQ-288
is reported by: SEG-OUT-6F74FB75D53B

A file in a subdirectory gives a source map of two docnames, docs/alpha and docs/beta, to the files reqs/alpha.sdoc and reqs/beta.sdoc. The loaded inputs carry the same two docnames. Each value is the subdirectory joined with the path written, as every other relative path is.

Test Specification: A source directory and a source map exclude each other. SEG-TS-179
nodeid: tests/specification/test_config_reader_shapes.py::test_a_source_directory_and_a_source_map_exclude_each_other
verifies: SEG-SREQ-289
is reported by: SEG-OUT-B376B3655ED5

Loading a file whose requirements block names a source directory and a source map raises the configuration error. So does loading a file that names neither. A file that names the source directory only loads, and so does a file that names the source map only.

tests/specification/test_config_unknown_keys.py

Test Specification: A key at the top of the file that the loader does not know is refused, naming the key. SEG-TS-419
nodeid: tests/specification/test_config_unknown_keys.py::test_a_key_at_the_top_of_the_file_that_is_not_known_is_refused
verifies: SEG-SREQ-376

A file holds the known top-level keys case and implementation, and one more key at the top: cases, implementations, Case or repository, one at a time. Of these, repository is known only inside the producer block, and Case differs from case by its capital letter. Loading each file raises a configuration error that names the key. A control without the extra key loads.

Test Specification: A key of the producer block that the loader does not know is refused. SEG-TS-420
nodeid: tests/specification/test_config_unknown_keys.py::test_a_key_of_the_producer_block_that_is_not_known_is_refused
verifies: SEG-SREQ-376

A file holds a producer block with the known keys root and repository, and one more key: roots, outputs, implementation, Repository or types, one at a time. Loading each file raises a configuration error that names the block producer and the key. A control without the extra key loads.

Test Specification: A key of a reader block that the loader does not know is refused, naming block and key. SEG-TS-421
nodeid: tests/specification/test_config_unknown_keys.py::test_a_key_of_a_reader_block_that_is_not_known_is_refused
verifies: SEG-SREQ-376

A file holds one reader block, the requirements block, the specifications block or the implementations block, with the keys that it needs to load and one more key. The extra key is either a mistyped name, such as doxygen_prefix or need_ids, or the name of a key that only another block knows, such as need-ids in the specifications block or doxygen-prefix in the requirements block. Loading each file raises a configuration error that names the block, as producer.<block>, and the key. A control without the extra key loads.

Test Specification: A file that holds only known keys loads, whatever blocks it holds. SEG-TS-422
nodeid: tests/specification/test_config_unknown_keys.py::test_a_file_that_holds_only_known_keys_loads
verifies: SEG-SREQ-376
is reported by: SEG-OUT-A03662ADB460

A file holds every key that the loader knows: at the top, case, implementation, repositories, roles and producer; in producer, root, repository, and the three reader blocks; in each reader block, every key of that block, including path-root, need-ids (in the implementations block only) and either source or source-map in the requirements block. The file loads. A second file that differs in the requirements block, which holds source-map and no source, loads too. Neither load raises a configuration error.

Test Specification: A producer block that holds the key outcomes is refused for that key, whatever it holds. SEG-TS-423
nodeid: tests/specification/test_config_unknown_keys.py::test_a_producer_that_names_a_run_keeps_its_own_refusal
verifies: SEG-SREQ-234

A file holds a producer block with the key outcomes, whose value is an empty list, a list of one run or a text, one at a time. Loading each file raises a configuration error that names the key outcomes and says that run bundles are named on the command line with –bundle. The refusal is the one the loader gave before it refused unknown keys, and it does not say that the key is unknown.

Test Specification: A mistyped key stops a verb of the command line with exit status 2, naming the key. SEG-TS-424
nodeid: tests/specification/test_config_unknown_keys.py::test_a_mistyped_key_stops_the_command_line_with_exit_status_2
verifies: SEG-SREQ-376
is reported by: SEG-OUT-EB43497E6740

A configuration holds an implementations block over the fixture, with the types {impl}, the prefix of its Doxygen output and the list of need identifiers I-LIB-MAX. Running the verb case sync with that file, with the list spelled need-ids, exits with status 0. The same file with the key spelled need_ids exits with status 2 and prints a message that names the key need_ids. The case holds no record after the second run.

tests/specification/test_confirming_outcomes.py

Test Specification: An outcome is a confirming outcome only when it has both a Confirms and a Witnesses edge. SEG-TS-362
nodeid: tests/specification/test_confirming_outcomes.py::test_an_outcome_counts_only_with_both_a_confirms_and_a_witnesses_edge
verifies: SEG-SREQ-355
is reported by: SEG-OUT-8AA6559A6B5D

One leaf has an active verifies edge and an active implements edge. Three outcomes passed. The first has a Confirms edge to the test specification and a Witnesses edge to the implementation. The second has a Confirms edge and no Witnesses edge. The third has a Witnesses edge and no Confirms edge. The satisfaction evaluator sets aside the second and the third, and not the first. The leaf is satisfied. With only the second and the third outcome in the graph, the leaf is not satisfied, and both outcomes are still set aside. With only the second outcome, the leaf is not satisfied either.

Test Specification: The gate reports each outcome that the satisfaction evaluator sets aside as information. SEG-TS-363
nodeid: tests/specification/test_confirming_outcomes.py::test_the_gate_reports_each_discarded_outcome_as_information
verifies: SEG-SREQ-356
is reported by: SEG-OUT-B66D4EE76811

A graph holds one leaf and three passed outcomes: one with a Confirms edge and a Witnesses edge, one with a Confirms edge only, and one with a Witnesses edge only. The package gate reports exactly one finding of the condition for a discarded outcome for each of the second and the third outcome, with the outcome as its subject and the severity information. It reports no such finding for the first outcome. The set of discarded outcomes in the report holds the second and the third outcome. The report is not blocked, because the first outcome covers the leaf.

Test Specification: With no implementation export, no outcome confirms, and each is reported once as information. SEG-TS-364
nodeid: tests/specification/test_confirming_outcomes.py::test_without_an_implementation_export_every_outcome_is_discarded_and_reported
is reported by: SEG-OUT-B9837E8FBA01

The producer reads the frozen evidence fixture and one run bundle, and its block names no implementation export, so no outcome has a Witnesses edge. Running proof check for the golden scope with the strong edges affirmed reports the 24 outcomes of the scope as discarded. Each of them has one finding of the condition for a discarded outcome, with severity information and the outcome as its subject. A leaf of the scope, SD-REQ-001, is a coverage gap and so is not satisfied. The same check over a producer that reads the export, in the next test, discards none.

Test Specification: With the implementation export, every outcome of the scope confirms and none is discarded. SEG-TS-365
nodeid: tests/specification/test_confirming_outcomes.py::test_with_an_implementation_export_no_outcome_is_discarded
is reported by: SEG-OUT-C284736EC8C0

The producer reads the frozen evidence fixture, one run bundle and the implementation export, so each outcome has a Witnesses edge to the implementations of what its test verifies. Running proof check for the golden scope with the strong edges affirmed lists no discarded outcome and holds no finding of the condition for a discarded outcome.

tests/specification/test_content_extractor.py

Test Specification: An Implementation is identified by its implementation need's identifier, verbatim. SEG-TS-022
nodeid: tests/specification/test_content_extractor.py::test_an_implementation_is_identified_by_its_need_identifier_verbatim
verifies: SEG-SREQ-154
is reported by: SEG-OUT-A5357E29EA4D

Extracting from the fixture supplies exactly 12 Implementation records whose local identifiers equal, byte for byte, the ids of the implementation export’s needs, among them IMPL-safe_data_init and IMPL-SAFE_CONTAINER_DEFINE. In a copy of the export where the need IMPL-safe_data_init is renamed ZZ-init-1 and names the same symbol, the records carry ZZ-init-1 and no identifier derived from the symbol.

Test Specification: A TestSpecification is identified by its test-case need's identifier, verbatim. SEG-TS-023
nodeid: tests/specification/test_content_extractor.py::test_a_test_specification_is_identified_by_its_need_identifier_verbatim
verifies: SEG-SREQ-155
is reported by: SEG-OUT-A27FFE6DECFA

Extracting from the fixture supplies exactly 19 TestSpecification records whose local identifiers equal, byte for byte, the ids of the test-case export’s needs, among them TC_SAFE_DATA_INIT_AND_VERIFY. In a copy of the export where that need is renamed TC-renamed-1 and names the same test function, the records carry TC-renamed-1 and no identifier derived from the function’s name.

Test Specification: Implements edges come from the implementation needs' satisfies links. SEG-TS-024
nodeid: tests/specification/test_content_extractor.py::test_implements_edges_come_from_satisfies_links
verifies: SEG-SREQ-156
is reported by: SEG-OUT-A7ED5022458C

Extracting from the fixture supplies exactly the 16 (implementation need, requirement) pairs the export’s needs declare in satisfies, among them (IMPL-safe_data_update, SD-REQ-008), each an edge of kind Implements in the pending state, running from the implementation to the requirement. In a copy of the header whose @satisfies tag in the comment of safe_data_init names SD-REQ-999, and with a root holding no source at all, the edge set is unchanged.

Test Specification: Verifies edges come from the test-case needs' verifies links. SEG-TS-025
nodeid: tests/specification/test_content_extractor.py::test_verifies_edges_come_from_verifies_links
verifies: SEG-SREQ-157
is reported by: SEG-OUT-C9CF29CBA82F

Extracting from the fixture supplies exactly the 24 (test-case need, requirement) pairs the export’s needs declare in verifies, among them (TC_SAFE_DATA_INIT_AND_VERIFY, SD-REQ-003), each an edge of kind Verifies in the pending state, running from the test specification to the requirement. In a copy of the test source whose @verifies tag in the comment of test_init_and_verify names SD-REQ-999, the edge set is unchanged.

Test Specification: A need export carrying a build timestamp is refused. SEG-TS-026
nodeid: tests/specification/test_content_extractor.py::test_a_need_export_carrying_a_build_timestamp_is_refused_by_the_extractor
verifies: SEG-SREQ-158
is reported by: SEG-OUT-03CA3CF863F1

Constructing the extractor over a copy of the implementation export that adds a created stamp to its version entry, and separately over a copy of the test-case export that adds it at the top level, raises the extractor’s error before any record is supplied; constructing it over the exports as frozen, whose every timestamp field is null, does not.

Test Specification: A node is located through the Doxygen member whose name is its symbol. SEG-TS-027
nodeid: tests/specification/test_content_extractor.py::test_a_node_is_located_through_the_member_its_symbol_names
verifies: SEG-SREQ-160
is reported by: SEG-OUT-BDD04078DD62

For each of the 12 implementations the bodyHash equals the SHA-256 of the run of lines that the location of the member named by its symbol gives (bodyfile, bodystart to bodyend, read by the test from the Doxygen output), and for each of the 19 test specifications the implHash equals the same for its test function; the 12 bodyHash digests are pairwise distinct. In a copy of the Doxygen output where only the bodyend of safe_data_init is one line smaller, the bodyHash of IMPL-safe_data_init is the digest of that shorter run and the other eleven are unchanged.

Test Specification: An unlocatable or ambiguous symbol is an error for its node, not an omission. SEG-TS-028
nodeid: tests/specification/test_content_extractor.py::test_an_unlocatable_or_ambiguous_symbol_is_an_error_for_its_node
verifies: SEG-SREQ-161
is reported by: SEG-OUT-57092FDD8773

Extracting from a copy of the implementation export in which IMPL-safe_data_init names the symbol safe_data_absent, which no member of the Doxygen output carries, raises the extractor’s error naming IMPL-safe_data_init; extracting from a copy of the Doxygen output in which a second member named safe_data_init is defined raises it likewise; extracting from the fixture as frozen supplies all 12 Implementation records.

Test Specification: A location outside the root is an error, and the file outside is not read. SEG-TS-029
nodeid: tests/specification/test_content_extractor.py::test_a_location_outside_the_root_is_an_error_and_is_not_read
verifies: SEG-SREQ-162
is reported by: SEG-OUT-977BC8079CA9

With a readable file x.c beside the root, in a copy of the Doxygen output where the declaration file of safe_data_init is ../x.c, and separately in one where its body file is ../x.c, extracting raises the extractor’s error naming IMPL-safe_data_init, and x.c is not opened.

Test Specification: An Implementation's apiHash covers its declaration and the comment above it. SEG-TS-030
nodeid: tests/specification/test_content_extractor.py::test_an_apihash_covers_a_declaration_and_the_comment_above_it
verifies: SEG-SREQ-163
is reported by: SEG-OUT-91D746949065

The apiHash of IMPL-safe_data_init equals the SHA-256 of lines 247 to 263 of include/safe_data/safe_data.h: from the opening of its documentation comment through the line holding the semicolon that ends the declaration. That of IMPL-safe_data_commit equals the digest of lines 378 to 399, the guard line above the opening of its comment lying outside.

Test Specification: A macro's apiHash covers its definition head and the comment above it. SEG-TS-031
nodeid: tests/specification/test_content_extractor.py::test_a_macros_apihash_covers_its_definition_head_and_its_comment
verifies: SEG-SREQ-164
is reported by: SEG-OUT-448F24CE1FCD

The apiHash of IMPL-SAFE_CONTAINER_DEFINE equals the SHA-256 of lines 477 to 498 of include/safe_data/safe_data.h, from the opening of its comment through the #define line, and that of IMPL-SAFE_SECTION equals the digest of lines 595 to 633, the guard line between its comment and its #define lying inside.

Test Specification: An Implementation's bodyHash covers the lines its body occupies in the source. SEG-TS-032
nodeid: tests/specification/test_content_extractor.py::test_a_bodyhash_covers_the_located_body
verifies: SEG-SREQ-165
is reported by: SEG-OUT-961B8C94F758

The bodyHash of IMPL-safe_data_init equals the SHA-256 of lines 224 to 237 of src/safe_data.c, the run its member’s location gives, and that of IMPL-SAFE_CONTAINER_DEFINE equals the digest of lines 498 to 506 of include/safe_data/safe_data.h.

Test Specification: A TestSpecification's specHash covers the documentation comment above the test. SEG-TS-033
nodeid: tests/specification/test_content_extractor.py::test_a_spechash_covers_the_tests_documentation_comment
verifies: SEG-SREQ-166
is reported by: SEG-OUT-1AB53F697DAF

The specHash of TC_SAFE_DATA_INIT_AND_VERIFY equals the SHA-256 of lines 33 to 43 of tests/safe_data/src/main.c: the comment carrying its @testid, @verifies and @active tags, from its opening to its closing line, and not the ZTEST line that follows.

Test Specification: A TestSpecification's implHash covers the lines the test's body occupies. SEG-TS-034
nodeid: tests/specification/test_content_extractor.py::test_an_implhash_covers_the_tests_located_body
verifies: SEG-SREQ-167
is reported by: SEG-OUT-CA1ACF7196C3

The implHash of TC_SAFE_DATA_INIT_AND_VERIFY equals the SHA-256 of lines 44 to 48 of tests/safe_data/src/main.c, from the ZTEST line through the closing brace, the run its member’s location gives.

Test Specification: Every span is a run of whole lines, each with its terminator. SEG-TS-035
nodeid: tests/specification/test_content_extractor.py::test_spans_are_whole_lines_with_their_terminators
verifies: SEG-SREQ-168
is reported by: SEG-OUT-A48E1C3C0D81

The apiHash of IMPL-safe_data_init equals the SHA-256 of lines 247 to 263 of the header including the line feed that ends line 263, and equals neither the digest of that run without its final line feed nor that of the run starting one byte after its first line’s start. In a copy of src/safe_data.c whose every line ends in CR LF, the bodyHash of IMPL-safe_data_init equals the digest of lines 224 to 237 with their CR LF terminators.

Test Specification: A missing documentation comment is an error for its node, never a hash over another comment. SEG-TS-036
nodeid: tests/specification/test_content_extractor.py::test_a_missing_documentation_comment_is_an_error_for_its_node
verifies: SEG-SREQ-169
is reported by: SEG-OUT-B4D3BD78BEF6

In a copy of the header where the lines of the comment above safe_data_init are blank, with every line number unchanged, extracting raises the extractor’s error naming IMPL-safe_data_init.

Test Specification: No hashed byte comes from the Doxygen output's text. SEG-TS-037
nodeid: tests/specification/test_content_extractor.py::test_no_hashed_byte_comes_from_the_doxygen_output_text
verifies: SEG-SREQ-170
is reported by: SEG-OUT-E6ED1BF634D1

The apiHash of IMPL-safe_data_init, IMPL-SAFE_CONTAINER_DEFINE and IMPL-SAFE_SECTION and the specHash of TC_SAFE_DATA_INIT_AND_VERIFY each equal the SHA-256 of source lines and none equals the SHA-256 of the UTF-8 text of that member’s brief description in the Doxygen output, raw or with its whitespace collapsed. In a copy of the Doxygen output where the text of every description element is replaced by one word, every hash of every record is unchanged.

Test Specification: An Implementation's api anchor names the declaration file and the symbol. SEG-TS-038
nodeid: tests/specification/test_content_extractor.py::test_an_implementations_api_anchor_names_the_declaration_file_and_symbol
verifies: SEG-SREQ-171
is reported by: SEG-OUT-6FE2E622417D

For each of the 12 implementations the apiHash anchor names the repository “toolbox”, a name and not a path, the file holding the symbol’s declaration as its member’s location gives it (include/safe_data/safe_data.h for safe_data_init), and the locator symbol:<symbol>#api, for safe_data_init symbol:safe_data_init#api.

Test Specification: An Implementation's body anchor names the body file and the symbol. SEG-TS-039
nodeid: tests/specification/test_content_extractor.py::test_an_implementations_body_anchor_names_the_body_file_and_symbol
verifies: SEG-SREQ-172
is reported by: SEG-OUT-E36505EA9E6F

For each of the 12 implementations the bodyHash anchor names the file holding the symbol’s body as its member’s location gives it (src/safe_data.c for safe_data_init, include/safe_data/safe_data.h for the macro SAFE_CONTAINER_DEFINE) and the locator symbol:<symbol>#body.

Test Specification: A TestSpecification's spec anchor names the test file and the function. SEG-TS-040
nodeid: tests/specification/test_content_extractor.py::test_a_test_specifications_spec_anchor_names_the_test_file_and_function
verifies: SEG-SREQ-173
is reported by: SEG-OUT-FE8C57A8291E

For each of the 19 test specifications the specHash anchor names the repository “toolbox”, the file tests/safe_data/src/main.c, and the locator symbol:<function>#spec, for test_init_and_verify symbol:test_init_and_verify#spec.

Test Specification: A TestSpecification's impl anchor names the test file and the function. SEG-TS-041
nodeid: tests/specification/test_content_extractor.py::test_a_test_specifications_impl_anchor_names_the_test_file_and_function
verifies: SEG-SREQ-174
is reported by: SEG-OUT-86427C742EA9

For each of the 19 test specifications the implHash anchor names the file tests/safe_data/src/main.c and the locator symbol:<function>#impl, for test_init_and_verify symbol:test_init_and_verify#impl.

Test Specification: A location whose source line lacks its symbol is an error for its node. SEG-TS-042
nodeid: tests/specification/test_content_extractor.py::test_a_location_that_does_not_name_its_symbol_is_an_error_for_its_node
verifies: SEG-SREQ-175
is reported by: SEG-OUT-DD4E15B46E50

In a copy of the Doxygen output where the declaration line of safe_data_init is that of safe_data_verify, and separately in one where its body start and end are those of safe_data_verify, extracting raises the extractor’s error naming IMPL-safe_data_init, although each run of lines is well formed.

Test Specification: The test-specification inputs are loaded, resolved against the file. SEG-TS-043
nodeid: tests/specification/test_content_extractor.py::test_the_specification_inputs_are_loaded_relative_to_the_file
verifies: SEG-SREQ-195
is reported by: SEG-OUT-0CB8B79DF4A3

Loading a configuration file in a subdirectory whose producer block names specifications with the export “needs/test-specification/needs.json” and the Doxygen output “xml/dox-testspec” yields specification inputs whose export and Doxygen output are that subdirectory joined with each relative path.

Test Specification: The implementation inputs are loaded, resolved against the file. SEG-TS-044
nodeid: tests/specification/test_content_extractor.py::test_the_implementation_inputs_are_loaded_relative_to_the_file
verifies: SEG-SREQ-196
is reported by: SEG-OUT-09DDA4E11198

Loading a configuration file in a subdirectory whose producer block names implementations with the export “needs/api-traceability/needs.json” and the Doxygen output “xml/dox-api” yields implementation inputs whose export and Doxygen output are that subdirectory joined with each relative path.

tests/specification/test_content_extractor_need_ids.py

Test Specification: With a list of need identifiers and no need types, a need is read when it is listed. SEG-TS-425
nodeid: tests/specification/test_content_extractor_need_ids.py::test_a_list_of_need_identifiers_alone_selects_the_needs_it_names
verifies: SEG-SREQ-358
is reported by: SEG-OUT-030B96CD250F

The implementation export holds I-ONE, I-TWO and I-THREE of the type impl and I-OTHER of the type other, each over a macro that the Doxygen output locates. The list I-ONE, I-OTHER is configured and no need types are. The extractor supplies a record for I-ONE and for I-OTHER, and for no other need. Each of the two has one Implements edge, and no other need has one. The type of a listed need does not matter when no types are configured.

Test Specification: With need types and no list of need identifiers, a need is read when its type is one of them. SEG-TS-426
nodeid: tests/specification/test_content_extractor_need_ids.py::test_need_types_alone_select_the_needs_of_those_types
verifies: SEG-SREQ-275
is reported by: SEG-OUT-EBFCA3F8778D

The implementation export holds I-ONE, I-TWO and I-THREE of the type impl and I-OTHER of the type other. The types {impl} are configured and no list is. The extractor supplies a record for each of the three needs of the type impl and none for I-OTHER. With the types {other} it supplies one for I-OTHER and for no other need. With the types {impl, other} it supplies all four.

Test Specification: With need types and a list of need identifiers, a need is read when it is listed and typed. SEG-TS-427
nodeid: tests/specification/test_content_extractor_need_ids.py::test_a_need_must_be_listed_and_of_a_configured_type_to_be_read
verifies: SEG-SREQ-358
is reported by: SEG-OUT-52C4B1188E94

The implementation export holds I-ONE, I-TWO and I-THREE of the type impl and I-OTHER of the type other. The types {impl} and the list I-ONE, I-TWO are configured. The extractor supplies a record for I-ONE and I-TWO. It supplies none for I-THREE, which has the type but is not listed, and none for I-OTHER, which has neither. With the types {impl, other} and the list I-ONE, I-OTHER it supplies I-ONE and I-OTHER, and not I-TWO.

Test Specification: While neither need types nor a list of need identifiers is configured, every need is read. SEG-TS-428
nodeid: tests/specification/test_content_extractor_need_ids.py::test_without_types_and_without_a_list_every_need_is_read
verifies: SEG-SREQ-276
is reported by: SEG-OUT-E1EA470D5B11

The implementation export holds I-ONE, I-TWO and I-THREE of the type impl and I-OTHER of the type other. The configuration names no need types and no list. The extractor supplies a record for each of the four needs, and one Implements edge from each. A configuration whose list is null, which is the same as no list, supplies the same four.

Test Specification: A listed need identifier that names no need of the export is refused, naming it. SEG-TS-429
nodeid: tests/specification/test_content_extractor_need_ids.py::test_a_listed_identifier_that_names_no_need_is_refused
verifies: SEG-SREQ-360
is reported by: SEG-OUT-6A2F33F628BC

The implementation export holds I-ONE, I-TWO, I-THREE and I-OTHER. The list I-ONE, I-GONE is configured. Reading the export raises one error from the extractor. The error names I-GONE and does not name I-ONE. A control that lists I-ONE and I-TWO is read without an error.

Test Specification: A listed need identifier whose need the configured types do not admit is refused. SEG-TS-430
nodeid: tests/specification/test_content_extractor_need_ids.py::test_a_listed_identifier_of_a_need_of_another_type_is_refused
verifies: SEG-SREQ-360
is reported by: SEG-OUT-7B4D416CBE1C

The implementation export holds I-ONE and I-TWO of the type impl, and I-OTHER of the type other. The types {impl} and the list I-ONE, I-OTHER are configured. Reading the export raises one error from the extractor. The error names I-OTHER and does not name I-ONE. A control that configures the types {impl, other} with the same list is read without an error, and the extractor supplies I-ONE and I-OTHER.

Test Specification: Every listed need identifier that names no admitted need is named in one error. SEG-TS-431
nodeid: tests/specification/test_content_extractor_need_ids.py::test_every_listed_identifier_that_names_no_need_is_named_in_one_error
verifies: SEG-SREQ-360
is reported by: SEG-OUT-D593DB60B114

The implementation export holds I-ONE, I-TWO and I-THREE of the type impl and I-OTHER of the type other. The types {impl} and the list I-ONE, I-GONE-A, I-OTHER, I-GONE-B are configured: two identifiers that name no need and one that names a need of another type. Reading the export raises one error from the extractor. The error names I-GONE-A, I-OTHER and I-GONE-B, and does not name I-ONE. It names each of the three once.

Test Specification: A need that is not in the list of need identifiers is not refused, whatever its fault. SEG-TS-432
nodeid: tests/specification/test_content_extractor_need_ids.py::test_a_need_outside_the_list_is_not_refused
verifies: SEG-SREQ-374
is reported by: SEG-OUT-47A07FC4DE02

The implementation export holds I-ONE and I-TWO, which the Doxygen output locates, and needs of the type impl that the extractor cannot use. In the first export they are I-NO-TITLE, which has no title, and I-BAD-LINKS, whose links are a text and not a list. In the second export the need is I-NO-MACRO, whose macro is in no member of the output. Without a list, reading each export raises an error that names its faulty needs. With the list I-ONE, I-TWO the extractor supplies a record for the two needs and raises no error, for each export. With a list that holds I-ONE and one faulty need it raises an error that names that need, and does not name the other faulty need of the export: a need that is listed is still refused for its fault.

tests/specification/test_content_extractor_no_body.py

Test Specification: A member whose body ends at -1 is an error for its node, and the node is not hashed. SEG-TS-361
nodeid: tests/specification/test_content_extractor_no_body.py::test_a_member_with_no_recorded_body_is_an_error_for_its_node
verifies: SEG-SREQ-350
is reported by: SEG-OUT-E3C585B3680B

In a copy of the Doxygen output of the implementations where the location of safe_data_init gives the end of the body as -1, extracting raises the extractor’s error. The message names IMP-safe_data_init, the need whose member records no body, and the stream gives no record for it. The same holds for a copy where both the start and the end of the body are -1. In a copy of the Doxygen output of the test specifications where the location of the test function of TC_SAFE_DATA_INIT_AND_VERIFY gives the end of the body as -1, extracting raises the error and the message names that need. The extraction over the fixture as frozen supplies all 12 Implementation records, so the rule does not refuse a member that records a body.

tests/specification/test_content_extractor_path_root.py

Test Specification: A path root is put in front of the path the Doxygen output names, and the file is read there. SEG-TS-379
nodeid: tests/specification/test_content_extractor_path_root.py::test_a_path_root_is_put_in_front_of_the_path_the_doxygen_output_names
verifies: SEG-SREQ-349
is reported by: SEG-OUT-3DCEEDA81BA4

The Doxygen output names the macro QUEUE_MAKE in the file zephyr/queue.h. The repository holds the header at include/zephyr/queue.h and holds no file at zephyr/queue.h. No path prefix is configured. The header has a documentation comment with a satisfies tag, then a macro of five lines with continuation lines. With the path root include/ configured, the extractor supplies the record of the need I-QUEUE. Its apiHash equals the SHA-256 of the lines from the opener of the comment to the first line of the macro. Its bodyHash equals the SHA-256 of the five lines of the macro, to the last continuation line.

Test Specification: With a prefix and a path root, the prefix is removed first and the root is put in front. SEG-TS-380
nodeid: tests/specification/test_content_extractor_path_root.py::test_the_prefix_is_removed_first_and_then_the_path_root_is_put_in_front
verifies: SEG-SREQ-349
is reported by: SEG-OUT-E7113F042347

The Doxygen output names the macro QUEUE_MAKE in the file ext/zephyr/queue.h. The prefix ext/ and the path root include/ are configured. The repository holds the header at include/zephyr/queue.h. It also holds a decoy header, with other text, at each of three paths: zephyr/queue.h, ext/zephyr/queue.h and include/ext/zephyr/queue.h. The extractor supplies the record of I-QUEUE, and its apiHash and bodyHash equal the SHA-256 of the lines of the header at include/zephyr/queue.h, found as in the first specification.

Test Specification: A path root with a trailing separator and one without it give the same record. SEG-TS-381
nodeid: tests/specification/test_content_extractor_path_root.py::test_a_trailing_separator_of_the_path_root_is_optional
verifies: SEG-SREQ-349
is reported by: SEG-OUT-90C1625ADFA9

The Doxygen output names the macro QUEUE_MAKE in the file zephyr/queue.h, and the repository holds the header at include/zephyr/queue.h. The extractor is run twice, once with the path root include/ and once with the path root include. Each run supplies the record of I-QUEUE. The two records have the same digests and the same anchors, and the path of each anchor is include/zephyr/queue.h, with no doubled separator.

Test Specification: An empty path root and a null path root are the same as no path root. SEG-TS-382
nodeid: tests/specification/test_content_extractor_path_root.py::test_an_empty_path_root_is_the_same_as_none
verifies: SEG-SREQ-349

The Doxygen output names the macro QUEUE_MAKE in the file include/zephyr/queue.h, and the repository holds the header at that path. With no path root given, the extractor supplies the record of I-QUEUE. With the path root given as the empty text, or as null, it supplies a record with the same digests and the same anchors, and the path of each anchor is include/zephyr/queue.h. No separator is put in front of the path.

Test Specification: A path root that is absolute or leads outside the repository is an error for the node. SEG-TS-383
nodeid: tests/specification/test_content_extractor_path_root.py::test_a_path_root_that_leads_outside_the_repository_is_an_error_for_the_node
verifies: SEG-SREQ-162

The repository is a directory that holds a header at zephyr/queue.h. Next to it is a second directory, outside the repository, that holds a header at the same path. The Doxygen output names the macro QUEUE_MAKE in the file zephyr/queue.h. With no path root the extractor supplies the record of I-QUEUE. The path root then names the second directory in one of three ways: as a relative path that begins with .., as a relative path that begins inside the repository and climbs out with .., or as an absolute path. In each case taking the records raises a source error that names the need I-QUEUE. The header in the second directory is not opened.

Test Specification: The directory of the test module is compared with the path after the root is put in front. SEG-TS-384
nodeid: tests/specification/test_content_extractor_path_root.py::test_the_test_module_is_compared_with_the_path_after_the_root_is_put_in_front
verifies: SEG-SREQ-278
is reported by: SEG-OUT-D87B99E4E255

The test source of the repository is in three files: tests/mod_a/src/main.c, tests/mod_ab/src/main.c and tests/mod_b/src/main.c. Each has the test test_shared with its own comment. The Doxygen output names the test in the files mod_a/src/main.c, mod_ab/src/main.c and mod_b/src/main.c. The need T-SHARED names the test module tests/mod_a. With the path root tests/ the extractor supplies the record of T-SHARED, and its specHash and implHash equal the SHA-256 of the comment and of the test in tests/mod_a/src/main.c. With no path root the extractor raises a source error that names T-SHARED, because none of the three paths lies within tests/mod_a.

Test Specification: A path root on the specifications block locates a test by the joined path. SEG-TS-385
nodeid: tests/specification/test_content_extractor_path_root.py::test_a_path_root_on_the_specifications_block_locates_a_test
verifies: SEG-SREQ-349
is reported by: SEG-OUT-BB7F900529EC

The Doxygen output names the test test_shared in the file mod_a/src/main.c, and the repository holds the test source at tests/mod_a/src/main.c only. The need T-SHARED names no test module. With the path root tests/ configured on the specifications block, the extractor supplies the record of T-SHARED. Its specHash equals the SHA-256 of the comment of the test, from its opener to its closer, and its implHash equals the SHA-256 of the lines of the test, from the line that names it to its closing brace.

Test Specification: An anchor names the repository and the joined path inside it. SEG-TS-386
nodeid: tests/specification/test_content_extractor_path_root.py::test_an_anchor_names_the_path_inside_the_repository_after_the_root_is_put_in_front
verifies: SEG-SREQ-281
is reported by: SEG-OUT-12CFB3D291AB

With the path root include/ and the prefix ext/, the Doxygen output names the macro QUEUE_MAKE in ext/zephyr/queue.h, and the repository named lib holds the header at include/zephyr/queue.h. Both anchors of I-QUEUE, the one of the apiHash and the one of the bodyHash, name the repository lib and the path include/zephyr/queue.h. With the path root tests/, the test test_shared that the Doxygen output names in mod_a/src/main.c gives anchors for specHash and implHash that name the repository suite and the path tests/mod_a/src/main.c.

Test Specification: A path root does not change the errors of the prefix. SEG-TS-387
nodeid: tests/specification/test_content_extractor_path_root.py::test_the_prefix_rules_still_hold_when_a_path_root_is_configured
verifies: SEG-SREQ-280
is reported by: SEG-OUT-4EF88EC9F8DE

The repository holds the header at include/zephyr/queue.h and a decoy at zephyr/queue.h. The path root include/ is configured. With the prefix ext/ and the Doxygen output naming the macro in zephyr/queue.h, which does not begin with the prefix, taking the records raises a source error that names I-QUEUE and the prefix. With the prefix ext and the path ext/zephyr/queue.h, whose remainder begins with a separator, the error names I-QUEUE and the path. With the whole path as the prefix, which leaves nothing, the error names I-QUEUE. In each case the root is not put in front of the unusable remainder.

Test Specification: The bytes behind a hash are the lines of the joined path. SEG-TS-388
nodeid: tests/specification/test_content_extractor_path_root.py::test_the_bytes_behind_a_hash_are_read_from_the_joined_path
is reported by: SEG-OUT-22D92C8DD826

The Doxygen output names the macro QUEUE_MAKE in the file zephyr/queue.h, and the repository holds the header at include/zephyr/queue.h only. With the path root include/ configured, the extractor supplies the record of I-QUEUE. Asking the content extractor, and asking the composed producer that holds it, for the bytes behind apiHash gives the lines of the header from the opener of the comment to the first line of the macro. Asking for the bytes behind bodyHash gives the five lines of the macro. Each answer equals the lines that the test cuts from its own header, and its SHA-256 is the digest in the anchor of the record.

tests/specification/test_content_extractor_prefix_and_module.py

Test Specification: A path whose remainder after the prefix is empty or begins with a separator is an error. SEG-TS-327
nodeid: tests/specification/test_content_extractor_prefix_and_module.py::test_a_path_whose_remainder_after_the_prefix_is_not_a_relative_path_is_an_error
verifies: SEG-SREQ-342
is reported by: SEG-OUT-A26DE01522BA

The Doxygen tree names test_alpha in the file inc/tests/mod_a/src/main.c. With the prefix inc/ configured, the extractor locates T-ALPHA. With the prefix inc configured, the remainder is /tests/mod_a/src/main.c. With the whole path inc/tests/mod_a/src/main.c as the prefix, the remainder is empty. In each of those two cases taking the records raises a source error that names T-ALPHA, the path inc/tests/mod_a/src/main.c and the prefix. The file tests/mod_a/src/main.c of the repository is not opened.

Test Specification: case sync names every node whose path does not fit its prefix, with the path and the prefix. SEG-TS-328
nodeid: tests/specification/test_content_extractor_prefix_and_module.py::test_case_sync_names_every_node_whose_path_does_not_fit_the_prefix
verifies: SEG-SREQ-342
is reported by: SEG-OUT-B4AC75A61F26

The configuration gives the test stream the prefix inc and the implementation stream the prefix libsrc, each with no trailing separator. The paths of the Doxygen trees are inc/tests/mod_a/src/main.c, inc/tests/mod_b/src/main.c and libsrc/include/lib.h. Running case sync exits with status 2. Its output names the four needs T-ALPHA, T-GAMMA, I-LIB-MAX and I-LIB-MIN, each on a line of its own. The line of each holds the path of its node and the prefix of its stream. A control with the prefixes inc/ and libsrc/ exits with status 0.

Test Specification: A test module that is absent, null or empty text names no test module. SEG-TS-329
nodeid: tests/specification/test_content_extractor_prefix_and_module.py::test_a_test_module_that_is_absent_null_or_empty_names_no_module
verifies: SEG-SREQ-343
is reported by: SEG-OUT-7ED98046C961

The Doxygen tree names test_alpha once and test_shared in three directories. For each of the three forms, a need with no test_module key, a need whose test_module is null and a need whose test_module is the empty text, the extractor locates the need that names test_alpha, with no narrowing. It refuses the need that names test_shared with an error that names that need, and the error is the same for the three forms.

Test Specification: A test module that is present and is neither null nor text is an error for that need. SEG-TS-330
nodeid: tests/specification/test_content_extractor_prefix_and_module.py::test_a_test_module_that_is_not_text_is_an_error_for_that_need
verifies: SEG-SREQ-344

The Doxygen tree names test_alpha in one file. The test-case export holds T-BAD, a need that names test_alpha and whose test_module is a number, a list, an object or a boolean, and T-GOOD, a need whose module is the text tests/mod_b. For each value, the extractor supplies the record of T-GOOD and then raises a source error that names T-BAD and does not name T-GOOD. A control whose test_module is the text tests/mod_a supplies a record for T-BAD.

Test Specification: A shared symbol with a prefix that leaves no relative path gets the prefix error. SEG-TS-334
nodeid: tests/specification/test_content_extractor_prefix_and_module.py::test_a_shared_symbol_with_a_prefix_that_leaves_no_path_gets_the_prefix_error
verifies: SEG-SREQ-342
is reported by: SEG-OUT-6B702CA83F5A

The Doxygen tree names test_shared in three files, one in each of the directories tests/mod_a, tests/mod_ab and tests/mod_b. The need T-SHARED names the test module tests/mod_a. With the prefix tests configured, the remainder of each path begins with a separator. With the whole path tests/mod_a/src/main.c as the prefix, the remainder of that path is empty. In each case taking the records raises a source error that names T-SHARED, a path of the tree and the prefix. The error does not say how many members lie within the test module.

tests/specification/test_content_repository_reads.py

Test Specification: case sync performs no write in the content repository, not even to its index. SEG-TS-216
nodeid: tests/specification/test_content_repository_reads.py::test_case_sync_writes_nothing_in_the_content_repository
verifies: SEG-SREQ-115
is reported by: SEG-OUT-429B2970E96A

A content repository has an out-of-date index and a change that is not committed. Running case sync over it exits with status 0. Every file under the .git directory of the repository is the same after the command. The same holds for every file of the working tree.

Test Specification: edge affirm performs no write in the content repository, not even to its index. SEG-TS-217
nodeid: tests/specification/test_content_repository_reads.py::test_edge_affirm_writes_nothing_in_the_content_repository
verifies: SEG-SREQ-115
is reported by: SEG-OUT-2E3572398DEB

A content repository has an out-of-date index and a change that is not committed. The change is in a file that the edge does not anchor. Running edge affirm over it exits with status 0. Every file under the .git directory of the repository is the same after the command. The same holds for every file of the working tree.

tests/specification/test_dangling_edge.py

Test Specification: The graph builder reports a never-affirmed edge its record reports as broken as broken. SEG-TS-104
nodeid: tests/specification/test_dangling_edge.py::test_the_builder_keeps_a_broken_edge_that_was_never_affirmed
verifies: SEG-SREQ-016
is reported by: SEG-OUT-EDFFE42FD6A7

The builder gets two requirements and a Refines edge between them. The record of the edge carries no hash and claims the state broken. The built graph reports the edge as broken, and it still carries no hash.

Test Specification: The graph builder reports every other never-affirmed edge as pending. SEG-TS-105
nodeid: tests/specification/test_dangling_edge.py::test_the_builder_still_resets_other_unaffirmed_edges_to_pending
verifies: SEG-SREQ-016
is reported by: SEG-OUT-585784A060FC

The builder gets three requirements and three edges. A Refines edge carries no hash and claims the state directly outdated. A second Refines edge is pending. A third carries the hash it was affirmed against and the state active. The built graph reports the first two as pending, and the third as active with its hash.

Test Specification: A never-affirmed edge to an absent node is broken in the graph built from the derivation. SEG-TS-106
nodeid: tests/specification/test_dangling_edge.py::test_a_never_affirmed_edge_to_an_absent_node_is_broken_after_the_derivation_and_the_build
verifies: SEG-SREQ-016
is reported by: SEG-OUT-46472EF10D37

The current records hold one requirement and a Refines edge from it to a requirement that the records lack. The recorded records are empty. The suspect detector derives the edge and the builder builds the derived records. The built graph reports the edge as broken.

Test Specification: A never-affirmed strong edge to an absent node is a broken row and gives exit status 1. SEG-TS-107
nodeid: tests/specification/test_dangling_edge.py::test_graph_status_lists_a_dangling_strong_edge_as_broken_and_exits_1
verifies: SEG-SREQ-083
is reported by: SEG-OUT-CF38670990F8

The current stream is a store with a Verifies edge and an Implements edge between present nodes, and a second Implements edge from an implementation the store does not hold. Nothing is affirmed. Graph status lists the second Implements edge as broken, lists the other two edges as pending, and exits with status 1. The same store without the second Implements edge exits with status 0 and lists two pending edges.

Test Specification: An affirmed strong edge whose endpoint leaves the stream is a broken row and gives exit 1. SEG-TS-108
nodeid: tests/specification/test_dangling_edge.py::test_graph_status_lists_an_affirmed_edge_whose_endpoint_left_as_broken
verifies: SEG-SREQ-083
is reported by: SEG-OUT-A3C3EEA8674A

One Verifies edge is affirmed over a store. The store is then changed so that it no longer holds the requirement the edge ends at. Graph status lists the Verifies edge as broken and exits with status 1.

Test Specification: A Confirms edge to an absent specification gives exit status 1 and one dangling count. SEG-TS-109
nodeid: tests/specification/test_dangling_edge.py::test_graph_status_counts_a_dangling_confirms_edge_and_exits_1
verifies: SEG-SREQ-083
is reported by: SEG-OUT-DC545384C512

The current stream is a store with one outcome recorded at the revision of the implementation repository, its Confirms and Witnesses edges, and a second Confirms edge to a specification the store does not hold. Graph status runs with that revision. It exits with status 1. Its evidence section counts one outcome at the current revision, no outcome at another revision and one dangling edge.

Test Specification: Never-affirmed strong edges between present nodes are pending rows and give exit status 0. SEG-TS-110
nodeid: tests/specification/test_dangling_edge.py::test_graph_status_lists_pending_strong_edges_as_pending_and_exits_0
verifies: SEG-SREQ-082
is reported by: SEG-OUT-D432132EE89C

The current stream is a store with an outcome and its evidence edges, one Verifies edge and one Implements edge, all endpoints present, nothing affirmed, and a clean implementation repository that the configuration names. Graph status lists both strong edges as pending and exits with status 0.

Test Specification: The gate lists a broken strong edge as not ready, with the detail broken. SEG-TS-111
nodeid: tests/specification/test_dangling_edge.py::test_the_gate_names_a_broken_strong_edge_as_broken
verifies: SEG-SREQ-016
is reported by: SEG-OUT-1D8C77C7B323

The built graph holds two requirements and a Refines edge between them that carries no hash and whose record reports the state broken. The package gate lists that edge among its unready edges, in the state broken, and gives its finding the detail broken. The report is blocked.

Test Specification: Case sync stores a dangling edge as broken, and as pending once the node returns. SEG-TS-112
nodeid: tests/specification/test_dangling_edge.py::test_case_sync_writes_a_dangling_edge_as_broken_and_writes_pending_when_the_node_returns
verifies: SEG-SREQ-072
is reported by: SEG-OUT-E81994F5E964

The current stream is a store whose Implements edge starts at an implementation the store does not hold. Case sync exits with status 0 and the stored edge document holds that edge in the state broken, with no hash. The store then gains that implementation. The next case sync exits with status 0 and the stored edge is pending, with no hash.

tests/specification/test_drift.py

Test Specification: Every edge touching an absent node is broken. SEG-TS-010
nodeid: tests/specification/test_drift.py::test_every_edge_touching_an_absent_node_is_broken
verifies: SEG-SREQ-017
is reported by: SEG-OUT-0FDAD200700B

Deriving edge states from a current record stream whose declared source or target node is absent from that stream reports the edge as broken — for a strong edge whose recorded affirmation no longer has both endpoints present, and equally for an edge of a kind that carries no suspicion, such as an outcome’s confirms edge to a specification that is not in the current stream. Absence of an endpoint takes precedence over every other derived state.

tests/specification/test_edge_affirm_unreadable_repository.py

Test Specification: edge affirm refuses, naming the repository and the reason, when it cannot read it. SEG-TS-345
nodeid: tests/specification/test_edge_affirm_unreadable_repository.py::test_edge_affirm_refuses_when_the_repository_cannot_be_read
verifies: SEG-SREQ-363

The content repository of both endpoints cannot be read. It is made so in five ways, and each is a variant: its objects are removed, a stand-in git fails every call, the configuration maps it to a directory that holds no repository, the configuration maps it to a path that does not exist, and no git is on the path. No revision is given, so edge affirm has to discover one. Running edge affirm for the edge from REQ-C to REQ-A exits with status 2. A line of the output names the repository as the configuration names it, and gives a reason. For the path that does not exist, the reason says that it does not exist. The output holds no traceback.

Test Specification: A refused edge affirm writes no review event, no edge record and no node record. SEG-TS-346
nodeid: tests/specification/test_edge_affirm_unreadable_repository.py::test_a_refused_edge_affirm_writes_nothing
verifies: SEG-SREQ-364

A case is empty, and the content repository cannot be read, in each of the five ways of the variants. Running edge affirm for the edge from REQ-C to REQ-A, with no revision given, exits with status 2. Every file of the case has the same bytes after the command as before it, and the case holds no review event, no edge record and no node record.

Test Specification: When one endpoint is readable and one is not, edge affirm refuses and writes nothing. SEG-TS-347
nodeid: tests/specification/test_edge_affirm_unreadable_repository.py::test_a_refused_edge_affirm_over_two_repositories_writes_nothing
verifies: SEG-SREQ-364

An implementation is in one repository and the requirement that it implements is in another. A first edge of the same kind is affirmed, so the run shows that the two repositories can be read. Then the repository of the requirement is made unreadable, or the repository of the implementation is. The repository is made unreadable by the removal of its objects, or by a stand-in git that fails every call that runs in it and passes every other. Running edge affirm for the second edge, with no revision given, exits with status 2 and names the repository that cannot be read. Every file of the case has the same bytes after the command as before it. The other repository, the readable one, is not named as the one that cannot be read.

Test Specification: A given revision is neither discovered nor checked, so edge affirm goes on. SEG-TS-348
nodeid: tests/specification/test_edge_affirm_unreadable_repository.py::test_edge_affirm_with_a_given_revision_reads_nothing_and_affirms
verifies: SEG-SREQ-109

The content repository cannot be read, in each of the five ways of the variants, and a case holds no extraction revision. A revision is given on the command line. Running edge affirm for the edge from REQ-C to REQ-A exits with status 0 and prints the affirmed line for the edge. It writes the node records of the two endpoints, and neither carries an extraction revision. The output has a line that names the repository and gives the number 2, the count of node records written without a revision. The output holds no traceback.

Test Specification: A held extraction revision stays when the repository cannot be read. SEG-TS-349
nodeid: tests/specification/test_edge_affirm_unreadable_repository.py::test_edge_affirm_with_a_given_revision_keeps_a_held_extraction_revision
verifies: SEG-SREQ-308

A case sync records the revision of the repository for every node. Then the repository is made unreadable, in each of the five ways of the variants. The content of the endpoints does not change. A revision is given on the command line. Running edge affirm for the edge from REQ-C to REQ-A exits with status 0. The node record of each endpoint keeps the revision that case sync recorded. The output has no line that reports node records without a revision for the repository.

tests/specification/test_edge_provenance_exit_and_writes.py

Test Specification: The exit status of edge show is the same for every history that the case can have. SEG-TS-283
nodeid: tests/specification/test_edge_provenance_exit_and_writes.py::test_the_history_never_changes_the_exit_status_of_edge_show
verifies: SEG-SREQ-303
is reported by: SEG-OUT-308B71CC5420

The same affirmed edge is shown in eight cases. The first has no history, as a control. The others have a commit that holds the event, a commit with a bad signature, an event that no commit holds, a case copied with no history, a case inside another repository, a repository that cannot be read, and a shallow history. In every case, edge show gives the same exit status as in the control, in text and in JSON. The status of the control is 0.

Test Specification: edge show performs no version-control write against the case, not even to its index. SEG-TS-284
nodeid: tests/specification/test_edge_provenance_exit_and_writes.py::test_edge_show_changes_nothing_in_a_case_repository
verifies: SEG-SREQ-116
is reported by: SEG-OUT-98ACD9776FDB

A case is a git repository with one committed event. The recorded modification time of every file of the case is changed, so the index of the repository is out of date. A plain git status writes a new index in such a repository. edge show runs, in text and in JSON, and exits with status 0. Every file under the .git directory of the case is the same after the command. The same holds for every file of the working tree. The last step is a control: a plain git status in the same repository changes a file under .git.

Test Specification: edge show performs no version-control write against a case that is a worktree. SEG-TS-285
nodeid: tests/specification/test_edge_provenance_exit_and_writes.py::test_edge_show_changes_nothing_in_a_case_that_is_a_worktree
verifies: SEG-SREQ-116
is reported by: SEG-OUT-E4C168398CE5

A case is a worktree of another repository, on a branch of its own, with one committed event. The recorded modification time of every file of the case is changed, so its index is out of date. The index of a worktree is under the .git directory of the first repository. edge show runs, in text and in JSON, and exits with status 0. Every file under the .git directory of the first repository is the same after the command. The same holds for every file of the worktree. The last step is a control: a plain git status in the worktree changes a file under that .git directory.

tests/specification/test_edge_provenance_identity.py

Test Specification: edge show reports the committer of the recording commit, with its date, as the identity. SEG-TS-260
nodeid: tests/specification/test_edge_provenance_identity.py::test_edge_show_reports_the_committer_and_the_commit_date_as_the_identity
verifies: SEG-SREQ-294
is reported by: SEG-OUT-89870284150E

A case is a git repository. One commit adds the review event of an edge. Its committer is Alice, with one commit date. Its author is Bob, with an earlier date. edge show exits with status 0, in text and in JSON. The JSON committer holds the name and the e-mail address of Alice, and a date that is the commit date as one instant. The text line “recorded in the case history as” holds the same name, the same e-mail address and the same instant. That line does not hold the e-mail address of Bob.

Test Specification: edge show reports the identifier and the subject line of the recording commit. SEG-TS-261
nodeid: tests/specification/test_edge_provenance_identity.py::test_edge_show_reports_the_identifier_and_the_subject_of_the_recording_commit
verifies: SEG-SREQ-299
is reported by: SEG-OUT-4B1404BC514F

A case is a git repository. One commit adds the review event of an edge. Its message has a subject line, an empty line and a body of two lines. edge show exits with status 0. The JSON commit is the identifier that git gives for the commit, and the JSON subject is the subject line alone. The text gives the first seven characters of the identifier at least. It gives the subject line in the same line as the identifier. It does not give the body.

Test Specification: edge show reports who made the last affirmation of each affirmed edge in a selection. SEG-TS-262
nodeid: tests/specification/test_edge_provenance_identity.py::test_edge_show_reports_every_affirmed_edge_of_a_selection_with_no_option
verifies: SEG-SREQ-293
is reported by: SEG-OUT-75944342CD38

Two edges are affirmed. Alice adds the event of the first edge in one commit. Bob adds the event of the second edge in a later commit. edge show runs with a selector of the edge kind and with no other option. It exits with status 0. Both edges are in the report. In text and in JSON, each edge names the commit that added its own event, and the committer of that commit, with the commit date. Neither edge names the commit or the committer of the other.

Test Specification: edge show reports the author and the author date when the author is not the committer. SEG-TS-263
nodeid: tests/specification/test_edge_provenance_identity.py::test_edge_show_reports_an_author_that_is_not_the_committer
verifies: SEG-SREQ-295
is reported by: SEG-OUT-BFF1FFD0016C

One commit adds the review event of an edge. Its committer is Alice, with one date. Its author is Bob, with an earlier date. edge show exits with status 0. The JSON author holds the name and the e-mail address of Bob and the author date as one instant. The JSON committer is Alice. The text has one line that starts with “author:”. That line holds the name, the e-mail address and the author date of Bob. The line “recorded in the case history as” still holds Alice.

Test Specification: edge show reports no author when the author of the recording commit is its committer. SEG-TS-264
nodeid: tests/specification/test_edge_provenance_identity.py::test_edge_show_reports_no_author_when_the_author_is_the_committer
verifies: SEG-SREQ-295
is reported by: SEG-OUT-102CD7745236

One commit adds the review event of an edge. The author and the committer are the same person, with the same date. edge show exits with status 0. The JSON has the author key, and its value is null. The JSON committer is that person. The text has no line that starts with “author:”. The line “recorded in the case history as” holds that person.

Test Specification: edge show reports each Signed-off-by line of the recording commit as written, in order. SEG-TS-265
nodeid: tests/specification/test_edge_provenance_identity.py::test_edge_show_reports_each_signed_off_by_line_as_written_in_order
verifies: SEG-SREQ-296
is reported by: SEG-OUT-421D2755EFFC

The message of the commit ends with two Signed-off-by lines. The first names Zed, and the second names Amy, so the order is not the order of the alphabet. edge show exits with status 0. The JSON list has two entries. They are the two values as written, with or without the word Signed-off-by, in the order of the message. The text has the two values in the same order, in lines that start with “signed-off-by:”.

Test Specification: edge show reports no Signed-off-by line when the message of the recording commit has none. SEG-TS-266
nodeid: tests/specification/test_edge_provenance_identity.py::test_edge_show_reports_no_signed_off_by_line_when_the_message_has_none
verifies: SEG-SREQ-296
is reported by: SEG-OUT-1F0ABE2EF41A

The message of the commit has a subject line and a body, and no Signed-off-by line. edge show exits with status 0. The JSON list of sign-offs is empty. The text has no line that starts with “signed-off-by:”.

Test Specification: edge show reports the committer as the commit records it and applies no mailmap. SEG-TS-286
nodeid: tests/specification/test_edge_provenance_identity.py::test_edge_show_reports_the_committer_as_recorded_and_applies_no_mailmap
verifies: SEG-SREQ-294
is reported by: SEG-OUT-9FAF3CF4646F

The case holds a .mailmap file, in the commit that adds the event. The file maps the e-mail address of Alice to another name and another address. The committer of the commit is Alice. edge show exits with status 0. The JSON committer has the name and the e-mail address that the commit records. The mapped name and the mapped address are not in the text or in the JSON.

Test Specification: edge show reports no author when the author is the committer, even if the dates differ. SEG-TS-291
nodeid: tests/specification/test_edge_provenance_identity.py::test_edge_show_reports_no_author_for_the_same_person_with_another_author_date
verifies: SEG-SREQ-295
is reported by: SEG-OUT-C4FAEA4572C2

One commit adds the review event of an edge. The author and the committer are the same person, by name and e-mail address. The author date is earlier than the commit date, as after an amend or a rebase. edge show exits with status 0. The JSON has the author key, and its value is null. The JSON committer is that person, with the commit date. The text has no line that starts with “author:”.

tests/specification/test_edge_provenance_no_answer.py

Test Specification: edge show reports an event that no commit holds as not committed, with no identity or time. SEG-TS-276
nodeid: tests/specification/test_edge_provenance_no_answer.py::test_edge_show_reports_a_draft_event_as_not_committed
verifies: SEG-SREQ-300
is reported by: SEG-OUT-AD4C14CA3C2B

A case is a git repository. Its only commit, by Carol, holds no review event. Then edge affirm records an event, and nobody commits it. edge show exits with status 0. The JSON status is notCommitted. The JSON commit, subject, committer and author are null. The text line “recorded in the case history” says not committed and holds no date. Neither the e-mail address of Carol nor her commit is anywhere in the output.

Test Specification: edge show reports a last affirmation that no commit holds as not committed. SEG-TS-277
nodeid: tests/specification/test_edge_provenance_no_answer.py::test_edge_show_does_not_fall_back_to_an_earlier_affirmation_of_a_draft_edge
verifies: SEG-SREQ-300
is reported by: SEG-OUT-AB0BEA2147F4

An edge is affirmed, and a commit by Alice adds its event. The text of the target requirement then changes, and the change is committed in the content repository. The edge is affirmed again, and nobody commits the second event. edge show exits with status 0. The JSON status is notCommitted, with no commit, no committer and no author. The text says not committed. The commit and the e-mail address of Alice are not in the output.

Test Specification: edge show reports the history as not available for a case that has no repository. SEG-TS-278
nodeid: tests/specification/test_edge_provenance_no_answer.py::test_edge_show_reports_the_history_of_a_case_with_no_repository_as_not_available
verifies: SEG-SREQ-301
is reported by: SEG-OUT-FEDB01B3AAAB

A case with one committed event is copied to another directory with no .git directory. edge show for the copy exits with status 0. The JSON status is unavailable, with no commit, committer and author. The text line “recorded in the case history” says not available and holds no date. Alice, the committer of the original, is not in the output. A control run on the original case names her.

Test Specification: edge show reports the history as not available for a case inside another repository. SEG-TS-279
nodeid: tests/specification/test_edge_provenance_no_answer.py::test_edge_show_never_answers_from_the_repository_that_holds_the_case
verifies: SEG-SREQ-301
is reported by: SEG-OUT-A7BB36E00416

The files of a case with one event are added, in one commit by Dan, to another repository. The case is a directory of that repository, and its root is not the top level of the repository. edge show for the case exits with status 0. The JSON status is unavailable, with no commit, committer and author. The text says not available. The commit of the enclosing repository and the e-mail address of Dan are not in the output.

Test Specification: edge show reports the history as not available when git cannot read the history. SEG-TS-280
nodeid: tests/specification/test_edge_provenance_no_answer.py::test_edge_show_reports_a_history_that_cannot_be_read_as_not_available
verifies: SEG-SREQ-301
is reported by: SEG-OUT-58A732BBD020

A case is a git repository, and a commit by Alice adds the event of an edge. The test deletes the object file of that commit from the repository. edge show exits with status 0, and it prints no traceback. The JSON status is unavailable, with no commit, committer and author. The text says not available. The e-mail address of Alice and the commit are not in the output.

Test Specification: edge show reads the history of a case that is a worktree of another repository. SEG-TS-281
nodeid: tests/specification/test_edge_provenance_no_answer.py::test_edge_show_reads_the_history_of_a_case_that_is_a_worktree_of_another_repository
verifies: SEG-SREQ-301
is reported by: SEG-OUT-27C5F698E738

A repository has one commit by Dan. A worktree of it, on a branch of its own, is the case. A commit by Carol starts the case. A commit by Alice adds the event of an edge. The top level of the worktree is the root of the case. edge show exits with status 0. The JSON status is found, with the commit of the worktree and Alice as the committer. The commit of the first repository and Dan are not in the output.

Test Specification: edge show reports that the history is shallow, beside the identity it reports. SEG-TS-282
nodeid: tests/specification/test_edge_provenance_no_answer.py::test_edge_show_reports_a_shallow_history_with_the_identity
verifies: SEG-SREQ-302
is reported by: SEG-OUT-B6157DA083B7

A case has three commits. Carol starts it. Alice adds the event of the first edge. Bob adds the event of the second edge. A clone of depth one holds only the commit by Bob. edge show on the clone exits with status 0. For each edge, the JSON status is found, with the commit by Bob and Bob as the committer, and the JSON shallow is true. In the text, the block of each edge holds the word shallow. A control run on the full history gives the commit by Alice for the first edge, with shallow false, and no block holds the word shallow.

Test Specification: edge show reports the provenance of the last affirmation of an edge that is not active. SEG-TS-288
nodeid: tests/specification/test_edge_provenance_no_answer.py::test_edge_show_reports_the_provenance_of_an_edge_that_is_no_longer_active
verifies: SEG-SREQ-293
is reported by: SEG-OUT-6C4DFC91AD34

An edge is affirmed, and one commit by Alice adds its event. The text of the target requirement then changes, so the edge is no longer active. edge show exits with status 0. The state of the edge in the report is not active. The JSON status is found, with the commit and Alice as the committer, and the text names the same commit and Alice.

Test Specification: edge show reports an event as not committed when the case repository has no commit. SEG-TS-289
nodeid: tests/specification/test_edge_provenance_no_answer.py::test_edge_show_reports_an_event_in_a_repository_with_no_commit_as_not_committed
verifies: SEG-SREQ-300
is reported by: SEG-OUT-4CB038F42C17

The case is a git repository with no commit. Then edge affirm records an event. edge show exits with status 0, and it prints no traceback. The JSON status is notCommitted, with no commit, subject, committer and author. The text line “recorded in the case history” says not committed and holds no date.

Test Specification: edge show gives a null signature and a null shallow flag when no commit is reported. SEG-TS-290
nodeid: tests/specification/test_edge_provenance_no_answer.py::test_edge_show_gives_no_signature_and_no_shallow_flag_without_a_commit
is reported by: SEG-OUT-7C3A8DCF5559

Two cases are built. In the first, the event is in the working tree and in no commit. In the second, the case was copied with no history. For each, edge show exits with status 0. The JSON status is notCommitted in the first case and unavailable in the second. In both, the JSON signature is null, and the JSON shallow flag is null. Both keys are present.

tests/specification/test_edge_provenance_recording_commit.py

Test Specification: edge show names the earliest commit that holds the event, not the one that made the file. SEG-TS-267
nodeid: tests/specification/test_edge_provenance_recording_commit.py::test_edge_show_names_the_earliest_commit_that_holds_the_event_not_the_one_that_made_the_file
verifies: SEG-SREQ-293
is reported by: SEG-OUT-69AE1D5EC81A

An early commit by Alice creates the file of review events, with the event of a first edge. A later commit by Bob adds the event of a second edge to the file. edge show for the second edge names the later commit and Bob, in text and in JSON. It does not name the early commit or Alice. edge show for the first edge names the early commit and Alice.

Test Specification: edge show names one commit as the recording commit of each event that the commit adds. SEG-TS-268
nodeid: tests/specification/test_edge_provenance_recording_commit.py::test_edge_show_names_one_commit_for_every_event_that_the_commit_adds
verifies: SEG-SREQ-293
is reported by: SEG-OUT-E24A286ABB5E

A commit by Carol starts the case. One run of edge affirm then records two events, for two edges. One commit by Alice adds both. edge show for each edge names that commit and Alice, in text and in JSON. It does not name the commit by Carol.

Test Specification: edge show matches the whole identifier of an event, not one that begins the same way. SEG-TS-269
nodeid: tests/specification/test_edge_provenance_recording_commit.py::test_edge_show_matches_the_whole_identifier_of_an_event
verifies: SEG-SREQ-293
is reported by: SEG-OUT-A352009CFC82

The file of review events holds two events. The identifier of one ends with /event/1 and the identifier of the other ends with /event/10, so the first is the beginning of the second. The store gives each event a number of six digits, so the test writes both identifiers into the file as text. An early commit by Alice adds the event /event/10, of the first edge. A later commit by Bob adds the event /event/1, of the second edge. edge show for the second edge names the later commit and Bob. edge show for the first edge names the early commit and Alice.

Test Specification: edge show does not name a commit only because its reason quotes the identifier of the event. SEG-TS-270
nodeid: tests/specification/test_edge_provenance_recording_commit.py::test_edge_show_does_not_take_a_reason_that_names_an_event_for_the_event
verifies: SEG-SREQ-293
is reported by: SEG-OUT-E2E8DEFCD160

The reason of the first event is free text, and it ends with the identifier of the second event. The second event does not exist yet. An early commit by Alice adds the first event. A later commit by Bob adds the second event. edge show for the second edge names the later commit and Bob. In text and in JSON it does not name the early commit. Only an event holds the identifier of the event as its own identifier. A reason that quotes the identifier does not hold the event.

Test Specification: edge show names the commit of the last affirmation of an edge that was affirmed twice. SEG-TS-271
nodeid: tests/specification/test_edge_provenance_recording_commit.py::test_edge_show_names_the_commit_of_the_last_affirmation_of_an_edge
verifies: SEG-SREQ-293
is reported by: SEG-OUT-0DBCF608B515

An edge is affirmed, and one commit by Alice adds its event. The text of the target requirement then changes in the content repository, and the change is committed there. The edge is affirmed again, and a second commit by Bob adds the second event. edge show names the second commit and Bob, in text and in JSON. It does not name the first commit or Alice.

Test Specification: edge show names the commit as it stands after an amend, with the new identifier. SEG-TS-272
nodeid: tests/specification/test_edge_provenance_recording_commit.py::test_edge_show_names_the_new_commit_after_an_amend
verifies: SEG-SREQ-299
is reported by: SEG-OUT-C1E59E86AF4F

One commit by Alice adds the event of an edge. edge show names that commit. Dan then amends the commit with a later commit date. The identifier of the commit changes. A second run of edge show names the new identifier and Dan as the committer, in text and in JSON. It does not name the old identifier.

Test Specification: edge show names the earliest commit for an event that was removed and added again. SEG-TS-287
nodeid: tests/specification/test_edge_provenance_recording_commit.py::test_edge_show_names_the_earliest_commit_for_an_event_removed_and_added_again
verifies: SEG-SREQ-293
is reported by: SEG-OUT-60FB781E24D5

A commit by Alice adds the event of an edge. A later commit by Bob removes the event from the file. A third commit by Dan puts the event back, with the same text. The file is then the same as after the first commit. edge show names the first commit and Alice, in text and in JSON. It does not name the commit by Bob or the commit by Dan.

tests/specification/test_edge_provenance_signature.py

Test Specification: edge show reports that the recording commit is not signed, with the status none. SEG-TS-273
nodeid: tests/specification/test_edge_provenance_signature.py::test_edge_show_reports_an_unsigned_commit_as_signature_none
verifies: SEG-SREQ-297
is reported by: SEG-OUT-D50031BF9883

One commit adds the review event of an edge, and it carries no signature. edge show exits with status 0. The JSON signature is the word none. The text has one line that starts with “signature:”, and it says none.

Test Specification: edge show reports the status of a signature as git gives it, for each status. SEG-TS-274
nodeid: tests/specification/test_edge_provenance_signature.py::test_edge_show_reports_each_signature_status_as_git_gives_it
verifies: SEG-SREQ-297
is reported by: SEG-OUT-A264F1E3354A

A stand-in for the gpg program lets git make and check a signature of each kind. For each of seven letters of git, a case is built. One signed commit adds the review event of an edge. The letters are G, B, U, X, Y, R and E. edge show exits with status 0. The JSON signature and the text line that starts with “signature:” give one word. G is good. B is bad. U is unknownValidity. X and Y are expired. R is revoked. E is cannotCheck. The text gives that word, with or without spaces, and no other word of the set.

Test Specification: edge show presents the identity as what the case history records, and never as verified. SEG-TS-275
nodeid: tests/specification/test_edge_provenance_signature.py::test_edge_show_presents_the_identity_as_recorded_and_never_as_verified
verifies: SEG-SREQ-298
is reported by: SEG-OUT-A6E062B44741

Three cases are built. In the first, a commit with a good signature adds the event. In the second, the event is in the working tree and in no commit. In the third, the case has no history. For each, edge show exits with status 0. The text has one line with the words “recorded in the case history”. In the first case, that line has the words “recorded in the case history as”. The JSON has the key recordedInCaseHistory. Nothing that edge show prints, in text or in JSON, holds the words “affirmed by”, “verified” or “authenticated”.

tests/specification/test_edge_selection_evidence_edges.py

Test Specification: Edge show with a subtree selection for a requirement lists no edge of an evidence kind. SEG-TS-366
nodeid: tests/specification/test_edge_selection_evidence_edges.py::test_a_subtree_selection_shows_only_refines_verifies_and_implements_edges
verifies: SEG-SREQ-371
is reported by: SEG-OUT-2A4B80FB2C33

A store holds the shape of the earlier specifications. It also holds an outcome, a Confirms edge from the outcome to a test specification, a Witnesses edge from it to an implementation, and a Calls edge between two implementations. It holds three more edges of those kinds that have a requirement of the subtree at one end: a Confirms edge to the leaf, a Witnesses edge to the middle requirement and a Calls edge to the leaf. Edge show with a subtree selection for the top, for the middle requirement and for the leaf each exits with status 0. The listed edges are the Refines, Verifies and Implements edges inside the subtree, as for the store without the additions, and no listed edge has the kind Confirms, Witnesses or Calls.

Test Specification: Case remove with a subtree selection for a requirement leaves an edge of another kind. SEG-TS-367
nodeid: tests/specification/test_edge_selection_evidence_edges.py::test_case_remove_with_a_subtree_selection_removes_only_the_three_kinds_of_a_subtree
verifies: SEG-SREQ-371
is reported by: SEG-OUT-6279CA4A1CE3

The case holds the records of the store of the earlier specifications, written by case sync, and so holds the Calls edge that has the leaf at one end and the Calls edge between two implementations. Case remove with a subtree selection for the top exits with status 0. The edge records that the case holds afterwards are those held before, less the seven edges inside the subtree. Both Calls edges are still held.

Test Specification: The selection function takes no Confirms, Witnesses, Calls or Excuses edge by subtree. SEG-TS-368
nodeid: tests/specification/test_edge_selection_evidence_edges.py::test_select_admits_no_edge_of_a_kind_outside_the_three_for_a_subtree
verifies: SEG-SREQ-371
is reported by: SEG-OUT-03D3CAE62971

A graph holds a requirement, a requirement that refines it, a test specification, two implementations and an outcome. It holds one Refines edge, one Verifies edge and one Implements edge inside the subtree of the first requirement. It also holds, for each of the kinds Confirms, Witnesses, Calls and Excuses, one edge that has a requirement of the subtree as its source and one that has it as its target. Selecting by the subtree of the first requirement returns the three edges of the three kinds, and no other. Selecting by kind and subtree together for each of the four other kinds returns no edge.

Test Specification: Edge show with a subtree selection for a node that is not a requirement lists no edge. SEG-TS-369
nodeid: tests/specification/test_edge_selection_evidence_edges.py::test_edge_show_below_a_node_that_is_not_a_requirement_matches_nothing
verifies: SEG-SREQ-372
is reported by: SEG-OUT-58F532BB1ECC

The store holds a test specification, an implementation and an outcome, each with edges of an evidence kind, and a requirement that is the far end of a refinement edge only, which no node of the store carries. Edge show with a subtree selection for the test specification, for the implementation, for the outcome, for a name that no node carries, and for the name that is the far end of the broken refinement edge each lists no edge and exits with status 2.

Test Specification: Edge affirm with a subtree selection for a node that is not a requirement fails. SEG-TS-370
nodeid: tests/specification/test_edge_selection_evidence_edges.py::test_edge_affirm_below_a_node_that_is_not_a_requirement_affirms_nothing
verifies: SEG-SREQ-372
is reported by: SEG-OUT-0BD42558B77F

The same store, and an empty case. Edge affirm with a revision, a synthetic role and a subtree selection for the test specification, for the implementation, for the outcome and for the far end of the broken refinement edge each exits with status 2. The case holds no review event after any of them.

Test Specification: Case remove with a subtree selection for a node that is not a requirement fails. SEG-TS-371
nodeid: tests/specification/test_edge_selection_evidence_edges.py::test_case_remove_below_a_node_that_is_not_a_requirement_removes_nothing
verifies: SEG-SREQ-372
is reported by: SEG-OUT-45F38BFBD410

The case holds the records of the store, written by case sync. It holds a Calls edge between two implementations, and the broken refinement edge. Case remove with a subtree selection for the implementation, for the test specification, for the outcome and for the far end of the broken refinement edge each exits with status 2. The case holds the same edge records after each of them.

Test Specification: The selection function takes no edge by the subtree of an outcome or any other node. SEG-TS-372
nodeid: tests/specification/test_edge_selection_evidence_edges.py::test_select_by_the_subtree_of_a_node_that_is_not_a_requirement_returns_no_edge
verifies: SEG-SREQ-372
is reported by: SEG-OUT-311AF1F6086A

A graph holds a requirement and the nodes of the other kinds: a test specification, two implementations and an outcome. It holds a Confirms edge from the outcome to the test specification, a Witnesses edge from the outcome to an implementation, a Calls edge between the implementations, and the Verifies and Implements edges of the requirement. Selecting by the subtree of the outcome, of the test specification, of each implementation, and of a name that no node carries returns no edge.

Test Specification: A subtree selection for a requirement that nothing refines still takes its two edges. SEG-TS-373
nodeid: tests/specification/test_edge_selection_evidence_edges.py::test_a_requirement_with_no_refiner_selects_its_verifies_and_implements_edges
is reported by: SEG-OUT-AB88B69F97D6

The store holds a requirement that no requirement refines and that refines no requirement, one test specification that verifies it and one implementation that implements it, beside the outcome and the edges of the evidence kinds. Edge show with a subtree selection for that requirement exits with status 0 and lists the Verifies edge and the Implements edge. Case remove with the same selection exits with status 0 and removes those two edges and no other.

tests/specification/test_edge_selection_subtree.py

Test Specification: A subtree selection reaches the requirement and every requirement that refines it. SEG-TS-335
nodeid: tests/specification/test_edge_selection_subtree.py::test_the_subtree_is_the_requirement_and_every_requirement_that_refines_it
verifies: SEG-SREQ-345
is reported by: SEG-OUT-7DC687D94363

A store holds a chain of refinement, a requirement with a parent, and a requirement with two parents, one of them outside. Running edge show with a subtree selection for the top of the chain exits with status 0. The requirements that the listed edges name are the top, the requirement that refines it, the requirement that refines that one in turn, and the requirement with two parents. They are no others: not the parent of the top, not the second parent. The same holds for a subtree selection for the middle of the chain, which names the middle and the requirement below it.

Test Specification: A sibling, and a requirement that refines only a requirement outside, add no edge. SEG-TS-336
nodeid: tests/specification/test_edge_selection_subtree.py::test_a_requirement_outside_the_subtree_adds_no_edge
verifies: SEG-SREQ-345
is reported by: SEG-OUT-10F44EE40797

A store holds a sibling of the top, which refines the parent of the top, and a requirement that refines only a requirement outside the subtree. A test specification and an implementation relate to that requirement alone. Running edge show with a subtree selection for the top exits with status 0. No listed edge has the sibling, the requirement that refines only a requirement outside, or the test specification or implementation that relate to that requirement alone, as an endpoint.

Test Specification: Edge show lists a Refines edge in a subtree only when both of its ends are in it. SEG-TS-337
nodeid: tests/specification/test_edge_selection_subtree.py::test_edge_show_lists_a_refines_edge_only_when_both_ends_are_in_the_subtree
verifies: SEG-SREQ-346
is reported by: SEG-OUT-11759F05A1BF

A store holds a top with a parent, a chain of refinement below the top, and a requirement that refines the top and a second requirement outside the subtree. Running edge show with a subtree selection for the top exits with status 0. The listed Refines edges are the three between two members: the middle refines the top, the leaf refines the middle, and the requirement with two parents refines the top. The edge from the top to its parent is not listed. The edge from the requirement with two parents to its second parent is not listed.

Test Specification: Edge affirm with a subtree selection affirms only the edges inside the subtree. SEG-TS-338
nodeid: tests/specification/test_edge_selection_subtree.py::test_edge_affirm_affirms_only_the_edges_inside_the_subtree
verifies: SEG-SREQ-346
is reported by: SEG-OUT-37ED106E5B7E

A store holds the shape of the earlier specifications, and the case is empty. Running edge affirm with a subtree selection for the top, a revision and a role exits with status 0. The case then holds a review event for each of the seven edges inside the subtree, and for no other edge. It holds no review event for the edge from the top to its parent, nor for the edge from a member to a second parent outside.

Test Specification: Case remove with a subtree selection removes only the edges inside the subtree. SEG-TS-339
nodeid: tests/specification/test_edge_selection_subtree.py::test_case_remove_removes_only_the_edges_inside_the_subtree
verifies: SEG-SREQ-346
is reported by: SEG-OUT-452496083EBC

A case holds the records of the shape of the earlier specifications, written by case sync. Running case remove with a subtree selection for the top exits with status 0. The edge records that the case holds afterwards are all the edges of the store, less the seven edges inside the subtree. The edge from the top to its parent is still held, and so is the edge from a member to a second parent outside.

Test Specification: A Verifies or Implements edge is selected by the requirement that it names. SEG-TS-340
nodeid: tests/specification/test_edge_selection_subtree.py::test_a_verifies_or_implements_edge_is_in_the_subtree_by_the_requirement_it_names
verifies: SEG-SREQ-347
is reported by: SEG-OUT-F556FA3F8A04

One test specification verifies a requirement inside the subtree and one outside, and one implementation implements a requirement inside and one outside. A selection by subtree for the top, with edge show, edge affirm and case remove in turn, takes the Verifies and Implements edges that name a requirement inside, and no other Verifies or Implements edge. The test specification and the implementation that relate to both sides give one selected edge and one edge that is not selected. A test specification and an implementation of the subtree that name a requirement outside are not selected either.

Test Specification: A leaf requirement selects the Verifies and Implements edges it names, and no Refines edge. SEG-TS-341
nodeid: tests/specification/test_edge_selection_subtree.py::test_a_leaf_requirement_selects_its_verifies_and_implements_edges_and_no_refines_edge
verifies: SEG-SREQ-347
is reported by: SEG-OUT-5C52C0EB9A9C

A leaf requirement refines one requirement, has one test specification that verifies it and one implementation that implements it. Running edge show with a subtree selection for the leaf exits with status 0. The listed edges are the Verifies edge and the Implements edge of the leaf. The Refines edge from the leaf to its parent is not listed.

Test Specification: A subtree selection for a requirement that has a parent leaves out its edge to the parent. SEG-TS-342
nodeid: tests/specification/test_edge_selection_subtree.py::test_a_subtree_below_a_requirement_that_is_not_a_top_leaves_out_its_own_refines_edge
verifies: SEG-SREQ-346
is reported by: SEG-OUT-3262788DF53E

The middle requirement of a chain refines the top, and the leaf refines the middle. In turn, edge show, edge affirm and case remove run with a subtree selection for the middle requirement, each over its own store. Each exits with status 0. Each takes four edges: the edge from the leaf to the middle, the Verifies edge and the Implements edge of the leaf, and the Implements edge of the middle. None takes the edge from the middle requirement to the top. The edge from the middle to the top is the one the selection leaves out, whichever verb runs.

Test Specification: A subtree selection for a requirement the store does not hold matches no edge. SEG-TS-343
nodeid: tests/specification/test_edge_selection_subtree.py::test_a_subtree_selection_for_an_unknown_requirement_matches_nothing
verifies: SEG-SREQ-103
is reported by: SEG-OUT-6EAC77F5D8E2

The same store, and a requirement name that no node carries. Running edge show, edge affirm and case remove in turn with a subtree selection for that name each exit with status 2, a request that could not be judged. Edge affirm records no review event. Case remove removes no edge record.

Test Specification: The edges of a subtree selection are the edges that a proof scope of that requirement holds. SEG-TS-344
nodeid: tests/specification/test_edge_selection_subtree.py::test_the_edges_of_a_subtree_selection_are_the_edges_that_the_proof_scope_cuts
verifies: SEG-SREQ-346
is reported by: SEG-OUT-45FB6809A006

The store holds only strong edges, and the nodes that they join. Edge show runs with a subtree selection for the top, and again for the middle of the chain. The proof generator collects the scope of the same requirement over the graph of the same store, and it holds the edges that join two members of the scope. For each of the two requirements, the edges that edge show lists are the edges of that scope, no more and no fewer. This is the reason a selection takes only the edges inside: it answers what a proof of the requirement would hold.

tests/specification/test_edge_show_unreadable_repository.py

Test Specification: edge show reports before-content it cannot read as not available. SEG-TS-350
nodeid: tests/specification/test_edge_show_unreadable_repository.py::test_edge_show_reports_before_content_it_cannot_read_as_not_available
verifies: SEG-SREQ-365

The edge from REQ-B to REQ-A is affirmed. Then the content repository cannot be read, in each of the five ways of the variants. Running edge show with the verbose rendering exits with status 0 and writes no traceback. For each endpoint, one line has the word before-content, the name of the endpoint, the words not available, the name of the repository as the configuration names it, and a reason. For the path that does not exist, the reason says that it does not exist.

Test Specification: edge show shows the content of the readable endpoint, and says the other is not available. SEG-TS-351
nodeid: tests/specification/test_edge_show_unreadable_repository.py::test_edge_show_still_shows_the_content_of_the_endpoint_that_it_can_read
verifies: SEG-SREQ-365

An implementation is in one repository and the requirement that it implements is in another. The edge between them is affirmed. Then the repository of the requirement cannot be read, or the repository of the implementation cannot be. It is made unreadable by the removal of its objects, or by a stand-in git that fails every call that runs in it. Running edge show with the verbose rendering exits with status 0. The endpoint in the readable repository shows the content that it had at its affirmation. The other endpoint has a line that says that its before-content is not available and names its repository.

Test Specification: edge show gives the same exit status whether or not it can read the before-content. SEG-TS-352
nodeid: tests/specification/test_edge_show_unreadable_repository.py::test_an_unreadable_before_content_does_not_change_the_exit_of_edge_show
verifies: SEG-SREQ-366

The edge from REQ-B to REQ-A is affirmed. Then the content of REQ-A changes in the working tree, so the edge is suspect. A first run of edge show with the verbose rendering reads the repository, and gives a status. Then the content repository cannot be read, in each of the five ways of the variants. Running edge show again with the verbose rendering gives the same status as the first run. So does running it with a subtree selection for REQ-A.

Test Specification: The report of edge show has a null content and an error for an unreadable end. SEG-TS-353
nodeid: tests/specification/test_edge_show_unreadable_repository.py::test_the_machine_readable_report_gives_a_null_content_and_an_error_for_an_unreadable_end
verifies: SEG-SREQ-365

The edge from REQ-B to REQ-A is affirmed. Then the content repository cannot be read, in each of the five ways of the variants. Running edge show with the verbose rendering and the machine-readable report exits with status 0. For each endpoint, the entry of the before-content keeps the revision that the affirmation recorded, has a null content, and has an error key. The error is a text that holds the name of the repository as the configuration names it and a reason. For the path that does not exist, the reason says that it does not exist.

Test Specification: The report of edge show has no error for the end that it could read. SEG-TS-354
nodeid: tests/specification/test_edge_show_unreadable_repository.py::test_the_machine_readable_report_keeps_the_content_of_the_readable_end_and_has_no_error
verifies: SEG-SREQ-365

An implementation is in one repository and the requirement that it implements is in another, and the edge between them is affirmed. Then one of the two repositories cannot be read, in the two ways of the variants. Running edge show with the verbose rendering and the machine-readable report exits with status 0. The entry of the readable end holds its revision and its content as text, and it has no error, or an error that is null. The entry of the other end has a null content and an error that names its repository.

Test Specification: The text of edge show prints one line of a fixed form for an endpoint it cannot read. SEG-TS-355
nodeid: tests/specification/test_edge_show_unreadable_repository.py::test_the_text_line_for_an_unreadable_end_has_the_form_of_the_page
verifies: SEG-SREQ-365

The edge from REQ-B to REQ-A is affirmed. Then the content repository cannot be read, in each of the five ways of the variants. Running edge show with the verbose rendering exits with status 0. For each endpoint, one line reads before-content, an at sign, the endpoint, the word revision with the revision of the affirmation in parentheses, a colon, the words not available, a colon, the repository, a colon and the reason. The repository is named as the configuration names it. The reason is not empty.

Test Specification: Without the verbose rendering, edge show reads no before-content. SEG-TS-356
nodeid: tests/specification/test_edge_show_unreadable_repository.py::test_edge_show_without_the_verbose_rendering_reads_no_before_content
verifies: SEG-SREQ-085

The edge from REQ-B to REQ-A is affirmed, and a stand-in git logs each call. Running edge show without the verbose rendering exits with status 0, and the log holds no call of the subcommand show. The status and the text are kept. Then the content repository cannot be read, in each of the five ways of the variants. Running edge show without the verbose rendering again gives the same status and the same text, and no traceback.

tests/specification/test_every_misshapen_need.py

Test Specification: The content extractor names every misshapen need of an export in one error. SEG-TS-389
nodeid: tests/specification/test_every_misshapen_need.py::test_the_content_extractor_names_every_misshapen_need_of_an_export
verifies: SEG-SREQ-351

An export of the content extractor holds five needs, in the stream of the implementations or in the stream of the test cases, one stream at a time. One need lacks a text field the extractor reads. One need declares an id other than its key. One need has a link field that is a text and not a list. The other two are good. Building the extractor raises one error. The error has one line for each of the three bad needs. Each line holds the key of the need and a word that tells why: the name of the missing field, the id that was declared, or the name of the link field. No line names a good need. A control export that holds only one of the three bad needs, with the two good ones, is refused with an error that names that need.

Test Specification: The requirements reader names every misshapen need of the requirement export in one error. SEG-TS-390
nodeid: tests/specification/test_every_misshapen_need.py::test_the_requirements_reader_names_every_misshapen_need_of_an_export
verifies: SEG-SREQ-352
is reported by: SEG-OUT-4E4A86F54E4B

The requirement export holds five needs of the configured type. One lacks a text field the reader reads. One declares an id other than its key. One has a parent-link field that is a text and not a list. The other two are good. Building the reader raises one error. The error has one line for each of the three bad needs. Each line holds the key of the need and a word that tells why: the name of the missing field, the id that was declared, or the name of the link field. No line names a good need. A control export that holds only one of the three bad needs, with the two good ones, is refused with an error that names that need.

Test Specification: The outcome extractor names every misshapen need of an export in one error. SEG-TS-391
nodeid: tests/specification/test_every_misshapen_need.py::test_the_outcome_extractor_names_every_misshapen_need_of_an_export
verifies: SEG-SREQ-353

An export of the outcome extractor holds five needs, in the test-case export or in the implementation export, one export at a time, with a good other export and a run bundle that is accepted. One need lacks a text field the extractor reads. One need declares an id other than its key. One need has a link field that is a text and not a list. The other two are good. Building the extractor raises one error. The error has one line for each of the three bad needs. Each line holds the key of the need and a word that tells why: the name of the missing field, the id that was declared, or the name of the link field. No line names a good need. A control export that holds only one of the three bad needs, with the two good ones, is refused with an error that names that need.

Test Specification: The error for misshapen needs of an export of the content extractor starts with a count. SEG-TS-392
nodeid: tests/specification/test_every_misshapen_need.py::test_the_error_for_misshapen_needs_of_the_content_extractor_starts_with_a_count
verifies: SEG-SREQ-351

An export of the content extractor, in the stream of the implementations or in the stream of the test cases, one at a time, holds three misshapen needs and two good ones. The first line of the error holds the number 3 and no other number, once the path of the export is cut out of it, and it names no need. Each of the lines after it names one bad need, so the error has four lines. With only one bad need, the first line holds the number 1 and one line follows.

Test Specification: The error for misshapen needs of the requirement export starts with a count line. SEG-TS-393
nodeid: tests/specification/test_every_misshapen_need.py::test_the_error_for_misshapen_needs_of_the_requirements_reader_starts_with_a_count
verifies: SEG-SREQ-352
is reported by: SEG-OUT-B97443DDC287

The requirement export holds three misshapen needs and two good ones. The first line of the error holds the number 3 and no other number, once the path of the export is cut out of it, and it names no need. Each of the lines after it names one bad need, so the error has four lines. With only one bad need, the first line holds the number 1 and one line follows.

Test Specification: The error for misshapen needs of an export of the outcome extractor starts with a count. SEG-TS-394
nodeid: tests/specification/test_every_misshapen_need.py::test_the_error_for_misshapen_needs_of_the_outcome_extractor_starts_with_a_count
verifies: SEG-SREQ-353

The test-case export, or the implementation export, one at a time, holds three misshapen needs and two good ones. The first line of the error holds the number 3 and no other number, once the path of the export is cut out of it, and it names no need. Each of the lines after it names one bad need, so the error has four lines. With only one bad need, the first line holds the number 1 and one line follows.

Test Specification: The misshapen needs of an export of the content extractor are listed in export order. SEG-TS-395
nodeid: tests/specification/test_every_misshapen_need.py::test_misshapen_needs_of_the_content_extractor_are_listed_in_export_order
verifies: SEG-SREQ-351

An export of the content extractor, in the stream of the implementations or in the stream of the test cases, one at a time, holds three misshapen needs and two good ones. The keys of the bad needs are not in alphabetical order in the export. The lines of the error name the bad needs in the order of the export. Building the extractor a second time over the same export gives an error with the same text.

Test Specification: The misshapen needs of the requirement export are listed in the order of the export. SEG-TS-396
nodeid: tests/specification/test_every_misshapen_need.py::test_misshapen_needs_of_the_requirements_reader_are_listed_in_export_order
verifies: SEG-SREQ-352
is reported by: SEG-OUT-E2734C74020A

The requirement export holds three misshapen needs and two good ones. The keys of the bad needs are not in alphabetical order in the export. The lines of the error name the bad needs in the order of the export. Building the reader a second time over the same export gives an error with the same text.

Test Specification: The misshapen needs of an export of the outcome extractor are listed in export order. SEG-TS-397
nodeid: tests/specification/test_every_misshapen_need.py::test_misshapen_needs_of_the_outcome_extractor_are_listed_in_export_order
verifies: SEG-SREQ-353

The test-case export, or the implementation export, one at a time, holds three misshapen needs and two good ones. The keys of the bad needs are not in alphabetical order in the export. The lines of the error name the bad needs in the order of the export. Building the extractor a second time over the same export gives an error with the same text.

Test Specification: Case sync prints one refusal that names every misshapen need and writes nothing. SEG-TS-398
nodeid: tests/specification/test_every_misshapen_need.py::test_case_sync_reports_every_misshapen_need_and_writes_nothing
verifies: SEG-SREQ-351
is reported by: SEG-OUT-9ED576D4149E

The implementation export of the configured producer holds three misshapen needs and two good ones. Case sync over an initialized case exits with status 2. Its output names each of the three bad needs with a line of its own, and names no good need. The files of the case are the same after the command as before it. With the export mended, the same command exits with status 0.

tests/specification/test_every_unmapped_result.py

Test Specification: Every unmapped or ambiguous result of a run artifact is named in one error. SEG-TS-399
nodeid: tests/specification/test_every_unmapped_result.py::test_every_unmapped_and_ambiguous_result_is_named_in_one_error
verifies: SEG-SREQ-354
is reported by: SEG-OUT-65BF368B6639

A run artifact holds one board with five results: PUT_GET, which maps to one need, three results that map to no need, and one result of a test that two needs share. The extractor raises one error. It has one line for each of the four bad results. Each line holds the identifier of the result. The line of an unmapped result says that it maps to no test-case need. The line of the ambiguous result names both needs. The error does not name the result that maps to one need. A control artifact that holds only one unmapped result, with the good one, is refused with an error that names it.

Test Specification: The error for unmapped or ambiguous results of a run starts with a count line. SEG-TS-400
nodeid: tests/specification/test_every_unmapped_result.py::test_the_error_for_unmapped_results_starts_with_a_count
verifies: SEG-SREQ-354
is reported by: SEG-OUT-167CD2B07507

A run artifact holds two boards. The first board holds 29 unmapped results and one ambiguous result. The second board holds the same 29 unmapped results and the same ambiguous result again, and each board also holds one good result. So the artifact holds 60 bad results, which are 58 unmapped results and two ambiguous ones. The first line of the error holds the number 60 and no other number, once the paths of the bundle and the artifact are cut out of it, and it names no result. The error has one more line for each bad result, so 61 lines. With a single bad result the first line holds the number 1 and one line follows.

Test Specification: The bad results of a run are listed in the order of the run artifact, and the text is stable. SEG-TS-401
nodeid: tests/specification/test_every_unmapped_result.py::test_unmapped_results_are_listed_in_the_order_of_the_artifact_every_time
verifies: SEG-SREQ-354
is reported by: SEG-OUT-7BF789F707A5

A run artifact holds two boards. The identifiers of the bad results are not in alphabetical order in the artifact: three unmapped results and one ambiguous result on the first board, then two unmapped results on the second board. The lines of the error name the six results in the order of the artifact. Building the extractor a second time over the same artifact gives an error with the same text.

Test Specification: A result with the status not run is refused for its status, with no result left out. SEG-TS-402
nodeid: tests/specification/test_every_unmapped_result.py::test_a_result_with_the_status_not_run_is_refused_for_its_status
verifies: SEG-SREQ-184
is reported by: SEG-OUT-A2071557CCB3

A run artifact holds the result PUT_GET with the status not run, which maps to one need, and after it three results that map to no need. The extractor raises an error that names the result PUT_GET and says that its status has no counterpart in the closed set. This is a refusal of its own: it does not name the three unmapped results, which come after it in the artifact. An artifact whose only bad result has the status not run is refused the same way.

Test Specification: Every result with the status not run is named in one refusal for its status. SEG-TS-412
nodeid: tests/specification/test_every_unmapped_result.py::test_every_not_run_result_is_named_in_one_status_refusal
verifies: SEG-SREQ-184
is reported by: SEG-OUT-52032556C8F7

A run artifact holds two boards. The first board holds, in this order, an unmapped result, a result with the status not run, a second unmapped result and a second result with the status not run. The second board holds a result with the status not run, then an unmapped result. The extractor raises one error. It has one line for each of the three results with the status not run, and each line holds the identifier of the result and the status. It names none of the unmapped results, even those that come before a result with the status not run. A second artifact holds one board with two unmapped results and then one result with the status not run. It is refused for the status, and its error names none of the unmapped results.

Test Specification: Each line of the error for unmapped results holds the board and the scenario. SEG-TS-413
nodeid: tests/specification/test_every_unmapped_result.py::test_each_unmapped_result_line_names_its_board_and_scenario
verifies: SEG-SREQ-354
is reported by: SEG-OUT-2CE110B0B79C

A run artifact holds two boards that run the scenario scn.alpha, on the platforms native_sim and qemu_x86, and a third board that runs the scenario scn.beta on native_sim. Each board holds the same unmapped result, whose identifier does not begin with the name of any scenario. The extractor raises one error with one line for each of the three results. The line of each result holds its platform and its scenario. The three lines are different from one another. The error has a count line first, and that line names no platform and no scenario.

tests/specification/test_extraction_revision_affirm.py

Test Specification: edge affirm records the discovered revision in the node record of each endpoint. SEG-TS-211
nodeid: tests/specification/test_extraction_revision_affirm.py::test_edge_affirm_records_the_discovered_revision_in_both_endpoint_records
verifies: SEG-SREQ-306
is reported by: SEG-OUT-F8710617831F

A case is empty. A repository is configured and holds the committed content of both endpoints. Running edge affirm exits with status 0. The case then holds the node records of the two endpoints and no other. Each of the two records carries the revision of the repository, as git gives it, for that repository.

Test Specification: edge affirm keeps a held revision while the content hashes are unchanged. SEG-TS-212
nodeid: tests/specification/test_extraction_revision_affirm.py::test_edge_affirm_keeps_the_held_revision_of_an_unchanged_endpoint
verifies: SEG-SREQ-308
is reported by: SEG-OUT-3DAB85975E7B

A case sync records the revision of the repository. Then a commit changes a file that no node anchors, so the repository is at a new revision and the content hashes are the same. Running edge affirm exits with status 0. The node record of each endpoint keeps the first revision. It does not carry the current revision of the repository, which is not the first one.

Test Specification: edge affirm drops a held revision when the changed content is not committed. SEG-TS-213
nodeid: tests/specification/test_extraction_revision_affirm.py::test_edge_affirm_drops_the_held_revision_of_an_endpoint_changed_and_not_committed
verifies: SEG-SREQ-309
is reported by: SEG-OUT-9755D4AE3EF5

A case sync records the revision of the repository. Then the content of one endpoint changes in the working tree and is not committed. A revision is given on the command line, so that edge affirm does not refuse. Running edge affirm exits with status 0. The node record of the changed endpoint holds the new content hash and carries no revision for the repository. The given revision is in no node record.

Test Specification: edge affirm never records a revision that the operator gives as an extraction revision. SEG-TS-214
nodeid: tests/specification/test_extraction_revision_affirm.py::test_a_revision_given_on_the_command_line_is_never_an_extraction_revision
verifies: SEG-SREQ-327
is reported by: SEG-OUT-CE059B17ECED

A revision that is not the revision of the repository is given on the command line. In a first case, the repository is configured and committed. Running edge affirm exits with status 0. The node records of the endpoints carry the revision of the repository, not the given one. In a second case, the configuration names no repository for the anchors. Running edge affirm exits with status 0, and the node records carry no revision at all.

Test Specification: edge affirm reports each repository and the number of records written without a revision. SEG-TS-218
nodeid: tests/specification/test_extraction_revision_affirm.py::test_edge_affirm_reports_the_repository_and_the_count_of_records_without_a_revision
verifies: SEG-SREQ-310
is reported by: SEG-OUT-ED244D5EFEDD

The content of both endpoints changes in the working tree and is not committed. A revision is given on the command line, so that edge affirm does not refuse. A case is empty. Running edge affirm exits with status 0. Its output has a line that names the repository and gives the number 2.

tests/specification/test_extraction_revision_store.py

Test Specification: A node record keeps the extraction revisions it is given. SEG-TS-195
nodeid: tests/specification/test_extraction_revision_store.py::test_a_node_record_keeps_the_extraction_revisions_it_is_given
verifies: SEG-SREQ-304
is reported by: SEG-OUT-ABDE27C7FE46

The store writes one node record of each kind that a case holds: a requirement, an implementation, a test specification and a waiver. Each record carries a map from a repository name to a revision. The map has one repository for one record and two repositories for the others. A new store over the same root reads each record back with the same map. The stored document of each record holds the map as a JSON object under one key, from repository name to revision.

Test Specification: A node record without an extraction revision is read back as written. SEG-TS-196
nodeid: tests/specification/test_extraction_revision_store.py::test_a_node_record_without_an_extraction_revision_is_read_back_as_written
verifies: SEG-SREQ-305
is reported by: SEG-OUT-08BEB0E685F0

The store writes one node record of each kind that a case holds, with no extraction revision. A new store over the same root reads each record back equal to the record written. The record carries no revision. The stored document of each record has no extraction revision field. Writing the same records again changes no byte of the case.

Test Specification: The extraction revisions never enter a node hash, an edge hash or the design root. SEG-TS-197
nodeid: tests/specification/test_extraction_revision_store.py::test_the_extraction_revisions_never_enter_a_hash
verifies: SEG-SREQ-005
is reported by: SEG-OUT-1CBE43F8449E

Two cases hold the same nodes and edges. In the second case every node record also carries a map of extraction revisions. Each node hash, derived from the node kind and the content hashes, is the same in both cases. The design root over all node hashes and edge tuples is the same. An edge is affirmed in the first case. A current stream whose node records carry the map derives that edge as active, with the edge hash it was affirmed against.

Test Specification: Every node schema declares the extraction revisions as an optional property. SEG-TS-198
nodeid: tests/specification/test_extraction_revision_store.py::test_every_node_schema_declares_the_extraction_revisions_as_optional
verifies: SEG-SREQ-304
is reported by: SEG-OUT-D64AAB598260

Each of the five packaged node schemas, for a requirement, an implementation, a test specification, a test outcome and a waiver, declares the extraction revision key as a property. The property is an object. No schema lists it as required, so a record without it stays valid.

Test Specification: The store refuses an extraction revision that is not 40 or 64 lowercase hex characters. SEG-TS-220
nodeid: tests/specification/test_extraction_revision_store.py::test_a_malformed_extraction_revision_is_refused
verifies: SEG-SREQ-325
is reported by: SEG-OUT-4AB5E059EE84

The store is given a node record whose map holds one of these values: the word XYZ, 40 uppercase hex characters, 39 lowercase hex characters, and 41 lowercase hex characters. Each write raises a store error. No file of the case changes. A value of 40 and a value of 64 lowercase hex characters are accepted.

Test Specification: The store persists a node record with no extraction revision with no such field. SEG-TS-221
nodeid: tests/specification/test_extraction_revision_store.py::test_a_node_record_with_no_revision_is_stored_with_no_field
verifies: SEG-SREQ-326
is reported by: SEG-OUT-8BDEA2DAAA36

The store writes a node record with an empty map, and a node record with no map. The stored document of each has no extraction revision key. A record is written with a map and then written again with an empty map. The stored document of that record then has no extraction revision key, and not an empty object.

tests/specification/test_extraction_revision_sync.py

Test Specification: case sync records the discovered revision for a node the case does not hold. SEG-TS-199
nodeid: tests/specification/test_extraction_revision_sync.py::test_a_node_the_case_does_not_hold_gets_the_discovered_revision
verifies: SEG-SREQ-306
is reported by: SEG-OUT-8BD99E846AF0

A case is empty. A repository is configured and holds the committed content of three requirements. Running case sync exits with status 0. Each node record in the case carries the revision of the repository, as git gives it, for that repository.

Test Specification: case sync replaces a held revision with the discovered one when the hash changes. SEG-TS-200
nodeid: tests/specification/test_extraction_revision_sync.py::test_a_changed_hash_replaces_the_held_revision_with_the_discovered_one
verifies: SEG-SREQ-306
is reported by: SEG-OUT-C523688FE8F7

A first case sync records the revision of the repository. Then the content of one requirement changes and the change is committed, so the repository is at a new revision. Running case sync again changes the content hash of that node record. It also changes the revision of the node record to the new revision of the repository.

Test Specification: case sync adds the discovered revision to a node record that holds none. SEG-TS-201
nodeid: tests/specification/test_extraction_revision_sync.py::test_an_unchanged_hash_with_no_revision_held_gets_the_discovered_revision
verifies: SEG-SREQ-307
is reported by: SEG-OUT-11A286A7AD70

The case holds three node records written with no extraction revision. The content has not changed, so running case sync writes the same content hashes. Each node record then carries the revision of the repository, as git gives it, for that repository.

Test Specification: case sync keeps a held revision while the content hashes are unchanged. SEG-TS-202
nodeid: tests/specification/test_extraction_revision_sync.py::test_an_unchanged_hash_keeps_the_held_revision_after_the_repository_moves_on
verifies: SEG-SREQ-308
is reported by: SEG-OUT-42EED3C7510E

A first case sync records the revision of the repository. Then a commit changes a file that no node anchors, so the repository is at a new revision and the content hashes are the same. Running case sync again keeps, in each node record, the first revision. It does not record the current revision of the repository, which is not the first one.

Test Specification: case sync keeps a held revision when no repository is configured any more. SEG-TS-203
nodeid: tests/specification/test_extraction_revision_sync.py::test_an_unchanged_hash_keeps_the_held_revision_when_the_repository_is_not_configured
verifies: SEG-SREQ-308
is reported by: SEG-OUT-721C2A0D1A5E

A first case sync records the revision of the repository. Then the configuration names no repository for the anchors, and the content is unchanged. Running case sync again exits with status 0. Each node record keeps the revision it held.

Test Specification: case sync drops a held revision when the changed content is not committed. SEG-TS-204
nodeid: tests/specification/test_extraction_revision_sync.py::test_a_changed_hash_over_an_uncommitted_change_drops_the_held_revision
verifies: SEG-SREQ-309
is reported by: SEG-OUT-49D540369554

A first case sync records the revision of the repository. Then the content of one requirement changes in the working tree and is not committed. Running case sync again exits with status 0. It writes the new content hash for that node record. The node record carries no revision for the repository. The first revision is not kept.

Test Specification: case sync drops a held revision when the repository is not configured. SEG-TS-205
nodeid: tests/specification/test_extraction_revision_sync.py::test_a_changed_hash_for_a_repository_that_is_not_configured_drops_the_held_revision
verifies: SEG-SREQ-309
is reported by: SEG-OUT-193622FCD4CB

A first case sync records the revision of the repository. Then the content of one requirement changes and is committed, and the configuration names no repository for the anchors. Running case sync again exits with status 0, and does not refuse. It writes the new content hash for that node record. The node record carries no revision for the repository.

Test Specification: case sync records no revision for a node whose anchored path the repository lacks. SEG-TS-206
nodeid: tests/specification/test_extraction_revision_sync.py::test_a_path_the_repository_does_not_hold_gives_no_revision
verifies: SEG-SREQ-309
is reported by: SEG-OUT-0325061F5089

Two repositories are configured and committed, and neither has a change that is not committed. The requirement reader anchors each requirement at a source file that the first repository does not hold at its revision. The implementation reader anchors at files that the second repository holds. Running case sync exits with status 0. Each requirement record carries no revision. Each implementation record carries the revision of the second repository.

Test Specification: case sync reports each repository and the number of records written without a revision. SEG-TS-207
nodeid: tests/specification/test_extraction_revision_sync.py::test_the_report_names_the_repository_and_the_count_of_records_without_a_revision
verifies: SEG-SREQ-310
is reported by: SEG-OUT-6A84314D5A2D

A first case sync, with every anchored file committed, prints no line that names the repository. Then the content of two of the three requirements changes in the working tree and is not committed. Running case sync again exits with status 0. Its output has a line that names the repository and gives the number 2, which is the number of node records written without a revision for it.

Test Specification: case sync reports the count of records without a revision for each repository. SEG-TS-208
nodeid: tests/specification/test_extraction_revision_sync.py::test_the_report_counts_the_records_without_a_revision_for_each_repository
verifies: SEG-SREQ-310
is reported by: SEG-OUT-38677B515949

Two repositories are configured. The requirement reader anchors its three records at paths that the first repository does not hold. The implementation reader anchors at paths that the second repository holds. Running case sync exits with status 0. Its output has a line that names the first repository and gives the number 3. No line names the second repository.

Test Specification: case sync records one revision for each repository that the anchors name. SEG-TS-209
nodeid: tests/specification/test_extraction_revision_sync.py::test_each_node_gets_the_revision_of_the_repository_its_anchors_name
verifies: SEG-SREQ-306
is reported by: SEG-OUT-52E1C53CA6E4

Two repositories are configured, committed and unchanged. The two have different revisions. The requirement reader anchors at source files in the first repository. The implementation reader anchors at files in the second repository. Running case sync exits with status 0. Each requirement record carries the revision of the first repository for that repository only. Each implementation record carries the revision of the second repository for that repository only.

Test Specification: case sync records a revision for each repository that one node's anchors name. SEG-TS-210
nodeid: tests/specification/test_extraction_revision_sync.py::test_a_node_whose_anchors_name_two_repositories_gets_a_revision_for_each
verifies: SEG-SREQ-306
is reported by: SEG-OUT-2EDA886F65E5

Two repositories are configured and committed. One implementation anchors its api hash in the first repository and its body hash in the second. Another implementation anchors the same way, but the file it names in the second repository has a change that is not committed. Running case sync exits with status 0. The first node record carries the revision of each repository. The second node record carries the revision of the first repository only.

Test Specification: case sync writes nothing when the schema copy of the case predates the field. SEG-TS-215
nodeid: tests/specification/test_extraction_revision_sync.py::test_a_schema_copy_without_the_field_refuses_the_sync_until_it_is_refreshed
verifies: SEG-SREQ-212
is reported by: SEG-OUT-02C31C3D9F52

The schema copy of a case has the extraction revision property removed from every node schema. Running case sync, which records revisions, exits with status 2 and changes no file of the case. After case refresh, the same case sync exits with status 0 and records the revision of the repository in each node record.

Test Specification: case sync drops a held revision when the configured directory is not a repository. SEG-TS-219
nodeid: tests/specification/test_extraction_revision_sync.py::test_a_changed_hash_for_a_directory_that_is_not_a_repository_drops_the_held_revision
verifies: SEG-SREQ-309
is reported by: SEG-OUT-111D84995B93

A first case sync records the revision of the repository. Then the content of one requirement changes and is committed. The configuration now maps the repository name to a directory that is not a git repository. Running case sync again exits with status 0, and does not refuse. It writes the new content hash for that node record. The node record carries no revision for the repository.

Test Specification: case sync keeps no held revision for a repository that the anchors no longer name. SEG-TS-222
nodeid: tests/specification/test_extraction_revision_sync.py::test_a_held_revision_for_a_repository_the_anchors_no_longer_name_is_not_kept
verifies: SEG-SREQ-308
is reported by: SEG-OUT-0C3177661CEC

Two repositories are configured and committed. A first case sync records, in each requirement record, the revision of the first repository. Then the configuration moves the requirement reader to a new repository name that maps to the same directory. The paths and the content hashes are the same. Running case sync again exits with status 0. Each requirement record carries the revision for the new name only. It carries none for the old name.

tests/specification/test_extractor_comment_search.py

Test Specification: A test with no documentation comment above it is an error for its node. SEG-TS-172
nodeid: tests/specification/test_extractor_comment_search.py::test_a_missing_comment_above_a_test_is_an_error_for_its_node
verifies: SEG-SREQ-283
is reported by: SEG-OUT-D23A9DD88EDF

In the test source, six tests have a documentation comment above them. One line of a stopping kind stands between the comment and the test. The kinds are a code line, an #include line and a #define line. They are also a line comment, a line that starts with three slashes, and a code line that ends in a block comment. A seventh test has code directly above it. An eighth test stands on the first line of its file. For each of the eight, taking the records raises a source error that names the test’s need. No hash is supplied.

Test Specification: Plain comments, blank lines and conditional lines alone do not make a comment. SEG-TS-173
nodeid: tests/specification/test_extractor_comment_search.py::test_a_plain_comment_is_no_documentation_comment
verifies: SEG-SREQ-283
is reported by: SEG-OUT-F31E00042D07

In the test source, one test has only a plain block comment above it. One has a banner comment that starts with three stars. One has a blank line and an #if line. Code lies above each of them. For each test, taking the records raises a source error that names the test’s need. No hash is supplied.

Test Specification: A specHash steps over blank lines and conditional lines above the test. SEG-TS-190
nodeid: tests/specification/test_extractor_comment_search.py::test_a_spechash_steps_over_blank_lines_and_conditional_lines
verifies: SEG-SREQ-166
is reported by: SEG-OUT-8F6B704661DD

In the test source, eight tests have a documentation comment above them. Lines of one kind stand between the comment and the test. The first test has one blank line, and the second has two. The third has a blank line and an #if line. The others have one line each: #ifdef, #ifndef, #elif, #else or #endif. For each test the specHash equals the SHA-256 of the comment, from its opening line to its closing line. The lines in between are not in the run.

Test Specification: A specHash steps over plain block comments above the test. SEG-TS-191
nodeid: tests/specification/test_extractor_comment_search.py::test_a_spechash_steps_over_plain_comments
verifies: SEG-SREQ-166
is reported by: SEG-OUT-52CE03BBC8D7

In the test source, four tests have a documentation comment above them. Lines of one kind stand between the comment and the test. The first has a plain block comment of one line. The second has one of three lines. The third has one of one line behind white space. The fourth has a plain comment, a blank line, an #if line and a blank line, in that order. For each test the specHash equals the SHA-256 of the documentation comment, from its opening line to its closing line. No byte of the plain comment is in the run.

Test Specification: The lines stepped over lie outside the specHash. SEG-TS-192
nodeid: tests/specification/test_extractor_comment_search.py::test_the_lines_stepped_over_are_outside_the_spechash
verifies: SEG-SREQ-166
is reported by: SEG-OUT-F7B8759D198E

In a copy of the test source, the blank line below the comment of test_blank becomes an #ifndef line. The plain comment below the comment of test_plain reads another text. The specHash of both tests equals the digest of the comment, as before. In a second copy, the word Direct in the comment of test_direct reads DIRECT. Its specHash changes. It equals the SHA-256 of the changed comment.

Test Specification: The search for the comment above an Implementation allows guard lines only. SEG-TS-193
nodeid: tests/specification/test_extractor_comment_search.py::test_the_search_for_an_implementation_comment_is_not_widened
verifies: SEG-SREQ-169
is reported by: SEG-OUT-2F8D1CA7D0D7

In the header, the comment of IMP_DIRECT is directly above its define line. One #if line stands between the comment and the define line of IMP_GUARD. The apiHash of each equals the SHA-256 of the lines from the comment opening to the define line. Three macros have another kind of line between the comment and the define line. IMP_BLANK has a blank line. IMP_ELSE has an #else line. IMP_PLAIN has a plain comment. Each of the three is an error that names its need.

tests/specification/test_extractor_error_report.py

Test Specification: Every node that cannot be supplied is reported in one error, each with its reason. SEG-TS-171
nodeid: tests/specification/test_extractor_error_report.py::test_every_node_that_cannot_be_supplied_is_reported_in_one_error
verifies: SEG-SREQ-282
is reported by: SEG-OUT-CE3799A8B893

The test stream holds one good need, one need whose symbol no Doxygen member carries, and one whose test has no documentation comment. The implementation stream holds one good need and one whose macro has a blank line between its comment and its define line. Taking the records raises one source error. Its message names the three bad needs, each with its symbol and a reason, and the two reasons of the test stream differ. It does not name the two good needs.

tests/specification/test_extractor_types_modules_and_prefix.py

Test Specification: Configured need types, and only those, supply records. SEG-TS-164
nodeid: tests/specification/test_extractor_types_modules_and_prefix.py::test_configured_need_types_and_only_those_supply_records
verifies: SEG-SREQ-275
is reported by: SEG-OUT-4B72A42DE35B

The test-case export holds needs of the type test_case. It also holds T-OTHER, a need of the type test_other, whose symbol the Doxygen tree locates. The types {test_case} are configured. The extractor supplies records for T-ALPHA and T-GAMMA and for no other need. It supplies no Verifies edge from T-OTHER.

Test Specification: Without configured types, every need supplies a record. SEG-TS-165
nodeid: tests/specification/test_extractor_types_modules_and_prefix.py::test_without_configured_types_every_need_supplies_a_record
verifies: SEG-SREQ-276
is reported by: SEG-OUT-CA1D79B3C28E

No type is configured. The test-case export holds T-ALPHA of the type test_case and T-GAMMA of the type test_other, both with a symbol the Doxygen tree locates. The extractor supplies a record for each of them.

Test Specification: A need of another type is not refused. SEG-TS-166
nodeid: tests/specification/test_extractor_types_modules_and_prefix.py::test_a_need_of_another_type_is_not_refused
verifies: SEG-SREQ-277
is reported by: SEG-OUT-BB2AA2A32B84

The types {test_case} are configured. The test-case export holds a need of the type test_procedure that has no symbol field, and one of the type test_other with an empty symbol. Building the extractor and taking every record raises no error, and the records are those of the needs of the type test_case.

Test Specification: A symbol that several members share is narrowed by the test module. SEG-TS-167
nodeid: tests/specification/test_extractor_types_modules_and_prefix.py::test_a_shared_symbol_is_narrowed_by_the_test_module
verifies: SEG-SREQ-278
is reported by: SEG-OUT-D672BDC17EBD

The Doxygen tree holds three members named test_shared, in tests/mod_a, tests/mod_ab and tests/mod_b. The need T-SHARED-A names the test module tests/mod_a. The need T-SHARED-B names tests/mod_b. Each need is located through the member inside its module. Its specHash equals the SHA-256 of the comment above that member, and its anchor names that member’s file. The directory tests/mod_ab is not inside tests/mod_a.

A second tree holds the name only in tests/mod_ab and tests/mod_b. There, a need that names tests/mod_a is an error, because no member lies inside it.

Test Specification: A Doxygen path is mapped into the repository by a configured prefix. SEG-TS-168
nodeid: tests/specification/test_extractor_types_modules_and_prefix.py::test_a_doxygen_path_is_mapped_into_the_repository_by_the_prefix
verifies: SEG-SREQ-279
is reported by: SEG-OUT-08114DAAF8F6

The Doxygen tree for tests names the file suite/tests/mod_a/src/main.c, and the tree for implementations names lib-src/include/lib.h. The prefixes suite/ and lib-src/ are configured, one for each tree. The specHash of T-ALPHA equals the SHA-256 of the comment above test_alpha in tests/mod_a/src/main.c of the repository suite. The apiHash of I-LIB-MAX equals the digest of the comment and the define line of LIB_MAX in include/lib.h of the repository lib.

Test Specification: A path that does not begin with the prefix is an error, and the file is not read. SEG-TS-169
nodeid: tests/specification/test_extractor_types_modules_and_prefix.py::test_a_path_outside_the_prefix_is_an_error_and_is_not_read
verifies: SEG-SREQ-280
is reported by: SEG-OUT-556643EAB074

The prefix suite/ is configured. In a copy of the Doxygen tree, the path of test_alpha begins with other/. That text has as many characters as the prefix. A readable file stands at other/tests/mod_a/src/main.c in the repository. Taking the records raises a source error that names T-ALPHA. The file under other/ is not opened. The file tests/mod_a/src/main.c is not opened either. Removing the first six characters reaches it.

Test Specification: An anchor names the repository of its stream and the path inside it. SEG-TS-170
nodeid: tests/specification/test_extractor_types_modules_and_prefix.py::test_an_anchor_names_the_repository_of_its_stream_and_the_path_inside_it
verifies: SEG-SREQ-281
is reported by: SEG-OUT-920E3FC9DF8C

The readers name three repositories: docs, suite and lib, and no default repository is configured. Each anchor of T-ALPHA names the repository suite and the path tests/mod_a/src/main.c, with no prefix in it. Each anchor of I-LIB-MAX names the repository lib and the path include/lib.h. Each anchor of R-1 names the repository docs.

Test Specification: After the choice by test module, anything but exactly one member is an error. SEG-TS-188
nodeid: tests/specification/test_extractor_types_modules_and_prefix.py::test_after_the_module_choice_not_exactly_one_member_is_an_error
verifies: SEG-SREQ-161
is reported by: SEG-OUT-BC5C6CC15AB5

Three needs name the symbol test_shared, and each extraction is refused with an error that names the need. T-TWICE names the module tests/mod_a, where the Doxygen tree holds two members of that name. T-NO-MODULE names no module, and the tree holds three members. T-ELSEWHERE names the module tests/other, which holds none.

Test Specification: A path outside the repository configured for the node's stream is an error. SEG-TS-189
nodeid: tests/specification/test_extractor_types_modules_and_prefix.py::test_a_path_outside_the_repository_of_the_stream_is_an_error
verifies: SEG-SREQ-162
is reported by: SEG-OUT-0E12E3BCE674

The default repository is docs and the test stream names the repository suite. In a copy of the Doxygen tree the path of test_alpha is ../docs/reqs/alpha.sdoc, a readable file in the repository docs and outside the repository suite. Taking the records raises a source error that names T-ALPHA, and the file is not opened.

Test Specification: The test module is compared with the file's path after the prefix is removed. SEG-TS-194
nodeid: tests/specification/test_extractor_types_modules_and_prefix.py::test_the_test_module_is_compared_with_the_path_after_the_prefix
verifies: SEG-SREQ-278
is reported by: SEG-OUT-D9811CBA5E80

The Doxygen tree names three members test_shared, in the files suite/tests/mod_a/src/main.c, suite/tests/mod_ab/src/main.c and suite/tests/mod_b/src/main.c. The prefix suite/ is configured. The need T-SHARED-A names the test module tests/mod_a. It is located through the member in mod_a: its specHash equals the SHA-256 of the comment above that member, and its anchor names tests/mod_a/src/main.c. A need that names the module suite/tests/mod_a is an error, because no path inside the repository lies in it.

tests/specification/test_gate_skip_rule.py

Test Specification: A failing outcome without a valid waiver blocks the gate. SEG-TS-045
nodeid: tests/specification/test_gate_skip_rule.py::test_a_failing_outcome_without_a_valid_waiver_blocks
verifies: SEG-SREQ-060
is reported by: SEG-OUT-115FFA9B5FBF

One leaf has one test specification. One outcome confirms the specification and witnesses the implementation. Its result is failed, and no waiver excuses it. The package gate reports one finding with the outcome as its subject. The severity of that finding blocks. The report is blocked. The same holds when the result is error.

Test Specification: A failing outcome excused by a valid waiver only informs. SEG-TS-046
nodeid: tests/specification/test_gate_skip_rule.py::test_a_failing_outcome_excused_by_a_valid_waiver_only_informs
verifies: SEG-SREQ-061
is reported by: SEG-OUT-2ED3C17CB643

One leaf has one test specification. One outcome confirms the specification and witnesses the implementation. Its result is failed. A waiver that has not expired excuses the outcome. The package gate reports one finding with the outcome as its subject. The severity of that finding is information. The report is not blocked. The same holds when the result is error.

Test Specification: A waiver does not excuse a skipped outcome. SEG-TS-047
nodeid: tests/specification/test_gate_skip_rule.py::test_a_valid_waiver_changes_nothing_for_a_skipped_outcome
verifies: SEG-SREQ-129
is reported by: SEG-OUT-E93C7DC9F590

Two graphs are the same leaf with one outcome that confirms the specification, witnesses the implementation and was skipped. In the second graph a waiver that has not expired excuses that outcome. The package gate gives an equal report for both graphs. The report holds no excused finding. It still lists the skipped outcome. The leaf has the same verdict in both graphs.

Test Specification: A skipped outcome is reported as information and does not block. SEG-TS-048
nodeid: tests/specification/test_gate_skip_rule.py::test_a_skipped_outcome_is_reported_as_information
verifies: SEG-SREQ-199
is reported by: SEG-OUT-C405C7C651A7

One leaf has one test specification. Two outcomes confirm the specification and witness the implementation. One passed and one was skipped. The report lists the skipped outcome and not the passed one. The report holds one finding, with the skipped outcome as its subject and the skipped-outcome condition. The severity of that finding is information. No failing outcome is listed. The report is not blocked.

Test Specification: A skipped outcome does not stop a leaf from being satisfied. SEG-TS-049
nodeid: tests/specification/test_gate_skip_rule.py::test_a_skipped_outcome_beside_a_passed_one_leaves_the_leaf_satisfied
verifies: SEG-SREQ-006
is reported by: SEG-OUT-F85B60885FE4

One leaf carries an active verifies edge and an active implements edge. Its one test specification has two confirming outcomes. One passed and one was skipped. The satisfaction evaluator reports the leaf as satisfied.

Test Specification: A leaf whose only outcome was skipped is not satisfied. SEG-TS-050
nodeid: tests/specification/test_gate_skip_rule.py::test_a_leaf_whose_only_outcome_was_skipped_is_not_satisfied
verifies: SEG-SREQ-006
is reported by: SEG-OUT-48E64A64F4E1

One leaf carries an active verifies edge and an active implements edge. Its one test specification has one confirming outcome, and that outcome was skipped. The satisfaction evaluator reports the leaf as not satisfied. The package gate reports the leaf as a coverage gap. The report is blocked, and that coverage gap is the only finding that blocks.

Test Specification: A failed outcome excused by a valid waiver counts for the leaf. SEG-TS-051
nodeid: tests/specification/test_gate_skip_rule.py::test_a_failed_outcome_excused_by_a_valid_waiver_satisfies_the_leaf
verifies: SEG-SREQ-006
is reported by: SEG-OUT-C9E7028DF37E

One leaf carries an active verifies edge and an active implements edge. Its one test specification has one confirming outcome. That outcome failed, and a waiver that has not expired excuses it. The satisfaction evaluator reports the leaf as satisfied.

Test Specification: A skipped outcome from another revision is reported once, as stale. SEG-TS-052
nodeid: tests/specification/test_gate_skip_rule.py::test_a_stale_skipped_outcome_is_reported_once_as_stale
verifies: SEG-SREQ-067
is reported by: SEG-OUT-631322A9D041

One leaf has one test specification. One outcome passed at the current revision. Another outcome was skipped, and it was recorded at a different revision. The package gate reports the second outcome as stale, with one finding of information severity. The report does not list it among the skipped outcomes. The report is not blocked.

tests/specification/test_gate_unreadable_repository.py

Test Specification: The gate names an implementation repository that it cannot read. SEG-TS-357
nodeid: tests/specification/test_gate_unreadable_repository.py::test_the_gate_names_an_implementation_repository_that_it_cannot_read
verifies: SEG-SREQ-367

A configuration names the implementation repository, and the stream holds a test outcome. A control run of each of the three verbs, while the repository is healthy, ends with a status other than 2. Then the repository cannot be read, in each of the five ways of the variants. Running proof check, proof generate and graph status, with no revision given, each exits with status 2. A line of the output names the repository as the configuration names it, and gives a reason. For the path that does not exist, the reason says that it does not exist. The output holds no traceback.

Test Specification: proof generate writes no evidence package when the implementation repository cannot be read. SEG-TS-358
nodeid: tests/specification/test_gate_unreadable_repository.py::test_proof_generate_writes_no_package_when_it_cannot_read_the_repository
verifies: SEG-SREQ-368

A configuration names the implementation repository, and the case has no package. The repository cannot be read, in each of the five ways of the variants. Running proof generate with no revision given exits with status 2. The proofs directory of the case holds no file afterwards, and every file of the case has the same bytes as before the command.

Test Specification: Commands that need no implementation revision read no repository. SEG-TS-359
nodeid: tests/specification/test_gate_unreadable_repository.py::test_the_commands_that_need_no_implementation_revision_read_no_repository
verifies: SEG-SREQ-112
is reported by: SEG-OUT-0DC6D22521BC

A stand-in git logs each call. Graph status over a stream with no test outcome exits with status 0, and the log holds no call. Graph status over a stream with an outcome, with a revision given, exits with a status other than 2, and the log holds no call. Proof verify over a package that the generator wrote makes no call either. The log is empty after all three.

Test Specification: proof check, proof generate and graph status run git without the seven variables. SEG-TS-360
nodeid: tests/specification/test_gate_unreadable_repository.py::test_the_gate_reads_the_implementation_repository_without_the_variables_that_name_a_repository
verifies: SEG-SREQ-333
is reported by: SEG-OUT-EC9DDB91D818

A configuration names the implementation repository, and the stream holds a test outcome. A second repository exists. All seven variables GIT_DIR, GIT_WORK_TREE, GIT_INDEX_FILE, GIT_OBJECT_DIRECTORY, GIT_ALTERNATE_OBJECT_DIRECTORIES, GIT_COMMON_DIR and GIT_NAMESPACE are set, and each names the second repository. A stand-in git logs the environment of each call. Running proof check, proof generate and graph status with no revision given leaves a log with calls for the revision and the status. In no call is one of the seven variables present.

tests/specification/test_graph.py

Test Specification: A refines cycle or self-loop is refused. SEG-TS-007
nodeid: tests/specification/test_graph.py::test_a_refines_cycle_or_self_loop_is_refused
verifies: SEG-SREQ-004
is reported by: SEG-OUT-41445B0CE9B9

Building a graph whose refines edges contain a self-loop, and separately one whose refines edges form a longer cycle, is refused with a graph-level error naming a cycle in both cases. Building a graph whose refines edges converge without looping — two children refining into one shared ancestor — succeeds; a diamond is not mistaken for a cycle.

Test Specification: An unaffirmed edge builds as pending. SEG-TS-008
nodeid: tests/specification/test_graph.py::test_an_unaffirmed_edge_builds_as_pending
verifies: SEG-SREQ-016
is reported by: SEG-OUT-18CF329FB6D0

Building a graph from an edge record that carries no hash it was affirmed against, but whose recorded state claims otherwise, yields a built edge in the pending state — the state the record itself claims is disregarded in favour of the absence of an affirmed hash.

Test Specification: A record of an undeclared kind is refused. SEG-TS-009
nodeid: tests/specification/test_graph.py::test_a_record_of_an_undeclared_kind_is_refused
verifies: SEG-SREQ-031
is reported by: SEG-OUT-A58CD7C22C06

Building a graph from a node record declaring a kind the taxonomy provider does not declare is refused, and building a graph from an edge record declaring such a kind is refused likewise — an undeclared kind stops the build whether it appears on a node or an edge.

tests/specification/test_manual_configuration_examples.py

Test Specification: The scan for YAML examples in the pages finds at least one. SEG-TS-442
nodeid: tests/specification/test_manual_configuration_examples.py::test_the_pages_show_at_least_one_configuration_example
verifies: SEG-SREQ-376
is reported by: SEG-OUT-23AB19CEC102

The manual shows its configuration file in a YAML code block at least once, in the installation tutorial. The scan reads every page of the manual and of the requirement specification and finds that block among the examples. A scan that finds none would let the next test pass for the wrong reason.

Test Specification: Every YAML configuration example that a page shows is accepted by the loader. SEG-TS-443
nodeid: tests/specification/test_manual_configuration_examples.py::test_every_configuration_example_of_the_pages_loads
verifies: SEG-SREQ-376

A page of the manual or of the requirement specification shows a configuration in a YAML code block. The block is written to a file, as it stands, and the loader reads the file. Loading raises no configuration error, so that no example holds a key that the loader refuses. This is tried for each YAML block of each page, one at a time.

tests/specification/test_need_ids_confirming_outcomes.py

Test Specification: With a list of need identifiers, an outcome with no listed implementation is set aside. SEG-TS-441
nodeid: tests/specification/test_need_ids_confirming_outcomes.py::test_an_outcome_whose_only_witnessed_implementation_is_not_listed_is_set_aside

The implementation export of the frozen evidence fixture has one more need, a copy of the need that implements SD-REQ-005 under another identifier, so that SD-REQ-005 has two implementation needs. The list holds every need of the fixture except the copy and except the need that alone implements SD-REQ-004, SD-REQ-009 and SD-REQ-010. The producer reads the fixture and one run bundle. Running proof check for the golden scope with the strong edges affirmed gives these results. The outcomes of the tests that verify only those three requirements are listed as discarded outcomes, and each has one finding of the condition for a discarded outcome, with severity information and the outcome as its subject. No outcome of the test that verifies SD-REQ-005 is discarded, so that outcome confirms through the listed need. No outcome of the test that verifies SD-REQ-003 and SD-REQ-009 is discarded: it confirms through the listed need of SD-REQ-003. The three requirements that lost their only need are coverage gaps, and SD-REQ-005 is not.

tests/specification/test_node_comparison.py

Test Specification: The suspect detector reports a hash as matching when both digests are equal. SEG-TS-227
nodeid: tests/specification/test_node_comparison.py::test_a_hash_with_the_same_digest_on_both_sides_matches
verifies: SEG-SREQ-312
is reported by: SEG-OUT-953C80F524FB

The case holds a requirement record whose contentHash covers one text. The current stream holds a record of the same node whose contentHash covers the same text, but with an anchor that names another path. The comparison has one item, for contentHash. Its status is matching. It carries both anchors.

Test Specification: The suspect detector reports a hash as differing when the two digests are not equal. SEG-TS-228
nodeid: tests/specification/test_node_comparison.py::test_a_hash_with_another_digest_on_each_side_differs
verifies: SEG-SREQ-312
is reported by: SEG-OUT-FBB5ED4F2D59

The case holds a requirement record whose contentHash covers one text. The current stream holds a record of the same node whose contentHash covers another text. The comparison has one item, for contentHash. Its status is differing. It carries both anchors, so the two digests can be read.

Test Specification: The suspect detector reports a hash that only the case's record carries as recorded only. SEG-TS-229
nodeid: tests/specification/test_node_comparison.py::test_a_hash_that_only_the_case_holds_is_recorded_only
verifies: SEG-SREQ-312
is reported by: SEG-OUT-8E454AD5EEBE

The case holds a test specification record with the hashes specHash and implHash. The current stream holds a record of the same node with specHash alone, with the same digest. The comparison has two items. specHash is matching. implHash is recorded only, with the recorded anchor and no current anchor.

Test Specification: The suspect detector reports a hash that only the current record carries as current only. SEG-TS-230
nodeid: tests/specification/test_node_comparison.py::test_a_hash_that_only_the_current_stream_carries_is_current_only
verifies: SEG-SREQ-312
is reported by: SEG-OUT-0C031184BFDF

The case holds a test specification record with specHash alone. The current stream holds a record of the same node with specHash, with the same digest, and implHash. The comparison has two items. specHash is matching. implHash is current only, with the current anchor and no recorded anchor.

Test Specification: The suspect detector gives one result for each hash name, each judged by itself. SEG-TS-231
nodeid: tests/specification/test_node_comparison.py::test_each_hash_name_of_a_node_gets_its_own_result
verifies: SEG-SREQ-312
is reported by: SEG-OUT-88C37634AB63

The case holds an implementation record with the hashes apiHash and bodyHash. In the current record apiHash covers the same text and bodyHash covers another text. The comparison has exactly two items. apiHash is matching and bodyHash is differing. The change of one hash does not change the status of the other.

Test Specification: The suspect detector reports every hash of a node that only one side holds as one-sided. SEG-TS-232
nodeid: tests/specification/test_node_comparison.py::test_a_node_that_only_one_side_holds_has_every_hash_on_one_side_only
verifies: SEG-SREQ-312
is reported by: SEG-OUT-172D75546C87

The case holds a test specification record with specHash and implHash, and the current stream holds no record of the node. The comparison has two items, and both are recorded only. In the other direction, the current stream holds the record and the case holds none. Both items are then current only.

tests/specification/test_node_content_sources.py

Test Specification: The requirements reader supplies the bytes from which it computed each hash. SEG-TS-223
nodeid: tests/specification/test_node_content_sources.py::test_the_requirements_reader_supplies_the_bytes_it_hashed
verifies: SEG-SREQ-311
is reported by: SEG-OUT-18FAFBCD866D

The reader reads the requirement export of the capture-shape fixture. It supplies three requirement records, each with the hash contentHash. For each record, asking the reader for the bytes behind contentHash gives bytes whose SHA-256 is the digest in the anchor of that record. The bytes are not empty.

Test Specification: The content extractor supplies the bytes from which it computed each hash. SEG-TS-224
nodeid: tests/specification/test_node_content_sources.py::test_the_content_extractor_supplies_the_bytes_it_hashed
verifies: SEG-SREQ-311
is reported by: SEG-OUT-6F16BD6D8D78

The extractor reads the test-case export and the implementation export of the capture-shape fixture, with their Doxygen output and their C sources. It supplies test specification records with specHash and implHash, and implementation records with apiHash and bodyHash. Take each record and each hash name. The bytes that the extractor gives for the hash have a SHA-256. That SHA-256 is the digest in the anchor of the record.

Test Specification: The would-be store supplies the bytes from which it computed each hash. SEG-TS-225
nodeid: tests/specification/test_node_content_sources.py::test_the_would_be_store_supplies_the_bytes_it_hashed
verifies: SEG-SREQ-311
is reported by: SEG-OUT-26D724B81189

The store loader reads the would-be store fixture. It supplies requirement, test specification and implementation records. Take each record and each hash name. The bytes that the loader gives for the hash have a SHA-256. That SHA-256 is the digest in the anchor of the record.

Test Specification: The composed producer supplies the bytes from which any of its readers computed a hash. SEG-TS-226
nodeid: tests/specification/test_node_content_sources.py::test_the_composed_producer_supplies_the_bytes_it_hashed
verifies: SEG-SREQ-311
is reported by: SEG-OUT-B1311A60B8B5

The producer chains the requirements reader and the content extractor over the capture-shape fixture. It supplies records of three kinds. Take each record and each hash name. The bytes that the producer gives for the hash have a SHA-256. That SHA-256 is the digest in the anchor of the record. The reader of the record gives the same bytes.

tests/specification/test_node_show_edge_cases.py

Test Specification: node show gives content that is valid UTF-8 as text in the JSON report. SEG-TS-255
nodeid: tests/specification/test_node_show_edge_cases.py::test_node_show_gives_valid_utf8_content_as_text_in_json
verifies: SEG-SREQ-328
is reported by: SEG-OUT-CFE37114792C

The file of a requirement holds text with characters outside ASCII, and the case is synced. node show exits with status 0. The JSON content of the hash is the text of the file. The entry does not name the base64 encoding. The SHA-256 of the bytes that the content stands for is the current digest.

Test Specification: node show gives content that is not valid UTF-8 as base64, with the encoding named. SEG-TS-256
nodeid: tests/specification/test_node_show_edge_cases.py::test_node_show_gives_other_content_as_base64_in_json
verifies: SEG-SREQ-328
is reported by: SEG-OUT-C76FD7C6081B

The file of a requirement holds bytes that are not valid UTF-8, and the case is synced. node show exits with status 0. The JSON entry names the base64 encoding. Decoding the JSON content from base64 gives exactly the bytes of the file. The SHA-256 of those bytes is the current digest.

Test Specification: node show exits with status 2 and names the identifier when the stream holds it twice. SEG-TS-257
nodeid: tests/specification/test_node_show_edge_cases.py::test_node_show_exits_with_status_2_for_an_identifier_the_current_stream_holds_twice
verifies: SEG-SREQ-329
is reported by: SEG-OUT-0E20CA70F3D7

The case holds a requirement record. A control run, over a current stream that holds the record once, exits with status 0. Then the current stream holds two records with that identifier and different content. node show exits with status 2. In the text and in the JSON, the message names the identifier, and the report has no hash. No file of the case changes.

Test Specification: node show reports no current content and no checkout for a hash only the case records. SEG-TS-258
nodeid: tests/specification/test_node_show_edge_cases.py::test_node_show_reports_no_current_content_for_a_hash_only_the_case_records
verifies: SEG-SREQ-330
is reported by: SEG-OUT-18A0390D787C

The case holds a test specification record with the hashes specHash and implHash. The current record of the node has specHash alone. For implHash, the text block says that there is no current content, and it has no checkout line and no worktree line. The JSON content and the JSON checkout of implHash are null. The block of specHash still has its checkout line and its content.

Test Specification: node show reports a repository that cannot be read, with the reason, and keeps the status. SEG-TS-259
nodeid: tests/specification/test_node_show_edge_cases.py::test_node_show_reports_a_repository_that_cannot_be_read_with_the_reason
verifies: SEG-SREQ-331
is reported by: SEG-OUT-8F04D609E650

The case is synced. With the repository readable, node show exits with status 0 for a matching hash, and with status 1 after the file of the requirement changes. Then the configuration maps the repository name to a directory that is not a git repository. For the same two comparisons, node show exits with the same two statuses. The checkout line says that the repository cannot be read, and gives a reason after it. The JSON checkout has no revision, and has a reason that is text and not empty. Git does not look for a repository above the test’s directory, so a checkout that holds the temporary directory cannot make the plain directory readable.

tests/specification/test_node_show_report.py

Test Specification: node show shows the node that has the identifier it is given, as its own verb. SEG-TS-233
nodeid: tests/specification/test_node_show_report.py::test_node_show_resolves_a_node_by_its_identifier
verifies: SEG-SREQ-313
is reported by: SEG-OUT-A70EA6E3AE07

The case holds three requirements. The help of the noun node lists the verb show. Running node show with the identifier REQ-B exits with status 0. Its text report names REQ-B and the kind Requirement. Its JSON report has the identifier REQ-B, the kind Requirement and one entry for contentHash. Running it with REQ-C names REQ-C and not REQ-B.

Test Specification: node show reports the comparison of the current and the recorded digest of each hash. SEG-TS-234
nodeid: tests/specification/test_node_show_report.py::test_node_show_compares_every_named_hash_of_the_node
verifies: SEG-SREQ-314
is reported by: SEG-OUT-6878A33B91F6

The case holds a test specification with the hashes specHash and implHash. Then the file that implHash covers changes and is committed. The file of specHash does not change. The report has one block for each of the two hash names. specHash is matching and implHash is differing, in the text and in the JSON. In the JSON, each entry gives the recorded digest the case holds and the current digest of the file, in full.

Test Specification: node show reports, for each named hash, the bytes that the current stream supplies. SEG-TS-235
nodeid: tests/specification/test_node_show_report.py::test_node_show_shows_the_current_content_of_every_hash
verifies: SEG-SREQ-315
is reported by: SEG-OUT-12BF4DF7CD29

The case holds a test specification and an implementation, each with two hashes. Then the file of specHash changes in the working tree and is not committed. For the test specification, the text of the specHash block shows the new text of the file. The text of the implHash block shows the text that the file still has. The JSON content of each hash is the text of its file, and the SHA-256 of that text is the current digest of the hash. The same holds for each hash of the implementation. No block says that no content is supplied.

Test Specification: node show reports that none is supplied for a hash when the source supplies no content. SEG-TS-236
nodeid: tests/specification/test_node_show_report.py::test_node_show_says_when_the_source_supplies_no_content
verifies: SEG-SREQ-316
is reported by: SEG-OUT-6758309F80B9

The case holds a waiver and a requirement. The current stream is a record source that reads no content and supplies the same two records. For each of the two nodes, node show exits with status 0, because the hash matches. The block of the hash says that no content is supplied. The JSON content is null. The report does not show any content.

Test Specification: node show reports the extraction revision the case records for the anchor's repository. SEG-TS-237
nodeid: tests/specification/test_node_show_report.py::test_node_show_reports_the_recorded_revision_of_the_recorded_anchors_repository
verifies: SEG-SREQ-317
is reported by: SEG-OUT-ADD408195661

A case is synced over two repositories that are at different revisions. A requirement anchors in the first and an implementation in the second. For the requirement, node show gives the revision of the first repository as the extraction revision, in the text and in the JSON. It does not give the revision of the second. For the implementation, in both of its hashes, it gives the revision of the second repository and not the first.

Test Specification: node show reports that none is recorded for a node record that has no extraction revision. SEG-TS-238
nodeid: tests/specification/test_node_show_report.py::test_node_show_says_when_the_case_records_no_extraction_revision
verifies: SEG-SREQ-317
is reported by: SEG-OUT-1AE0D62053E3

The case holds three requirement records written with no extraction revision, as a case written by an older version holds them. The content has not changed. node show exits with status 0. The text says that none is recorded, and the JSON revision is null. After a case sync adds the revision, the text gives the revision and no longer says that none is recorded.

Test Specification: node show reports the revision of the repository the current anchor names. SEG-TS-239
nodeid: tests/specification/test_node_show_report.py::test_node_show_reports_the_revision_the_current_anchors_repository_is_at
verifies: SEG-SREQ-318
is reported by: SEG-OUT-D149E33306EB

A case sync records the revision of the repository. Then a commit changes a file that no node anchors, so the repository is at a new revision. node show for a requirement gives the new revision as the revision of the checkout, in the text and in the JSON. It gives the first revision, and only that one, as the revision the node was extracted from.

Test Specification: node show reports that no repository is configured for a current anchor that names none. SEG-TS-240
nodeid: tests/specification/test_node_show_report.py::test_node_show_says_when_no_repository_is_configured_for_the_current_anchor
verifies: SEG-SREQ-318
is reported by: SEG-OUT-34A8541C2951

A case sync records the revision of the repository. Then the configuration maps no repository for the name that the anchors carry. node show exits with status 0 and the hash matches. The checkout line says that no repository is configured. It gives no revision, and the JSON checkout has no revision. The extraction revision is still the one the case records.

Test Specification: node show reports whether the anchored paths match their commit, naming each that differs. SEG-TS-241
nodeid: tests/specification/test_node_show_report.py::test_node_show_names_each_anchored_path_that_differs_from_its_commit
verifies: SEG-SREQ-319
is reported by: SEG-OUT-A9BF1588A1DF

The case holds a requirement, a test specification and an implementation, in one repository. After the sync, the two files of the test specification and one file of the implementation change in the working tree and are not committed. For the test specification, the worktree line names its two paths and no other, and the JSON dirty paths are those two. For the implementation, they are its one changed path. For the requirement, the line says clean, names no path, and the JSON dirty paths are empty.

tests/specification/test_node_show_user_case.py

Test Specification: node show gives the differing hash, the current bytes and the recorded extraction revision. SEG-TS-253
nodeid: tests/specification/test_node_show_user_case.py::test_node_show_answers_what_changed_and_where_the_recorded_content_was_read
verifies: SEG-SREQ-313
is reported by: SEG-OUT-FF13D3C33FD1

A case sync records the revision of the repository. Then the content of one requirement changes and the change is committed, so the repository is at a new revision. node show for the changed requirement exits with status 1. It names contentHash as differing. It shows the new content, in the text and in the JSON, and the SHA-256 of the JSON content is the current digest. It gives the first revision as the revision the case recorded, and the new revision as the revision of the checkout. node show for a requirement that did not change exits with status 0.

Test Specification: node show says that none is recorded, and gives no other revision in its place. SEG-TS-254
nodeid: tests/specification/test_node_show_user_case.py::test_node_show_gives_no_fallback_revision_for_a_node_record_with_none
verifies: SEG-SREQ-317
is reported by: SEG-OUT-DD1A95DFC483

The case holds a requirement record with no extraction revision. A review event of an edge of that requirement records another revision, given on the command line, for the same requirement. Then the content of the requirement changes and the change is committed. node show for the requirement exits with status 1. It names contentHash as differing and shows the new content. It says that none is recorded as the extraction revision. The revision of the review event appears nowhere in the text or in the JSON. The checkout line gives the revision of the repository.

tests/specification/test_node_show_verdicts.py

Test Specification: node show exits with status 0 while every named hash of the node matches. SEG-TS-242
nodeid: tests/specification/test_node_show_verdicts.py::test_node_show_exits_with_status_0_while_every_hash_matches
verifies: SEG-SREQ-320
is reported by: SEG-OUT-6D60C50BA1E6

The case holds a requirement, a test specification and an implementation, synced from one repository. Nothing has changed. For each node, node show exits with status 0, and every hash is matching in the text and in the JSON. A file that no node anchors is then added to the repository and not committed. The repository differs from its commit, and node show still exits with status 0 for each node.

Test Specification: node show exits with status 0, and names the dirty path, for a matching hash on it. SEG-TS-243
nodeid: tests/specification/test_node_show_verdicts.py::test_node_show_exits_with_status_0_for_a_matching_hash_on_a_dirty_checkout
verifies: SEG-SREQ-320
is reported by: SEG-OUT-765DBFBAAF65

A file of a requirement changes in the working tree and is not committed. Then the case is synced, so the case holds the hash of the changed content. The case holds no extraction revision for the node, because the path is dirty. node show for that requirement exits with status 0. Its hash is matching. The worktree line names the path that differs, and the JSON dirty paths are that one path.

Test Specification: node show exits with status 1 while a named hash of the node differs. SEG-TS-244
nodeid: tests/specification/test_node_show_verdicts.py::test_node_show_exits_with_status_1_while_a_hash_differs
verifies: SEG-SREQ-321
is reported by: SEG-OUT-E3F977E8B70F

The case holds a test specification with the hashes specHash and implHash. A control run exits with status 0. Then the file of implHash changes in the working tree. The file of specHash does not change. node show exits with status 1, in the text and in the JSON, although specHash still matches.

Test Specification: node show exits with status 1 while a named hash exists on one side only. SEG-TS-245
nodeid: tests/specification/test_node_show_verdicts.py::test_node_show_exits_with_status_1_while_a_hash_is_on_one_side_only
verifies: SEG-SREQ-321
is reported by: SEG-OUT-9E5745A92117

The case holds two test specification records, each with the hashes specHash and implHash. A control run, over a current stream that supplies the same two records, exits with status 0 for each. Then the current record of the first node loses implHash. node show for it exits with status 1, and implHash is recorded only. Then the current record of the second node gains the hash apiHash. node show for it exits with status 1, and apiHash is current only.

Test Specification: node show exits with status 1 while the current stream holds no node with the identifier. SEG-TS-246
nodeid: tests/specification/test_node_show_verdicts.py::test_node_show_exits_with_status_1_while_the_current_stream_holds_no_such_node
verifies: SEG-SREQ-321
is reported by: SEG-OUT-613A41FC58DD

The case holds three requirements. A control run for REQ-C exits with status 0. Then REQ-C is removed from the current store. node show for REQ-C exits with status 1, and not with status 2. Its hash is recorded only. The other requirements are not affected: node show for REQ-B still exits with status 0.

Test Specification: node show exits with status 2 and names the identifier when the case holds no such node. SEG-TS-247
nodeid: tests/specification/test_node_show_verdicts.py::test_node_show_exits_with_status_2_for_an_identifier_the_case_does_not_hold
verifies: SEG-SREQ-322
is reported by: SEG-OUT-D72CE84C8C35

The case holds three requirements. A control run for REQ-B exits with status 0. The current store gains a fourth requirement, REQ-NEW, that the case does not hold. node show for REQ-NEW exits with status 2, although the current stream holds it. node show for UNKNOWN-9, which no side holds, also exits with status 2. In the text and in the JSON, the message names the identifier, and the report has no hash.

Test Specification: node show exits with status 2 when it cannot read the current stream it is given. SEG-TS-248
nodeid: tests/specification/test_node_show_verdicts.py::test_node_show_exits_with_status_2_when_it_cannot_read_the_current_stream
verifies: SEG-SREQ-323
is reported by: SEG-OUT-B64BD0A21FC2

The case holds three requirements. A control run for REQ-B exits with status 0. Then node show is given, as the current stream, a directory that does not exist. It exits with status 2. It is then given a copy of the store whose manifest of requirements is not valid. It exits with status 2. In both cases the text and the JSON give a message and no hash.

Test Specification: node show takes no run bundle. SEG-TS-249
nodeid: tests/specification/test_node_show_verdicts.py::test_node_show_takes_no_run_bundle
verifies: SEG-SREQ-230
is reported by: SEG-OUT-E34E6264112A

The case holds three requirements. node show works without any option for a bundle and exits with status 0. The help of node show does not list the option –bundle. Given –bundle and the directory of a run bundle, node show ends with an argument error and exit status 2. It changes no file of the case.

Test Specification: node show exits with status 2 when no current stream is given and no producer is configured. SEG-TS-250
nodeid: tests/specification/test_node_show_verdicts.py::test_node_show_without_a_current_stream_or_a_producer_cannot_be_judged
verifies: SEG-SREQ-142
is reported by: SEG-OUT-3C6591BF041F

The case holds three requirements, and the configuration names no producer. A control run that is given a current stream exits with status 0. node show for REQ-B, given no current stream, exits with status 2 and gives a message. It changes no file of the case.

tests/specification/test_node_show_writes_nothing.py

Test Specification: node show changes no file of the case, for each exit status it gives. SEG-TS-251
nodeid: tests/specification/test_node_show_writes_nothing.py::test_node_show_changes_no_file_of_the_case
verifies: SEG-SREQ-324
is reported by: SEG-OUT-BFFC1B886368

The case holds three requirements. The test takes the SHA-256 of every file of the case. Then node show runs for four nodes. A matching node exits with status 0. A differing node exits with status 1. A node that the current stream no longer holds exits with status 1. An identifier that the case does not hold exits with status 2. After each command, the files of the case are the same. No file is added or removed.

Test Specification: node show performs no write in the content repository, not even to its index. SEG-TS-252
nodeid: tests/specification/test_node_show_writes_nothing.py::test_node_show_writes_nothing_in_the_content_repository
verifies: SEG-SREQ-324
is reported by: SEG-OUT-515C2682D394

A content repository has an out-of-date index and a change that is not committed. The change is in a file that one node anchors. Running node show for that node and for a node that anchors another file exits with status 1 and with status 0. Every file under the .git directory of the repository is the same after the commands. The same holds for every file of the working tree.

tests/specification/test_outcome_extractor.py

Test Specification: A run identifier joins the run's name, platform and scenario, in that order. SEG-TS-053
nodeid: tests/specification/test_outcome_extractor.py::test_a_run_identifier_joins_the_run_name_the_platform_and_the_scenario
verifies: SEG-SREQ-178
is reported by: SEG-OUT-449328EE291E

The bundle records the run name twister-run-2026-09-29. Its run artifact records four scenarios, all on the platform native_sim/native/64.

Extracting supplies outcomes of exactly four run identifiers. Each is the name, the platform as native_sim-native-64 and one scenario name, joined by hyphens. Each run identifier starts the identities of 19 outcomes. The nested scenarios stay apart.

When the name record of the bundle holds another-run, every run identifier starts with another-run. When one scenario records the platform qemu_x86, the run identifier of that scenario holds qemu_x86.

Test Specification: A specification identifier is the identifier of the test-case need, verbatim. SEG-TS-054
nodeid: tests/specification/test_outcome_extractor.py::test_a_specification_identifier_is_the_test_case_needs_identifier_verbatim
verifies: SEG-SREQ-179
is reported by: SEG-OUT-57DC344C0E9E

Extracting from the fixture supplies 76 outcomes. Each identity ends with a slash and the identifier of one of the 19 test-case needs of the export. Each need identifier ends the identities of exactly four outcomes, one for each scenario.

In a copy of the export, the need TC_SAFE_DATA_INIT_AND_VERIFY is renamed TC-renamed-1. Then the four identities that ended with the old identifier end with the new one. No other identity changes.

Test Specification: A result maps to the need whose suite and test function join the result's scenario. SEG-TS-055
nodeid: tests/specification/test_outcome_extractor.py::test_a_result_maps_to_the_need_with_its_scenario_suite_and_test_function
verifies: SEG-SREQ-180
is reported by: SEG-OUT-76788D731E2E

The fixture records the result safe_data.api.safe_data.init_and_verify. The need TC_SAFE_DATA_INIT_AND_VERIFY has the suite safe_data and the test function test_init_and_verify. Extracting gives that result the specification TC_SAFE_DATA_INIT_AND_VERIFY. The same holds in the nested scenario safe_data.api.plain.

In the scenario safe_data.api, that result is passed and the result write_observes_overwritten_corruption is skipped. In a copy of the export, the test functions of these two needs are swapped. Then the passed result belongs to the other need, and the skipped result belongs to TC_SAFE_DATA_INIT_AND_VERIFY.

In a copy of the artifact, the scenario safe_data.api.strict is renamed zz.api in its suite and its results. Then the results of zz.api map the same way.

Test Specification: An unmapped or ambiguous result is an error that names the result. SEG-TS-056
nodeid: tests/specification/test_outcome_extractor.py::test_an_unmapped_or_ambiguous_result_is_an_error_for_that_result
verifies: SEG-SREQ-181
is reported by: SEG-OUT-6001EFC52E7D

In a copy of the export, a second need has the suite and the test function of TC_SAFE_DATA_INIT_AND_VERIFY. The result safe_data.api.safe_data.init_and_verify now maps to two needs. Extracting raises an error that names that result.

In a copy of the export, the need TC_SAFE_DATA_SELFTEST is dropped. The result safe_data.api.safe_data.selftest now maps to no need. Extracting raises an error that names that result.

Test Specification: A content hash covers the specification identifier, the run identifier and the result. SEG-TS-057
nodeid: tests/specification/test_outcome_extractor.py::test_a_content_hash_covers_the_specification_the_run_and_the_result_only
verifies: SEG-SREQ-182
is reported by: SEG-OUT-D11AFD63DF2A

The contentHash digest of the outcome of TC_SAFE_DATA_INIT_AND_VERIFY in the scenario safe_data.api equals a SHA-256. The SHA-256 is of this canonical record:

{“result”:”passed”,”run”:”twister-run-2026-09-29-native_sim-native-64-safe_data.api”, “specification”:”TC_SAFE_DATA_INIT_AND_VERIFY”}

In hex, the digest is b21f9c415e6b2de8ea131a18c709acdface0c91c976041b752ae382bf3128869. Each of the 76 digests equals the SHA-256 of its own canonical record.

In a copy of the artifact, the execution time and the reason of every result are changed. Then no digest changes. In a copy, the status of that result is failed. Then only its digest changes, to the digest of the record with the result failed.

Test Specification: A recorded status maps onto the member of the closed result set it corresponds to. SEG-TS-058
nodeid: tests/specification/test_outcome_extractor.py::test_a_recorded_status_maps_onto_the_closed_result_set
verifies: SEG-SREQ-183
is reported by: SEG-OUT-11EB7E9A1ACD

In the fixture, each result with the status passed gives an outcome with the result passed. Each result with the status skipped gives an outcome with the result skipped.

In a copy of the artifact, the result init_and_verify in safe_data.api has the status failed and the result selftest has the status error. Then the two outcomes record the results failed and error. Every other outcome is unchanged.

Test Specification: A status with no counterpart in the closed result set is an error for that result. SEG-TS-059
nodeid: tests/specification/test_outcome_extractor.py::test_a_status_with_no_counterpart_is_an_error_for_that_result
verifies: SEG-SREQ-184
is reported by: SEG-OUT-3A6989D07E5D

In a copy of the artifact, the result safe_data.api.safe_data.init_and_verify has the status blocked. Extracting raises an error that names that result. The same holds for the status no-such-status.

Test Specification: A skipped result is recorded as an outcome whose result is skipped. SEG-TS-060
nodeid: tests/specification/test_outcome_extractor.py::test_a_skipped_result_is_recorded_as_a_skipped_outcome
verifies: SEG-SREQ-185
is reported by: SEG-OUT-636F5BD7984A

The fixture records 76 results. 65 are passed and 11 are skipped. The skips fall 2, 5, 1 and 3 over the four scenarios.

Extracting supplies 76 outcomes. The 11 outcomes with the result skipped are exactly those of the 11 skipped results.

Test Specification: An outcome's revision is the revision the bundle records for the implementation checkout. SEG-TS-061
nodeid: tests/specification/test_outcome_extractor.py::test_an_outcomes_revision_is_the_revision_the_bundle_records_for_the_checkout
verifies: SEG-SREQ-186
is reported by: SEG-OUT-AB7E3161F63B

The record of the implementation checkout (toolbox) in the bundle holds 5847f3fdca777b8d62615d84b8926fdc8ce125ed and a line feed. Each of the 76 outcomes has that text, without the line feed, as its revision.

When the record holds 77e25d8f3cb2e94adb5a44426b98e088f1bef3fe, every outcome has that revision.

Test Specification: A run with no recorded full revision is refused, and no outcome is supplied. SEG-TS-062
nodeid: tests/specification/test_outcome_extractor.py::test_a_run_with_no_recorded_revision_is_refused
verifies: SEG-SREQ-187
is reported by: SEG-OUT-C9DB5E3153A5

Building the extractor raises an error when the bundle holds no revision record of the implementation checkout. It raises the same error when the record is empty. It raises the same error when the record holds only a line feed.

Test Specification: A Confirms edge runs from each outcome to the specification its result maps to. SEG-TS-063
nodeid: tests/specification/test_outcome_extractor.py::test_a_confirms_edge_runs_from_each_outcome_to_its_specification
verifies: SEG-SREQ-188
is reported by: SEG-OUT-ED3D388706EB

Extracting from the fixture supplies exactly 76 edges of kind Confirms. Their pairs are the 76 pairs of an outcome identity and a specification identifier, formed from the results. One pair is the outcome of safe_data.api.safe_data.init_and_verify and TC_SAFE_DATA_INIT_AND_VERIFY. No outcome has two such edges.

Test Specification: A Witnesses edge runs from each outcome to each implementation of what its test verifies. SEG-TS-064
nodeid: tests/specification/test_outcome_extractor.py::test_a_witnesses_edge_runs_to_each_implementation_of_what_the_specification_verifies
verifies: SEG-SREQ-189
is reported by: SEG-OUT-1FEC9505B8D3

The need TC_SAFE_DATA_INIT_AND_VERIFY verifies SD-REQ-001 and SD-REQ-003. The implementation needs IMPL-safe_data_init and IMPL-safe_data_verify satisfy them. Each of the four outcomes of that specification has Witnesses edges to exactly those two implementations.

For every outcome, the edges run to exactly the implementations whose need satisfies a requirement that its specification verifies. This holds for a skipped outcome too. The skipped outcome of TC_SAFE_DATA_WRITE_OBSERVES_OVERWRITTEN_CORRUPTION has one edge, to IMPL-safe_data_write.

In a copy of the implementation export, IMPL-safe_data_commit also satisfies SD-REQ-001. Then the four outcomes have an edge to it as well. Without the implementation input, no Witnesses edge is supplied.

Test Specification: An outcome's anchor names its bundle by digest, the artifact's path in it, and the result. SEG-TS-065
nodeid: tests/specification/test_outcome_extractor.py::test_an_outcomes_anchor_names_the_run_artifact_and_the_result
verifies: SEG-SREQ-190
is reported by: SEG-OUT-580D9CFC09D0

Each of the 76 outcomes has exactly one content hash, contentHash. Its anchor names as its repository the digest of the clean bundle, written as sha256: and 64 hex digits. Its path is the run artifact within the bundle, twister.json. Its locator is nodeid: followed by the identifier of the result, for example nodeid:safe_data.api.safe_data.init_and_verify.

In a copy of the fixture, the bundle is moved to out/run1. Then every anchor still has the same repository member and the same path.

tests/specification/test_outcome_extractor_boards.py

Test Specification: A leaf is satisfied when the test of its specification passed on every board. SEG-TS-331
nodeid: tests/specification/test_outcome_extractor_boards.py::test_a_leaf_is_satisfied_when_the_test_passed_on_every_board
verifies: SEG-SREQ-006
is reported by: SEG-OUT-EE515657D8EE

One run artifact records one test on three platforms, native_sim/native/64, qemu_x86 and mps2/an385, and the test passed on each. One leaf requirement has an active Verifies edge from the specification of the test and an active Implements edge. The extractor supplies three outcomes, one for each platform, and each outcome has a Confirms edge to the specification. The satisfaction evaluator reports the leaf as satisfied. The same holds for the first two platforms alone.

Test Specification: A leaf is not satisfied when the test failed on one board, though it passed on the others. SEG-TS-332
nodeid: tests/specification/test_outcome_extractor_boards.py::test_a_leaf_is_not_satisfied_when_the_test_failed_on_one_board
verifies: SEG-SREQ-006
is reported by: SEG-OUT-D676F349E913

One run artifact records one test on three platforms. The test passed on two and failed on one, and the failing board is in turn the first, the second and the third. The extractor supplies three outcomes. For each order, the satisfaction evaluator reports the leaf as not satisfied. The package gate blocks, and the outcome of the failing board is the one outcome that no waiver excuses. A control with the test passed on every board is satisfied.

Test Specification: A board that skipped the test adds no obligation: the others decide the leaf. SEG-TS-333
nodeid: tests/specification/test_outcome_extractor_boards.py::test_a_board_that_skipped_the_test_adds_no_obligation
verifies: SEG-SREQ-006
is reported by: SEG-OUT-BE970386C069

One run artifact records one test on three platforms. The test passed on two and was skipped on one, and the skipping board is in turn the first, the second and the third. The extractor supplies three outcomes. For each order, the satisfaction evaluator reports the leaf as satisfied. The package gate lists the skipped outcome and no other, and the gate does not block. The same holds for a run artifact with two platforms, where the test was skipped on one and passed on the other.

tests/specification/test_outcome_extractor_need_ids.py

Test Specification: With a list and no need types, an outcome witnesses the listed needs only. SEG-TS-433
nodeid: tests/specification/test_outcome_extractor_need_ids.py::test_witnesses_run_only_to_the_listed_implementation_needs
verifies: SEG-SREQ-359
is reported by: SEG-OUT-84CE4D3050BD

The implementation export holds IMPL-A and IMPL-B of the type impl and IMPL-C of the type design. Each satisfies the requirement that two test cases verify. A run bundle holds one passed result for each test case. The list IMPL-A, IMPL-C is configured and no need types are. Each of the two outcomes has a Witnesses edge to IMPL-A and to IMPL-C, and to no other need. A control without the list gives each outcome an edge to all three.

Test Specification: With need types and no list, an outcome witnesses the needs of those types. SEG-TS-434
nodeid: tests/specification/test_outcome_extractor_need_ids.py::test_witnesses_run_only_to_the_implementation_needs_of_the_configured_types
verifies: SEG-SREQ-339
is reported by: SEG-OUT-F24B3BA2ADDE

The implementation export holds IMPL-A and IMPL-B of the type impl and IMPL-C of the type design. Each satisfies the requirement that two test cases verify. A run bundle holds one passed result for each test case. The types {impl} are configured and no list is. Each of the two outcomes has a Witnesses edge to IMPL-A and to IMPL-B and to no other need. With the types {design} each has one edge, to IMPL-C.

Test Specification: With need types and a list of need identifiers, a witnessed need is listed and typed. SEG-TS-435
nodeid: tests/specification/test_outcome_extractor_need_ids.py::test_an_outcome_witnesses_a_need_that_is_listed_and_of_a_configured_type
verifies: SEG-SREQ-359
is reported by: SEG-OUT-BF7A53EDC8C4

The implementation export holds IMPL-A and IMPL-B of the type impl and IMPL-C of the type design, and each satisfies the requirement that two test cases verify. The types {impl} and the list IMPL-A are configured. Each of the two outcomes has one Witnesses edge, to IMPL-A. There is none to IMPL-B, which has the type and is not listed, and none to IMPL-C, which has neither. With the types {impl, design} and the list IMPL-B, IMPL-C each outcome has an edge to those two needs only.

Test Specification: While neither need types nor a list is configured, an outcome witnesses every need. SEG-TS-436
nodeid: tests/specification/test_outcome_extractor_need_ids.py::test_without_types_and_without_a_list_an_outcome_witnesses_every_need
verifies: SEG-SREQ-340
is reported by: SEG-OUT-1720C1CCE941

The implementation export holds IMPL-A and IMPL-B of the type impl and IMPL-C of the type design, and each satisfies the requirement that two test cases verify. The configuration names no need types and no list. Each of the two outcomes has a Witnesses edge to each of the three needs. A list that is null, which is the same as no list, gives the same edges.

Test Specification: A listed need identifier that names no need of the export is refused, naming it. SEG-TS-437
nodeid: tests/specification/test_outcome_extractor_need_ids.py::test_a_listed_identifier_that_names_no_need_is_refused_by_the_outcome_extractor
verifies: SEG-SREQ-361
is reported by: SEG-OUT-93E6850A5981

The implementation export holds IMPL-A, IMPL-B and IMPL-C. The list IMPL-A, IMPL-GONE is configured. Building the outcome extractor raises one error. The error names IMPL-GONE and does not name IMPL-A. A control that lists IMPL-A and IMPL-B builds the extractor without an error.

Test Specification: A listed need identifier whose need the configured types do not admit is refused. SEG-TS-438
nodeid: tests/specification/test_outcome_extractor_need_ids.py::test_a_listed_identifier_of_a_need_of_another_type_is_refused_by_the_outcome_extractor
verifies: SEG-SREQ-361
is reported by: SEG-OUT-2F17D11E9012

The implementation export holds IMPL-A and IMPL-B of the type impl and IMPL-C of the type design. The types {impl} and the list IMPL-A, IMPL-C are configured. Building the outcome extractor raises one error. The error names IMPL-C and does not name IMPL-A. A control that configures the types {impl, design} with the same list builds the extractor without an error.

Test Specification: Every listed need identifier that names no admitted need is named in one error. SEG-TS-439
nodeid: tests/specification/test_outcome_extractor_need_ids.py::test_every_listed_identifier_that_names_no_need_is_named_in_one_outcome_error
verifies: SEG-SREQ-361
is reported by: SEG-OUT-013C79D51523

The implementation export holds IMPL-A and IMPL-B of the type impl and IMPL-C of the type design. The types {impl} and the list IMPL-A, IMPL-GONE-A, IMPL-C, IMPL-GONE-B are configured: two identifiers that name no need and one that names a need of another type. Building the outcome extractor raises one error. The error names IMPL-GONE-A, IMPL-C and IMPL-GONE-B, once each, and does not name IMPL-A.

Test Specification: A need that is not in the list of need identifiers is not refused, whatever its fault. SEG-TS-440
nodeid: tests/specification/test_outcome_extractor_need_ids.py::test_a_need_outside_the_list_is_not_refused_by_the_outcome_extractor
verifies: SEG-SREQ-375
is reported by: SEG-OUT-3AB07152F013

The implementation export holds IMPL-A, IMPL-B and IMPL-C, and two needs that the outcome extractor cannot use: IMPL-RENAMED, whose id is another text than its key, and IMPL-BAD-LINKS, whose links are a text and not a list. Without a list, building the outcome extractor raises an error that names the two. With the list IMPL-A, IMPL-B the extractor is built without an error, and each outcome has a Witnesses edge to those two needs. With a list that holds IMPL-A and IMPL-BAD-LINKS it raises an error that names IMPL-BAD-LINKS and not IMPL-RENAMED: a need that is listed is still refused for its fault.

tests/specification/test_outcome_extractor_need_types.py

Test Specification: Only the needs of the configured types are test-case needs. SEG-TS-317
nodeid: tests/specification/test_outcome_extractor_need_types.py::test_only_needs_of_the_configured_types_are_test_case_needs
verifies: SEG-SREQ-336
is reported by: SEG-OUT-092F58104D63

The test-case export holds TC-A and TC-B of the type test_case. It also holds TC-OTHER of the type test_other, with a suite and a test function. A run bundle records a result for the test of each of the three needs. With the types {test_case, test_other} configured, the extractor supplies three outcomes, and one of them confirms TC-OTHER. With the types {test_case} configured, the extractor refuses the bundle with an error that names the result of TC-OTHER, because that result maps to no test-case need.

Test Specification: While no type is configured, every need of the test-case export is a test-case need. SEG-TS-318
nodeid: tests/specification/test_outcome_extractor_need_types.py::test_without_configured_types_every_need_is_a_test_case_need
verifies: SEG-SREQ-337
is reported by: SEG-OUT-3C2F49E5CEAA

The test-case export holds TC-A of the type test_case and TC-OTHER of the type test_other, both with a suite and a test function. A run bundle records a result for the test of each. With no types configured, the extractor supplies two outcomes, and the outcomes confirm TC-A and TC-OTHER. When the export also holds a need of the type test_procedure whose suite is null, the extractor refuses the export with an error that names the need and says it has no text field ‘suite’.

Test Specification: A need of another type does not refuse the test-case export. SEG-TS-319
nodeid: tests/specification/test_outcome_extractor_need_types.py::test_a_need_of_another_type_does_not_refuse_the_test_case_export
verifies: SEG-SREQ-338
is reported by: SEG-OUT-32F050282708

The test-case export holds two needs of the type test_case and three needs of the type test_procedure. The identifier of a procedure need has the form test-proc-<area>_api_procedures-<step>, and its suite and test function are null. The types {test_case} are configured. A run bundle records one result for the test of each test case. Building the extractor and taking every record raises no error. The extractor supplies two outcomes, and each Confirms edge runs to a test case. No edge runs to a procedure need.

Test Specification: A bundle read over exports that hold needs of other types is not refused. SEG-TS-320
nodeid: tests/specification/test_outcome_extractor_need_types.py::test_a_bundle_read_over_exports_with_other_types_gives_a_verdict
verifies: SEG-SREQ-338
is reported by: SEG-OUT-2514FCE15D91

The test-case export of the toolbox fixture has a need of the type test_procedure added, with a suite and a test function that are null. The implementation export has a need of the type design added, whose links are not a list. The configuration names the types test_case and impl for the two exports. Running graph status with the clean bundle and a given revision exits with status 0. Its machine-readable report counts 76 outcomes at the current revision and none at another.

Test Specification: With no types configured, a need of another type with no test function refuses the read. SEG-TS-321
nodeid: tests/specification/test_outcome_extractor_need_types.py::test_a_bundle_read_over_a_procedure_need_with_no_configured_types_is_refused
verifies: SEG-SREQ-337
is reported by: SEG-OUT-BDF5E8D14B41

The test-case export of the toolbox fixture has a need of the type test_procedure added, with a suite and a test function that are null. The configuration names no types. Running graph status with the clean bundle and a given revision exits with status 2 and prints no report. The output names the procedure need. A control, whose export lacks that need, gives exit status 0.

Test Specification: A need of another type does not refuse the implementation export. SEG-TS-322
nodeid: tests/specification/test_outcome_extractor_need_types.py::test_a_need_of_another_type_does_not_refuse_the_implementation_export
verifies: SEG-SREQ-338
is reported by: SEG-OUT-B1267C3BF8F9

The implementation export holds IMPL-1 of the type impl and NOTE-1 of the type design. The links of NOTE-1 are a text and not a list. A run bundle records one result for one test case. With the types {impl} configured for the implementation export, the extractor is built without an error, and one Witnesses edge runs from the outcome to IMPL-1. With no types configured, the extractor refuses the export with an error that names NOTE-1.

Test Specification: Witnesses edges come only from the implementation needs of the configured types. SEG-TS-323
nodeid: tests/specification/test_outcome_extractor_need_types.py::test_the_witnesses_come_from_the_implementation_needs_of_the_configured_types
verifies: SEG-SREQ-339
is reported by: SEG-OUT-5B83598C96B5

The implementation export holds IMPL-1 of the type impl and NOTE-1 of the type design. Both satisfy the requirement that the one test case verifies, and both have a valid list of links. A run bundle records one result for that test case. With the types {impl} configured, the extractor supplies one Witnesses edge from the outcome, and it runs to IMPL-1. With the types {design} configured, the one edge runs to NOTE-1.

Test Specification: While no type is configured, every need of the implementation export is read. SEG-TS-324
nodeid: tests/specification/test_outcome_extractor_need_types.py::test_without_configured_types_every_implementation_need_is_read
verifies: SEG-SREQ-340
is reported by: SEG-OUT-2266AB62033C

The implementation export holds IMPL-1 of the type impl and NOTE-1 of the type design. Both satisfy the requirement that the one test case verifies. A run bundle records one result for that test case. With no types configured for the implementation export, the extractor supplies two Witnesses edges from the outcome, one to each need.

tests/specification/test_proof_show.py

Test Specification: Proof show and proof verify accept an identifier, a unique prefix of it, or a directory path. SEG-TS-133
nodeid: tests/specification/test_proof_show.py::test_a_package_is_named_by_identifier_by_unique_prefix_or_by_path
verifies: SEG-SREQ-248
is reported by: SEG-OUT-BC9ED970FF13

A case holds one generated package. For each of the two verbs, naming the package by its snapshot identifier, by the first twelve characters of the identifier, and by the path of a copy of its directory outside the case gives exit status 0. For proof show the three renderings are the same report, and its snapshot identifier is the identifier of the package.

Test Specification: Proof show and proof verify exit with status 2 for a prefix that names two packages. SEG-TS-134
nodeid: tests/specification/test_proof_show.py::test_a_prefix_that_names_two_packages_is_refused_with_both_names
verifies: SEG-SREQ-249
is reported by: SEG-OUT-E67AD99411B9

A case holds two packages generated one second apart, so that their identifiers share a long prefix. A prefix of both identifiers makes each verb exit with status 2. The output names both packages by identifier and holds no report. A prefix of the first identifier alone, longer than the shared one, names one package, and each verb exits with status 0.

Test Specification: Proof show reports the snapshot, scopes, revision, totality, root and findings. SEG-TS-135
nodeid: tests/specification/test_proof_show.py::test_proof_show_reports_what_the_package_records_about_itself
verifies: SEG-SREQ-250
is reported by: SEG-OUT-F293110E8824

For a generated package, the machine-readable report of proof show holds the snapshot identifier, the requested scope, the member scope, the revision, the totality flag, the design root and the digests of the run bundles, each equal to what the documents of the package record, and the findings of the coverage report in the order of the report. The human-readable report holds the snapshot identifier, the revision, the design root, each digest and each requested requirement.

Test Specification: Proof show reports, for each requirement of the scope, what the package records for it. SEG-TS-136
nodeid: tests/specification/test_proof_show.py::test_proof_show_lists_the_specifications_outcomes_and_implementations_of_each_requirement
verifies: SEG-SREQ-250
is reported by: SEG-OUT-72F6BADF50CC

For a generated package, the machine-readable report of proof show holds one entry for each requirement of the package’s node manifest and no other entry. Each entry holds the requirements that refine it, the specifications that verify it, the implementations that implement it, and the outcomes (identifier and result) that confirm one of those specifications. The expected lists are read by hand from the design edges and the execution coverage record. At least one entry holds a skipped outcome, and at least one entry refines no requirement and holds no specification.

Test Specification: Proof show says that no run bundle digest is recorded for a package that lists none. SEG-TS-137
nodeid: tests/specification/test_proof_show.py::test_a_package_without_run_bundle_digests_says_that_none_is_recorded
verifies: SEG-SREQ-251
is reported by: SEG-OUT-CC1BF196AA19

The golden package was sealed before packages listed run bundles. For it, proof show exits with status 0, its human-readable report holds the words “not recorded” on the line about the run bundle digests, and its machine-readable report holds no digest for them. A generated package that lists a digest shows the digest and not those words.

Test Specification: Proof show gives the same report whatever the readers of the configuration supply. SEG-TS-138
nodeid: tests/specification/test_proof_show.py::test_proof_show_reads_no_run_bundle_and_no_current_stream
verifies: SEG-SREQ-252
is reported by: SEG-OUT-93458605645B

A control call of proof show names the package with a working configuration. Then the producer that reads the current stream is replaced by one that records each call and fails, and proof show gives the same report and exit status 0. The producer was not called. A second call names a configuration whose requirement export does not exist: the report is the same again.

Test Specification: Proof show exits with status 0 for a package that records a blocked scope or a wrong root. SEG-TS-139
nodeid: tests/specification/test_proof_show.py::test_proof_show_exits_with_status_0_whatever_the_package_records
verifies: SEG-SREQ-253
is reported by: SEG-OUT-0FA5EE55F372

Four packages are read. A generated package that records no problem, a private copy whose coverage report records the scope as blocked with a finding of severity error, a private copy whose recorded root is not the root of its design, and the golden package. For each of them proof show exits with status 0 and reports the package.

Test Specification: Proof show and proof verify exit with status 2 for a package that cannot be read. SEG-TS-140
nodeid: tests/specification/test_proof_show.py::test_a_package_that_cannot_be_read_gives_exit_status_2
verifies: SEG-SREQ-254
is reported by: SEG-OUT-A61397CA0625

A generated package is read by each verb with exit status 0. Six other names each give exit status 2 and a refusal in the output: an identifier that the case does not hold, a path that is no directory, an empty directory, a copy without its coverage report, a copy whose evidence manifest is not JSON, and a copy whose design consistency proof lacks its root. The output holds no report.

Test Specification: Proof show reads a package named by its directory path from an empty directory. SEG-TS-158
nodeid: tests/specification/test_proof_show.py::test_proof_show_reads_a_package_named_by_path_with_no_configuration_and_no_case
verifies: SEG-SREQ-270
is reported by: SEG-OUT-0065CA3425EB

A generated package is copied to a place outside its case. The working directory is empty: it holds no configuration file and no case, and the call names neither. Given only the path of the copy, proof show exits with status 0 and reports the snapshot identifier of the package. The directory is still empty afterwards.

tests/specification/test_proof_verbs.py

Test Specification: The operator asks the gate about a scope and generates the package, each as its own verb. SEG-TS-149
nodeid: tests/specification/test_proof_verbs.py::test_proof_check_and_proof_generate_are_verbs_of_their_own
verifies: SEG-SREQ-089
is reported by: SEG-OUT-36FF72B66526

Over the frozen evidence and a case with every strong edge affirmed, proof check reports the gate’s coverage report as machine-readable output and exits with status 0, and writes nothing. Proof generate, as a separate verb, writes the four documents of a package under the case and exits with status 0.

Test Specification: The operator shows and verifies an evidence package, each as its own verb. SEG-TS-150
nodeid: tests/specification/test_proof_verbs.py::test_proof_show_and_proof_verify_are_verbs_of_their_own
verifies: SEG-SREQ-089
is reported by: SEG-OUT-6E0CEBE555BC

For a generated package, proof show exits with status 0 and its machine-readable report holds a list of requirements and no list of checks. Proof verify, as a separate verb, exits with status 0 and its machine-readable report holds a list of checks and no list of requirements.

Test Specification: The root of a package is the root that the design consistency proof's own contents give. SEG-TS-151
nodeid: tests/specification/test_proof_verbs.py::test_the_design_root_of_a_package_is_recomputed_from_its_own_design_consistency_proof
verifies: SEG-SREQ-037
is reported by: SEG-OUT-ACD94CCC3FE8

Two packages are generated, one over the clean bundle and one over the clean bundle and a second bundle at another revision. For each, the recipe of the tutorial gives the recorded root from the node hashes, the design edges, the scope and the revision of the design consistency proof, and from nothing else. The golden package gives the root of the golden file. A copy of a package with one digit of a node hash changed gives another root than the recorded one.

tests/specification/test_proof_verifier_bundles.py

Test Specification: The verifier fails the bundle digests check for a bundle the package does not list. SEG-TS-127
nodeid: tests/specification/test_proof_verifier_bundles.py::test_a_bundle_whose_digest_the_package_does_not_list_is_a_mismatch
verifies: SEG-SREQ-242
is reported by: SEG-OUT-BF9D190DEFEF

A package lists the digest of the clean bundle. Given that bundle, the check named bundle-digests is passed. Given a copy of the clean bundle with one file more, the check is failed and its detail holds the digest of the given copy. A package that lists no digest, the golden package, gives the same result for the clean bundle.

Test Specification: The verifier reports the evidence as not judged when a listed bundle is not given. SEG-TS-128
nodeid: tests/specification/test_proof_verifier_bundles.py::test_a_listed_bundle_that_is_not_given_leaves_the_evidence_unjudged
verifies: SEG-SREQ-243
is reported by: SEG-OUT-8B52C3B9EB53

A package lists the digests of two bundles. Given both, the checks named bundle-digests, rebuilt-evidence and snapshot-id are passed. Given only the first bundle, no check fails. The check named bundle-digests is not judged, its detail holds the digest of the bundle that is missing, and the checks named rebuilt-evidence and snapshot-id are not judged.

Test Specification: The verifier reports the evidence as not judged when a design node hash differs. SEG-TS-129
nodeid: tests/specification/test_proof_verifier_bundles.py::test_a_design_node_the_readers_do_not_supply_leaves_the_evidence_unjudged
verifies: SEG-SREQ-244
is reported by: SEG-OUT-E3FB768F4903

Given the clean bundle and the readers of the configuration, the check named design-guard is passed for a generated package. In a private copy the node hash of one requirement is changed by one digit in the design consistency proof, and the root is sealed again over the changed hash. The root and identity checks of the copy are passed. The design-guard check is not judged, its detail names the requirement, and the checks named rebuilt-evidence and snapshot-id are not judged. No check fails.

Test Specification: The verifier leaves the evidence unjudged for a design edge that no reader supplies. SEG-TS-130
nodeid: tests/specification/test_proof_verifier_bundles.py::test_a_design_edge_the_readers_do_not_supply_leaves_the_evidence_unjudged
verifies: SEG-SREQ-244
is reported by: SEG-OUT-AD5622CBB046

In a private copy of a generated package one more design edge joins two requirements that the readers of the configuration do not join, and the root is sealed again over the longer edge list. Given the clean bundle, the check named design-guard is not judged, its detail names both endpoints of the edge, and the checks named rebuilt-evidence and snapshot-id are not judged. The root check is passed. No check fails.

Test Specification: The verifier reports the rebuilt evidence check as failed when the record differs. SEG-TS-131
nodeid: tests/specification/test_proof_verifier_bundles.py::test_the_evidence_rebuilt_from_the_bundles_must_equal_the_recorded_evidence
verifies: SEG-SREQ-245
is reported by: SEG-OUT-12AAFC8A10D7

Given the clean bundle, the verifier rebuilds the outcomes and the findings at the revision the package records. For a generated package the check named rebuilt-evidence is passed. Two private copies each change the record. In the first, the result of one passed outcome in the execution coverage record is failed. In the second, the coverage report holds one more finding about an outcome of the record. For each copy the check named rebuilt-evidence is failed, and the root check is still passed.

Test Specification: The verifier reports the snapshot identifier check as failed when the identifier differs. SEG-TS-132
nodeid: tests/specification/test_proof_verifier_bundles.py::test_the_snapshot_identifier_must_follow_from_the_rebuilt_scope
verifies: SEG-SREQ-246
is reported by: SEG-OUT-7F6B1E16744E

A package generated at one timestamp and a package generated at another timestamp each pass the check named snapshot-id, given the clean bundle: the verifier mints the identifier with the timestamp the recorded identifier carries. A private copy changes the fingerprint part of the identifier in the design consistency proof and in the evidence manifest, so that the two documents agree, and the directory takes the new name. For the copy the check named snapshot-id is failed and the check named identity is passed.

tests/specification/test_proof_verifier_package.py

Test Specification: The verifier recomputes the design root of a package and reports that it equals the record. SEG-TS-119
nodeid: tests/specification/test_proof_verifier_package.py::test_the_design_root_of_a_package_is_recomputed_and_equals_the_recorded_root
verifies: SEG-SREQ-237
is reported by: SEG-OUT-770FCCD165A4

A package generated over the frozen evidence records a root. The recipe of the tutorial, written again in the test from the node hashes, the design edges, the scope and the revision of the design consistency proof, gives the same value. The verifier reports the check named root as passed. The golden package, which was sealed before packages listed run bundles, records the root in the golden file; the recipe gives that value too, and the verifier passes the root, the identity, the agreement and the unblocked checks of it. The verifier needs no configuration, no case and no run bundle for these checks.

Test Specification: The verifier reports the root check as failed when one input of the root changed. SEG-TS-120
nodeid: tests/specification/test_proof_verifier_package.py::test_a_changed_design_root_input_fails_the_root_check
verifies: SEG-SREQ-237
is reported by: SEG-OUT-A17CF7ED2A88

Four private copies of a generated package each change one input of the root in the design consistency proof, and nothing else: one hexadecimal digit of a node hash, a design edge removed, the revision, and the scope. The root recorded in each copy is the original. For each copy the check named root is failed. For the first two copies it is the only check that fails. An untouched copy passes the root check.

Test Specification: The verifier reports the identity check as failed when two documents name different packages. SEG-TS-121
nodeid: tests/specification/test_proof_verifier_package.py::test_documents_that_disagree_on_what_the_package_is_fail_the_identity_check
verifies: SEG-SREQ-238
is reported by: SEG-OUT-E577579D72C4

In a generated package the evidence manifest and the design consistency proof agree on the snapshot identifier, the requested scope and the revision: the check named identity is passed. Three private copies each change one of the three in the evidence manifest only: another snapshot identifier, one requested requirement removed, another revision. For each copy the identity check is failed, and the root check is still passed.

Test Specification: The verifier reports the agreement check as failed for a name that is no member of the scope. SEG-TS-122
nodeid: tests/specification/test_proof_verifier_package.py::test_an_outcome_or_finding_outside_the_member_scope_fails_the_agreement_check
verifies: SEG-SREQ-239
is reported by: SEG-OUT-E4AA9A4559A6

In a generated package every outcome and every finding that the execution coverage record and the coverage report name is a member of the member scope of the evidence manifest: the check named agreement is passed. Two private copies each break that. In the first, one outcome of the execution coverage record is removed from the member scope. In the second, the coverage report holds one more finding about a name that is no member. For each copy the agreement check is failed and the root check is still passed.

Test Specification: The verifier reports the agreement check as failed when the record and the report differ. SEG-TS-123
nodeid: tests/specification/test_proof_verifier_package.py::test_records_that_disagree_on_set_aside_skipped_or_excused_outcomes_fail_the_agreement_check
verifies: SEG-SREQ-239
is reported by: SEG-OUT-50660DD21DD9

In a generated package the execution coverage record and the coverage report agree on which outcomes are set aside, skipped and excused. Three private copies each break one of the three. In the first, an outcome that the record holds is also listed as stale in the report. In the second, an outcome that the report lists as skipped has the result passed in the record. In the third, the report lists as excused an outcome that carries no waiver in the record. For each copy the check named agreement is failed.

Test Specification: The verifier reports the unblocked check as failed when the report says the scope is blocked. SEG-TS-124
nodeid: tests/specification/test_proof_verifier_package.py::test_a_coverage_report_that_records_a_blocked_scope_fails_the_unblocked_check
verifies: SEG-SREQ-240
is reported by: SEG-OUT-461322055AD3

The coverage report of a generated package records the scope as not blocked: the check named unblocked is passed. A private copy changes the one flag, as the tutorial does with a text editor, and nothing else. The unblocked check of the copy is failed. The root check is still passed, because the root does not cover the report, and the check named unblocked is the only check that fails.

Test Specification: The verifier reports the affirmations check as passed when the case binds every design edge. SEG-TS-125
nodeid: tests/specification/test_proof_verifier_package.py::test_every_design_edge_bound_by_a_review_event_passes_the_affirmations_check
verifies: SEG-SREQ-241
is reported by: SEG-OUT-A3EA9EB48445

The case in which the package was generated holds a review event for every strong edge, made when the edges were affirmed. Given that case, the verifier reports the check named affirmations as passed for a generated package. Given no case, it does not make the check: the check is not made.

Test Specification: The verifier reports the affirmations check as failed for an edge the case does not bind. SEG-TS-126
nodeid: tests/specification/test_proof_verifier_package.py::test_a_design_edge_without_a_binding_review_event_fails_the_affirmations_check
verifies: SEG-SREQ-241
is reported by: SEG-OUT-1B98661CC6E2

Two private copies of the case each change the review events of one design edge of the package. In the first, the one event of the edge is removed. In the second, the event is kept and the content hash of its requirement endpoint is changed by one hexadecimal digit, so that it binds another node hash than the package records. For each copy, given that case, the check named affirmations is failed and its detail names both endpoints of the edge. Checked against the original case, the same package passes.

Test Specification: The verifier fails the identity check when the identifier is not the directory name. SEG-TS-152
nodeid: tests/specification/test_proof_verifier_package.py::test_a_snapshot_identifier_that_is_not_the_directory_name_fails_the_identity_check
verifies: SEG-SREQ-264
is reported by: SEG-OUT-F172EBCD079C

A generated package, named by the path of its directory, passes the check named identity. A private copy of the same documents sits in a directory with another name. For the copy the identity check is failed, its detail holds both names, and the root check is still passed.

Test Specification: The verifier fails the agreement check for an outcome that carries another revision. SEG-TS-153
nodeid: tests/specification/test_proof_verifier_package.py::test_an_outcome_of_another_revision_fails_the_agreement_check
verifies: SEG-SREQ-265
is reported by: SEG-OUT-C4329F77A42F

In a generated package every outcome of the execution coverage record carries the revision of the package: the check named agreement is passed. A private copy gives one outcome of the record another revision, with the same form. For the copy the agreement check is failed and the root check is still passed.

Test Specification: The verifier fails the agreement check when a recorded outcome is also listed as stale. SEG-TS-154
nodeid: tests/specification/test_proof_verifier_package.py::test_an_outcome_of_the_record_that_is_also_stale_fails_the_agreement_check
verifies: SEG-SREQ-266
is reported by: SEG-OUT-ED49FAF04EC6

A private copy of a generated package lists in its coverage report, as stale, one outcome that its execution coverage record holds. For the copy the check named agreement is failed and the root check is still passed. The untouched package passes.

Test Specification: The verifier fails the agreement check when the member scope has too much or too little. SEG-TS-155
nodeid: tests/specification/test_proof_verifier_package.py::test_a_member_scope_that_is_not_what_the_documents_name_fails_the_agreement_check
verifies: SEG-SREQ-267
is reported by: SEG-OUT-15C7323C357F

The member scope of a generated package is the design nodes, the outcomes and nothing else: the check named agreement is passed. Two private copies change the evidence manifest only. In the first, the member scope holds one name more that no document names. In the second, one design node is missing from the member scope. For each copy the agreement check is failed and the root check is still passed.

Test Specification: The verifier fails the unblocked check when the report lists an unready edge. SEG-TS-156
nodeid: tests/specification/test_proof_verifier_package.py::test_a_coverage_report_that_lists_an_unready_edge_fails_the_unblocked_check
verifies: SEG-SREQ-268
is reported by: SEG-OUT-ED112537A39E

A private copy of a generated package lists one design edge as pending in the unready edges of its coverage report, and keeps the flag that says the scope is not blocked. For the copy the check named unblocked is failed and the root check is still passed. The untouched package passes.

Test Specification: The verifier fails the unblocked check when the report holds a finding that blocks. SEG-TS-157
nodeid: tests/specification/test_proof_verifier_package.py::test_a_coverage_report_with_a_blocking_finding_fails_the_unblocked_check
verifies: SEG-SREQ-269
is reported by: SEG-OUT-1E5E436AE52A

A private copy of a generated package holds one more finding of severity error in its coverage report, about a requirement of the scope, and keeps the flag that says the scope is not blocked. For the copy the check named unblocked is failed and the root check is still passed.

tests/specification/test_proof_verify_cli.py

Test Specification: Proof verify names each check with its status, and names each check it did not make. SEG-TS-141
nodeid: tests/specification/test_proof_verify_cli.py::test_proof_verify_names_every_check_and_the_checks_it_did_not_make
verifies: SEG-SREQ-256
is reported by: SEG-OUT-4CD4F9FB46D6

For a generated package named with no run bundle and no request for the affirmations, the machine-readable report holds ten checks by name: root, identity, agreement, unblocked, affirmations, bundle-digests, design-guard, rebuilt-evidence, snapshot-id and sibling-digests. The first four are passed, and the other six are not made. With the clean bundle and the request for the affirmations, the first nine are passed and the check named sibling-digests is still not made. In the human-readable report one line starts with each name and holds the status. For a copy whose root is wrong, the line of the root check holds the word failed.

Test Specification: Proof verify judges the evidence by the run bundles named in the invocation and no others. SEG-TS-142
nodeid: tests/specification/test_proof_verify_cli.py::test_proof_verify_gives_the_verifier_exactly_the_bundles_the_operator_names
verifies: SEG-SREQ-257
is reported by: SEG-OUT-BAD3CBCE1E90

One package lists the digests of two bundles, and another lists the digest of the clean bundle alone. Naming both bundles for the first gives exit status 0. Naming only the clean bundle for the first gives exit status 2. Naming no bundle gives exit status 0, with the bundle checks not made. For the second package, naming the clean bundle gives exit status 0, and naming the clean bundle and the second bundle gives exit status 1, because the second bundle is a bundle that the package does not list. The configuration names no bundle in any call.

Test Specification: Proof verify checks the affirmations only when asked, against the case that the call names. SEG-TS-143
nodeid: tests/specification/test_proof_verify_cli.py::test_proof_verify_checks_the_affirmations_against_the_case_of_the_invocation
verifies: SEG-SREQ-258
is reported by: SEG-OUT-63C6FCA33C27

The case that holds a package binds every design edge. With the request for the affirmations, the check named affirmations is passed and the exit status is 0. A private copy of the case lacks the review event of one design edge. Naming that copy as the case, with the request, gives exit status 1 and a failed affirmations check. Naming that copy without the request gives exit status 0 and the check not made.

Test Specification: Proof verify exits with status 1 when a check fails, even if another is not judged. SEG-TS-144
nodeid: tests/specification/test_proof_verify_cli.py::test_a_failed_check_gives_exit_status_1_even_when_another_check_is_not_judged
verifies: SEG-SREQ-259
is reported by: SEG-OUT-3C71459A622A

Four private copies of a generated package fail one check each: a changed digit of a node hash (root), another requested scope in the evidence manifest (identity), a record that disagrees with the report (agreement), and a blocked scope (unblocked). Each gives exit status 1 and names the failed check. A copy of a package that lists two bundles, with a wrong root, named with only one bundle, has a failed root check and a check that is not judged. It gives exit status 1.

Test Specification: Proof verify exits with status 2 when an asked check is not judged and no check failed. SEG-TS-145
nodeid: tests/specification/test_proof_verify_cli.py::test_a_check_that_cannot_be_judged_gives_exit_status_2_when_nothing_failed
verifies: SEG-SREQ-260
is reported by: SEG-OUT-6D1C71E8A16B

A package lists two bundles and the call names one: the bundle checks are not judged, no check fails, and the exit status is 2. A copy of a package with one node hash changed and the root sealed again, named with the clean bundle, has a design guard that is not judged, no failed check, and exit status 2. The same two calls without any bundle give exit status 0.

Test Specification: Proof verify exits with status 0 when every check made passed and every asked one was judged. SEG-TS-146
nodeid: tests/specification/test_proof_verify_cli.py::test_a_package_whose_checks_all_pass_gives_exit_status_0
verifies: SEG-SREQ-261
is reported by: SEG-OUT-20644A8EAC31

For a generated package the exit status is 0 in four calls: with the package alone, with the clean bundle, with the request for the affirmations, and with both. A package that lists two bundles gives exit status 0 when both are named. The golden package, which lists none, gives exit status 0 with the package alone.

Test Specification: Proof verify takes no revision option and never asks for the revision of a repository. SEG-TS-147
nodeid: tests/specification/test_proof_verify_cli.py::test_proof_verify_obtains_no_implementation_revision
verifies: SEG-SREQ-262
is reported by: SEG-OUT-6AD674137D2D

Naming an option –revision for proof verify is a usage error with exit status 2. The function that resolves the revision for the other proof verbs is replaced by one that records each call and fails. Proof verify, named with the clean bundle, still gives exit status 0 and the function was not called.

Test Specification: Proof show and proof verify leave every file of the case, bundles and configuration alone. SEG-TS-148
nodeid: tests/specification/test_proof_verify_cli.py::test_proof_show_and_proof_verify_write_nothing
verifies: SEG-SREQ-263
is reported by: SEG-OUT-23E321148B57

A case holds a generated package, and its bundles and configuration lie beside it. Every file under the directory has its bytes recorded. Proof show, and proof verify with the package alone, with the bundle, with the request for the affirmations, and for a package that fails, each run with the machine-readable and the human-readable rendering. Afterwards the directory holds the same files with the same bytes, and no other.

Test Specification: Proof verify judges the package checks of a package named by path from an empty directory. SEG-TS-159
nodeid: tests/specification/test_proof_verify_cli.py::test_proof_verify_judges_a_package_named_by_path_with_no_configuration_and_no_case
verifies: SEG-SREQ-270
is reported by: SEG-OUT-680C263A4DFF

A generated package is copied to a place outside its case. The working directory is empty: it holds no configuration file and no case, and the call names neither. Given only the path of the copy, proof verify exits with status 0. The checks named root, identity, agreement and unblocked are passed, and the other six are not made. The directory is still empty afterwards.

tests/specification/test_reader_parent_field_and_source_map.py

Test Specification: Parent links come from the configured need field. SEG-TS-160
nodeid: tests/specification/test_reader_parent_field_and_source_map.py::test_parent_links_come_from_the_configured_field
verifies: SEG-SREQ-271
is reported by: SEG-OUT-7C5642861DC5

The configuration names the field trace. Reading the fixture export gives exactly three Refines edges: R-2 to R-1, R-3 to R-1 and R-3 to R-2. No edge goes to R-DECOY, the link in the field refines of R-2.

Test Specification: The parent-link field defaults to refines. SEG-TS-161
nodeid: tests/specification/test_reader_parent_field_and_source_map.py::test_the_parent_field_defaults_to_refines
verifies: SEG-SREQ-272
is reported by: SEG-OUT-EDD4E37E2376

The configuration names no parent field. Reading the fixture export gives exactly one Refines edge, R-2 to R-DECOY, the link in the field refines. The links in the field trace are not followed.

Test Specification: A Requirement is anchored at its mapped source file. SEG-TS-162
nodeid: tests/specification/test_reader_parent_field_and_source_map.py::test_a_requirement_is_anchored_at_its_mapped_source_file
verifies: SEG-SREQ-273
is reported by: SEG-OUT-65FDF716E6E0

The configuration holds a source map and no source directory. The content hash anchor of R-1 and R-2 names the repository docs, the path reqs/alpha.sdoc and the locator need:R-1 or need:R-2. That of R-3 names reqs/beta.sdoc. The digest of each equals the digest of the source directory form for the same need. So the map changes the anchor and never the hash.

Test Specification: A docname the source map does not cover is refused, and every one is named. SEG-TS-163
nodeid: tests/specification/test_reader_parent_field_and_source_map.py::test_a_docname_the_source_map_does_not_cover_is_refused
verifies: SEG-SREQ-274
is reported by: SEG-OUT-AF211F79B307

In a copy of the export, two needs of the configured type req sit in the documents docs/delta and docs/epsilon. The map does not name them. Building the reader raises a source error that names both docnames. It names none of docs/alpha, docs/beta and docs/gamma. The first two are mapped. The third holds only a need of the type info, and that type is not configured.

Test Specification: A content hash covers the parent links of the configured field. SEG-TS-184
nodeid: tests/specification/test_reader_parent_field_and_source_map.py::test_a_content_hash_covers_the_parent_links_of_the_configured_field
verifies: SEG-SREQ-147
is reported by: SEG-OUT-786EFE1A7930

The configuration names the field trace. For each requirement, the contentHash digest equals a SHA-256 that the test computes. The test hashes the canonical JSON of the title, the content and the sorted parent links, under the key refines. The digest also equals the digest from a copy of the export whose parents sit in the field refines, read with the default. The decoy link of R-2 changes nothing.

Test Specification: The order of the parent links does not change the content hash. SEG-TS-185
nodeid: tests/specification/test_reader_parent_field_and_source_map.py::test_the_order_of_parent_links_does_not_change_the_hash
verifies: SEG-SREQ-148
is reported by: SEG-OUT-5F9513B0B83A

The configuration names the field trace. In a copy of the export, the links of R-3 are listed in the other order. The contentHash digest of R-3 is the digest the fixture gives. Both equal the SHA-256 of the canonical form of R-3 with its parents sorted. The test computes that digest.

Test Specification: Refines edges come from the declared parent links, and from no back-link field. SEG-TS-186
nodeid: tests/specification/test_reader_parent_field_and_source_map.py::test_refines_edges_come_from_declared_parent_links_only
verifies: SEG-SREQ-149
is reported by: SEG-OUT-6346B7D70095

The configuration names the field trace. R-1 holds the back-links R-2 and R-3 in the field trace_back. Reading the export gives one pending Refines edge per declared link, from the child to the parent: three edges, and none from R-1.

Test Specification: A Requirement is anchored in the repository configured for the requirements reader. SEG-TS-187
nodeid: tests/specification/test_reader_parent_field_and_source_map.py::test_a_requirement_is_anchored_in_the_repository_of_the_reader
verifies: SEG-SREQ-151
is reported by: SEG-OUT-2B50A95EC1E8

The default repository is suite. The requirements reader names the repository docs and a source directory in it. The content hash anchor of R-1 names the repository docs and the path reqs/docs/alpha.rst. That path joins the source directory, the docname and the doctype, within docs.

tests/specification/test_repository_path_refusal.py

Test Specification: A producer over three plain directories that hold the files is read without an error. SEG-TS-403
nodeid: tests/specification/test_repository_path_refusal.py::test_a_world_with_three_plain_directories_is_the_control
verifies: SEG-SREQ-373
is reported by: SEG-OUT-BEFF3114AE89

The three repositories of the fixtures are plain directories, with no version-control data, and each holds the files its stream reads. Building the producer and taking its nodes and edges raises no error. The producer supplies nine nodes. This is the control for the specifications that follow, so each of them fails for the repository path alone.

Test Specification: A repository path that does not exist is reported once, by its name and with its path. SEG-TS-404
nodeid: tests/specification/test_repository_path_refusal.py::test_a_repository_path_that_does_not_exist_is_reported_once
verifies: SEG-SREQ-373
is reported by: SEG-OUT-6C13FAC6A4C6

The configuration maps the repository of the test stream to a path that does not exist. Three needs read through it. The producer is built and its records are taken. One source error is raised. Exactly one of its lines holds the configured name of the repository. That line also holds the configured path and says that the path does not exist. No line holds the identifier or the symbol of a need of that stream, and the other two repositories are not named.

Test Specification: A repository path that is a file is reported once, by its name and with its path. SEG-TS-405
nodeid: tests/specification/test_repository_path_refusal.py::test_a_repository_path_that_is_a_file_is_reported_once
verifies: SEG-SREQ-373
is reported by: SEG-OUT-FF2DA0D36C9A

The configuration maps the repository of the implementation stream to a path that is a file. Three needs read through it. The producer is built and its records are taken. One source error is raised. Exactly one of its lines holds the configured name of the repository. That line also holds the configured path and says that the path is not a directory. No line holds the identifier or the symbol of a need of that stream.

Test Specification: A repository that both streams read through is reported once. SEG-TS-406
nodeid: tests/specification/test_repository_path_refusal.py::test_one_repository_that_both_streams_read_through_is_reported_once
verifies: SEG-SREQ-373
is reported by: SEG-OUT-04D51673CE5A

The configuration gives the implementation stream and the test stream one repository name, and maps it to a path that does not exist. Six needs read through it. One source error is raised. Exactly one of its lines holds the configured name, and that line holds the path. No line holds the identifier or the symbol of a need.

Test Specification: Two repositories whose paths cannot be used are both reported in one error. SEG-TS-407
nodeid: tests/specification/test_repository_path_refusal.py::test_two_repositories_that_cannot_be_used_are_both_reported_in_one_error
verifies: SEG-SREQ-373
is reported by: SEG-OUT-990D62768A24

The configuration maps the repository of the implementation stream to a path that does not exist, and the repository of the test stream to a path that is a file. The requirements repository is fine. One source error is raised. It has one line that holds the name of the first repository and its path, and one line that holds the name of the second repository and its path. No line holds the name of the requirements repository or the identifier or the symbol of any need.

Test Specification: A plain directory that holds the files is a valid repository path. SEG-TS-408
nodeid: tests/specification/test_repository_path_refusal.py::test_a_directory_that_is_not_a_version_control_repository_is_a_valid_path
verifies: SEG-SREQ-373
is reported by: SEG-OUT-0EC146C14FF4

The three repositories are plain directories that hold the files the streams read and no version-control data. Case sync over an initialized case exits with status 0 and prints the sync line. It prints, for each of the three configured names, a line that says that node records were written without an extraction revision. The case holds nine nodes, three for each stream.

Test Specification: A repository path that only the requirements reader reads through is not refused. SEG-TS-409
nodeid: tests/specification/test_repository_path_refusal.py::test_a_repository_that_only_the_requirements_reader_names_is_not_checked
verifies: SEG-SREQ-373
is reported by: SEG-OUT-91771C35F021

The configuration maps the repository of the requirements reader to a path that does not exist. The other two repositories are fine. Building the producer and taking its records raises no error, and the producer supplies the three requirements. Case sync over an initialized case exits with status 0 and its output says nothing about a path that does not exist.

Test Specification: Case sync over a repository path that does not exist exits with status 2 and writes nothing. SEG-TS-410
nodeid: tests/specification/test_repository_path_refusal.py::test_case_sync_over_a_missing_repository_exits_2_names_it_once_and_writes_nothing
verifies: SEG-SREQ-373
is reported by: SEG-OUT-F38AC3DB0D1F

The configuration maps the repository of the test stream to a path that does not exist. Case sync over an initialized case exits with status 2. Its output has exactly one line that holds the configured name of the repository, and that line holds the path. No line holds the identifier or the symbol of a need. The files of the case are the same after the command as before it. The output holds no traceback.

Test Specification: The line about a repository path comes before any line about a need. SEG-TS-411
nodeid: tests/specification/test_repository_path_refusal.py::test_the_repository_line_comes_before_any_line_about_a_need
verifies: SEG-SREQ-373
is reported by: SEG-OUT-F42815811AE5

The configuration maps the repository of the implementation stream to a path that does not exist. The test stream reads through a repository that is a directory but lacks the test source file its Doxygen output names, so each of its needs has a fault of its own. One source error is raised. It has a line that holds the configured name of the first repository, and every line that holds the identifier or the symbol of a need comes after that line.

Test Specification: Several repositories whose paths cannot be used are listed sorted by configured name. SEG-TS-414
nodeid: tests/specification/test_repository_path_refusal.py::test_several_bad_repositories_are_listed_sorted_by_configured_name
verifies: SEG-SREQ-373
is reported by: SEG-OUT-579B7C53A23A

The configuration names the repository of the implementation stream zeta-name and the repository of the test stream alpha-name, and maps both to a path that does not exist. The implementation stream comes first in the order of the streams, but the error lists the line of alpha-name before the line of zeta-name. Building the producer a second time gives an error with the same lines.

tests/specification/test_repository_reads_decoy_case.py

Test Specification: edge show names the commit of the case itself, whatever repository the environment names. SEG-TS-297
nodeid: tests/specification/test_repository_reads_decoy_case.py::test_edge_show_names_the_recording_commit_of_the_case_whatever_the_environment_names
verifies: SEG-SREQ-332

A case is a git repository. One commit by Alice adds the review event of an edge. A second repository holds a copy of the files of the case, in a commit by Dan. One variable of the environment names it: GIT_DIR, GIT_WORK_TREE, GIT_OBJECT_DIRECTORY or GIT_COMMON_DIR. edge show exits with status 0. In text and in JSON, the provenance of the edge is found, and it names the commit by Alice and her identity. It does not name the commit by Dan, or his e-mail address. A control, without the variable, gives the same. Git, called with the variable, answers differently, so the decoy works.

Test Specification: edge show reports a case inside another repository as not available, whatever GIT_DIR names. SEG-TS-298
nodeid: tests/specification/test_repository_reads_decoy_case.py::test_edge_show_does_not_take_an_enclosing_repository_for_the_case
verifies: SEG-SREQ-301
is reported by: SEG-OUT-EB9DC97E5AFC

A case lies inside another repository, which holds it in a commit of its own. edge show for an edge of that case exits with status 0. It reports the history as not available: the JSON status is unavailable, and no commit, committer or author is named. The same holds when GIT_DIR names the git directory of the enclosing repository. Git, called with that variable, takes the case for the top level of that repository, so the variable changes the answer of git.

tests/specification/test_repository_reads_decoy_content.py

Test Specification: case sync records the revision of the repository at the path, whatever the environment names. SEG-TS-292
nodeid: tests/specification/test_repository_reads_decoy_content.py::test_case_sync_records_the_revision_of_the_repository_at_the_path
verifies: SEG-SREQ-332

A case is empty. A configuration maps the content repository, which holds the committed content of three requirements. A second repository has other commits. One variable of the environment names it: GIT_DIR, GIT_WORK_TREE, GIT_INDEX_FILE, GIT_OBJECT_DIRECTORY or GIT_COMMON_DIR. Running case sync exits with status 0 and prints no line about a missing extraction revision. Each node record carries the revision of the content repository, as git gives it with no such variable. It never carries a revision of the second repository. A control, without the variable, gives the same records. Git, called with the variable, answers differently, so the decoy works.

Test Specification: case sync gives no revision for a repository without objects, whatever the environment names. SEG-TS-293
nodeid: tests/specification/test_repository_reads_decoy_content.py::test_case_sync_does_not_borrow_objects_from_a_repository_the_environment_names
verifies: SEG-SREQ-332
is reported by: SEG-OUT-4DB3F121F2BB

The content repository has lost every object file, so git cannot read a commit in it. A second repository holds a copy of those objects. A first case sync, without a variable, exits with status 0 and records no revision. It prints one line that names the repository and the count 3. Then GIT_ALTERNATE_OBJECT_DIRECTORIES names the object store of the second repository, and case sync runs again. It exits with status 0 and records no revision. It prints the same line. Git, called with the variable, can read the commit, so the variable changes the answer of git.

Test Specification: edge affirm records the revision of the repository at the path, not an environment one. SEG-TS-294
nodeid: tests/specification/test_repository_reads_decoy_content.py::test_edge_affirm_records_the_revision_of_the_repository_at_the_path
verifies: SEG-SREQ-332

A configuration maps the content repository, which holds the committed content of three requirements. A second repository has other commits. One variable of the environment names it: GIT_DIR, GIT_WORK_TREE, GIT_INDEX_FILE, GIT_OBJECT_DIRECTORY or GIT_COMMON_DIR. Running edge affirm for the edge from REQ-B to REQ-A, with no revision given, exits with status 0 and refuses nothing. The review event holds the revision of the content repository for both endpoints, and no other revision. Each of the two node records carries that revision. A control, without the variable, gives the same event revisions. Git, called with the variable, answers differently, so the decoy works.

Test Specification: node show reports the revision and the cleanliness of the repository at the path. SEG-TS-295
nodeid: tests/specification/test_repository_reads_decoy_content.py::test_node_show_reports_the_state_of_the_repository_at_the_path
verifies: SEG-SREQ-332

A case holds three requirements, written by a case sync. The content repository is clean. A second repository has other commits. One variable of the environment names it: GIT_DIR, GIT_WORK_TREE, GIT_INDEX_FILE, GIT_OBJECT_DIRECTORY or GIT_COMMON_DIR. Running node show for REQ-B exits with status 0. The checkout of its hash names the revision of the content repository, as git gives it with no such variable. It lists no dirty path and reports no error. Git, called with the variable, answers differently, so the decoy works.

Test Specification: edge show recovers the before-content from the repository at the path. SEG-TS-296
nodeid: tests/specification/test_repository_reads_decoy_content.py::test_edge_show_reads_the_before_content_from_the_repository_at_the_path
verifies: SEG-SREQ-332

An edge from REQ-B to REQ-A is affirmed. Then the text of both requirements changes, and the change is committed in the content repository. A second repository has other commits. One variable of the environment names it: GIT_DIR, GIT_OBJECT_DIRECTORY or GIT_COMMON_DIR. Running edge show with the options for verbose JSON exits with status 0. The before-content of each endpoint is the text that the content repository held when the edge was affirmed. A control, without the variable, gives the same text. Git, called with the variable, answers differently, so the decoy works.

Test Specification: edge affirm refuses a dirty content repository, whatever repository the environment names. SEG-TS-316
nodeid: tests/specification/test_repository_reads_decoy_content.py::test_edge_affirm_still_refuses_a_dirty_repository_with_a_variable_set
verifies: SEG-SREQ-332

The content repository holds an uncommitted change in the file of REQ-B. A second repository is made so that it hides the change from a read of the wrong repository. One variable of the environment names it: GIT_DIR, GIT_WORK_TREE or GIT_INDEX_FILE. Running edge affirm for the edge from REQ-B to REQ-A, with no revision given, exits with status 2 and names the file of REQ-B. It writes no review event. A control, without the variable, gives the same. Git, called with the variable, reports no change in that file for GIT_DIR and GIT_WORK_TREE, so the decoy works.

tests/specification/test_repository_reads_decoy_no_write.py

Test Specification: case sync writes nothing in the content repository or in the decoy, with a variable set. SEG-TS-299
nodeid: tests/specification/test_repository_reads_decoy_no_write.py::test_case_sync_writes_nothing_in_either_repository_with_a_variable_set
verifies: SEG-SREQ-115

A content repository has an out-of-date index and a change that is not committed. A second repository has an out-of-date index too. One variable of the environment names it: GIT_DIR, GIT_WORK_TREE or GIT_INDEX_FILE. Running case sync exits with status 0. Every file under the .git directory of each repository is the same after the command, and so is every file of each working tree.

Test Specification: edge affirm and node show write nothing in the content repository or in the decoy. SEG-TS-300
nodeid: tests/specification/test_repository_reads_decoy_no_write.py::test_edge_affirm_and_node_show_write_nothing_in_either_repository_with_a_variable_set
verifies: SEG-SREQ-115

A content repository has an out-of-date index and a change that is not committed, in a file that the edge does not anchor. A second repository has an out-of-date index too. One variable of the environment names it: GIT_DIR, GIT_WORK_TREE or GIT_INDEX_FILE. The test runs node show for REQ-B. Then it runs edge affirm for the edge from REQ-B to REQ-A. Every file under the .git directory of each repository is the same after both commands. So is every file of each working tree.

Test Specification: edge show writes nothing under the git directory of the case or of the decoy. SEG-TS-301
nodeid: tests/specification/test_repository_reads_decoy_no_write.py::test_edge_show_writes_nothing_under_the_git_directory_of_the_case_with_a_variable_set
verifies: SEG-SREQ-116

A case is a git repository with an out-of-date index, and a commit holds the review event of an edge. A second repository holds a copy of the case, with an out-of-date index too. GIT_DIR or GIT_WORK_TREE names it. Running edge show exits with status 0. Every file under the .git directory of the case is the same after the command. So is every file under the .git directory of the second repository, and every file of both working trees.

tests/specification/test_repository_reads_parts.py

Test Specification: A read of more paths than one call takes gives the answer that one call gives. SEG-TS-308
nodeid: tests/specification/test_repository_reads_parts.py::test_a_read_of_more_paths_than_one_call_takes_gives_the_answer_of_one_call
verifies: SEG-SREQ-334
is reported by: SEG-OUT-1D7BCC7F61CF

A repository holds nine requirements, each in a file of its own. The change of two files is not committed, and a third file was never committed. One call of git takes at most two paths. A stand-in git logs the calls. Running case sync exits with status 0. Git status is called more than once. The six requirements with clean, committed files carry the revision of the repository. The three others carry none. One line names the repository and the count 3. A control makes the same store with no limit, and gives the same records and the same line.

Test Specification: A read in parts names every path in exactly one call, and no call names too many. SEG-TS-309
nodeid: tests/specification/test_repository_reads_parts.py::test_a_read_in_parts_gives_every_path_to_exactly_one_call_and_no_call_too_many
verifies: SEG-SREQ-334
is reported by: SEG-OUT-FC9EF8120506

A repository holds nine requirements, each in a file of its own. One call of git takes at most two paths. A stand-in git logs each call. Running case sync exits with status 0. The calls of git status are more than one, and so are the calls of git ls-tree. In each call, the paths number at most two. Taken together, the calls of each subcommand name each of the nine paths once and name no other path.

Test Specification: node show reads the paths of a node in parts and reports the dirty path one call reports. SEG-TS-310
nodeid: tests/specification/test_repository_reads_parts.py::test_node_show_reads_the_paths_of_one_node_in_parts_and_reports_the_same_dirty_path
verifies: SEG-SREQ-334
is reported by: SEG-OUT-D5D7EEFB79AD

A node, TS-1, hashes two files in one repository. The change of the second file in the order of the names is not committed. One call of git takes at most one path. Running node show for TS-1 exits with status 0. The checkout lists the second file as its one dirty path, and names the revision of the repository. A control, with no limit, gives the same checkout.

Test Specification: A read of so many paths that the system refuses one call gives the answer of one call. SEG-TS-311
nodeid: tests/specification/test_repository_reads_parts.py::test_a_read_of_so_many_paths_that_the_system_refuses_the_call_still_gives_revisions
verifies: SEG-SREQ-334
is reported by: SEG-OUT-54C6642A3089

A repository holds a committed file for each of several hundred requirements. Each file lies in directories deep in the tree, and each path is about 3.5 KB long, with no one name longer than 250 bytes. The paths together are larger than the limit of the operating system for the arguments of one program, so that the number of bytes and not the number of paths decides where a read is cut in parts. Running case sync exits with status 0. Each node record carries the revision of the repository. No line reports a missing extraction revision.

Test Specification: A call of git that fails makes the repository one that cannot be read. SEG-TS-312
nodeid: tests/specification/test_repository_reads_parts.py::test_a_failing_call_fails_the_read_of_a_repository_that_one_call_reads
verifies: SEG-SREQ-335
is reported by: SEG-OUT-865CACC04069

A repository holds six requirements. In one run, a stand-in git fails the first call of git status. In a second run, it fails the first call of git ls-tree. In both runs, case sync exits with status 0. No node record carries a revision, and one line names the repository and the count 6. The same run without a failure gives all six records the revision.

Test Specification: case sync gives no revision for any node of a repository when a later part fails. SEG-TS-313
nodeid: tests/specification/test_repository_reads_parts.py::test_case_sync_counts_the_repository_as_unreadable_when_a_later_part_fails
verifies: SEG-SREQ-335

A repository holds six requirements, all clean and committed. One call of git takes at most two paths. A stand-in git fails the second call of git status in one run, and the second call of git ls-tree in the other. Running case sync exits with status 0. No node record carries a revision, not even the records of the paths in the parts that were read. One line names the repository and the count 6.

Test Specification: node show reports a repository that cannot be read when a later part fails. SEG-TS-314
nodeid: tests/specification/test_repository_reads_parts.py::test_node_show_reports_the_repository_as_unreadable_when_a_later_part_fails
verifies: SEG-SREQ-335
is reported by: SEG-OUT-EF7BA18D8642

A node, TS-1, hashes two files in one repository. One call of git takes at most one path. A stand-in git fails the second call of git status. Running node show for TS-1 exits with status 0. The checkout names no revision, and it gives an error.

tests/specification/test_repository_reads_stand_in.py

Test Specification: case sync runs every call of git without the seven variables that name a repository. SEG-TS-302
nodeid: tests/specification/test_repository_reads_stand_in.py::test_case_sync_runs_git_without_the_variables_that_name_a_repository
verifies: SEG-SREQ-333
is reported by: SEG-OUT-F034B448DCCB

A configuration maps a content repository. A second repository exists. All seven variables GIT_DIR, GIT_WORK_TREE, GIT_INDEX_FILE, GIT_OBJECT_DIRECTORY, GIT_ALTERNATE_OBJECT_DIRECTORIES, GIT_COMMON_DIR and GIT_NAMESPACE are set, and each names the second repository. A stand-in git logs the environment of each call. Running case sync exits with status 0. The log holds calls for the revision, the status and the tree. In no call is one of the seven variables present.

Test Specification: edge affirm runs every call of git without the seven variables that name a repository. SEG-TS-303
nodeid: tests/specification/test_repository_reads_stand_in.py::test_edge_affirm_runs_git_without_the_variables_that_name_a_repository
verifies: SEG-SREQ-333
is reported by: SEG-OUT-287026A09738

A configuration maps a content repository. A second repository exists. All seven variables are set, and each names the second repository. A stand-in git logs the environment of each call. Running edge affirm for the edge from REQ-B to REQ-A, with no revision given, exits with status 0. The log holds calls for the revision, the status and the tree. In no call is one of the seven variables present.

Test Specification: node show runs every call of git without the seven variables that name a repository. SEG-TS-304
nodeid: tests/specification/test_repository_reads_stand_in.py::test_node_show_runs_git_without_the_variables_that_name_a_repository
verifies: SEG-SREQ-333
is reported by: SEG-OUT-FC5663933F69

A case holds three requirements. A second repository exists. All seven variables are set, and each names the second repository. A stand-in git logs the environment of each call. Running node show for REQ-B exits with status 0. The log holds calls for the revision, the status and the tree. In no call is one of the seven variables present.

Test Specification: edge show runs the before-content read of git without the seven variables. SEG-TS-305
nodeid: tests/specification/test_repository_reads_stand_in.py::test_edge_show_runs_the_before_content_read_without_the_variables_that_name_a_repository
verifies: SEG-SREQ-333
is reported by: SEG-OUT-7BF2BCA6DD45

An edge from REQ-B to REQ-A is affirmed, and then the text of both requirements changes and is committed. A second repository exists. All seven variables are set, and each names the second repository. A stand-in git logs the environment of each call. Running edge show with the options for verbose JSON exits with status 0. The log holds a call of the subcommand show. In no call is one of the seven variables present.

Test Specification: edge show runs every read of the history of the case without the seven variables. SEG-TS-306
nodeid: tests/specification/test_repository_reads_stand_in.py::test_edge_show_runs_the_case_history_reads_without_the_variables_that_name_a_repository
verifies: SEG-SREQ-333
is reported by: SEG-OUT-A0FD2A7DD9AB

A case is a git repository, and one commit adds the review event of an edge. A second repository exists. All seven variables are set, and each names the second repository. A stand-in git logs the environment of each call. Running edge show exits with status 0, and the provenance of the edge is found. The log holds calls of the subcommands rev-parse, log and show. In no call is one of the seven variables present.

Test Specification: A repository read keeps GIT_CEILING_DIRECTORIES and the GIT_CONFIG_COUNT settings. SEG-TS-307
nodeid: tests/specification/test_repository_reads_stand_in.py::test_a_repository_read_keeps_the_ceiling_and_the_config_variables
verifies: SEG-SREQ-333
is reported by: SEG-OUT-8FE3E68724C2

GIT_CEILING_DIRECTORIES names a directory, and GIT_CONFIG_COUNT with its key and value variables sets a git option. A stand-in git logs the environment of each call. Running case sync exits with status 0. The log holds calls. In each call, GIT_CEILING_DIRECTORIES and GIT_CONFIG_COUNT are still present.

Test Specification: proof check reads the revision of the implementation repository without the seven variables. SEG-TS-315
nodeid: tests/specification/test_repository_reads_stand_in.py::test_proof_check_reads_the_gate_revision_without_the_variables_that_name_a_repository
verifies: SEG-SREQ-333
is reported by: SEG-OUT-8859FBD240B1

A configuration maps the implementation repository, which is clean. A second repository exists. All seven variables are set, and each names the second repository. A stand-in git logs the environment of each call. Running proof check for the scope SREQ-1, with no revision given, does not refuse the run. The log holds calls of the subcommands rev-parse and status. In no call is one of the seven variables present.

tests/specification/test_requirements_reader.py

Test Specification: Only configured need types become Requirements. SEG-TS-011
nodeid: tests/specification/test_requirements_reader.py::test_only_configured_need_types_become_requirements
verifies: SEG-SREQ-145
is reported by: SEG-OUT-8DA5BCC72549

Reading the frozen requirement export with the configured types {top_requirement, requirement} supplies Requirement records for exactly the 29 need identifiers the export holds; reading it with {requirement} alone supplies exactly the 22 identifiers of needs of that type, and no identifier of a top_requirement need appears among them.

Test Specification: A Requirement is identified by its need identifier, verbatim. SEG-TS-012
nodeid: tests/specification/test_requirements_reader.py::test_a_requirement_is_identified_by_its_need_identifier_verbatim
verifies: SEG-SREQ-146
is reported by: SEG-OUT-7099DDD684D9

Reading the frozen requirement export with both requirement types configured supplies records whose local identifiers equal, byte for byte, the ids of the export’s needs, among them SD-REQ-002 and SD-TOP-001; no identifier is normalised, prefixed or re-cased.

Test Specification: A Requirement's content hash covers its authored fields and no others. SEG-TS-013
nodeid: tests/specification/test_requirements_reader.py::test_a_requirements_content_hash_covers_its_authored_fields_only
verifies: SEG-SREQ-147
is reported by: SEG-OUT-BC4B01B2EECC

The contentHash digest supplied for SD-REQ-002 equals the SHA-256 of the UTF-8 canonical JSON (sorted keys, no insignificant whitespace) of an object holding exactly its title, its content and its sorted refines, computed in the test. In a copy of the export where only its status is changed, the digest is the same; in a copy where one character of its content is changed, the digest differs.

Test Specification: The order of a need's refines links does not change its content hash. SEG-TS-014
nodeid: tests/specification/test_requirements_reader.py::test_the_order_of_refines_links_does_not_change_the_content_hash
verifies: SEG-SREQ-148
is reported by: SEG-OUT-C663F828BADB

In two copies of the export where SD-REQ-002 declares the same two parents, SD-TOP-006 and SD-TOP-001, in opposite orders, the digest supplied for SD-REQ-002 is the same in both, and equals the digest computed in the test from the sorted parents.

Test Specification: Refines edges come from declared refines links only. SEG-TS-015
nodeid: tests/specification/test_requirements_reader.py::test_refines_edges_come_from_declared_links_only
verifies: SEG-SREQ-149
is reported by: SEG-OUT-1A8CEBAA4D08

Reading the frozen export supplies exactly the 22 (child, parent) pairs its needs declare in refines, each edge of kind Refines in the pending state, running from the child to the parent. In a copy where a need’s refines_back lists a need that does not declare the link, the edge set is unchanged.

Test Specification: An export carrying a build timestamp is refused. SEG-TS-016
nodeid: tests/specification/test_requirements_reader.py::test_an_export_carrying_a_build_timestamp_is_refused
verifies: SEG-SREQ-150
is reported by: SEG-OUT-C0637BF41059

Constructing the reader over a copy of the export that adds a created stamp to its version entry, and separately over one that adds it at the top level, raises the reader’s error before any record is supplied; constructing it over the export as frozen, whose every timestamp field is null, does not.

Test Specification: A Requirement's anchor names its repository, source file and need. SEG-TS-017
nodeid: tests/specification/test_requirements_reader.py::test_a_requirements_anchor_names_its_source_file_and_its_need
verifies: SEG-SREQ-151
is reported by: SEG-OUT-29A3C899243D

Reading the frozen export with the repository name “toolbox” and the source directory “doc” supplies, for every Requirement, a contentHash anchor whose repository is “toolbox” (a name, not a path), whose path is the need’s docname and doctype under “doc” (doc/detailed.rst for SD-REQ-002, doc/top-level.rst for SD-TOP-001) and whose locator is need: followed by the need’s identifier.

Test Specification: The producer's repository name is loaded from the configuration file. SEG-TS-018
nodeid: tests/specification/test_requirements_reader.py::test_the_producers_repository_name_is_loaded_from_the_file
verifies: SEG-SREQ-192
is reported by: SEG-OUT-F7E558FB5B8A

Loading a configuration file whose producer block names the repository “sample-repo” yields a producer whose repository is “sample-repo”.

Test Specification: The requirement export's location is loaded, resolved against the file. SEG-TS-019
nodeid: tests/specification/test_requirements_reader.py::test_the_requirement_export_location_is_loaded_relative_to_the_file
verifies: SEG-SREQ-193
is reported by: SEG-OUT-475C3D1E2731

Loading a configuration file in a subdirectory whose producer requirements block names the export “needs/needs.json” yields a requirement export path equal to that subdirectory joined with the relative path, independent of the working directory.

Test Specification: The requirement types are loaded as a set of strings. SEG-TS-020
nodeid: tests/specification/test_requirements_reader.py::test_the_requirement_types_are_loaded_as_a_set_of_strings
verifies: SEG-SREQ-194
is reported by: SEG-OUT-8B4B92828686

Loading a configuration file whose producer requirements block lists the types sreq and sys, the first listed twice, yields the frozenset {“sreq”, “sys”}.

Test Specification: The requirement source directory is loaded, resolved against the file. SEG-TS-021
nodeid: tests/specification/test_requirements_reader.py::test_the_requirement_source_directory_is_loaded_relative_to_the_file
verifies: SEG-SREQ-198
is reported by: SEG-OUT-6EBB18340527

Loading a configuration file in a subdirectory whose producer requirements block names the source directory “doc” yields a source directory path equal to that subdirectory joined with “doc”.

tests/specification/test_run_bundle_cli.py

Test Specification: A run bundle that the extractor refuses gives exit status 2 and no verdict. SEG-TS-078
nodeid: tests/specification/test_run_bundle_cli.py::test_a_refused_bundle_gives_exit_status_2_and_no_verdict
verifies: SEG-SREQ-231
is reported by: SEG-OUT-8C2D27C52581

Graph status, proof check and proof generate each name the clean bundle with a revision given, and each gives a verdict: graph status prints its edges, proof check prints its coverage report, and proof generate prints a refusal of the gate or a snapshot. Five spoiled copies replace the bundle in turn: a dirty implementation checkout, no run name, no run artifact, no recorded revision, and a path that is a file and no directory. For each copy and each verb the exit status is 2. The output holds a refusal and no edge rows, no coverage report, no snapshot and no written document.

Test Specification: Case sync, case check, graph check, edge show and edge affirm take no run bundle. SEG-TS-079
nodeid: tests/specification/test_run_bundle_cli.py::test_the_other_verbs_take_no_run_bundle
verifies: SEG-SREQ-230
is reported by: SEG-OUT-593921F41331

The three verbs that judge evidence list --bundle in their help. The other five verbs do not. Each of the five, given --bundle and a directory, ends with an argument error and exit status 2, and changes nothing. Without that option each of the five works and exits with status 0: case sync, case check (which reports the producer as readable), graph check, edge show over the Refines edges, and edge affirm over the Refines edges.

Test Specification: Graph status and proof check include the test evidence of exactly the bundles named. SEG-TS-080
nodeid: tests/specification/test_run_bundle_cli.py::test_the_verbs_that_judge_evidence_include_exactly_the_named_bundles
verifies: SEG-SREQ-229
is reported by: SEG-OUT-FA682213197F

With no bundle named, graph status counts no outcome and proof check lists no skipped and no stale outcome. Naming the clean bundle, proof check lists three skipped outcomes of that bundle’s run and no stale outcome. Naming it and a second bundle, recorded at another revision under another run name, proof check lists the same three skipped outcomes and 24 outcomes of the second run as stale, and graph status counts the outcomes of both runs. A third bundle that lies beside the others and is not named supplies no outcome to any report.

Test Specification: Graph status reports outcomes at the current revision and at another, and dangling edges. SEG-TS-081
nodeid: tests/specification/test_run_bundle_cli.py::test_graph_status_reports_the_evidence_apart_with_its_counts
verifies: SEG-SREQ-210
is reported by: SEG-OUT-F58B756016BA

Graph status names the clean bundle and a second bundle recorded at another revision. Graph status runs with the revision of the first. Its machine-readable report holds an evidence section. The section counts 76 outcomes at the current revision, 76 at another revision, and no edge that touches an absent node. The rows of the report hold no edge of kind Confirms, Witnesses or Excuses.

Test Specification: A Confirms, Witnesses or Excuses edge that touches an absent node gives exit status 1. SEG-TS-082
nodeid: tests/specification/test_run_bundle_cli.py::test_a_dangling_evidence_edge_gives_the_negative_status_verdict
verifies: SEG-SREQ-083
is reported by: SEG-OUT-FD6761F05BF7

The current stream is a store that holds two outcomes, one recorded at the revision of the implementation repository and one at another, and one Confirms edge to a test specification that the store does not hold. Graph status runs with the revision of the repository. It exits with status 1, its negative verdict. The same store without that edge gives exit status 0.

Test Specification: The evidence section counts each evidence edge that touches an absent node. SEG-TS-083
nodeid: tests/specification/test_run_bundle_cli.py::test_graph_status_counts_the_dangling_evidence_edges
verifies: SEG-SREQ-210
is reported by: SEG-OUT-13C48606821A

The current stream is the store of the previous test: two outcomes, one at the revision of the repository and one at another, and one Confirms edge to an absent test specification. Graph status runs with the revision of the repository. The evidence section counts one outcome at the current revision, one at another revision and one dangling edge.

Test Specification: Graph status gives a state for every strong edge and for no evidence edge. SEG-TS-084
nodeid: tests/specification/test_run_bundle_cli.py::test_graph_status_lists_strong_edges_only
verifies: SEG-SREQ-080
is reported by: SEG-OUT-76667636880F

The current stream is a store with two outcomes, each with a Confirms edge and a Witnesses edge, and one Verifies and one Implements edge. Graph status runs with the revision of the repository. Its rows are the two strong edges, both pending. No row has the kind Confirms or Witnesses.

Test Specification: When the only edges that are not active are pending, graph status exits with status 0. SEG-TS-085
nodeid: tests/specification/test_run_bundle_cli.py::test_pending_strong_edges_leave_the_status_verdict_positive
verifies: SEG-SREQ-082
is reported by: SEG-OUT-33C412C4514F

The current stream is a store with two outcomes, one at the revision of the implementation repository and one at another, and a clean repository that the configuration names. Its two strong edges are pending and nothing is affirmed. Graph status runs and exits with status 0.

Test Specification: Graph status refuses a discovered revision when the repository holds an untracked file. SEG-TS-086
nodeid: tests/specification/test_run_bundle_cli.py::test_graph_status_refuses_a_dirty_implementation_repository
verifies: SEG-SREQ-112
is reported by: SEG-OUT-6260A1003A80

The current stream holds an outcome. The implementation repository holds one untracked file. Graph status runs with no revision given. It exits with status 2 and its report names the untracked path. With a revision given, graph status exits with status 0.

Test Specification: Proof check and proof generate refuse a discovered revision when the repository is dirty. SEG-TS-087
nodeid: tests/specification/test_run_bundle_cli.py::test_proof_verbs_refuse_a_dirty_implementation_repository
verifies: SEG-SREQ-112
is reported by: SEG-OUT-85FACA852812

The implementation repository holds one untracked file. Proof check and proof generate run with no revision given. Each exits with status 2 and its report names the untracked path. Run with a revision given, neither exits with status 2.

Test Specification: With an outcome in the stream and no obtainable revision, the verbs exit with status 2. SEG-TS-088
nodeid: tests/specification/test_run_bundle_cli.py::test_no_obtainable_revision_cannot_be_judged
verifies: SEG-SREQ-208
is reported by: SEG-OUT-E319DB6AE498

The current stream holds an outcome. No revision is given and no implementation repository is configured. Graph status, proof check and proof generate each exit with status 2.

Test Specification: Graph status asks for no revision when the current stream holds no outcome. SEG-TS-089
nodeid: tests/specification/test_run_bundle_cli.py::test_a_stream_without_an_outcome_needs_no_revision
verifies: SEG-SREQ-112
is reported by: SEG-OUT-F5AE751C9146

The current stream holds a requirement, a specification, an implementation and two strong edges, and no outcome. No revision is given and no configuration is read. Graph status exits with status 0.

Test Specification: A verb that reads a case whose record fails its schema exits with status 2. SEG-TS-090
nodeid: tests/specification/test_run_bundle_cli.py::test_a_refused_store_read_is_a_request_the_command_cannot_judge
verifies: SEG-SREQ-211
is reported by: SEG-OUT-AB177B2F6C9B

One edge record in the case holds a link state that the case’s schema copy does not allow. Graph status, edge show, graph check on the case itself, and proof check each exit with status 2 and print the refusal with text. The machine-readable form of graph status holds an error entry.

Test Specification: Graph check counts the pending strong edges and counts evidence edges by kind only. SEG-TS-091
nodeid: tests/specification/test_run_bundle_cli.py::test_graph_check_counts_pending_strong_edges_only
verifies: SEG-SREQ-077
is reported by: SEG-OUT-13ABB04EA7DD

The legacy case holds 32 edges: four strong edges are pending, six are active, and 22 evidence edges are pending. Graph check on the case reports a pending count of four, and counts of 10 Confirms and 12 Witnesses edges by kind. A store with two outcomes, each with a Confirms and a Witnesses edge, and two strong edges, none affirmed, gives a pending count of two when it is the current stream. The report holds the node counts, the edge counts and the pending count, and no count of dangling endpoints.

Test Specification: A bundle named more than once in one invocation is read once. SEG-TS-113
nodeid: tests/specification/test_run_bundle_cli.py::test_a_bundle_named_twice_is_read_once
verifies: SEG-SREQ-232
is reported by: SEG-OUT-AB6C63A99E77

Graph status and proof check name the clean bundle twice, once as a path and once as a path that goes through another directory and back. Each gives the result of naming it once: graph status counts 76 outcomes at the current revision, and proof check lists three skipped outcomes. Two copies of the bundle named together are refused, because they supply the same outcome identities twice.

Test Specification: A run bundle and a current stream given in one invocation give exit status 2. SEG-TS-114
nodeid: tests/specification/test_run_bundle_cli.py::test_a_named_bundle_and_a_given_stream_cannot_be_judged_together
verifies: SEG-SREQ-233
is reported by: SEG-OUT-780B327DBB94

The current stream is a would-be store. Graph status, proof check and proof generate each run with the stream alone and are not refused. Each run with the stream and a named bundle exits with status 2, and the output holds a refusal and no verdict.

Test Specification: A run bundle named with no test-case export in the configuration gives exit status 2. SEG-TS-116
nodeid: tests/specification/test_run_bundle_cli.py::test_a_named_bundle_needs_a_test_case_export
verifies: SEG-SREQ-235
is reported by: SEG-OUT-7E7F76B6B54E

A configuration that gives a test-case export lets graph status, proof check and proof generate judge the clean bundle (none exits with status 2). A configuration that gives none makes each of them exit with status 2 when the bundle is named, with a refusal and no verdict.

tests/specification/test_run_bundle_digest.py

Test Specification: A run bundle's digest is the SHA-256 of its list of paths and file digests. SEG-TS-067
nodeid: tests/specification/test_run_bundle_digest.py::test_a_bundle_digest_is_the_sha256_of_its_file_list_by_path_and_content
verifies: SEG-SREQ-220
is reported by: SEG-OUT-435E0513D62F

The clean bundle fixture holds 11 files. Its digest by the recipe of the architecture page is the value named in the fixture’s README. The recipe is run in plain Python, and in the shell with find, sort and sha256sum where the shell has them. Both give that value. The tool gives that value too, written as sha256: and the 64 hex digits, whatever the location of the bundle.

Test Specification: A changed byte, a renamed file or an added file changes the digest of a bundle. SEG-TS-068
nodeid: tests/specification/test_run_bundle_digest.py::test_a_changed_byte_a_renamed_file_or_a_new_file_changes_the_digest
verifies: SEG-SREQ-220
is reported by: SEG-OUT-18485E7186F4

Four copies of the clean bundle each differ from it in one way: one byte of the run artifact is changed, one file is renamed, one file is added, and one empty file is added. Each copy has a digest that differs from the clean bundle’s digest and from every other copy’s. Three more copies differ in no byte and no name: the files are created in the reverse order, the bundle lies in another directory under another name, and every file has another modification time. Each has the clean bundle’s digest.

tests/specification/test_run_bundle_extractor.py

Test Specification: A run is read from its bundle and from no other record. SEG-TS-069
nodeid: tests/specification/test_run_bundle_extractor.py::test_a_run_is_read_from_its_bundle_and_from_no_other_record
verifies: SEG-SREQ-219
is reported by: SEG-OUT-6AAAA6E7E3EF

The bundle lies in a directory that also holds a revision record, a name record and a run artifact of the same names, with other content: another revision, another run name and an artifact whose every result failed. The configuration names the bundle. All 76 outcomes carry the revision and the run name of the bundle, and none carries a result of the other artifact.

Test Specification: A bundle that records a dirty implementation checkout is refused. SEG-TS-071
nodeid: tests/specification/test_run_bundle_extractor.py::test_a_run_whose_implementation_checkout_was_dirty_is_refused
verifies: SEG-SREQ-222
is reported by: SEG-OUT-CB0415741E30

The clean bundle is accepted. With the dirty file of the implementation checkout holding one line of git status output, the extractor refuses the run and names the dirty flag. With the dirty file of the other checkout holding such a line, the bundle is accepted and supplies 76 outcomes. When the configuration names the other checkout as the implementation checkout, its dirty file refuses the run, and the dirty file of the first checkout does not.

Test Specification: A bundle that records no run name is refused. SEG-TS-072
nodeid: tests/specification/test_run_bundle_extractor.py::test_a_run_with_no_recorded_name_is_refused
verifies: SEG-SREQ-223
is reported by: SEG-OUT-7CBDBE8D8A51

The clean bundle is accepted. With the name record deleted, empty, or holding only a line feed, the extractor refuses the run and names the run name.

Test Specification: A bundle that holds no readable run artifact is refused. SEG-TS-073
nodeid: tests/specification/test_run_bundle_extractor.py::test_a_bundle_with_no_readable_run_artifact_is_refused
verifies: SEG-SREQ-224
is reported by: SEG-OUT-54820D799207

The clean bundle is accepted. With the run artifact deleted, the extractor refuses the run, although the bundle still holds a test plan, two XML reports, the revisions and the name. With the run artifact replaced by text that is not JSON, the extractor refuses the run.

Test Specification: A need export that carries a build timestamp is refused. SEG-TS-074
nodeid: tests/specification/test_run_bundle_extractor.py::test_an_export_with_a_build_timestamp_is_refused
verifies: SEG-SREQ-225
is reported by: SEG-OUT-CED15744CAD3

The clean bundle with the frozen exports is accepted. A copy of the test-specification export with a created entry at its top level makes the extractor refuse the run and name the timestamp. So does a copy of the implementation export with such an entry.

Test Specification: Each outcome's revision is the revision the bundle records for the implementation checkout. SEG-TS-075
nodeid: tests/specification/test_run_bundle_extractor.py::test_an_outcomes_revision_is_the_implementation_checkouts_revision_in_the_bundle
verifies: SEG-SREQ-186
is reported by: SEG-OUT-6C733C3CB8B5

The clean bundle records a different revision for each of its two checkouts. With the first as the implementation checkout, all 76 outcomes carry the first revision. With the second, all carry the second revision. A record of the implementation checkout that holds a short word is taken exactly as recorded.

Test Specification: A bundle that records no revision for the implementation checkout is refused. SEG-TS-076
nodeid: tests/specification/test_run_bundle_extractor.py::test_a_run_with_no_recorded_revision_is_refused
verifies: SEG-SREQ-187
is reported by: SEG-OUT-04310FEABE16

The clean bundle is accepted. With the revision record of the implementation checkout deleted, empty, or holding only a line feed, the extractor refuses the run and names the revision. It refuses the run too when the configuration names an implementation checkout of which the bundle holds no record. A missing record of another checkout does not refuse the run.

Test Specification: A configuration that names a run is refused, whatever the entry holds. SEG-TS-115
nodeid: tests/specification/test_run_bundle_extractor.py::test_a_configuration_that_names_a_run_is_refused
verifies: SEG-SREQ-234
is reported by: SEG-OUT-1B3614F9CE1B

A configuration with no run loads. A configuration whose producer holds outcomes is refused with a configuration error: with a list of run entries that give a bundle and a digest, with a list of entries that give the old keys, and with an empty list. Graph check and case check, which read the configuration, exit with status 2 and print the refusal.

Test Specification: A path named as a run bundle that is not a directory with a readable artifact is refused. SEG-TS-117
nodeid: tests/specification/test_run_bundle_extractor.py::test_a_path_that_is_not_a_directory_is_refused
verifies: SEG-SREQ-224
is reported by: SEG-OUT-224E1455E820

The clean bundle is accepted. A path that does not exist, a path that is a plain file, and an empty directory each make the extractor refuse the run. Graph status exits with status 2 when it names the plain file.

Test Specification: An outcome's anchor names its run bundle by the digest, wherever the bundle lies. SEG-TS-118
nodeid: tests/specification/test_run_bundle_extractor.py::test_an_anchor_names_the_bundle_by_its_digest
verifies: SEG-SREQ-190
is reported by: SEG-OUT-6EF544CC9B54

Each of the 76 outcomes of the clean bundle has an anchor whose repository member is the bundle’s digest written as sha256: and 64 hex digits, whose path is the run artifact within the bundle (twister.json), and whose locator is nodeid: and a test identifier. A copy of the bundle in another directory under another name gives the same anchors. A copy with one added file has another digest and so another repository member, and the same path.

tests/specification/test_run_bundle_proof.py

Test Specification: A package's manifest holds the digest of every run bundle that supplied an in-scope outcome. SEG-TS-092
nodeid: tests/specification/test_run_bundle_proof.py::test_a_package_records_the_digest_of_every_bundle_that_supplied_an_outcome_in_scope
verifies: SEG-SREQ-226
is reported by: SEG-OUT-588F2A1FF71F

Three bundles are configured. The first is recorded at the revision given, and supplies outcomes in the scope. The second is recorded at another revision: its outcomes in the scope are set aside by the gate, and the package still records it. The third is recorded at the revision given, and holds results of one test function that lies outside the scope: it is not recorded. The evidence manifest of the generated package holds the digest of the first and of the second, and not the digest of the third. With only the first bundle configured, the manifest holds only that digest.

Test Specification: A package's design root and design proof are those of the golden, with one run or two. SEG-TS-093
nodeid: tests/specification/test_run_bundle_proof.py::test_the_design_root_does_not_move_with_the_evidence
verifies: SEG-SREQ-133
is reported by: SEG-OUT-A86DE63A155D

The golden design root was made before bundles existed. The package generated over the clean bundle has a design consistency proof that is byte for byte the golden’s. The package generated over the clean bundle and a second bundle at another revision has a design consistency proof that is byte for byte the golden’s for two runs. In both the design root is the root written in the golden. The scope of both packages holds test outcomes, and the root is the same with 24 or 48 of them in the scope.

Test Specification: The gate leaves the outcomes of a run at another revision out of every coverage finding. SEG-TS-094
nodeid: tests/specification/test_run_bundle_proof.py::test_a_stale_run_changes_no_coverage_finding_of_the_gate
verifies: SEG-SREQ-063
is reported by: SEG-OUT-81CFD8C970A5

The gate’s report over the clean bundle equals the golden report. The report over the clean bundle and a second bundle at another revision equals the first report in every part except the list of stale outcomes and the diagnostics that name them: the blocked flag, the coverage gaps, the unready edges, the skipped, excused, unwaived and discarded outcomes and the empty-design flag are the same. The gate does not block.

Test Specification: The gate reports each outcome of a run at another revision as an informational finding. SEG-TS-095
nodeid: tests/specification/test_run_bundle_proof.py::test_a_stale_outcome_is_reported_as_information
verifies: SEG-SREQ-067
is reported by: SEG-OUT-1852E52E6AB2

The gate’s report over the clean bundle and a second bundle at another revision equals the golden report for two runs. It lists 24 outcomes of the second run as stale. Each has one finding of severity information, and no outcome of the first run is listed as stale.

Test Specification: Every requirement's satisfaction over bundle evidence equals the golden verdict. SEG-TS-096
nodeid: tests/specification/test_run_bundle_proof.py::test_leaf_verdicts_over_bundles_equal_the_golden_verdicts
verifies: SEG-SREQ-006
is reported by: SEG-OUT-83C9218D8B41

The producer the configuration describes supplies the outcomes of the bundles. The graph built from the case and that producer gives the satisfaction evaluator the same verdicts as the golden for each of the 29 requirements, 18 of them satisfied, with the same outcomes set aside as incomplete. The verdicts are the same with a second run at another revision.

Test Specification: The documents of a package equal the golden's, and the manifest gains one field. SEG-TS-097
nodeid: tests/specification/test_run_bundle_proof.py::test_a_package_gains_one_field_and_changes_nothing_else
verifies: SEG-SREQ-226
is reported by: SEG-OUT-A4BD7625547C

For one run and for two runs, the coverage report and the execution coverage record are byte for byte the golden’s, and the package has the golden’s snapshot identifier. The evidence manifest has every field of the golden’s manifest with the same value, and exactly one more field. That field holds the digest of each bundle used: one for one run, two for two runs.

tests/specification/test_taxonomy.py

Test Specification: The built-in kind set is closed. SEG-TS-001
nodeid: tests/specification/test_taxonomy.py::test_the_taxonomy_declares_exactly_the_built_in_kind_set
verifies: SEG-SREQ-029
is reported by: SEG-OUT-47112B4B64CD

Querying the taxonomy provider’s node-kind and edge-kind sets returns exactly the built-in vocabulary: the node kinds are Requirement, Implementation, TestSpecification, TestOutcome, and Waiver; the edge kinds are Refines, Verifies, Implements, Confirms, Witnesses, Excuses, and Calls. Neither set holds anything beyond this list, and neither omits an entry from it.

Test Specification: Exactly three edge kinds propagate. SEG-TS-002
nodeid: tests/specification/test_taxonomy.py::test_exactly_refines_verifies_and_implements_propagate
verifies: SEG-SREQ-030
is reported by: SEG-OUT-7810D5C43176

Querying the taxonomy provider for the edge kinds that propagate suspicion returns exactly three: Refines, Verifies, and Implements. No other declared edge kind is included, and none of these three is missing.

Test Specification: Each node kind declares its content hashes. SEG-TS-003
nodeid: tests/specification/test_taxonomy.py::test_each_node_kind_declares_its_content_hash_names
verifies: SEG-SREQ-032
is reported by: SEG-OUT-808AE65B2D08

For each of the five built-in node kinds, querying the taxonomy provider’s content-hash names returns exactly the names that kind carries: contentHash alone for Requirement, TestOutcome, and Waiver; apiHash and bodyHash for Implementation; specHash and implHash for TestSpecification.