summaryrefslogtreecommitdiff
path: root/conformance
diff options
context:
space:
mode:
Diffstat (limited to 'conformance')
-rw-r--r--conformance/README.txt73
-rw-r--r--conformance/fixtures/reference-examples.json5870
-rw-r--r--conformance/fixtures/transition-fixtures.json3214
-rw-r--r--conformance/migemo-assets.txt58
-rw-r--r--conformance/phase-status.txt13
-rw-r--r--conformance/requirements.tsv339
-rw-r--r--conformance/scenario-schema.json536
-rw-r--r--conformance/specification-observations.txt7
8 files changed, 10110 insertions, 0 deletions
diff --git a/conformance/README.txt b/conformance/README.txt
new file mode 100644
index 0000000..d341c3d
--- /dev/null
+++ b/conformance/README.txt
@@ -0,0 +1,73 @@
+CLEVER-F CONFORMANCE ASSETS
+
+PURPOSE
+
+These files are the Phase 1 conformance ledger and reference fixtures. They define checks before plugin implementation starts.
+
+FILES
+
+requirements.tsv
+One row represents one normative rule. The requirement identifier has the form CF-SSSS-NNN. SSSS is the specification section with punctuation removed. NNN is an ordinal inside that section.
+
+scenario-schema.json
+JSON Schema Draft 2020-12 contract for host-neutral fixtures.
+
+fixtures/reference-examples.json
+Scenarios transcribed from specification sections 11 and 15.
+
+fixtures/transition-fixtures.json
+Scenarios for cleanup and exact field-retention transitions.
+
+migemo-assets.txt
+Inventory and request for the three normative Migemo data sets.
+
+specification-observations.txt
+Traceability notes for source examples that require confirmation.
+
+phase-status.txt
+Completion and block status for affected implementation phases.
+
+LEDGER COLUMNS
+
+requirement_id
+Stable identifier for one normative rule.
+
+strength
+REQUIRED maps to SHALL and normative declarative behavior. RECOMMENDED maps to SHOULD. OPTIONAL maps to MAY.
+
+source
+Specification section that owns the rule.
+
+rule
+Host-neutral statement of the rule.
+
+leaf_scope
+One leaf scope from implementation-strategy.txt section 2.
+
+component_owner
+One responsibility component from implementation-strategy.txt section 3.
+
+planned_check
+A concrete check for a later unit, integration, adapter, or conformance test.
+
+fixture_ids
+Initial scenario coverage. A hyphen means that the planned check will become a fixture during its implementation phase.
+
+SCENARIO CONVENTIONS
+
+- Positions use one-based lines and one-based byte columns.
+- Step indexes, packet indexes, event indexes, and time-value indexes use zero-based JSON array indexes.
+- Buffer lines contain decoded editor text. effective_encoding selects the byte representation used by the host text view.
+- Raw input packets store decimal byte values.
+- An omitted configuration key uses the specification default.
+- Resource identities are stable symbolic test identities.
+- Operations in each expected list use observation order.
+- A state snapshot is a partial structural assertion. Omitted state fields are outside that snapshot assertion.
+- retained_fields and cleared_fields name transition fields that a test must compare with the preceding state.
+- Events run after the action transition that caused them. A standalone event uses the state in given or in the latest set_state step.
+- final_buffer and action outcome buffer_lines record operator effects.
+- dot_payload records the effective descriptor and resolved target.
+
+COVERAGE RULE
+
+Every ledger row has one leaf scope, one component owner, and one planned check. Initial fixture identifiers connect required interactions and transition checks to declarative scenarios. Later phases can add fixture identifiers without changing requirement identifiers.
diff --git a/conformance/fixtures/reference-examples.json b/conformance/fixtures/reference-examples.json
new file mode 100644
index 0000000..6927b24
--- /dev/null
+++ b/conformance/fixtures/reference-examples.json
@@ -0,0 +1,5870 @@
+{
+ "format_version": 1,
+ "scenarios": [
+ {
+ "id": "SCN-1101-TIMEOUT-BOUNDARY",
+ "title": "Repeat timeout accepts equality and restarts the interval",
+ "source_refs": [
+ "11.1"
+ ],
+ "requirements": [
+ "CF-0508-003",
+ "CF-0602-004",
+ "CF-0702-009",
+ "CF-1101-001",
+ "CF-1101-002",
+ "CF-1101-004",
+ "CF-1101-005"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aaaaa"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0,
+ "repeat_timeout_ms": 100
+ },
+ "input_packets": [],
+ "time_values_ms": [
+ 200,
+ 299.9
+ ],
+ "events": [],
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "a",
+ "first_code": 97
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 100,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "time_value_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "time_value_indexes": [
+ 1
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "aaaaa"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 1,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "a",
+ "first_code": 97
+ }
+ }
+ },
+ "repeat_timestamp_ms": 299.9
+ },
+ "retained_fields": [],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "apply_cursor",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ }
+ },
+ {
+ "after_step": 1,
+ "operation": "apply_cursor",
+ "position": {
+ "line": 1,
+ "byte_column": 4
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1101-TIMEOUT-EXPIRED",
+ "title": "Repeat timeout resets and reacquires above the threshold",
+ "source_refs": [
+ "11.1"
+ ],
+ "requirements": [
+ "CF-0508-003",
+ "CF-1101-002",
+ "CF-1101-003"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "ababa"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0,
+ "repeat_timeout_ms": 100
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "b"
+ }
+ ],
+ "time_values_ms": [
+ 201
+ ],
+ "events": [],
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "a",
+ "first_code": 97
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "repeat_timestamp_ms": 100,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ],
+ "time_value_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "ababa"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "b",
+ "first_code": 98
+ }
+ }
+ },
+ "last_input_context": "n",
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 201
+ },
+ "retained_fields": [
+ "previous_target",
+ "last_input_context",
+ "moved_forward"
+ ],
+ "cleared_fields": [
+ "migemo_cache"
+ ]
+ }
+ ],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 0,
+ "operation": "apply_cursor",
+ "position": {
+ "line": 1,
+ "byte_column": 4
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1102-COMMAND-SUCCESS",
+ "title": "Command-path success commits landing and direction",
+ "source_refs": [
+ "11.2"
+ ],
+ "requirements": [
+ "CF-0200-005",
+ "CF-0301-007",
+ "CF-0303-002",
+ "CF-0304-001",
+ "CF-0601-002",
+ "CF-0601-003",
+ "CF-0602-002",
+ "CF-1102-001",
+ "CF-1102-002",
+ "CF-1102-003",
+ "CF-1102-005",
+ "CF-1102-007"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "abca"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "a"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "abca"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "a",
+ "first_code": 97
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true
+ },
+ "retained_fields": [],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 0,
+ "operation": "apply_cursor",
+ "position": {
+ "line": 1,
+ "byte_column": 4
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1102-COMMAND-FAILURE",
+ "title": "First-step command failure preserves successful history",
+ "source_refs": [
+ "10.6",
+ "11.2",
+ "14.4"
+ ],
+ "requirements": [
+ "CF-0601-003",
+ "CF-0604-001",
+ "CF-1004-004",
+ "CF-1006-002",
+ "CF-1006-003",
+ "CF-1102-004",
+ "CF-1404-001"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "abc"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": true,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "z"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "failed_search",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "complete": false,
+ "successful_steps": 0,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "abc"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": null,
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "z",
+ "first_code": 122
+ }
+ }
+ },
+ "last_input_context": "n",
+ "target_overlays": [
+ "char-1"
+ ],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "retained_fields": [
+ "previous_landing",
+ "first_move"
+ ],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1",
+ "anchor_line": 1,
+ "priority": "high",
+ "descriptor": "f",
+ "target_plan": "literal-sensitive-z"
+ }
+ ],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 0,
+ "operation": "register_finalizer",
+ "identity": "finalizer-1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1103-VISUAL-SUCCESS",
+ "title": "Visual success preserves kind, direction state, and overlay anchor",
+ "source_refs": [
+ "11.3"
+ ],
+ "requirements": [
+ "CF-0200-005",
+ "CF-1005-002",
+ "CF-1103-001",
+ "CF-1103-002",
+ "CF-1103-003",
+ "CF-1103-004",
+ "CF-1103-005",
+ "CF-1206-004"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "abca"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "v",
+ "selection": {
+ "active": true,
+ "kind": "character",
+ "anchor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "focus": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "c"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [
+ "char-1"
+ ],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "abca"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "final_selection": {
+ "active": true,
+ "kind": "character",
+ "anchor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "focus": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "v": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "c",
+ "first_code": 99
+ }
+ }
+ },
+ "moved_forward": true,
+ "target_overlays": [
+ "char-1"
+ ]
+ },
+ "retained_fields": [
+ "moved_forward",
+ "target_overlays"
+ ],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "preserve",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1",
+ "anchor_line": 1
+ }
+ ],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 0,
+ "operation": "apply_selection",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1104-DFE",
+ "title": "Forward FIND delete endpoint",
+ "source_refs": [
+ "11.4"
+ ],
+ "requirements": [
+ "CF-1104-003",
+ "CF-1104-001",
+ "CF-0200-005",
+ "CF-1102-001",
+ "CF-1205-007"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "hoge fuge piye poye"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "no",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": "delete",
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "e"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f",
+ "buffer_lines": [
+ " fuge piye poye"
+ ]
+ }
+ ],
+ "final_buffer": [
+ " fuge piye poye"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1104-DTE",
+ "title": "Forward TILL delete endpoint",
+ "source_refs": [
+ "11.4"
+ ],
+ "requirements": [
+ "CF-1104-004",
+ "CF-1104-001"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "hoge fuge piye poye"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "no",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": "delete",
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "e"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartTillForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "t",
+ "buffer_lines": [
+ "e fuge piye poye"
+ ]
+ }
+ ],
+ "final_buffer": [
+ "e fuge piye poye"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1104-DFE-BACKWARD",
+ "title": "Backward FIND delete endpoint",
+ "source_refs": [
+ "11.4"
+ ],
+ "requirements": [
+ "CF-1104-005",
+ "CF-1104-002"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "hoge fuge piye poye"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 19
+ },
+ "mode": "no",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": "delete",
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "e"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindBackward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 14
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F",
+ "buffer_lines": [
+ "hoge fuge piye"
+ ]
+ }
+ ],
+ "final_buffer": [
+ "hoge fuge piye"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 14
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1104-DTE-BACKWARD",
+ "title": "Backward TILL delete endpoint",
+ "source_refs": [
+ "11.4"
+ ],
+ "requirements": [
+ "CF-1104-006",
+ "CF-1104-002",
+ "CF-0302-004",
+ "CF-1003-002"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "hoge fuge piye poye"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 19
+ },
+ "mode": "no",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": "delete",
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "e"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartTillBackward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 14
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "T",
+ "buffer_lines": [
+ "hoge fuge piyee"
+ ]
+ }
+ ],
+ "final_buffer": [
+ "hoge fuge piyee"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 14
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1105-DOT-REPEAT",
+ "title": "Successive dfe dot repeats preserve the resolved payload",
+ "source_refs": [
+ "11.5"
+ ],
+ "requirements": [
+ "CF-0200-009",
+ "CF-1105-001",
+ "CF-1105-002",
+ "CF-1105-003",
+ "CF-1105-004",
+ "CF-1105-005"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "hoge fuge piye poye"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "no",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": "delete",
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "e"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "DotRepeat"
+ },
+ {
+ "operation": "action",
+ "action": "DotRepeat"
+ },
+ {
+ "operation": "action",
+ "action": "DotRepeat"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f",
+ "buffer_lines": [
+ " fuge piye poye"
+ ],
+ "dot_payload": {
+ "descriptor": "f",
+ "target": {
+ "kind": "character",
+ "value": "e",
+ "first_code": 101
+ }
+ }
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f",
+ "buffer_lines": [
+ " piye poye"
+ ],
+ "dot_payload": {
+ "descriptor": "f",
+ "target": {
+ "kind": "character",
+ "value": "e",
+ "first_code": 101
+ }
+ }
+ },
+ {
+ "after_step": 2,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f",
+ "buffer_lines": [
+ " poye"
+ ],
+ "dot_payload": {
+ "descriptor": "f",
+ "target": {
+ "kind": "character",
+ "value": "e",
+ "first_code": 101
+ }
+ }
+ },
+ {
+ "after_step": 3,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f",
+ "buffer_lines": [
+ ""
+ ],
+ "dot_payload": {
+ "descriptor": "f",
+ "target": {
+ "kind": "character",
+ "value": "e",
+ "first_code": 101
+ }
+ }
+ }
+ ],
+ "final_buffer": [
+ ""
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1501-SHARED-KEYS",
+ "title": "Four primary keys share one FIND sequence",
+ "source_refs": [
+ "15.1"
+ ],
+ "requirements": [
+ "CF-0200-002",
+ "CF-0200-003",
+ "CF-0200-004",
+ "CF-0302-005",
+ "CF-0303-003",
+ "CF-0303-004",
+ "CF-0303-005",
+ "CF-0504-002",
+ "CF-0604-003",
+ "CF-0801-001",
+ "CF-0801-002",
+ "CF-1501-001",
+ "CF-1501-002"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "hxhxh"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "h"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartTillForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartTillBackward"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 5
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 2,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 3,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 5
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 4,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ }
+ ],
+ "final_buffer": [
+ "hxhxh"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 4,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ }
+ },
+ "last_input_context": "n"
+ },
+ "retained_fields": [],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1502-MODE-ISOLATION",
+ "title": "Normal and Visual histories are isolated while target reuse crosses contexts",
+ "source_refs": [
+ "15.2"
+ ],
+ "requirements": [
+ "CF-0305-001",
+ "CF-0305-003",
+ "CF-0305-004",
+ "CF-0510-003",
+ "CF-0601-001",
+ "CF-0601-004",
+ "CF-0602-001",
+ "CF-0702-007",
+ "CF-0704-002",
+ "CF-1502-001",
+ "CF-1502-002"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "ahha"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "h"
+ },
+ {
+ "kind": "text",
+ "text": "\r"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "set_cursor",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ }
+ },
+ {
+ "operation": "set_mode",
+ "mode": "v"
+ },
+ {
+ "operation": "set_selection",
+ "selection": {
+ "active": true,
+ "kind": "character",
+ "anchor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "focus": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "option": "inclusive"
+ }
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 1
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 4,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "ahha"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "final_selection": {
+ "active": true,
+ "kind": "character",
+ "anchor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "focus": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": null,
+ "previous_landing": null,
+ "first_move": null,
+ "previous_target": null
+ }
+ },
+ "last_input_context": "n"
+ },
+ "retained_fields": [],
+ "cleared_fields": []
+ },
+ {
+ "after_step": 4,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ }
+ },
+ "last_input_context": "v"
+ },
+ "retained_fields": [
+ "contexts.n"
+ ],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 4,
+ "operation": "read_input"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1503-MULTILINE",
+ "title": "Buffer-wide primary repetition follows the specified multiline sequence",
+ "source_refs": [
+ "15.3"
+ ],
+ "requirements": [
+ "CF-0200-007",
+ "CF-0501-002",
+ "CF-1001-006",
+ "CF-1503-001"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "foo bar baz",
+ "poge huga hiyo poyo"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "a"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 9
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 2,
+ "byte_column": 6
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 2,
+ "kind": "movement",
+ "position": {
+ "line": 2,
+ "byte_column": 10
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 3,
+ "kind": "movement",
+ "position": {
+ "line": 2,
+ "byte_column": 6
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 4,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 9
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ }
+ ],
+ "final_buffer": [
+ "foo bar baz",
+ "poge huga hiyo poyo"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 9
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1503-CURRENT-LINE",
+ "title": "Current-line scope stops at the last same-line occurrence",
+ "source_refs": [
+ "15.3"
+ ],
+ "requirements": [
+ "CF-0501-003",
+ "CF-1001-005",
+ "CF-1503-002"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "foo bar baz",
+ "poge huga hiyo poyo"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0,
+ "search_current_line_only": true
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "a"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 9
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 1,
+ "kind": "failed_search",
+ "position": {
+ "line": 1,
+ "byte_column": 9
+ },
+ "complete": false,
+ "successful_steps": 0,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "foo bar baz",
+ "poge huga hiyo poyo"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 9
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1504-FIND-FORWARD",
+ "title": "Basic forward FIND sequence",
+ "source_refs": [
+ "15.4"
+ ],
+ "requirements": [
+ "CF-0302-001",
+ "CF-0303-001",
+ "CF-1001-002",
+ "CF-1002-001",
+ "CF-1002-002",
+ "CF-1504-001"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "poge huga hiyo poyo"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "h"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 6
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 11
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 2,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 6
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ }
+ ],
+ "final_buffer": [
+ "poge huga hiyo poyo"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 6
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1504-FIND-BACKWARD",
+ "title": "Basic backward FIND sequence",
+ "source_refs": [
+ "8.1",
+ "15.4"
+ ],
+ "requirements": [
+ "CF-0302-002",
+ "CF-0801-004",
+ "CF-1001-003",
+ "CF-1002-001",
+ "CF-1504-002"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "poge huga hiyo poyo"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 19
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "o"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindBackward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 17
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 14
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ }
+ ],
+ "final_buffer": [
+ "poge huga hiyo poyo"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 14
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1505-TILL-FORWARD",
+ "title": "Basic forward TILL sequence",
+ "source_refs": [
+ "8.1",
+ "15.5"
+ ],
+ "requirements": [
+ "CF-0302-003",
+ "CF-0801-005",
+ "CF-1003-001",
+ "CF-1003-004",
+ "CF-1505-001"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "poge huga hiyo poyo"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "h"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartTillForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartTillForward"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 5
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "t"
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 10
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "t"
+ }
+ ],
+ "final_buffer": [
+ "poge huga hiyo poyo"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 10
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1505-TILL-NEW",
+ "title": "Fresh TILL followed by repeated adjacent-target exclusion",
+ "source_refs": [
+ "15.5"
+ ],
+ "requirements": [
+ "CF-1505-002"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "poge huga hiyo poyo"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 14
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "o"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartTillForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartTillForward"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 16
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "t"
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 18
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "t"
+ }
+ ],
+ "final_buffer": [
+ "poge huga hiyo poyo"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 18
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1506-IGNORE-CASE",
+ "title": "ignore_case folds all literal target case",
+ "source_refs": [
+ "15.6"
+ ],
+ "requirements": [
+ "CF-0200-010",
+ "CF-0502-002",
+ "CF-0904-001",
+ "CF-1506-001"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "poge Guga hiyo Go;yo;"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0,
+ "ignore_case": true
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "g"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 6
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 2,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 8
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 3,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 6
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ }
+ ],
+ "final_buffer": [
+ "poge Guga hiyo Go;yo;"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 6
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1506-SMART-LOWER",
+ "title": "smart_case lower-case target visits both cases",
+ "source_refs": [
+ "15.6"
+ ],
+ "requirements": [
+ "CF-0502-004",
+ "CF-0904-002",
+ "CF-1506-002"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "poHe huga Hiyo hoyo"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0,
+ "smart_case": true
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "h"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 6
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 2,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 11
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 3,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 16
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "poHe huga Hiyo hoyo"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 16
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1506-SMART-UPPER",
+ "title": "smart_case upper-case target visits exact case",
+ "source_refs": [
+ "15.6"
+ ],
+ "requirements": [
+ "CF-0502-004",
+ "CF-0904-003",
+ "CF-1506-003"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "poHe huga Hiyo hoyo"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0,
+ "smart_case": true
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "H"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 11
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "poHe huga Hiyo hoyo"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 11
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1507-SYMBOLS",
+ "title": "Wildcard repeats traverse all 32 symbols in both directions",
+ "source_refs": [
+ "9.3",
+ "15.7"
+ ],
+ "requirements": [
+ "CF-0506-002",
+ "CF-0903-001",
+ "CF-0903-002",
+ "CF-0903-003",
+ "CF-0904-004",
+ "CF-1507-001"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "x!\"#$%&'()=~|\\-^@`[]{};:+*<>,.?_/"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0,
+ "chars_match_any_signs": ";"
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": ";"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 2,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 3,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 5
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 4,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 6
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 5,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 7
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 6,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 8
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 7,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 9
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 8,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 10
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 9,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 11
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 10,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 12
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 11,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 13
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 12,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 14
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 13,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 15
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 14,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 16
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 15,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 17
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 16,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 18
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 17,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 19
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 18,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 20
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 19,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 21
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 20,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 22
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 21,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 23
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 22,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 24
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 23,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 25
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 24,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 26
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 25,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 27
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 26,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 28
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 27,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 29
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 28,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 30
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 29,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 31
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 30,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 32
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 31,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 33
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 32,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 32
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 33,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 31
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 34,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 30
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 35,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 29
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 36,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 28
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 37,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 27
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 38,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 26
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 39,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 25
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 40,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 24
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 41,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 23
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 42,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 22
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 43,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 21
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 44,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 20
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 45,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 19
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 46,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 18
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 47,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 17
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 48,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 16
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 49,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 15
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 50,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 14
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 51,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 13
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 52,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 12
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 53,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 11
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 54,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 10
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 55,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 9
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 56,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 8
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 57,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 7
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 58,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 6
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 59,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 5
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 60,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 61,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ },
+ {
+ "after_step": 62,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ }
+ ],
+ "final_buffer": [
+ "x!\"#$%&'()=~|\\-^@`[]{};:+*<>,.?_/"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1508-DIRECT-ONE",
+ "title": "Direct preview count 1",
+ "source_refs": [
+ "12.4",
+ "15.8"
+ ],
+ "requirements": [
+ "CF-0511-002",
+ "CF-1004-001",
+ "CF-1204-003",
+ "CF-1204-004",
+ "CF-1204-008",
+ "CF-1508-001",
+ "CF-0702-003",
+ "CF-1204-001"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "pOge huga Hiyo pOyo"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": 1,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": true,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "h"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ],
+ "count": 1
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 6
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "pOge huga Hiyo pOyo"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 6
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFDirect",
+ "identity": "direct-set-1",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 2
+ },
+ {
+ "line": 1,
+ "byte_column": 3
+ },
+ {
+ "line": 1,
+ "byte_column": 4
+ },
+ {
+ "line": 1,
+ "byte_column": 5
+ },
+ {
+ "line": 1,
+ "byte_column": 6
+ },
+ {
+ "line": 1,
+ "byte_column": 7
+ },
+ {
+ "line": 1,
+ "byte_column": 9
+ },
+ {
+ "line": 1,
+ "byte_column": 11
+ },
+ {
+ "line": 1,
+ "byte_column": 12
+ },
+ {
+ "line": 1,
+ "byte_column": 13
+ },
+ {
+ "line": 1,
+ "byte_column": 14
+ },
+ {
+ "line": 1,
+ "byte_column": 16
+ }
+ ],
+ "priority": "ordinary"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFDirect",
+ "identity": "direct-set-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [
+ {
+ "after_step": 0,
+ "kind": "screen"
+ }
+ ],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1508-DIRECT-TWO",
+ "title": "Direct preview count 2",
+ "source_refs": [
+ "12.4",
+ "15.8"
+ ],
+ "requirements": [
+ "CF-0511-002",
+ "CF-1004-001",
+ "CF-1204-003",
+ "CF-1204-004",
+ "CF-1204-008",
+ "CF-1508-002",
+ "CF-0200-006"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "pOge huga Hiyo pOyo"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": 2,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": true,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "h"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ],
+ "count": 2
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 11
+ },
+ "complete": true,
+ "successful_steps": 2,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "pOge huga Hiyo pOyo"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 11
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFDirect",
+ "identity": "direct-set-1",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 8
+ },
+ {
+ "line": 1,
+ "byte_column": 10
+ },
+ {
+ "line": 1,
+ "byte_column": 17
+ },
+ {
+ "line": 1,
+ "byte_column": 18
+ },
+ {
+ "line": 1,
+ "byte_column": 19
+ }
+ ],
+ "priority": "ordinary"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFDirect",
+ "identity": "direct-set-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [
+ {
+ "after_step": 0,
+ "kind": "screen"
+ }
+ ],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1508-DIRECT-MULTIBYTE",
+ "title": "Direct preview emits valid UTF-8 byte columns in both directions",
+ "source_refs": [
+ "10.7",
+ "15.8"
+ ],
+ "requirements": [
+ "CF-0200-008",
+ "CF-0301-002",
+ "CF-0301-003",
+ "CF-0301-004",
+ "CF-1007-001",
+ "CF-1007-002",
+ "CF-1204-002",
+ "CF-1508-003"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "x\u3042x\u3044x"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": true,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "x"
+ },
+ {
+ "kind": "text",
+ "text": "x"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "Reset"
+ },
+ {
+ "operation": "set_cursor",
+ "position": {
+ "line": 1,
+ "byte_column": 9
+ }
+ },
+ {
+ "operation": "action",
+ "action": "StartFindBackward",
+ "input_packet_indexes": [
+ 1
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 5
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 1,
+ "kind": "neutral",
+ "position": {
+ "line": 1,
+ "byte_column": 5
+ },
+ "complete": null,
+ "successful_steps": 0,
+ "effective_descriptor": null
+ },
+ {
+ "after_step": 3,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 5
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "F"
+ }
+ ],
+ "final_buffer": [
+ "x\u3042x\u3044x"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 5
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFDirect",
+ "identity": "direct-forward",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 2
+ },
+ {
+ "line": 1,
+ "byte_column": 5
+ },
+ {
+ "line": 1,
+ "byte_column": 6
+ }
+ ],
+ "priority": "ordinary"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFDirect",
+ "identity": "direct-forward",
+ "window": "window-1"
+ },
+ {
+ "after_step": 3,
+ "operation": "create",
+ "group": "CleverFDirect",
+ "identity": "direct-backward",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 6
+ },
+ {
+ "line": 1,
+ "byte_column": 5
+ },
+ {
+ "line": 1,
+ "byte_column": 2
+ }
+ ],
+ "priority": "ordinary"
+ },
+ {
+ "after_step": 3,
+ "operation": "remove",
+ "group": "CleverFDirect",
+ "identity": "direct-backward",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [
+ {
+ "after_step": 0,
+ "kind": "screen"
+ },
+ {
+ "after_step": 3,
+ "kind": "screen"
+ }
+ ],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1509-MACRO",
+ "title": "Each fax macro iteration acquires and removes the next a",
+ "source_refs": [
+ "7.3",
+ "15.9"
+ ],
+ "requirements": [
+ "CF-0604-002",
+ "CF-0703-001",
+ "CF-0703-002",
+ "CF-0703-003",
+ "CF-1509-001"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "1a 2a 3a 4a 5a"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": true,
+ "mark_direct": true,
+ "show_prompt": true,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "a"
+ },
+ {
+ "kind": "text",
+ "text": "a"
+ },
+ {
+ "kind": "text",
+ "text": "a"
+ },
+ {
+ "kind": "text",
+ "text": "a"
+ },
+ {
+ "kind": "text",
+ "text": "a"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": "q",
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "editor_key",
+ "key": "x"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 1
+ ]
+ },
+ {
+ "operation": "editor_key",
+ "key": "x"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 2
+ ]
+ },
+ {
+ "operation": "editor_key",
+ "key": "x"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 3
+ ]
+ },
+ {
+ "operation": "editor_key",
+ "key": "x"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 4
+ ]
+ },
+ {
+ "operation": "editor_key",
+ "key": "x"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 2,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 4,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 6
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 6,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 8
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 8,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 10
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "1 2 3 4 5"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 9
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [
+ {
+ "after_step": 0,
+ "kind": "suppressed"
+ },
+ {
+ "after_step": 2,
+ "kind": "suppressed"
+ },
+ {
+ "after_step": 4,
+ "kind": "suppressed"
+ },
+ {
+ "after_step": 6,
+ "kind": "suppressed"
+ },
+ {
+ "after_step": 8,
+ "kind": "suppressed"
+ }
+ ],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 2,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 4,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 6,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 8,
+ "operation": "read_input"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1510-OVERLAY-LIFECYCLE",
+ "title": "Persistent feedback stays on line and migrates across lines",
+ "source_refs": [
+ "12.5",
+ "12.6",
+ "12.7",
+ "15.10"
+ ],
+ "requirements": [
+ "CF-0200-010",
+ "CF-0509-002",
+ "CF-0702-010",
+ "CF-1102-006",
+ "CF-0602-006",
+ "CF-1205-001",
+ "CF-1205-002",
+ "CF-1206-001",
+ "CF-1206-003",
+ "CF-1207-001",
+ "CF-1207-002",
+ "CF-1510-001",
+ "CF-1510-002"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aha",
+ "aha"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": true,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "h"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [
+ {
+ "name": "CursorMoved",
+ "cursor": {
+ "line": 2,
+ "byte_column": 2
+ }
+ }
+ ],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "event",
+ "event_index": 0
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 1,
+ "kind": "movement",
+ "position": {
+ "line": 2,
+ "byte_column": 2
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "aha",
+ "aha"
+ ],
+ "final_position": {
+ "line": 2,
+ "byte_column": 2
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 2,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 2,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ }
+ },
+ "target_overlays": [
+ "char-2"
+ ],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "retained_fields": [
+ "previous_landing",
+ "target_overlays",
+ "finalizers"
+ ],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1",
+ "anchor_line": 1,
+ "priority": "high",
+ "descriptor": "f",
+ "target_plan": "literal-sensitive-h"
+ },
+ {
+ "after_step": 0,
+ "operation": "preserve",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1",
+ "anchor_line": 1
+ },
+ {
+ "after_step": 1,
+ "operation": "rebuild",
+ "group": "CleverFChar",
+ "identity": "char-2",
+ "window": "window-1",
+ "anchor_line": 2,
+ "priority": "high",
+ "descriptor": "f",
+ "target_plan": "literal-sensitive-h"
+ },
+ {
+ "after_step": 2,
+ "operation": "preserve",
+ "group": "CleverFChar",
+ "identity": "char-2",
+ "window": "window-1",
+ "anchor_line": 2
+ }
+ ],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "register_finalizer",
+ "identity": "finalizer-1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1510-TIMEOUT",
+ "title": "Highlight timeout clears feedback and primary repeat restores it",
+ "source_refs": [
+ "12.8",
+ "15.10"
+ ],
+ "requirements": [
+ "CF-0509-007",
+ "CF-1208-001",
+ "CF-1208-004",
+ "CF-1208-005",
+ "CF-1510-004"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "ahaha"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": true,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 50
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "h"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ },
+ {
+ "operation": "timer_callback",
+ "timer_identity": "timer-1"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ },
+ {
+ "after_step": 2,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "ahaha"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 1,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ }
+ },
+ "highlight_timer": null,
+ "target_overlays": []
+ },
+ "retained_fields": [
+ "previous_descriptor",
+ "previous_target",
+ "previous_landing",
+ "first_move"
+ ],
+ "cleared_fields": []
+ },
+ {
+ "after_step": 2,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ }
+ },
+ "highlight_timer": "timer-2",
+ "target_overlays": [
+ "char-2"
+ ]
+ },
+ "retained_fields": [],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1",
+ "anchor_line": 1,
+ "priority": "high"
+ },
+ {
+ "after_step": 1,
+ "operation": "remove",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1"
+ },
+ {
+ "after_step": 2,
+ "operation": "create",
+ "group": "CleverFChar",
+ "identity": "char-2",
+ "window": "window-1",
+ "anchor_line": 1,
+ "priority": "high"
+ }
+ ],
+ "timer_operations": [
+ {
+ "after_step": 0,
+ "operation": "start",
+ "identity": "timer-1",
+ "delay_ms": 50
+ },
+ {
+ "after_step": 1,
+ "operation": "fire",
+ "identity": "timer-1"
+ },
+ {
+ "after_step": 1,
+ "operation": "set_inactive",
+ "identity": "timer-1"
+ },
+ {
+ "after_step": 2,
+ "operation": "start",
+ "identity": "timer-2",
+ "delay_ms": 50
+ }
+ ],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1511-FOLDS",
+ "title": "Primary action opens all enclosing horizontal-motion folds before input",
+ "source_refs": [
+ "7.1",
+ "15.11"
+ ],
+ "requirements": [
+ "CF-0701-001",
+ "CF-0701-002",
+ "CF-0701-003",
+ "CF-1511-001"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aha"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "h"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [
+ "horizontal"
+ ],
+ "closed_fold_levels": 3,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "aha"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "open_fold",
+ "fold_level": 3
+ },
+ {
+ "after_step": 0,
+ "operation": "open_fold",
+ "fold_level": 2
+ },
+ {
+ "after_step": 0,
+ "operation": "open_fold",
+ "fold_level": 1
+ },
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 0,
+ "operation": "apply_cursor",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ }
+ }
+ ]
+ }
+ }
+ ]
+}
diff --git a/conformance/fixtures/transition-fixtures.json b/conformance/fixtures/transition-fixtures.json
new file mode 100644
index 0000000..98d639a
--- /dev/null
+++ b/conformance/fixtures/transition-fixtures.json
@@ -0,0 +1,3214 @@
+{
+ "format_version": 1,
+ "scenarios": [
+ {
+ "id": "SCN-0702-TEMP-SUCCESS",
+ "title": "Successful acquisition releases all temporary feedback",
+ "source_refs": [
+ "7.2",
+ "12.3",
+ "12.4"
+ ],
+ "requirements": [
+ "CF-0505-002",
+ "CF-0507-002",
+ "CF-0507-006",
+ "CF-0702-001",
+ "CF-0702-002",
+ "CF-0702-004",
+ "CF-0702-005",
+ "CF-0702-006",
+ "CF-0602-006",
+ "CF-0702-008",
+ "CF-0702-011",
+ "CF-0702-012",
+ "CF-0702-013",
+ "CF-1203-001",
+ "CF-1203-002",
+ "CF-1203-003",
+ "CF-1204-011"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aha"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": true,
+ "mark_direct": true,
+ "show_prompt": true,
+ "highlight_timeout_ms": 0,
+ "hide_cursor_on_cmdline": true
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "h"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "aha"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "temporary_overlays": []
+ },
+ "retained_fields": [],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFCursor",
+ "identity": "cursor-1",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 1
+ }
+ ],
+ "priority": "high"
+ },
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFDirect",
+ "identity": "direct-1",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 2
+ },
+ {
+ "line": 1,
+ "byte_column": 3
+ }
+ ],
+ "priority": "ordinary"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFCursor",
+ "identity": "cursor-1",
+ "window": "window-1"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFDirect",
+ "identity": "direct-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [],
+ "prompts": [
+ "clever-f: "
+ ],
+ "redraws": [
+ {
+ "after_step": 0,
+ "kind": "screen"
+ },
+ {
+ "after_step": 0,
+ "kind": "screen"
+ },
+ {
+ "after_step": 0,
+ "kind": "full"
+ }
+ ],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "hide_cursor_presentation"
+ },
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 0,
+ "operation": "apply_cursor",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ }
+ },
+ {
+ "after_step": 0,
+ "operation": "restore_cursor_presentation"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-0702-TEMP-CANCEL",
+ "title": "Escape releases all temporary feedback",
+ "source_refs": [
+ "7.2",
+ "7.5",
+ "12.3",
+ "12.4"
+ ],
+ "requirements": [
+ "CF-0702-012",
+ "CF-0702-013",
+ "CF-1204-011",
+ "CF-0702-007",
+ "CF-0705-001",
+ "CF-0705-002",
+ "CF-1203-003"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aha"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": true,
+ "mark_direct": true,
+ "show_prompt": true,
+ "highlight_timeout_ms": 0,
+ "hide_cursor_on_cmdline": true
+ },
+ "input_packets": [
+ {
+ "kind": "special_key",
+ "name": "Escape",
+ "bytes": [
+ 27
+ ]
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "escape",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "complete": null,
+ "successful_steps": 0,
+ "effective_descriptor": null
+ }
+ ],
+ "final_buffer": [
+ "aha"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": null,
+ "first_move": true,
+ "previous_target": null
+ }
+ },
+ "temporary_overlays": []
+ },
+ "retained_fields": [
+ "previous_descriptor",
+ "first_move"
+ ],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFCursor",
+ "identity": "cursor-1",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 1
+ }
+ ],
+ "priority": "high"
+ },
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFDirect",
+ "identity": "direct-1",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 2
+ },
+ {
+ "line": 1,
+ "byte_column": 3
+ }
+ ],
+ "priority": "ordinary"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFCursor",
+ "identity": "cursor-1",
+ "window": "window-1"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFDirect",
+ "identity": "direct-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [],
+ "prompts": [
+ "clever-f: "
+ ],
+ "redraws": [
+ {
+ "after_step": 0,
+ "kind": "screen"
+ },
+ {
+ "after_step": 0,
+ "kind": "screen"
+ }
+ ],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "hide_cursor_presentation"
+ },
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 0,
+ "operation": "restore_cursor_presentation"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-0702-TEMP-INPUT-ERROR",
+ "title": "Input error releases all temporary feedback",
+ "source_refs": [
+ "7.2",
+ "7.5",
+ "12.3",
+ "12.4"
+ ],
+ "requirements": [
+ "CF-0702-012",
+ "CF-0702-013",
+ "CF-1204-011",
+ "CF-0507-006"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aha"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": true,
+ "mark_direct": true,
+ "show_prompt": true,
+ "highlight_timeout_ms": 0,
+ "hide_cursor_on_cmdline": true
+ },
+ "input_packets": [
+ {
+ "kind": "error",
+ "message": "input failed"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "error",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "complete": null,
+ "successful_steps": 0,
+ "effective_descriptor": null
+ }
+ ],
+ "final_buffer": [
+ "aha"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": null,
+ "first_move": true,
+ "previous_target": null
+ }
+ },
+ "temporary_overlays": []
+ },
+ "retained_fields": [
+ "previous_descriptor",
+ "first_move"
+ ],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFCursor",
+ "identity": "cursor-1",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 1
+ }
+ ],
+ "priority": "high"
+ },
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFDirect",
+ "identity": "direct-1",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 2
+ },
+ {
+ "line": 1,
+ "byte_column": 3
+ }
+ ],
+ "priority": "ordinary"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFCursor",
+ "identity": "cursor-1",
+ "window": "window-1"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFDirect",
+ "identity": "direct-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [],
+ "prompts": [
+ "clever-f: "
+ ],
+ "redraws": [
+ {
+ "after_step": 0,
+ "kind": "screen"
+ },
+ {
+ "after_step": 0,
+ "kind": "screen"
+ }
+ ],
+ "diagnostics": [
+ {
+ "after_step": 0,
+ "level": "error",
+ "text": "input failed"
+ }
+ ],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "hide_cursor_presentation"
+ },
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 0,
+ "operation": "restore_cursor_presentation"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-0702-TEMP-UNMATCHED",
+ "title": "Unmatched target releases temporary feedback and retains persistent feedback",
+ "source_refs": [
+ "7.2",
+ "12.3",
+ "14.4"
+ ],
+ "requirements": [
+ "CF-0702-012",
+ "CF-0702-013",
+ "CF-1203-003",
+ "CF-1404-003"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "abc"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": true,
+ "mark_cursor": true,
+ "mark_direct": true,
+ "show_prompt": true,
+ "highlight_timeout_ms": 0,
+ "hide_cursor_on_cmdline": true
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "z"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "failed_search",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "complete": false,
+ "successful_steps": 0,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "abc"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": null,
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "z",
+ "first_code": 122
+ }
+ }
+ },
+ "last_input_context": "n",
+ "temporary_overlays": [],
+ "target_overlays": [
+ "char-1"
+ ],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "retained_fields": [
+ "previous_landing",
+ "first_move",
+ "target_overlays",
+ "finalizers"
+ ],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFCursor",
+ "identity": "cursor-1",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 1
+ }
+ ],
+ "priority": "high"
+ },
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFDirect",
+ "identity": "direct-1",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 2
+ },
+ {
+ "line": 1,
+ "byte_column": 3
+ }
+ ],
+ "priority": "ordinary"
+ },
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1",
+ "anchor_line": 1,
+ "priority": "high",
+ "descriptor": "f",
+ "target_plan": "literal-sensitive-z"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFCursor",
+ "identity": "cursor-1",
+ "window": "window-1"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFDirect",
+ "identity": "direct-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [],
+ "prompts": [
+ "clever-f: "
+ ],
+ "redraws": [
+ {
+ "after_step": 0,
+ "kind": "screen"
+ },
+ {
+ "after_step": 0,
+ "kind": "screen"
+ },
+ {
+ "after_step": 0,
+ "kind": "full"
+ }
+ ],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "hide_cursor_presentation"
+ },
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 0,
+ "operation": "register_finalizer",
+ "identity": "finalizer-1"
+ },
+ {
+ "after_step": 0,
+ "operation": "restore_cursor_presentation"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-0702-TEMP-SEARCH-ERROR",
+ "title": "Target-plan error releases all temporary feedback",
+ "source_refs": [
+ "7.2",
+ "12.3",
+ "14.4"
+ ],
+ "requirements": [
+ "CF-0702-012",
+ "CF-0702-013",
+ "CF-1203-003",
+ "CF-1404-003"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "abc"
+ ]
+ },
+ "effective_encoding": "latin1",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": true,
+ "mark_direct": true,
+ "show_prompt": true,
+ "highlight_timeout_ms": 0,
+ "hide_cursor_on_cmdline": true,
+ "use_migemo": true
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "a"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "error",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "complete": null,
+ "successful_steps": 0,
+ "effective_descriptor": null
+ }
+ ],
+ "final_buffer": [
+ "abc"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": null,
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "a",
+ "first_code": 97
+ }
+ }
+ },
+ "last_input_context": "n",
+ "temporary_overlays": []
+ },
+ "retained_fields": [],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFCursor",
+ "identity": "cursor-1",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 1
+ }
+ ],
+ "priority": "high"
+ },
+ {
+ "after_step": 0,
+ "operation": "create",
+ "group": "CleverFDirect",
+ "identity": "direct-1",
+ "window": "window-1",
+ "positions": [
+ {
+ "line": 1,
+ "byte_column": 2
+ },
+ {
+ "line": 1,
+ "byte_column": 3
+ }
+ ],
+ "priority": "ordinary"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFCursor",
+ "identity": "cursor-1",
+ "window": "window-1"
+ },
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFDirect",
+ "identity": "direct-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [],
+ "prompts": [
+ "clever-f: "
+ ],
+ "redraws": [
+ {
+ "after_step": 0,
+ "kind": "screen"
+ },
+ {
+ "after_step": 0,
+ "kind": "screen"
+ }
+ ],
+ "diagnostics": [
+ {
+ "after_step": 0,
+ "level": "error",
+ "text": "clever-f: Encoding 'latin1' is not supported. Migemo is disabled"
+ }
+ ],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "hide_cursor_presentation"
+ },
+ {
+ "after_step": 0,
+ "operation": "read_input"
+ },
+ {
+ "after_step": 0,
+ "operation": "restore_cursor_presentation"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-0704-MISSING-PREVIOUS",
+ "title": "Missing previous input preserves cursor and reports the exact error",
+ "source_refs": [
+ "7.4"
+ ],
+ "requirements": [
+ "CF-0704-003"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aha"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "\r"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "empty",
+ "position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "complete": null,
+ "successful_steps": 0,
+ "effective_descriptor": null
+ }
+ ],
+ "final_buffer": [
+ "aha"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": null,
+ "first_move": true,
+ "previous_target": null
+ }
+ },
+ "last_input_context": null
+ },
+ "retained_fields": [],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [
+ {
+ "after_step": 0,
+ "level": "error",
+ "text": "Previous input not found."
+ }
+ ],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1004-PARTIAL-FAILURE",
+ "title": "Sequential count failure applies partial endpoint without history commit",
+ "source_refs": [
+ "10.4",
+ "11.2",
+ "14.4"
+ ],
+ "requirements": [
+ "CF-0601-002",
+ "CF-1004-003",
+ "CF-1102-003",
+ "CF-1102-004",
+ "CF-1404-002"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "ababa"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": 3,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "a"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {},
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ],
+ "count": 3
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "failed_search",
+ "position": {
+ "line": 1,
+ "byte_column": 5
+ },
+ "complete": false,
+ "successful_steps": 2,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "ababa"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 5
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": null,
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "a",
+ "first_code": 97
+ }
+ }
+ },
+ "last_input_context": "n"
+ },
+ "retained_fields": [
+ "previous_landing",
+ "first_move"
+ ],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [],
+ "timer_operations": [],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "apply_cursor",
+ "position": {
+ "line": 1,
+ "byte_column": 5
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1207-CURSOR-FINALIZE",
+ "title": "Unrelated CursorMoved performs full finalization",
+ "source_refs": [
+ "12.7"
+ ],
+ "requirements": [
+ "CF-1207-003",
+ "CF-1207-005",
+ "CF-1207-006",
+ "CF-1510-003",
+ "CF-0803-005",
+ "CF-1207-007"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aha",
+ "xxx"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [],
+ "time_values_ms": [],
+ "events": [
+ {
+ "name": "CursorMoved",
+ "cursor": {
+ "line": 1,
+ "byte_column": 1
+ }
+ }
+ ],
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": {
+ "line": 2,
+ "byte_column": 3
+ },
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "repeat_timestamp_ms": 77,
+ "highlight_timer": "timer-1",
+ "target_overlays": [
+ "char-1"
+ ],
+ "temporary_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "event",
+ "event_index": 0
+ }
+ ],
+ "expect": {
+ "action_outcomes": [],
+ "final_buffer": [
+ "aha",
+ "xxx"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 1
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": null,
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": null,
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": false,
+ "moved_forward_initialized": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "repeat_timestamp_ms": 77,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "retained_fields": [
+ "previous_descriptor",
+ "previous_target",
+ "first_move",
+ "last_input_context",
+ "migemo_cache",
+ "repeat_timestamp_ms",
+ "moved_forward_initialized"
+ ],
+ "cleared_fields": [
+ "previous_landing",
+ "highlight_timer",
+ "target_overlays",
+ "finalizers",
+ "moved_forward"
+ ]
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [
+ {
+ "after_step": 0,
+ "operation": "stop",
+ "identity": "timer-1"
+ }
+ ],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "remove_finalizer",
+ "identity": "finalizer-1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1207-INSERT-FINALIZE",
+ "title": "InsertEnter performs full finalization",
+ "source_refs": [
+ "12.7"
+ ],
+ "requirements": [
+ "CF-1207-004",
+ "CF-1207-005",
+ "CF-1207-006",
+ "CF-1510-003"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aha",
+ "xxx"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [],
+ "time_values_ms": [],
+ "events": [
+ {
+ "name": "InsertEnter"
+ }
+ ],
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": {
+ "line": 2,
+ "byte_column": 3
+ },
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "repeat_timestamp_ms": 77,
+ "highlight_timer": "timer-1",
+ "target_overlays": [
+ "char-1"
+ ],
+ "temporary_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "event",
+ "event_index": 0
+ }
+ ],
+ "expect": {
+ "action_outcomes": [],
+ "final_buffer": [
+ "aha",
+ "xxx"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": null,
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": null,
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": false,
+ "moved_forward_initialized": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "repeat_timestamp_ms": 77,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "retained_fields": [
+ "previous_descriptor",
+ "previous_target",
+ "first_move",
+ "last_input_context",
+ "migemo_cache",
+ "repeat_timestamp_ms",
+ "moved_forward_initialized"
+ ],
+ "cleared_fields": [
+ "previous_landing",
+ "highlight_timer",
+ "target_overlays",
+ "finalizers",
+ "moved_forward"
+ ]
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [
+ {
+ "after_step": 0,
+ "operation": "stop",
+ "identity": "timer-1"
+ }
+ ],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "remove_finalizer",
+ "identity": "finalizer-1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1207-TEXT-FINALIZE",
+ "title": "TextChanged performs full finalization",
+ "source_refs": [
+ "12.7"
+ ],
+ "requirements": [
+ "CF-1207-004",
+ "CF-1207-005",
+ "CF-1207-006",
+ "CF-1510-003"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aha",
+ "xxx"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [],
+ "time_values_ms": [],
+ "events": [
+ {
+ "name": "TextChanged",
+ "buffer_lines": [
+ "ahz",
+ "xxx"
+ ]
+ }
+ ],
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": {
+ "line": 2,
+ "byte_column": 3
+ },
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "repeat_timestamp_ms": 77,
+ "highlight_timer": "timer-1",
+ "target_overlays": [
+ "char-1"
+ ],
+ "temporary_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "event",
+ "event_index": 0
+ }
+ ],
+ "expect": {
+ "action_outcomes": [],
+ "final_buffer": [
+ "ahz",
+ "xxx"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": null,
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": null,
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": false,
+ "moved_forward_initialized": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "repeat_timestamp_ms": 77,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "retained_fields": [
+ "previous_descriptor",
+ "previous_target",
+ "first_move",
+ "last_input_context",
+ "migemo_cache",
+ "repeat_timestamp_ms",
+ "moved_forward_initialized"
+ ],
+ "cleared_fields": [
+ "previous_landing",
+ "highlight_timer",
+ "target_overlays",
+ "finalizers",
+ "moved_forward"
+ ]
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [
+ {
+ "after_step": 0,
+ "operation": "stop",
+ "identity": "timer-1"
+ }
+ ],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "remove_finalizer",
+ "identity": "finalizer-1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1207-EAGER-WINDOWS",
+ "title": "Each eager window event removes feedback and preserves history",
+ "source_refs": [
+ "12.7"
+ ],
+ "requirements": [
+ "CF-0512-002",
+ "CF-0512-003",
+ "CF-1207-008",
+ "CF-1207-009"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aha",
+ "xxx"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": true,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0,
+ "clean_labels_eagerly": true
+ },
+ "input_packets": [],
+ "time_values_ms": [],
+ "events": [
+ {
+ "name": "WinEnter"
+ },
+ {
+ "name": "WinLeave"
+ },
+ {
+ "name": "CmdwinLeave"
+ }
+ ],
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": {
+ "line": 2,
+ "byte_column": 3
+ },
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "repeat_timestamp_ms": 77,
+ "highlight_timer": "timer-1",
+ "target_overlays": [
+ "char-1"
+ ],
+ "temporary_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "event",
+ "event_index": 0
+ },
+ {
+ "operation": "set_state",
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": {
+ "line": 2,
+ "byte_column": 3
+ },
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "repeat_timestamp_ms": 77,
+ "highlight_timer": "timer-2",
+ "target_overlays": [
+ "char-2"
+ ],
+ "temporary_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ }
+ },
+ {
+ "operation": "event",
+ "event_index": 1
+ },
+ {
+ "operation": "set_state",
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": {
+ "line": 2,
+ "byte_column": 3
+ },
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "repeat_timestamp_ms": 77,
+ "highlight_timer": "timer-3",
+ "target_overlays": [
+ "char-3"
+ ],
+ "temporary_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ }
+ },
+ {
+ "operation": "event",
+ "event_index": 2
+ }
+ ],
+ "expect": {
+ "action_outcomes": [],
+ "final_buffer": [
+ "aha",
+ "xxx"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": {
+ "line": 2,
+ "byte_column": 3
+ },
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "highlight_timer": null,
+ "target_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "retained_fields": [
+ "previous_descriptor",
+ "previous_target",
+ "previous_landing",
+ "first_move",
+ "last_input_context",
+ "moved_forward",
+ "migemo_cache",
+ "finalizers"
+ ],
+ "cleared_fields": [
+ "highlight_timer",
+ "target_overlays"
+ ]
+ },
+ {
+ "after_step": 2,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": {
+ "line": 2,
+ "byte_column": 3
+ },
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "highlight_timer": null,
+ "target_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "retained_fields": [
+ "previous_descriptor",
+ "previous_target",
+ "previous_landing",
+ "first_move",
+ "last_input_context",
+ "moved_forward",
+ "migemo_cache",
+ "finalizers"
+ ],
+ "cleared_fields": [
+ "highlight_timer",
+ "target_overlays"
+ ]
+ },
+ {
+ "after_step": 4,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": {
+ "line": 2,
+ "byte_column": 3
+ },
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "highlight_timer": null,
+ "target_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "retained_fields": [
+ "previous_descriptor",
+ "previous_target",
+ "previous_landing",
+ "first_move",
+ "last_input_context",
+ "moved_forward",
+ "migemo_cache",
+ "finalizers"
+ ],
+ "cleared_fields": [
+ "highlight_timer",
+ "target_overlays"
+ ]
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1"
+ },
+ {
+ "after_step": 2,
+ "operation": "remove",
+ "group": "CleverFChar",
+ "identity": "char-2",
+ "window": "window-1"
+ },
+ {
+ "after_step": 4,
+ "operation": "remove",
+ "group": "CleverFChar",
+ "identity": "char-3",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [
+ {
+ "after_step": 0,
+ "operation": "stop",
+ "identity": "timer-1"
+ },
+ {
+ "after_step": 2,
+ "operation": "stop",
+ "identity": "timer-2"
+ },
+ {
+ "after_step": 4,
+ "operation": "stop",
+ "identity": "timer-3"
+ }
+ ],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1208-TIMER-IDENTITY",
+ "title": "Only the current replacement timer can remove feedback",
+ "source_refs": [
+ "12.8"
+ ],
+ "requirements": [
+ "CF-0602-005",
+ "CF-1208-002",
+ "CF-1208-003",
+ "CF-1208-006"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aaaaa"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": true,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 50
+ },
+ "input_packets": [],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "a",
+ "first_code": 97
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": "timer-1",
+ "target_overlays": [
+ "char-1"
+ ],
+ "temporary_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "StartFindForward"
+ },
+ {
+ "operation": "timer_callback",
+ "timer_identity": "timer-1"
+ },
+ {
+ "operation": "timer_callback",
+ "timer_identity": "timer-2"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "aaaaa"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 1,
+ "state": {
+ "highlight_timer": "timer-2",
+ "target_overlays": [
+ "char-1"
+ ]
+ },
+ "retained_fields": [
+ "highlight_timer",
+ "target_overlays"
+ ],
+ "cleared_fields": []
+ },
+ {
+ "after_step": 2,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 3
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "a",
+ "first_code": 97
+ }
+ }
+ },
+ "highlight_timer": null,
+ "target_overlays": []
+ },
+ "retained_fields": [
+ "previous_descriptor",
+ "previous_target",
+ "previous_landing",
+ "first_move"
+ ],
+ "cleared_fields": [
+ "highlight_timer",
+ "target_overlays"
+ ]
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "preserve",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1",
+ "anchor_line": 1
+ },
+ {
+ "after_step": 2,
+ "operation": "remove",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [
+ {
+ "after_step": 0,
+ "operation": "stop",
+ "identity": "timer-1"
+ },
+ {
+ "after_step": 0,
+ "operation": "start",
+ "identity": "timer-2",
+ "delay_ms": 50
+ },
+ {
+ "after_step": 1,
+ "operation": "fire",
+ "identity": "timer-1"
+ },
+ {
+ "after_step": 1,
+ "operation": "ignore",
+ "identity": "timer-1"
+ },
+ {
+ "after_step": 2,
+ "operation": "fire",
+ "identity": "timer-2"
+ },
+ {
+ "after_step": 2,
+ "operation": "set_inactive",
+ "identity": "timer-2"
+ }
+ ],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": []
+ }
+ },
+ {
+ "id": "SCN-1401-PUBLIC-RESET",
+ "title": "Public Reset clears and retains the exact field sets",
+ "source_refs": [
+ "7.4",
+ "13.3",
+ "14.1"
+ ],
+ "requirements": [
+ "CF-0400-003",
+ "CF-0601-005",
+ "CF-0704-004",
+ "CF-0803-007",
+ "CF-1303-005",
+ "CF-1401-001",
+ "CF-1401-002",
+ "CF-1401-003",
+ "CF-1401-004",
+ "CF-1401-005",
+ "CF-1401-006"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "ahaha"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [
+ {
+ "kind": "text",
+ "text": "\r"
+ }
+ ],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": {
+ "line": 2,
+ "byte_column": 3
+ },
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "repeat_timestamp_ms": 77,
+ "highlight_timer": "timer-1",
+ "target_overlays": [
+ "char-1"
+ ],
+ "temporary_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "Reset"
+ },
+ {
+ "operation": "action",
+ "action": "RepeatSameDirection"
+ },
+ {
+ "operation": "action",
+ "action": "StartFindForward",
+ "input_packet_indexes": [
+ 0
+ ]
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "neutral",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "complete": null,
+ "successful_steps": 0,
+ "effective_descriptor": null
+ },
+ {
+ "after_step": 1,
+ "kind": "empty",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "complete": null,
+ "successful_steps": 0,
+ "effective_descriptor": null
+ },
+ {
+ "after_step": 2,
+ "kind": "movement",
+ "position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "complete": true,
+ "successful_steps": 1,
+ "effective_descriptor": "f"
+ }
+ ],
+ "final_buffer": [
+ "ahaha"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": null,
+ "previous_landing": null,
+ "first_move": null,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": null,
+ "previous_landing": null,
+ "first_move": null,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "retained_fields": [
+ "previous_target",
+ "last_input_context",
+ "moved_forward",
+ "moved_forward_initialized",
+ "finalizers"
+ ],
+ "cleared_fields": [
+ "previous_descriptor",
+ "previous_landing",
+ "first_move",
+ "migemo_cache",
+ "repeat_timestamp_ms",
+ "highlight_timer",
+ "target_overlays"
+ ]
+ },
+ {
+ "after_step": 2,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 4
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": null,
+ "previous_landing": null,
+ "first_move": null,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "retained_fields": [],
+ "cleared_fields": []
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [
+ {
+ "after_step": 0,
+ "operation": "stop",
+ "identity": "timer-1"
+ }
+ ],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 2,
+ "operation": "read_input"
+ }
+ ]
+ }
+ },
+ {
+ "id": "SCN-1402-DIAGNOSTIC-RESET",
+ "title": "Diagnostic full reset clears all public and diagnostic fields",
+ "source_refs": [
+ "14.2"
+ ],
+ "requirements": [
+ "CF-1402-001",
+ "CF-1402-002"
+ ],
+ "given": {
+ "buffer": {
+ "lines": [
+ "aha",
+ "xxx"
+ ]
+ },
+ "effective_encoding": "utf-8",
+ "cursor": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "mode": "n",
+ "selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "pending_operator": null,
+ "count": null,
+ "configuration": {
+ "mark_char": false,
+ "mark_cursor": false,
+ "mark_direct": false,
+ "show_prompt": false,
+ "highlight_timeout_ms": 0
+ },
+ "input_packets": [],
+ "time_values_ms": [],
+ "events": [],
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": "f",
+ "previous_landing": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "first_move": false,
+ "previous_target": {
+ "kind": "character",
+ "value": "h",
+ "first_code": 104
+ }
+ },
+ "v": {
+ "previous_descriptor": "t",
+ "previous_landing": {
+ "line": 2,
+ "byte_column": 3
+ },
+ "first_move": true,
+ "previous_target": {
+ "kind": "character",
+ "value": "x",
+ "first_code": 120
+ }
+ }
+ },
+ "last_input_context": "n",
+ "moved_forward": true,
+ "moved_forward_initialized": true,
+ "migemo_cache": [
+ "utf-8"
+ ],
+ "repeat_timestamp_ms": 77,
+ "highlight_timer": "timer-1",
+ "target_overlays": [
+ "char-1"
+ ],
+ "temporary_overlays": [],
+ "finalizers": [
+ "finalizer-1"
+ ]
+ },
+ "host": {
+ "macro_register": null,
+ "fold_open_policy": [],
+ "closed_fold_levels": 0,
+ "timer_support": true,
+ "cmdline_cursor_support": true
+ }
+ },
+ "steps": [
+ {
+ "operation": "action",
+ "action": "DiagnosticFullReset"
+ }
+ ],
+ "expect": {
+ "action_outcomes": [
+ {
+ "after_step": 0,
+ "kind": "neutral",
+ "position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "complete": null,
+ "successful_steps": 0,
+ "effective_descriptor": null
+ }
+ ],
+ "final_buffer": [
+ "aha",
+ "xxx"
+ ],
+ "final_position": {
+ "line": 1,
+ "byte_column": 2
+ },
+ "final_selection": {
+ "active": false,
+ "kind": "none",
+ "anchor": null,
+ "focus": null,
+ "option": "inclusive"
+ },
+ "state_snapshots": [
+ {
+ "after_step": 0,
+ "state": {
+ "contexts": {
+ "n": {
+ "previous_descriptor": null,
+ "previous_landing": null,
+ "first_move": null,
+ "previous_target": null
+ },
+ "v": {
+ "previous_descriptor": null,
+ "previous_landing": null,
+ "first_move": null,
+ "previous_target": null
+ }
+ },
+ "last_input_context": null,
+ "moved_forward": false,
+ "moved_forward_initialized": false,
+ "migemo_cache": [],
+ "repeat_timestamp_ms": 0,
+ "highlight_timer": null,
+ "target_overlays": [],
+ "temporary_overlays": [],
+ "finalizers": []
+ },
+ "retained_fields": [],
+ "cleared_fields": [
+ "previous_descriptor",
+ "previous_landing",
+ "first_move",
+ "previous_target",
+ "last_input_context",
+ "moved_forward",
+ "moved_forward_initialized",
+ "migemo_cache",
+ "repeat_timestamp_ms",
+ "highlight_timer",
+ "target_overlays",
+ "temporary_overlays",
+ "finalizers"
+ ]
+ }
+ ],
+ "overlay_plans": [
+ {
+ "after_step": 0,
+ "operation": "remove",
+ "group": "CleverFChar",
+ "identity": "char-1",
+ "window": "window-1"
+ }
+ ],
+ "timer_operations": [
+ {
+ "after_step": 0,
+ "operation": "stop",
+ "identity": "timer-1"
+ }
+ ],
+ "prompts": [],
+ "redraws": [],
+ "diagnostics": [],
+ "host_operations": [
+ {
+ "after_step": 0,
+ "operation": "remove_finalizer",
+ "identity": "finalizer-1"
+ }
+ ]
+ }
+ }
+ ]
+}
diff --git a/conformance/migemo-assets.txt b/conformance/migemo-assets.txt
new file mode 100644
index 0000000..a9d0199
--- /dev/null
+++ b/conformance/migemo-assets.txt
@@ -0,0 +1,58 @@
+MIGEMO NORMATIVE ASSET INVENTORY
+
+Inventory date: Phase 1
+Normative source: specification.txt, section 13.1
+Required key order: a through z, then A through Z
+Required entry count: 52 per data set
+
+MIGEMO-UTF8
+Effective encoding: UTF-8
+Normative source data: missing
+Available-path count: 0
+Phase 7 status: blocked
+Required asset: the original clever-f UTF-8 generated Migemo data file
+
+MIGEMO-CP932
+Effective encoding: CP932
+Normative source data: missing
+Available-path count: 0
+Phase 7 status: blocked
+Required asset: the original clever-f CP932 generated Migemo data file
+
+MIGEMO-EUCJP
+Effective encoding: EUC-JP
+Normative source data: missing
+Available-path count: 0
+Phase 7 status: blocked
+Required asset: the original clever-f EUC-JP generated Migemo data file
+
+REFERENCE RESOURCE SEARCH
+
+.project/resources.yaml
+Resource role: manifest
+Relevant data-set path count: 0
+
+.library/neovim
+Resource role: Neovim source and test tree
+Relevant data-set path count: 0
+Encoding-name matches belong to runtime, translation, build, or test data.
+
+.library/vim-themis
+Resource role: vim-themis framework
+Relevant data-set path count: 0
+
+/usr/bin/nvim
+Resource role: specified host executable
+Relevant data-set path count: 0
+
+/usr/share/nvim/runtime/doc
+Resource role: host documentation
+Relevant data-set path count: 0
+
+/usr/share/nvim/runtime/lua
+Resource role: host Lua runtime and generated metadata
+Relevant data-set path count: 0
+
+ASSET REQUEST
+
+Provide the three original clever-f generated Migemo source data files for UTF-8, CP932, and EUC-JP. Include their source revision or checksums so Phase 7 can compare bundled data with the normative source.
diff --git a/conformance/phase-status.txt b/conformance/phase-status.txt
new file mode 100644
index 0000000..c102d2e
--- /dev/null
+++ b/conformance/phase-status.txt
@@ -0,0 +1,13 @@
+IMPLEMENTATION PHASE STATUS
+
+Phase 1: complete
+
+- requirements.tsv assigns every identified normative rule to one leaf scope, one component owner, and one planned check.
+- scenario-schema.json defines the host-neutral scenario contract.
+- fixtures/reference-examples.json contains all section 11 and section 15 examples.
+- fixtures/transition-fixtures.json contains temporary cleanup, lifecycle cleanup, timer cleanup, Public Reset, diagnostic reset, and failed-motion retention cases.
+- migemo-assets.txt inventories all three required source data sets.
+
+Phase 7: blocked
+
+The normative UTF-8, CP932, and EUC-JP Migemo source data files are missing from the supplied reference resources. The asset request is in migemo-assets.txt.
diff --git a/conformance/requirements.tsv b/conformance/requirements.tsv
new file mode 100644
index 0000000..1a715b6
--- /dev/null
+++ b/conformance/requirements.tsv
@@ -0,0 +1,339 @@
+requirement_id strength source rule leaf_scope component_owner planned_check fixture_ids
+CF-0200-001 REQUIRED 2 Extend the editor f, F, t, and T character motions. S0.1.1 ActionFacade Invoke each initiating action and compare its descriptor with the corresponding editor motion. -
+CF-0200-002 REQUIRED 2 A later primary key reuses the acquired target. S0.5.2 RepeatResolver Acquire one target, invoke another primary key at the landing, and assert that no input is read. SCN-1501-SHARED-KEYS
+CF-0200-003 REQUIRED 2 A lower-case primary key normally repeats in the stored direction and an upper-case key normally uses the opposite direction. S0.5.4 RepeatResolver Exercise lower-case and upper-case repeats after each stored direction. SCN-1501-SHARED-KEYS
+CF-0200-004 REQUIRED 2 The initiating FIND or TILL family remains active for the sequence. S0.5.4 RepeatResolver Start each family and repeat with the other family key. SCN-1501-SHARED-KEYS
+CF-0200-005 REQUIRED 2 Support Normal mode, Visual mode, and operator-pending mode. S0.2.5 DomainModel Run one complete motion in each required mode context. SCN-1102-COMMAND-SUCCESS,SCN-1103-VISUAL-SUCCESS,SCN-1104-DFE
+CF-0200-006 REQUIRED 2 Support positive counts. S0.2.4 DestinationEngine Run FIND and TILL with absent, one, and larger counts. SCN-1508-DIRECT-TWO
+CF-0200-007 REQUIRED 2 Support multiline search. S0.8.2 DestinationEngine Repeat a target across two lines in both directions. SCN-1503-MULTILINE
+CF-0200-008 REQUIRED 2 Support multibyte text. S0.2.2 TextTopology Search and preview text with multibyte characters and assert byte-aligned endpoints. SCN-1508-DIRECT-MULTIBYTE
+CF-0200-009 REQUIRED 2 Support dot-repeat for operator changes. S0.9.4 MotionExecutor Repeat an operator FIND and TILL payload without target input. SCN-1105-DOT-REPEAT
+CF-0200-010 REQUIRED 2 Support configurable matching and visual feedback. S0.3.6 PolicyService Change each live matching and feedback setting and observe the next applicable behavior. SCN-1506-IGNORE-CASE,SCN-1510-OVERLAY-LIFECYCLE
+CF-0301-001 REQUIRED 3.1 Represent a position with one-based line and column values. S0.2.1 DomainModel Reject zero coordinates and construct positions at line one and column one. -
+CF-0301-002 REQUIRED 3.1 Interpret a position column as a byte position. S0.2.1 DomainModel Resolve positions on ASCII and multibyte text and compare expected byte columns. SCN-1508-DIRECT-MULTIBYTE
+CF-0301-003 REQUIRED 3.1 Iterate characters and compare targets as editor characters. S0.2.2 TextTopology Enumerate one entry per editor character in multibyte text. SCN-1508-DIRECT-MULTIBYTE
+CF-0301-004 REQUIRED 3.1 Convert between character boundaries and byte columns correctly. S0.2.2 TextTopology Round-trip every character start for each supported encoding fixture. SCN-1508-DIRECT-MULTIBYTE
+CF-0301-005 REQUIRED 3.1 Order positions lexicographically by line and then column. S0.2.1 DomainModel Compare positions on different lines and positions on one line. -
+CF-0301-006 REQUIRED 3.1 Treat equal positions as neither forward nor successful displacement. S0.2.1 DomainModel Compare equal positions and test a stationary non-first move. -
+CF-0301-007 REQUIRED 3.1 Store only line and column in motion history. S0.2.1 DomainModel Inspect a committed landing value and assert that it has only line and byte column. SCN-1102-COMMAND-SUCCESS
+CF-0301-008 REQUIRED 3.1 Permit plugin-global history to apply in another buffer or window when context and numeric position agree. S0.5.2 RepeatResolver Change buffer and window while preserving context and position, then assert primary repetition. -
+CF-0302-001 REQUIRED 3.2 Descriptor f means FIND forward. S0.2.3 DomainModel Decode f and inspect family and direction. SCN-1504-FIND-FORWARD
+CF-0302-002 REQUIRED 3.2 Descriptor F means FIND backward. S0.2.3 DomainModel Decode F and inspect family and direction. SCN-1504-FIND-BACKWARD
+CF-0302-003 REQUIRED 3.2 Descriptor t means TILL forward. S0.2.3 DomainModel Decode t and inspect family and direction. SCN-1505-TILL-FORWARD
+CF-0302-004 REQUIRED 3.2 Descriptor T means TILL backward. S0.2.3 DomainModel Decode T and inspect family and direction. SCN-1104-DTE-BACKWARD
+CF-0302-005 REQUIRED 3.2 Swapping descriptor case changes direction and preserves family. S0.2.3 DomainModel Assert f-F and t-T swaps in both directions and double-swap identity. SCN-1501-SHARED-KEYS
+CF-0303-001 REQUIRED 3.3 An initiating action acquires a target character. S0.6.4 AcquisitionService Invoke each initiating action without eligible history and assert one input read. SCN-1504-FIND-FORWARD
+CF-0303-002 REQUIRED 3.3 An initiating action stores its descriptor. S0.6.3 StateTransitions Inspect context state immediately before and after input. SCN-1102-COMMAND-SUCCESS
+CF-0303-003 REQUIRED 3.3 A repeated primary action reuses the stored target and initiating descriptor. S0.5.2 RepeatResolver Repeat at the stored landing and assert descriptor and target sources. SCN-1501-SHARED-KEYS
+CF-0303-004 REQUIRED 3.3 A repeated key letter does not change the active motion family. S0.5.4 RepeatResolver Start FIND then press t, and start TILL then press f. SCN-1501-SHARED-KEYS
+CF-0303-005 REQUIRED 3.3 A repeated key case selects direction according to section 8. S0.5.4 RepeatResolver Cover relative and fixed direction matrices. SCN-1501-SHARED-KEYS
+CF-0304-001 REQUIRED 3.4 Mark the first destination calculation after target acquisition as the first move. S0.4.1 StateTransitions Inspect first_move before and after a successful first destination. SCN-1102-COMMAND-SUCCESS
+CF-0304-002 REQUIRED 3.4 Use first-move state to permit a stationary TILL destination. S0.8.4 DestinationEngine Run tb on ab from a and assert complete stationary success. -
+CF-0305-001 REQUIRED 3.5 Partition history by the editor full mode string. S0.2.5 DomainModel Acquire targets in distinct full mode strings and inspect separate records. SCN-1502-MODE-ISOLATION
+CF-0305-002 REQUIRED 3.5 Normalize all operator-pending variants to one operator context. S0.2.5 DomainModel Normalize ordinary, forced-character, forced-line, and forced-block operator mode strings. -
+CF-0305-003 REQUIRED 3.5 Keep every non-operator full mode string as a separate context. S0.2.5 DomainModel Normalize Normal, Visual kinds, and Select kinds and assert distinct keys. SCN-1502-MODE-ISOLATION
+CF-0305-004 REQUIRED 3.5 Keep Normal and Visual primary histories independent. S0.4.1 SequenceState Acquire in each context and compare untouched peer records. SCN-1502-MODE-ISOLATION
+CF-0400-001 REQUIRED 4 Expose StartFindForward, StartFindBackward, StartTillForward, and StartTillBackward logical actions. S0.1.1 ActionFacade Inspect the registered action set and invoke all four actions. -
+CF-0400-002 REQUIRED 4 Expose RepeatSameDirection and RepeatOppositeDirection logical actions. S0.1.2 ActionFacade Inspect the registered action set and invoke both explicit repeats. -
+CF-0400-003 REQUIRED 4 Expose the Reset logical action. S0.1.3 ActionFacade Inspect the registered action set and invoke Reset. SCN-1401-PUBLIC-RESET
+CF-0400-004 REQUIRED 4 Map f, F, t, and T by default to their corresponding start actions in Normal, Visual, and operator-pending modes. S0.1.5 CompositionRoot Inspect default mappings for each key and required mode. -
+CF-0400-005 REQUIRED 4 Permit initialization with all four default mappings disabled. S0.1.5 CompositionRoot Initialize with the suppression setting present and assert zero default mappings. -
+CF-0400-006 REQUIRED 4 Treat presence of the suppression sentinel as suppression even when its value is false or zero. S0.1.5 CompositionRoot Initialize separately with false and zero sentinel values. -
+CF-0400-007 REQUIRED 4 Make mappings silent and non-recursive in effect. S0.1.5 CompositionRoot Inspect mapping attributes and run against recursive user mappings. -
+CF-0400-008 REQUIRED 4 Preserve an entered count through a mapping. S0.1.5 CompositionRoot Invoke a mapped action with count three and inspect the motion request. -
+CF-0400-009 REQUIRED 4 Accept only f, F, t, and T as free-form primary descriptors. S0.1.1 ActionFacade Pass all valid values and representative invalid values. -
+CF-0400-010 REQUIRED 4 RepeatSameDirection uses the stored descriptor and RepeatOppositeDirection uses its swapped case. S0.5.5 RepeatResolver Invoke both explicit actions from forward and backward stored descriptors. -
+CF-0400-011 REQUIRED 4 Explicit repeat actions acquire no new target input. S0.1.2 ActionFacade Invoke both explicit actions with an input trap and assert zero reads. -
+CF-0501-001 REQUIRED 5.1 Treat search_current_line_only as Boolean with default false. S0.3.1 PolicyService Validate Boolean values, reject other values, and inspect the default. -
+CF-0501-002 REQUIRED 5.1 A false search_current_line_only searches the remaining buffer in the requested direction. S0.3.1 PolicyService Search a target on a later and an earlier line. SCN-1503-MULTILINE
+CF-0501-003 REQUIRED 5.1 A true search_current_line_only restricts match starts to the cursor line. S0.3.1 PolicyService Place another target on a different line and assert it is excluded. SCN-1503-CURRENT-LINE
+CF-0502-001 REQUIRED 5.2 Treat ignore_case as Boolean with default false. S0.3.1 PolicyService Validate Boolean values and inspect the default. -
+CF-0502-002 REQUIRED 5.2 A true ignore_case enables case-insensitive matching. S0.7.6 CasePolicyResolver Search mixed-case occurrences with ignore_case true. SCN-1506-IGNORE-CASE
+CF-0502-003 REQUIRED 5.2 Treat smart_case as Boolean with default false. S0.3.1 PolicyService Validate Boolean values and inspect the default. -
+CF-0502-004 REQUIRED 5.2 Smart case makes a lower-case ASCII target insensitive and an upper-case ASCII target sensitive. S0.7.6 CasePolicyResolver Search the same mixed-case text with lower- and upper-case targets. SCN-1506-SMART-LOWER,SCN-1506-SMART-UPPER
+CF-0502-005 REQUIRED 5.2 ignore_case takes precedence over smart_case. S0.7.6 CasePolicyResolver Enable both settings and use an upper-case target against lower case. -
+CF-0502-006 REQUIRED 5.2 Set case behavior explicitly for every plugin search. S0.3.6 PolicyService Capture every target plan and assert an explicit case mode. -
+CF-0502-007 REQUIRED 5.2 Ignore ambient editor ignore-case and smart-case options. S0.7.6 CasePolicyResolver Vary ambient options while plugin settings remain fixed. -
+CF-0503-001 REQUIRED 5.3 Treat use_migemo as Boolean with default false. S0.3.1 PolicyService Validate Boolean values and inspect the default. -
+CF-0503-002 REQUIRED 5.3 A true use_migemo enables bundled static dictionaries only under section 13 conditions. S0.7.2 TargetPlanFactory Exercise each activation predicate branch. -
+CF-0504-001 REQUIRED 5.4 Treat fix_key_direction as Boolean with default false. S0.3.2 PolicyService Validate Boolean values and inspect the default. -
+CF-0504-002 REQUIRED 5.4 A false fix_key_direction gives lower-case primary keys same-direction and upper-case keys opposite-direction semantics. S0.5.4 RepeatResolver Cover the relative direction matrix. SCN-1501-SHARED-KEYS
+CF-0504-003 REQUIRED 5.4 A true fix_key_direction makes lower-case primary keys forward and upper-case keys backward. S0.5.4 RepeatResolver Cover the fixed direction matrix for stored forward and backward descriptors. -
+CF-0505-001 REQUIRED 5.5 Treat show_prompt as Boolean with default false. S0.3.3 PolicyService Validate Boolean values and inspect the default. -
+CF-0505-002 REQUIRED 5.5 When show_prompt is true, display exactly clever-f: followed by one space while waiting for input. S0.6.2 AcquisitionService Acquire interactively and compare the prompt byte for byte. SCN-0702-TEMP-SUCCESS
+CF-0506-001 REQUIRED 5.6 Treat chars_match_any_signs as a string with default empty string. S0.3.1 PolicyService Validate string values and inspect the default. -
+CF-0506-002 REQUIRED 5.6 Every character in chars_match_any_signs triggers the complete section 9.3 symbol set. S0.7.3 TargetPlanFactory Configure multiple triggers and compare each resulting symbol predicate. SCN-1507-SYMBOLS
+CF-0507-001 REQUIRED 5.7 Treat mark_cursor as Boolean with default true. S0.3.3 PolicyService Validate Boolean values and inspect the default. -
+CF-0507-002 REQUIRED 5.7 When mark_cursor is true, highlight the current cursor while target input is pending. S0.10.2 FeedbackService Pause input and inspect one cursor overlay at the origin. SCN-0702-TEMP-SUCCESS
+CF-0507-003 REQUIRED 5.7 Treat mark_cursor_color as an optional highlight-group name with default target Cursor. S0.3.3 PolicyService Validate null and string values and resolve the default link. -
+CF-0507-004 REQUIRED 5.7 Sample mark_cursor_color according to setup-sensitive highlight-link rules. S0.3.5 PolicyService Change the value after initialization and before ColorScheme refresh. -
+CF-0507-005 REQUIRED 5.7 Treat hide_cursor_on_cmdline as Boolean with default true. S0.3.3 PolicyService Validate Boolean values and inspect the default. -
+CF-0507-006 REQUIRED 5.7 When supported and enabled, hide the command-line cursor for input and restore the exact prior state. S0.6.1 AcquisitionService Record cursor presentation, acquire input on success and error, and compare restoration. SCN-0702-TEMP-SUCCESS,SCN-0702-TEMP-INPUT-ERROR
+CF-0507-007 REQUIRED 5.7 Preserve existing guicursor and terminal cursor visibility during command-line suppression on the source Neovim path. S0.11.3 HostAdapter Set nondefault cursor values, acquire input, and compare exact values afterward. -
+CF-0508-001 REQUIRED 5.8 Treat repeat_timeout_ms as a nonnegative integer with default zero. S0.3.2 PolicyService Validate boundaries, reject negative values, and inspect the default. -
+CF-0508-002 REQUIRED 5.8 A zero repeat timeout disables repeat expiration. S0.5.3 RepeatResolver Advance time by a large amount with timeout zero and assert repetition. -
+CF-0508-003 REQUIRED 5.8 A positive repeat timeout applies section 11.1 transitions. S0.5.3 RepeatResolver Exercise below, equal, and above-threshold elapsed values. SCN-1101-TIMEOUT-BOUNDARY,SCN-1101-TIMEOUT-EXPIRED
+CF-0509-001 REQUIRED 5.9 Treat mark_char as Boolean with default true. S0.3.4 PolicyService Validate Boolean values and inspect the default. -
+CF-0509-002 REQUIRED 5.9 When mark_char is true, enable current-line destination-candidate highlighting. S0.10.4 FeedbackService Acquire a target in an eligible context and inspect candidate overlay positions. SCN-1510-OVERLAY-LIFECYCLE
+CF-0509-003 REQUIRED 5.9 Treat mark_char_color as an optional highlight-group name with default target CleverFDefaultLabel. S0.3.4 PolicyService Validate null and string values and resolve the default link. -
+CF-0509-004 REQUIRED 5.9 Sample mark_char_color according to setup-sensitive highlight-link rules. S0.3.5 PolicyService Change the value after initialization and before ColorScheme refresh. -
+CF-0509-005 REQUIRED 5.9 Treat highlight_timeout_ms as a nonnegative integer with default zero. S0.3.4 PolicyService Validate boundaries, reject negative values, and inspect the default. -
+CF-0509-006 REQUIRED 5.9 A zero highlight timeout retains the target overlay until a lifecycle event. S0.10.7 FeedbackService Advance time without events and assert that no timer starts. -
+CF-0509-007 REQUIRED 5.9 A positive highlight timeout enables timer cleanup when timer support exists. S0.10.7 FeedbackService Acquire with a positive timeout and fire the current timer. SCN-1510-TIMEOUT
+CF-0510-001 REQUIRED 5.10 Treat repeat_last_char_inputs as a list of strings with default carriage return. S0.3.2 PolicyService Validate list entries and inspect the default first code. -
+CF-0510-002 REQUIRED 5.10 Match previous-input triggers by the acquired code and each configured string first character code. S0.6.5 AcquisitionService Use multi-character trigger strings with matching and nonmatching first codes. -
+CF-0510-003 REQUIRED 5.10 A matching previous-input trigger reuses the most recently acquired target. S0.6.5 AcquisitionService Acquire in one context, trigger reuse in another, and inspect the target. SCN-1502-MODE-ISOLATION
+CF-0511-001 REQUIRED 5.11 Treat mark_direct as Boolean with default false. S0.3.3 PolicyService Validate Boolean values and inspect the default. -
+CF-0511-002 REQUIRED 5.11 When mark_direct is true, preview count-selected occurrences for possible current-line targets while input is pending. S0.10.3 DirectPreviewPlanner Generate previews for counts one and two before completing input. SCN-1508-DIRECT-ONE,SCN-1508-DIRECT-TWO
+CF-0511-003 REQUIRED 5.11 Treat mark_direct enablement as setup-sensitive for highlight linking. S0.3.5 PolicyService Initialize disabled, enable live, and inspect links before and after ColorScheme. -
+CF-0511-004 REQUIRED 5.11 Treat mark_direct_color as an optional highlight-group name with default target CleverFDefaultLabel. S0.3.3 PolicyService Validate null and string values and resolve the default link. -
+CF-0511-005 REQUIRED 5.11 Sample mark_direct_color according to setup-sensitive highlight-link rules. S0.3.5 PolicyService Change the value after initialization and before ColorScheme refresh. -
+CF-0512-001 REQUIRED 5.12 Treat clean_labels_eagerly as Boolean with default true. S0.3.5 PolicyService Validate Boolean values and inspect the default. -
+CF-0512-002 REQUIRED 5.12 Sample clean_labels_eagerly during initialization. S0.3.5 PolicyService Change the live setting after initialization and inspect installed hooks. SCN-1207-EAGER-WINDOWS
+CF-0512-003 REQUIRED 5.12 When sampled true, install section 12.7 window-transition cleanup. S0.11.1 CompositionRoot Inspect event registrations and deliver each eager event. SCN-1207-EAGER-WINDOWS
+CF-0513-001 REQUIRED 5.13 Read search scope, case settings, Migemo, direction, prompt, symbol triggers, mark settings, timeouts, and previous-input triggers when used. S0.3.6 PolicyService Change each setting between actions and assert the next behavior uses it. -
+CF-0513-002 REQUIRED 5.13 Decide default mappings, eager cleanup, and initial highlight links during initialization. S0.3.5 PolicyService Change these settings after activation and assert setup decisions remain. -
+CF-0513-003 REQUIRED 5.13 Apply color-link changes on the next colorscheme refresh. S0.3.5 PolicyService Change explicit colors, deliver ColorScheme, and inspect links. -
+CF-0600-001 REQUIRED 6 Maintain one plugin-global state object. S0.11.1 SequenceState Create multiple adapters and assert they coordinate through one state identity. -
+CF-0601-001 REQUIRED 6.1 Store previous_descriptor per normalized context. S0.4.1 SequenceState Acquire in two contexts and inspect descriptor records. SCN-1502-MODE-ISOLATION
+CF-0601-002 REQUIRED 6.1 Store previous_landing per normalized context as the last complete destination. S0.4.1 SequenceState Complete and partially fail motions, then inspect each landing. SCN-1102-COMMAND-SUCCESS,SCN-1004-PARTIAL-FAILURE
+CF-0601-003 REQUIRED 6.1 Store first_move per normalized context from acquisition through the first destination request. S0.4.1 SequenceState Inspect first_move around successful and failed first requests. SCN-1102-COMMAND-SUCCESS,SCN-1102-COMMAND-FAILURE
+CF-0601-004 REQUIRED 6.1 Store previous_target per normalized context. S0.4.1 SequenceState Acquire different targets in separate contexts. SCN-1502-MODE-ISOLATION
+CF-0601-005 REQUIRED 6.1 Represent a missing previous_landing with an invalid position. S0.4.1 DomainModel Create initial and reset records and assert invalid landing semantics. SCN-1401-PUBLIC-RESET
+CF-0602-001 REQUIRED 6.2 Store last_input_context for the latest successful acquisition. S0.4.2 SequenceState Acquire in two contexts and inspect the global field after each. SCN-1502-MODE-ISOLATION
+CF-0602-002 REQUIRED 6.2 Store moved_forward for the latest complete command-path direction. S0.4.3 SequenceState Complete forward and backward command motions and inspect the field. SCN-1102-COMMAND-SUCCESS
+CF-0602-003 REQUIRED 6.2 Cache Migemo dictionaries by effective encoding. S0.4.4 SequenceState Load each supported encoding twice and inspect cache keys and load counts. -
+CF-0602-004 REQUIRED 6.2 Store the repeat-expiration timestamp. S0.4.5 SequenceState Acquire and repeat with expiration active and inspect timestamp updates. SCN-1101-TIMEOUT-BOUNDARY
+CF-0602-005 REQUIRED 6.2 Store the current highlight timer identity or an inactive value. S0.4.5 SequenceState Start, replace, fire, and cancel timers while inspecting identity. SCN-1208-TIMER-IDENTITY
+CF-0602-006 REQUIRED 6.2 Store active target and temporary overlay identities. S0.4.6 SequenceState Create and clean both overlay classes and inspect identity sets. SCN-0702-TEMP-SUCCESS,SCN-1510-OVERLAY-LIFECYCLE
+CF-0603-001 REQUIRED 6.3 Initialize previous_descriptor, previous_landing, first_move, and migemo_cache as empty. S0.11.1 SequenceState Inspect state immediately after core activation. -
+CF-0603-002 REQUIRED 6.3 Initialize previous_target and last_input_context as empty. S0.11.1 SequenceState Inspect state immediately after core activation. -
+CF-0603-003 REQUIRED 6.3 Initialize repeat_timestamp to an implementation-safe zero. S0.11.1 SequenceState Inspect and use the initial timestamp without arithmetic failure. -
+CF-0603-004 REQUIRED 6.3 Initialize highlight_timer as inactive. S0.11.1 SequenceState Inspect state immediately after core activation. -
+CF-0604-001 REQUIRED 6.4 Require fresh acquisition when current position differs from or lacks the context landing. S0.5.2 RepeatResolver Test missing, equal, and unequal positions. SCN-1102-COMMAND-FAILURE
+CF-0604-002 REQUIRED 6.4 Require fresh acquisition while a keyboard macro register is executing. S0.5.2 RepeatResolver Invoke at an equal landing with a macro register active. SCN-1509-MACRO
+CF-0604-003 REQUIRED 6.4 Select primary repetition when position equals a valid landing and no macro executes. S0.5.2 RepeatResolver Invoke at an equal landing with macro state inactive and trap input. SCN-1501-SHARED-KEYS
+CF-0604-004 REQUIRED 6.4 Exclude buffer identity, window identity, revision, and target visibility from the primary repetition guard. S0.5.2 RepeatResolver Vary each excluded value while context and numeric position remain equal. -
+CF-0701-001 REQUIRED 7.1 Inspect fold-open policy before evaluating the repetition guard. S0.5.1 RepeatResolver Record capability call order around fold opening and guard evaluation. SCN-1511-FOLDS
+CF-0701-002 REQUIRED 7.1 For all-motion or horizontal-motion policy, open every enclosing closed fold level at the cursor line. S0.5.1 RepeatResolver Start in nested folds for each eligible policy and count open operations. SCN-1511-FOLDS
+CF-0701-003 REQUIRED 7.1 Make the cursor line visible before target input. S0.5.1 RepeatResolver Inspect fold visibility at the input capability call. SCN-1511-FOLDS
+CF-0702-001 REQUIRED 7.2 At interactive acquisition start, request same repeated direction. S0.6.2 AcquisitionService Inspect acquisition sequencing before feedback creation. SCN-0702-TEMP-SUCCESS
+CF-0702-002 REQUIRED 7.2 When mark_cursor is true, create a temporary CleverFCursor overlay at the cursor and redraw before input. S0.6.2 AcquisitionService Record overlay, redraw, and input call order. SCN-0702-TEMP-SUCCESS
+CF-0702-003 REQUIRED 7.2 When mark_direct is true, create nominal-direction count previews and redraw before input. S0.6.2 AcquisitionService Record direct plans, redraw, and input call order. SCN-1508-DIRECT-ONE
+CF-0702-004 REQUIRED 7.2 When show_prompt is true, emit the exact prompt before input. S0.6.2 AcquisitionService Record prompt and input call order and exact text. SCN-0702-TEMP-SUCCESS
+CF-0702-005 REQUIRED 7.2 Store initiating descriptor and set context first_move true before reading input. S0.6.3 StateTransitions Inspect state from inside the input capability. SCN-0702-TEMP-SUCCESS
+CF-0702-006 REQUIRED 7.2 Read one target input packet after pre-input state transitions. S0.6.4 AcquisitionService Count input reads and inspect preceding operation log. SCN-0702-TEMP-SUCCESS
+CF-0702-007 REQUIRED 7.2 Resolve cancellation or previous-input reuse before acquisition commit. S0.6.4 AcquisitionService Feed Escape and a reuse trigger and inspect committed fields. SCN-0702-TEMP-CANCEL,SCN-1502-MODE-ISOLATION
+CF-0702-008 REQUIRED 7.2 On resolved acquisition, store target in the context and set last_input_context to that context. S0.6.7 StateTransitions Inspect state immediately after successful input resolution. SCN-0702-TEMP-SUCCESS
+CF-0702-009 REQUIRED 7.2 When repeat expiration is active, set repeat_timestamp at acquisition. S0.6.7 StateTransitions Supply a known time during acquisition and compare the stored timestamp. SCN-1101-TIMEOUT-BOUNDARY
+CF-0702-010 REQUIRED 7.2 Create persistent feedback after successful acquisition only for eligible contexts. S0.6.7 AcquisitionService Acquire in every eligible context and operator-pending context. SCN-1510-OVERLAY-LIFECYCLE
+CF-0702-011 REQUIRED 7.2 After completed interactive prompt input, force a full redraw. S0.6.7 AcquisitionService Enable prompt, complete input, and inspect the redraw kind and order. SCN-0702-TEMP-SUCCESS
+CF-0702-012 REQUIRED 7.2 Release cursor overlays, direct overlays, and saved cursor presentation after input handling. S0.6.1 AcquisitionService Inspect all temporary resource identities after each exit path. SCN-0702-TEMP-SUCCESS,SCN-0702-TEMP-CANCEL,SCN-0702-TEMP-INPUT-ERROR,SCN-0702-TEMP-UNMATCHED,SCN-0702-TEMP-SEARCH-ERROR
+CF-0702-013 REQUIRED 7.2 Run temporary cleanup after success, cancellation, input errors, and search errors. S0.6.1 AcquisitionService Inject each exit path and assert an empty temporary-resource set. SCN-0702-TEMP-SUCCESS,SCN-0702-TEMP-CANCEL,SCN-0702-TEMP-INPUT-ERROR,SCN-0702-TEMP-UNMATCHED,SCN-0702-TEMP-SEARCH-ERROR
+CF-0703-001 REQUIRED 7.3 Always acquire a target for a primary action during keyboard-macro execution. S0.6.8 AcquisitionService Repeat a macro action from an equal prior landing and count input reads. SCN-1509-MACRO
+CF-0703-002 REQUIRED 7.3 Suppress visual redraw and skip direct previews during macro acquisition. S0.6.8 AcquisitionService Enable all feedback in macro state and inspect redraw and overlay logs. SCN-1509-MACRO
+CF-0703-003 REQUIRED 7.3 Consume macro input and update descriptor and target state. S0.6.8 AcquisitionService Run repeated macro iterations and inspect per-iteration state. SCN-1509-MACRO
+CF-0703-004 OPTIONAL 7.3 A runtime without macro-execution detection can treat invocation as interactive. S0.11.3 HostAdapter Document capability absence and run the interactive acquisition contract. -
+CF-0704-001 REQUIRED 7.4 Match repeat_last_char_inputs by acquired code against each configured string first code. S0.6.5 AcquisitionService Use one- and multi-character configured entries with equal first codes. -
+CF-0704-002 REQUIRED 7.4 On a reuse match, read the target from last_input_context and copy it to the active context. S0.6.5 AcquisitionService Reuse a Normal target in Visual context and compare both records. SCN-1502-MODE-ISOLATION
+CF-0704-003 REQUIRED 7.4 When the reuse source has no target, preserve cursor, emit Previous input not found., and return an empty result. S0.6.5 AcquisitionService Trigger reuse from empty initial state and inspect outcome and diagnostic. SCN-0704-MISSING-PREVIOUS
+CF-0704-004 REQUIRED 7.4 Public Reset retains target cache and last_input_context for later previous-input reuse. S0.4.7 StateTransitions Acquire, reset, trigger reuse, and inspect the reused target. SCN-1401-PUBLIC-RESET
+CF-0705-001 REQUIRED 7.5 Escape cancels acquisition, preserves cursor, returns Escape to the active mode, and removes temporary overlays. S0.6.6 AcquisitionService Feed Escape in command, Visual, and operator contexts. SCN-0702-TEMP-CANCEL
+CF-0705-002 REQUIRED 7.5 Escape starts no movement or highlight timer. S0.6.6 AcquisitionService Feed Escape with timer feedback enabled and inspect effect logs. SCN-0702-TEMP-CANCEL
+CF-0706-001 REQUIRED 7.6 Discard raw packet 80 FD 60 hexadecimal and continue waiting. S0.6.4 AcquisitionService Feed the artifact followed by text and assert two reads and the text target. -
+CF-0706-002 REQUIRED 7.6 Normalize an ordinary character code to its editor character. S0.6.4 AcquisitionService Feed ASCII and multibyte ordinary input and inspect TargetValue. -
+CF-0706-003 REQUIRED 7.6 A stored special-key representation whose first code is hexadecimal 80 produces an empty repeated motion result. S0.2.6 DomainModel Acquire a special key and invoke primary and explicit repetition. -
+CF-0706-004 REQUIRED 7.6 Send ordinary unmatched control characters through normal target search. S0.6.4 AcquisitionService Feed a non-trigger control character and inspect a literal target plan. -
+CF-0801-001 REQUIRED 8.1 In relative mode, a lower-case primary key executes the stored descriptor. S0.5.4 RepeatResolver Repeat each stored descriptor with f and t. SCN-1501-SHARED-KEYS
+CF-0801-002 REQUIRED 8.1 In relative mode, an upper-case primary key executes the swapped stored descriptor. S0.5.4 RepeatResolver Repeat each stored descriptor with F and T. SCN-1501-SHARED-KEYS
+CF-0801-003 REQUIRED 8.1 After fa, lower-case primary keys search forward with FIND and upper-case keys search backward with FIND. S0.5.4 RepeatResolver Run the specified fa direction sequence. -
+CF-0801-004 REQUIRED 8.1 After Fa, lower-case primary keys search backward with FIND and upper-case keys search forward with FIND. S0.5.4 RepeatResolver Run the specified Fa direction sequence. SCN-1504-FIND-BACKWARD
+CF-0801-005 REQUIRED 8.1 After ta, lower-case primary keys search forward with TILL and upper-case keys search backward with TILL. S0.5.4 RepeatResolver Run the specified ta direction sequence. SCN-1505-TILL-FORWARD
+CF-0802-001 REQUIRED 8.2 In fixed mode, a lower-case primary key executes the lower-case form of the stored descriptor. S0.5.4 RepeatResolver Repeat stored forward and backward descriptors with f and t. -
+CF-0802-002 REQUIRED 8.2 In fixed mode, an upper-case primary key executes the upper-case form of the stored descriptor. S0.5.4 RepeatResolver Repeat stored forward and backward descriptors with F and T. -
+CF-0802-003 REQUIRED 8.2 Fixed direction preserves the stored FIND or TILL family. S0.5.4 RepeatResolver Repeat FIND with t/T and TILL with f/F while fixed mode is active. -
+CF-0802-004 REQUIRED 8.2 The equivalent reverse-request algorithm yields the fixed direction matrix. S0.5.4 RepeatResolver Property-test all stored descriptor and pressed-key pairs against the stated algorithm. -
+CF-0803-001 REQUIRED 8.3 RepeatSameDirection executes the stored descriptor. S0.5.5 RepeatResolver Invoke from each valid stored descriptor. -
+CF-0803-002 REQUIRED 8.3 RepeatOppositeDirection executes the swapped stored descriptor. S0.5.5 RepeatResolver Invoke from each valid stored descriptor. -
+CF-0803-003 REQUIRED 8.3 fix_key_direction does not affect explicit repeat direction. S0.5.5 RepeatResolver Compare explicit outcomes with the setting false and true. -
+CF-0803-004 REQUIRED 8.3 Explicit repeats read descriptor and target from the current context and accept current count. S0.1.2 ActionFacade Set separate context records and invoke count two in each. -
+CF-0803-005 REQUIRED 8.3 Explicit repeats can run after ordinary cursor movement or target-overlay finalization. S0.1.2 ActionFacade Finalize history, move cursor, and invoke both explicit actions. SCN-1207-CURSOR-FINALIZE
+CF-0803-006 REQUIRED 8.3 Explicit repeats bypass acquisition, the primary position guard, repeat timeout, overlay restoration, and timer refresh. S0.1.2 SequenceCoordinator Install effect traps for every bypassed service and invoke explicit repeats. -
+CF-0803-007 REQUIRED 8.3 A missing stored descriptor returns an empty action result. S0.1.2 ActionFacade Invoke explicit repeats from initial and public-reset state. SCN-1401-PUBLIC-RESET
+CF-0803-008 REQUIRED 8.3 A stored descriptor without a target uses character code zero as fallback. S0.2.6 DomainModel Build explicit repetition from a descriptor-only context and inspect TargetValue. -
+CF-0803-009 REQUIRED 8.3 A stored special-key string starting with hexadecimal 80 returns an empty action result. S0.2.6 DomainModel Invoke explicit repeats with a stored encoded special key. -
+CF-0901-001 REQUIRED 9.1 Select base target predicates in Migemo, symbol, backslash, then literal precedence. S0.7.1 TargetPlanFactory Enable overlapping predicates and inspect the selected plan kind. -
+CF-0901-002 REQUIRED 9.1 Apply effective case mode after base predicate selection. S0.7.1 TargetPlanFactory Inspect literal and Migemo target plans under each case mode. -
+CF-0901-003 REQUIRED 9.1 Apply FIND or TILL destination transformation after target matching. S0.8.1 MotionPlanFactory Use one target plan with all four descriptors and inspect endpoints. -
+CF-0902-001 REQUIRED 9.2 Match a plain target literally with no regular-expression syntax. S0.7.5 TargetPlanFactory Search every representative pattern metacharacter as data. -
+CF-0902-002 REQUIRED 9.2 Match backslash as one literal backslash. S0.7.4 TargetPlanFactory Search text containing one and two adjacent backslashes. -
+CF-0902-003 REQUIRED 9.2 Treat caret, bracket, parenthesis, period, and asterisk as safe literal targets. S0.7.5 TargetPlanFactory Acquire each listed character and assert only exact occurrences match. -
+CF-0903-001 REQUIRED 9.3 A wildcard trigger matches exactly the specified 32 ASCII symbols. S0.7.3 TargetPlanFactory Compare predicate acceptance against all ASCII characters. SCN-1507-SYMBOLS
+CF-0903-002 REQUIRED 9.3 Exclude space, alphabetic characters, and numeric characters from symbol matching. S0.7.3 TargetPlanFactory Test representative and exhaustive ASCII exclusions. SCN-1507-SYMBOLS
+CF-0903-003 REQUIRED 9.3 Every configured trigger character selects the same complete symbol set. S0.7.3 TargetPlanFactory Configure several triggers and compare plan acceptance sets. SCN-1507-SYMBOLS
+CF-0904-001 REQUIRED 9.4 Use insensitive case when ignore_case is true. S0.7.6 CasePolicyResolver Resolve case mode for all target classes with ignore_case true. SCN-1506-IGNORE-CASE
+CF-0904-002 REQUIRED 9.4 Use insensitive case for lower-case ASCII when only smart_case is true. S0.7.6 CasePolicyResolver Resolve and apply smart case for a through z. SCN-1506-SMART-LOWER
+CF-0904-003 REQUIRED 9.4 Use sensitive case in all other cases. S0.7.6 CasePolicyResolver Resolve upper-case ASCII, symbols, and multibyte targets under all settings. SCN-1506-SMART-UPPER
+CF-0904-004 REQUIRED 9.4 Apply case mode to literal and Migemo matching but leave symbol matching unchanged. S0.7.6 CasePolicyResolver Compare all three plan kinds under each case configuration. SCN-1507-SYMBOLS
+CF-1001-001 REQUIRED 10.1 Search only the current buffer and disable wrapping regardless of editor wrap-search. S0.8.2 DestinationEngine Place matches across buffer boundaries and vary ambient wrap-search. -
+CF-1001-002 REQUIRED 10.1 A forward descriptor examines positions strictly after the search origin. S0.8.2 DestinationEngine Place a match at and after origin and inspect candidate order. SCN-1504-FIND-FORWARD
+CF-1001-003 REQUIRED 10.1 A backward descriptor examines positions strictly before the search origin. S0.8.2 DestinationEngine Place a match at and before origin and inspect candidate order. SCN-1504-FIND-BACKWARD
+CF-1001-004 REQUIRED 10.1 Allow the section 10.3 first-move TILL exception to accept current position as destination. S0.8.4 DestinationEngine Run adjacent first TILL and repeated TILL cases. -
+CF-1001-005 REQUIRED 10.1 When current-line-only is true, limit permitted match starts to the origin line in both directions. S0.8.2 DestinationEngine Search forward and backward with off-line matches. SCN-1503-CURRENT-LINE
+CF-1001-006 REQUIRED 10.1 When current-line-only is false, continue to the corresponding buffer boundary. S0.8.2 DestinationEngine Search to first and last buffer lines in both directions. SCN-1503-MULTILINE
+CF-1002-001 REQUIRED 10.2 Forward and backward FIND map a matching position Q to Q. S0.8.3 DestinationEngine Calculate endpoints for both directions from a shared target stream. SCN-1504-FIND-FORWARD,SCN-1504-FIND-BACKWARD
+CF-1002-002 REQUIRED 10.2 Exclude the occurrence under the cursor from FIND search. S0.8.3 DestinationEngine Start on a matching occurrence and search both directions. SCN-1504-FIND-FORWARD
+CF-1003-001 REQUIRED 10.3 Forward TILL maps target Q to the editor character immediately before Q. S0.8.4 DestinationEngine Calculate same-line and cross-line forward TILL endpoints. SCN-1505-TILL-FORWARD
+CF-1003-002 REQUIRED 10.3 Backward TILL maps target Q to the editor character immediately after Q. S0.8.4 DestinationEngine Calculate same-line and cross-line backward TILL endpoints. SCN-1104-DTE-BACKWARD
+CF-1003-003 REQUIRED 10.3 On first move, TILL accepts a destination equal to the current position and consumes one count unit. S0.8.4 DestinationEngine Run tb on ab with counts one and two. -
+CF-1003-004 REQUIRED 10.3 After the first accepted TILL step, require later destinations on the strict motion side. S0.8.4 DestinationEngine Use adjacent repeated targets and assert no duplicate destination. SCN-1505-TILL-FORWARD
+CF-1003-005 REQUIRED 10.3 Permit a TILL target and adjacent destination on opposite sides of a line boundary in buffer-wide scope. S0.8.4 DestinationEngine Place targets at first and last character positions around line boundaries. -
+CF-1003-006 REQUIRED 10.3 Normalize a cross-line TILL endpoint to a valid editor cursor position. S0.2.2 TextTopology Compare boundary adjacency with host cursor normalization. -
+CF-1004-001 REQUIRED 10.4 Normalize absent count to one and use a positive count to select successive destinations. S0.2.4 DomainModel Compare absent and one, then run counts two and three. SCN-1508-DIRECT-ONE,SCN-1508-DIRECT-TWO
+CF-1004-002 REQUIRED 10.4 Run count search sequentially using each reached destination as the next origin. S0.8.6 DestinationEngine Capture origins for every step of a count-three request. -
+CF-1004-003 REQUIRED 10.4 On later count-step failure, retain the last reached endpoint but report overall failure and preserve successful history. S0.8.6 DestinationEngine Request more occurrences than remain after at least one match. SCN-1004-PARTIAL-FAILURE
+CF-1004-004 REQUIRED 10.4 On first count-step failure, retain the original cursor. S0.8.6 DestinationEngine Search a missing target with count greater than one. SCN-1102-COMMAND-FAILURE
+CF-1005-001 REQUIRED 10.5 Apply exclusive Visual endpoint adjustments only to characterwise or linewise Visual mode. S0.8.5 MotionPlanFactory Compare character, line, block Visual and Select plans under exclusive selection. -
+CF-1005-002 REQUIRED 10.5 Exclusive Visual forward FIND maps Q to the editor character after Q. S0.8.5 DestinationEngine Select forward FIND in characterwise and linewise exclusive Visual mode. SCN-1103-VISUAL-SUCCESS
+CF-1005-003 REQUIRED 10.5 Exclusive Visual forward TILL maps Q to Q. S0.8.5 DestinationEngine Select forward TILL in characterwise and linewise exclusive Visual mode. -
+CF-1005-004 REQUIRED 10.5 Exclusive Visual backward FIND and TILL retain regular destinations. S0.8.5 DestinationEngine Compare backward endpoints with inclusive Visual mode. -
+CF-1005-005 REQUIRED 10.5 Blockwise Visual, Select, Normal, and operator contexts retain regular endpoint rules for every selection option. S0.8.5 MotionPlanFactory Build each context plan under inclusive and exclusive options. -
+CF-1006-001 REQUIRED 10.6 An empty current line produces no direct-reach previews. S0.10.3 DirectPreviewPlanner Plan both directions from an empty line. -
+CF-1006-002 REQUIRED 10.6 A first-step missing target preserves cursor, previous_landing, and first_move. S0.8.6 DestinationEngine Search a missing target and compare state before and after. SCN-1102-COMMAND-FAILURE
+CF-1006-003 REQUIRED 10.6 After first-step failure, the next primary action acquires because no current landing exists. S0.5.2 RepeatResolver Fail a fresh search, invoke again, and assert target input is read. SCN-1102-COMMAND-FAILURE
+CF-1007-001 REQUIRED 10.7 Support multibyte characters in search, case handling, acquisition, and direct scanning. S0.2.2 TextTopology Exercise all four paths with UTF-8, CP932, and EUC-JP views. SCN-1508-DIRECT-MULTIBYTE
+CF-1007-002 REQUIRED 10.7 Keep every byte column aligned to a valid character start. S0.2.2 TextTopology Validate every emitted candidate, endpoint, and overlay position. SCN-1508-DIRECT-MULTIBYTE
+CF-1007-003 REQUIRED 10.7 Permit buffer-wide repetition between ASCII and multibyte lines in both directions. S0.8.7 DestinationEngine Repeat a shared target from ASCII to multibyte lines and back. -
+CF-1101-001 REQUIRED 11.1 For positive timeout repetition, truncate elapsed milliseconds toward zero. S0.5.3 RepeatResolver Use positive and negative fractional clock deltas and inspect integer elapsed value. SCN-1101-TIMEOUT-BOUNDARY
+CF-1101-002 REQUIRED 11.1 Replace repeat_timestamp with current time before the timeout decision. S0.5.3 StateTransitions Inspect timestamp in both eligible and expired branches. SCN-1101-TIMEOUT-BOUNDARY,SCN-1101-TIMEOUT-EXPIRED
+CF-1101-003 REQUIRED 11.1 When elapsed is strictly greater than timeout, run Public Reset and reprocess the key as initiating action. S0.5.3 RepeatResolver Use elapsed timeout plus one, then assert reset fields and a new input read. SCN-1101-TIMEOUT-EXPIRED
+CF-1101-004 REQUIRED 11.1 When elapsed is equal to or below timeout, continue with the stored target. S0.5.3 RepeatResolver Use below and exact threshold values with an input trap. SCN-1101-TIMEOUT-BOUNDARY
+CF-1101-005 REQUIRED 11.1 Each timely repeated primary action starts the next repeat interval. S0.5.3 RepeatResolver Perform repeats at successive near-threshold times and inspect timestamps. SCN-1101-TIMEOUT-BOUNDARY
+CF-1101-006 REQUIRED 11.1 Explicit repeat actions bypass repeat timeout. S0.5.5 RepeatResolver Invoke explicit repeat after an over-threshold delay and assert no reset or input. -
+CF-1102-001 REQUIRED 11.2 Use the command-path success transition for Normal, operator-pending, and other command contexts. S0.9.1 MotionExecutor Run complete motions in representative command contexts. SCN-1102-COMMAND-SUCCESS,SCN-1104-DFE
+CF-1102-002 REQUIRED 11.2 Save the origin before command-path destination calculation. S0.9.1 MotionExecutor Capture the origin supplied to direction and migration calculations. SCN-1102-COMMAND-SUCCESS
+CF-1102-003 REQUIRED 11.2 Apply the reached command-path endpoint. S0.9.1 MotionExecutor Return complete, partial, and first-step outcomes and inspect cursor application. SCN-1102-COMMAND-SUCCESS,SCN-1004-PARTIAL-FAILURE
+CF-1102-004 REQUIRED 11.2 On failed destination calculation, preserve successful history fields. S0.9.1 MotionExecutor Compare state around first-step and partial failures. SCN-1102-COMMAND-FAILURE,SCN-1004-PARTIAL-FAILURE
+CF-1102-005 REQUIRED 11.2 On complete command motion, compute moved_forward by lexicographic destination comparison. S0.9.1 MotionExecutor Complete same-line, cross-line, forward, and backward motions. SCN-1102-COMMAND-SUCCESS
+CF-1102-006 REQUIRED 11.2 Update persistent feedback under section 12.6 before committing command success fields. S0.9.1 MotionExecutor Record effect order during same-line and cross-line success. SCN-1510-OVERLAY-LIFECYCLE
+CF-1102-007 REQUIRED 11.2 On complete command motion, set moved_forward, previous_landing, and first_move false. S0.4.7 StateTransitions Inspect state immediately after forward and backward complete outcomes. SCN-1102-COMMAND-SUCCESS
+CF-1103-001 REQUIRED 11.3 Calculate Visual destinations while retaining the active selection. S0.9.2 MotionExecutor Capture selection-active state during destination calculation. SCN-1103-VISUAL-SUCCESS
+CF-1103-002 REQUIRED 11.3 On Visual success, set the exact endpoint and preserve Visual kind. S0.9.2 MotionExecutor Run characterwise, linewise, and blockwise Visual motions. SCN-1103-VISUAL-SUCCESS
+CF-1103-003 REQUIRED 11.3 On Visual success, set previous_landing and first_move false. S0.4.7 StateTransitions Inspect the active Visual context after completion. SCN-1103-VISUAL-SUCCESS
+CF-1103-004 REQUIRED 11.3 Visual success leaves moved_forward unchanged. S0.9.2 MotionExecutor Seed moved_forward true and false and complete Visual motions. SCN-1103-VISUAL-SUCCESS
+CF-1103-005 REQUIRED 11.3 Visual success leaves the persistent target-overlay anchor unchanged. S0.9.2 MotionExecutor Cross a line in Visual mode and compare overlay anchor. SCN-1103-VISUAL-SUCCESS
+CF-1104-001 REQUIRED 11.4 Forward operator-pending descriptors apply the characterwise inclusivity toggle before destination command. S0.9.3 MotionExecutor Record host operator operations for forward FIND and TILL. SCN-1104-DFE,SCN-1104-DTE
+CF-1104-002 REQUIRED 11.4 Backward operator-pending descriptors retain the editor backward endpoint convention. S0.9.3 MotionExecutor Record and apply backward FIND and TILL endpoints. SCN-1104-DFE-BACKWARD,SCN-1104-DTE-BACKWARD
+CF-1104-003 REQUIRED 11.4 dfe on hoge fuge piye poye leaves one leading space followed by fuge piye poye. S0.9.3 MotionExecutor Run the exact operator example and compare resulting buffer. SCN-1104-DFE
+CF-1104-004 REQUIRED 11.4 dte on hoge fuge piye poye leaves e fuge piye poye. S0.9.3 MotionExecutor Run the exact operator example and compare resulting buffer. SCN-1104-DTE
+CF-1104-005 REQUIRED 11.4 From end of line, dFe leaves hoge fuge piye. S0.9.3 MotionExecutor Run the exact backward operator example and compare resulting buffer. SCN-1104-DFE-BACKWARD
+CF-1104-006 REQUIRED 11.4 From end of line, dTe leaves hoge fuge piyee. S0.9.3 MotionExecutor Run the exact backward operator example and compare resulting buffer. SCN-1104-DTE-BACKWARD
+CF-1105-001 REQUIRED 11.5 Make an operator change containing any primary motion repeatable by dot. S0.9.4 MotionExecutor Record and replay each effective descriptor family and direction. SCN-1105-DOT-REPEAT
+CF-1105-002 REQUIRED 11.5 Store effective descriptor and resolved target in the dot payload. S0.9.4 MotionExecutor Inspect payload after fresh and repeated operator motions. SCN-1105-DOT-REPEAT
+CF-1105-003 REQUIRED 11.5 Dot replay asks for no new target input. S0.9.4 MotionExecutor Replay with an input trap. SCN-1105-DOT-REPEAT
+CF-1105-004 REQUIRED 11.5 Successive dot operations find successive occurrences and preserve FIND or TILL endpoints. S0.9.4 MotionExecutor Run successive dot operations for both families. SCN-1105-DOT-REPEAT
+CF-1105-005 REQUIRED 11.5 Repeated dfe produces the four specified buffer states in order. S0.9.4 MotionExecutor Run the exact four-stage deletion sequence. SCN-1105-DOT-REPEAT
+CF-1201-001 REQUIRED 12.1 Define or honor CleverFDefaultLabel, CleverFCursor, CleverFChar, and CleverFDirect highlight groups. S0.10.1 FeedbackService Inspect highlight definitions after activation and ColorScheme. -
+CF-1201-002 REQUIRED 12.1 Use red foreground, default background, bold, and underline as CleverFDefaultLabel fallback. S0.10.1 FeedbackService Inspect all fallback attributes. -
+CF-1201-003 REQUIRED 12.1 Apply fallback attributes to terminal-color and GUI-color rendering. S0.10.1 FeedbackService Inspect cterm and GUI definitions. -
+CF-1202-001 REQUIRED 12.2 Resolve highlight links by explicit color, existing colorscheme group, then fallback link precedence. S0.10.1 FeedbackService Create all combinations and inspect selected links. -
+CF-1202-002 REQUIRED 12.2 Force a CleverF group link when an explicit color name exists. S0.10.1 FeedbackService Predefine a conflicting group and apply explicit configuration. -
+CF-1202-003 REQUIRED 12.2 Without explicit color, preserve an existing colorscheme CleverF group. S0.10.1 FeedbackService Predefine each group and evaluate links. -
+CF-1202-004 REQUIRED 12.2 Without explicit or existing groups, link Cursor to Cursor and Char and Direct to CleverFDefaultLabel. S0.10.1 FeedbackService Evaluate links in an empty highlight registry. -
+CF-1202-005 REQUIRED 12.2 Create a CleverF feature link only when that feature is enabled at evaluation. S0.10.1 FeedbackService Evaluate each enabled and disabled feature combination. -
+CF-1202-006 REQUIRED 12.2 Re-evaluate default label and links after every colorscheme change. S0.10.1 FeedbackService Deliver ColorScheme after replacing group definitions. -
+CF-1202-007 RECOMMENDED 12.2 Make explicit color configuration available before initial link evaluation. S0.11.1 CompositionRoot Configure explicit colors before activation and inspect first definitions. -
+CF-1203-001 REQUIRED 12.3 During fresh acquisition, mark_cursor creates one high-priority CleverFCursor overlay at the cursor. S0.10.2 FeedbackService Pause acquisition and inspect count, group, position, and priority. SCN-0702-TEMP-SUCCESS
+CF-1203-002 REQUIRED 12.3 Redraw before waiting for target input. S0.10.2 FeedbackService Record redraw and input call order. SCN-0702-TEMP-SUCCESS
+CF-1203-003 REQUIRED 12.3 Remove the cursor marker immediately after input handling, including cancellation, missing target, and errors. S0.10.2 FeedbackService Exercise every listed exit and inspect cleanup order. SCN-0702-TEMP-SUCCESS,SCN-0702-TEMP-CANCEL,SCN-0702-TEMP-UNMATCHED,SCN-0702-TEMP-SEARCH-ERROR
+CF-1204-001 REQUIRED 12.4 Direct preview scans only the current line and strict nominal side selected by descriptor case. S0.10.3 DirectPreviewPlanner Plan all four descriptors from a middle cursor and inspect candidate region. SCN-1508-DIRECT-ONE
+CF-1204-002 REQUIRED 12.4 Direct preview scans lower-case descriptors forward and upper-case descriptors backward. S0.10.3 DirectPreviewPlanner Compare f/t and F/T scan order. SCN-1508-DIRECT-MULTIBYTE
+CF-1204-003 REQUIRED 12.4 Direct preview uses the entered count and occurrence counters in motion order. S0.10.3 DirectPreviewPlanner Compare count one, two, and three plans in both directions. SCN-1508-DIRECT-ONE,SCN-1508-DIRECT-TWO
+CF-1204-004 REQUIRED 12.4 Default-case direct preview counts each exact character separately. S0.10.3 DirectPreviewPlanner Scan mixed-case repeated text with both counts. SCN-1508-DIRECT-ONE,SCN-1508-DIRECT-TWO
+CF-1204-005 REQUIRED 12.4 ignore_case direct preview lowercases with editor conversion and counts each fold class. S0.10.3 DirectPreviewPlanner Scan mixed-case and multibyte case pairs under ignore_case. -
+CF-1204-006 REQUIRED 12.4 Smart-case preview increments exact counters and also lower-case counters for ASCII uppercase characters. S0.10.3 DirectPreviewPlanner Trace counters over mixed ASCII case text. -
+CF-1204-007 REQUIRED 12.4 Smart-case preview marks the union selected by exact or lower-case counter reaching count. S0.10.3 DirectPreviewPlanner Compare planner output with all possible smart-case target searches. -
+CF-1204-008 REQUIRED 12.4 Create one ordinary-priority CleverFDirect position overlay for each selected position. S0.10.3 FeedbackService Inspect overlay count, group, positions, and priority. SCN-1508-DIRECT-ONE,SCN-1508-DIRECT-TWO
+CF-1204-009 REQUIRED 12.4 TILL direct preview marks the target occurrence rather than its adjacent endpoint. S0.10.3 DirectPreviewPlanner Plan TILL beside targets and compare later motion endpoint. -
+CF-1204-010 REQUIRED 12.4 Direct preview ignores Migemo and symbol equivalence when grouping counters. S0.10.3 DirectPreviewPlanner Enable Migemo and symbols and compare with exact and case-only plans. -
+CF-1204-011 REQUIRED 12.4 Remove every direct marker immediately after target input on normal, Escape, and error paths. S0.10.3 FeedbackService Exercise all exits and inspect temporary resources. SCN-0702-TEMP-SUCCESS,SCN-0702-TEMP-CANCEL,SCN-0702-TEMP-INPUT-ERROR
+CF-1205-001 REQUIRED 12.5 When mark_char is active in an eligible acquisition context, create one high-priority CleverFChar multi-match overlay. S0.10.4 FeedbackService Acquire in each context and inspect overlay count and priority. SCN-1510-OVERLAY-LIFECYCLE
+CF-1205-002 REQUIRED 12.5 Anchor persistent candidate match starts to the current line. S0.10.4 FeedbackService Acquire on different lines and inspect each anchor. SCN-1510-OVERLAY-LIFECYCLE
+CF-1205-003 REQUIRED 12.5 Use the movement target plan and descriptor destination transform for persistent feedback. S0.10.4 FeedbackService Compare overlay and movement plan identities for literal, symbol, case, and Migemo branches. -
+CF-1205-004 REQUIRED 12.5 Persistent FIND highlights targets, TILL highlights adjacent positions, and exclusive Visual follows section 10.5. S0.10.4 FeedbackService Inspect overlay positions for all descriptors and endpoint policies. -
+CF-1205-005 REQUIRED 12.5 Keep persistent match highlighting window-local. S0.10.4 FeedbackService Create feedback in one window and inspect a second window. -
+CF-1205-006 REQUIRED 12.5 Allow persistent feedback in Normal, all Visual and Select kinds, and legacy Normal-Ex compatibility context. S0.10.4 FeedbackService Acquire in every listed full mode and assert one overlay. -
+CF-1205-007 REQUIRED 12.5 Suppress persistent feedback in operator-pending context while retaining motion and temporary feedback. S0.10.4 FeedbackService Run an operator motion with all marks enabled and inspect effects. SCN-1104-DFE
+CF-1206-001 REQUIRED 12.6 After complete command movement to another line, rebuild persistent CleverFChar feedback at the destination line. S0.10.5 FeedbackService Complete a cross-line FIND and inspect remove-create operations and anchor. SCN-1510-OVERLAY-LIFECYCLE
+CF-1206-002 REQUIRED 12.6 After repeated TILL changes movement direction, rebuild persistent feedback at the destination line. S0.10.5 FeedbackService Repeat TILL opposite to moved_forward on the same line. -
+CF-1206-003 REQUIRED 12.6 Keep same-line FIND feedback at its prior anchor. S0.10.5 FeedbackService Complete same-line FIND repeats in both directions and assert no rebuild. SCN-1510-OVERLAY-LIFECYCLE
+CF-1206-004 REQUIRED 12.6 Visual motion retains its overlay anchor until a later lifecycle transition. S0.10.5 FeedbackService Move Visual endpoint across a line and inspect anchor. SCN-1103-VISUAL-SUCCESS
+CF-1207-001 REQUIRED 12.7 After persistent feedback creation, register current-buffer CursorMoved, InsertEnter, and TextChanged finalizers. S0.11.2 FeedbackService Inspect registrations and their buffer association. SCN-1510-OVERLAY-LIFECYCLE
+CF-1207-002 REQUIRED 12.7 On CursorMoved at previous_landing[last_input_context], preserve the sequence. S0.10.6 FeedbackService Deliver synchronous and later matching CursorMoved events. SCN-1510-OVERLAY-LIFECYCLE
+CF-1207-003 REQUIRED 12.7 On CursorMoved at another position, execute full finalization. S0.10.6 FeedbackService Move to an unrelated position and deliver CursorMoved. SCN-1207-CURSOR-FINALIZE
+CF-1207-004 REQUIRED 12.7 On InsertEnter or TextChanged, execute full finalization directly. S0.10.6 FeedbackService Deliver each event from populated feedback state. SCN-1207-INSERT-FINALIZE,SCN-1207-TEXT-FINALIZE
+CF-1207-005 REQUIRED 12.7 Full finalization removes finalizers, cancels active timer, removes current-window CleverFChar overlays, clears all landings, and sets moved_forward false. S0.10.6 StateTransitions Populate every affected field, finalize, and inspect effects and state. SCN-1207-CURSOR-FINALIZE,SCN-1207-INSERT-FINALIZE,SCN-1207-TEXT-FINALIZE
+CF-1207-006 REQUIRED 12.7 Full finalization retains descriptors, targets, first_move, last_input_context, and Migemo cache. S0.10.6 StateTransitions Populate every retained field, finalize, and compare exact values. SCN-1207-CURSOR-FINALIZE,SCN-1207-INSERT-FINALIZE,SCN-1207-TEXT-FINALIZE
+CF-1207-007 REQUIRED 12.7 After full finalization, explicit repeats remain possible and the next primary action acquires. S0.10.6 StateTransitions Finalize, invoke explicit repeat, then invoke primary action. SCN-1207-CURSOR-FINALIZE
+CF-1207-008 REQUIRED 12.7 When eager cleanup was enabled at initialization and live mark_char is true, WinEnter, WinLeave, and CmdwinLeave remove character overlays and cancel timer. S0.10.8 FeedbackService Deliver all three events with the sampled policy and live setting combinations. SCN-1207-EAGER-WINDOWS
+CF-1207-009 REQUIRED 12.7 Eager window cleanup preserves motion history and finalizer registrations. S0.10.8 StateTransitions Compare all sequence and finalizer fields before and after each eager event. SCN-1207-EAGER-WINDOWS
+CF-1208-001 REQUIRED 12.8 Activate highlight timeout only when mark_char is true, delay is positive, and timers are supported. S0.10.7 FeedbackService Cover the eight-condition Boolean matrix. SCN-1510-TIMEOUT
+CF-1208-002 REQUIRED 12.8 After each primary action, stop the prior timer and start a new timer for highlight_timeout_ms. S0.10.7 FeedbackService Run fresh and repeated actions and inspect ordered timer operations. SCN-1208-TIMER-IDENTITY
+CF-1208-003 REQUIRED 12.8 A timer callback clears feedback only when its identity equals highlight_timer. S0.10.7 FeedbackService Fire stale and current callbacks after timer replacement. SCN-1208-TIMER-IDENTITY
+CF-1208-004 REQUIRED 12.8 A current timer callback marks the timer inactive and removes CleverFChar overlays while preserving motion history. S0.10.7 StateTransitions Fire current timer and compare all state fields. SCN-1510-TIMEOUT
+CF-1208-005 REQUIRED 12.8 A repeated primary action after timeout cleanup restores stored feedback before movement and starts a new timer. S0.10.7 FeedbackService Fire timeout, invoke primary repeat, and inspect effect order. SCN-1510-TIMEOUT
+CF-1208-006 REQUIRED 12.8 Repeated primary actions postpone highlight expiration. S0.10.7 FeedbackService Repeat before expiry, then fire old and new timer identities. SCN-1208-TIMER-IDENTITY
+CF-1208-007 REQUIRED 12.8 Explicit repeats leave target-overlay restoration and timer management unchanged. S0.10.7 FeedbackService Invoke explicit actions after timer cleanup and inspect zero feedback effects. -
+CF-1301-001 REQUIRED 13.1 Bundle precomputed UTF-8, CP932, and EUC-JP Migemo dictionary variants. S0.7.7 MigemoCatalog Inventory and load each bundled asset. -
+CF-1301-002 REQUIRED 13.1 Each Migemo dictionary has exactly 52 keys ordered a through z then A through Z. S0.7.7 MigemoCatalog Parse each asset and compare count and ordered key list. -
+CF-1301-003 REQUIRED 13.1 Each dictionary value denotes a generated Migemo regular-expression language. S0.7.7 MigemoCatalog Compile every value and run a fixed acceptance corpus. -
+CF-1301-004 REQUIRED 13.1 Treat the source data files as the normative Migemo data set. S0.7.7 MigemoCatalog Compare bundled asset checksums or parsed values with supplied source files. -
+CF-1301-005 OPTIONAL 13.1 A port can translate regular-expression representation when accepted starts and case behavior are preserved. S0.7.7 MigemoCatalog Run differential source-versus-translated predicates over a fixed corpus. -
+CF-1301-006 REQUIRED 13.1 Require no external cmigemo process or package at runtime. S0.7.7 MigemoCatalog Run Migemo tests with no cmigemo executable or package available. -
+CF-1302-001 REQUIRED 13.2 Activate Migemo only when live use_migemo is true and target is exactly one ASCII alphabetic character. S0.7.2 TargetPlanFactory Cover true and false setting plus ASCII letter, nonletter, and multicharacter targets. -
+CF-1302-002 REQUIRED 13.2 For buffer-wide search, activate Migemo after the two base checks. S0.7.2 TargetPlanFactory Build a buffer-wide plan on ASCII-only and multibyte lines. -
+CF-1302-003 REQUIRED 13.2 For current-line search, additionally require a multibyte character on the current line by byte-length versus character-count comparison. S0.7.2 TargetPlanFactory Build plans for ASCII and multibyte current lines in each encoding. -
+CF-1303-001 REQUIRED 13.3 Select and cache the dictionary by effective encoding on first use. S0.7.7 MigemoCatalog Request each encoding twice and inspect load count and cache identity. -
+CF-1303-002 REQUIRED 13.3 Accept UTF-8, CP932, and EUC-JP effective encodings. S0.7.7 MigemoCatalog Resolve canonical host names for all three variants. -
+CF-1303-003 REQUIRED 13.3 For another encoding, set live use_migemo to false. S0.7.7 MigemoCatalog Request an unsupported encoding and inspect configuration mutation. -
+CF-1303-004 REQUIRED 13.3 For another encoding, raise clever-f: Encoding '<encoding>' is not supported. Migemo is disabled. S0.11.4 MigemoCatalog Request a named unsupported encoding and compare exact diagnostic text. -
+CF-1303-005 REQUIRED 13.3 Public Reset clears the Migemo cache. S0.4.7 StateTransitions Populate all three cache keys, reset, and inspect the cache. SCN-1401-PUBLIC-RESET
+CF-1304-001 REQUIRED 13.4 A Migemo candidate requires its dictionary pattern to match at the candidate start. S0.7.2 TargetPlanFactory Evaluate candidates before, at, and inside accepted dictionary text. -
+CF-1304-002 REQUIRED 13.4 A Migemo candidate character must equal the target under case mode or lie outside ASCII alphabetic characters. S0.7.2 TargetPlanFactory Test matching and nonmatching Latin letters plus Japanese candidates. -
+CF-1304-003 REQUIRED 13.4 Return one character at the candidate start while permitting dictionary assertion lookahead across whitespace and lines. S0.7.2 TargetPlanFactory Use same-line and cross-line dictionary corpus entries and inspect returned span. -
+CF-1304-004 REQUIRED 13.4 Apply search-scope limits to Migemo candidate start, then apply FIND, TILL, count, and feedback transforms. S0.7.2 TargetPlanFactory Place assertion tails outside scope and compare all downstream transforms. -
+CF-1401-001 REQUIRED 14.1 Public Reset clears all descriptors, landings, first_move values, and Migemo cache. S0.4.7 StateTransitions Populate all contexts and cache, reset, and inspect cleared fields. SCN-1401-PUBLIC-RESET
+CF-1401-002 REQUIRED 14.1 Public Reset replaces repeat_timestamp with a safe zero. S0.4.7 StateTransitions Set a nonzero timestamp, reset, and use the result in later timeout arithmetic. SCN-1401-PUBLIC-RESET
+CF-1401-003 REQUIRED 14.1 Public Reset cancels the active highlight timer and removes current-window CleverFChar overlays. S0.4.7 StateTransitions Populate timer and overlays, reset, and inspect effects and identities. SCN-1401-PUBLIC-RESET
+CF-1401-004 REQUIRED 14.1 Public Reset returns a neutral result and causes no cursor movement. S0.1.3 ActionFacade Invoke Reset at a noninitial position and inspect result and cursor. SCN-1401-PUBLIC-RESET
+CF-1401-005 REQUIRED 14.1 Public Reset retains targets, last_input_context, moved_forward, and finalizer registrations. S0.4.7 StateTransitions Populate all retained fields, reset, and compare exact values. SCN-1401-PUBLIC-RESET
+CF-1401-006 REQUIRED 14.1 After Public Reset, a primary action acquires, an explicit repeat is empty, and later finalizer events can remove retained registrations. S0.4.7 StateTransitions Reset, invoke both action classes, and deliver one retained finalizer. SCN-1401-PUBLIC-RESET
+CF-1402-001 OPTIONAL 14.2 A diagnostic full reset can be exposed for tests or diagnostics. S0.11.4 ActionFacade Inspect optional action exposure when diagnostic mode is enabled. SCN-1402-DIAGNOSTIC-RESET
+CF-1402-002 REQUIRED 14.2 Diagnostic full reset performs Public Reset and also clears input context, all targets, finalizers, moved_forward, and its initialization state. S0.4.7 StateTransitions Populate every state field, run diagnostic reset, and inspect exact cleared set. SCN-1402-DIAGNOSTIC-RESET
+CF-1403-001 REQUIRED 14.3 A free-form invalid descriptor raises clever-f: Invalid mapping 'X'. S0.11.4 ActionFacade Pass representative invalid values and compare exact rendered value. -
+CF-1404-001 REQUIRED 14.4 A failed first search emits no plugin error and preserves the original cursor. S0.1.4 ActionFacade Search a missing target and inspect diagnostics and cursor. SCN-1102-COMMAND-FAILURE
+CF-1404-002 REQUIRED 14.4 A failed sequential count follows partial-progress behavior. S0.1.4 ActionFacade Request one more match than available and inspect typed outcome and endpoint. SCN-1004-PARTIAL-FAILURE
+CF-1404-003 REQUIRED 14.4 Temporary feedback cleanup completes after failed search while persistent feedback follows its lifecycle. S0.6.1 AcquisitionService Inject first and later-step failures and inspect temporary and persistent resources. SCN-0702-TEMP-UNMATCHED,SCN-0702-TEMP-SEARCH-ERROR
+CF-1501-001 REQUIRED 15.1 All four primary keys share descriptor, target, landing, and first_move state within one normalized context. S0.4.1 SequenceState Run the specified mixed-key sequence and inspect one context record. SCN-1501-SHARED-KEYS
+CF-1501-002 REQUIRED 15.1 After fh, f moves to the next h, F returns, and t/T retain the stored FIND family with case-selected direction. S0.5.4 RepeatResolver Run the exact shared-key sequence and compare endpoints and descriptors. SCN-1501-SHARED-KEYS
+CF-1502-001 REQUIRED 15.2 Normal acquisition leaves Visual primary history unchanged and Visual acquisition leaves Normal primary history unchanged. S0.4.1 SequenceState Acquire in both contexts and snapshot the peer record after each. SCN-1502-MODE-ISOLATION
+CF-1502-002 REQUIRED 15.2 Previous-input reuse can cross contexts through last_input_context. S0.4.2 SequenceState Acquire in Normal and trigger reuse in Visual. SCN-1502-MODE-ISOLATION
+CF-1503-001 REQUIRED 15.3 With buffer-wide scope, the specified two-line target-a sequence visits 1:9, 2:6, 2:10, 2:6, and 1:9. S0.8.2 DestinationEngine Run the exact multiline sequence. SCN-1503-MULTILINE
+CF-1503-002 REQUIRED 15.3 With current-line scope, a repeat after the last same-line occurrence remains at that occurrence. S0.8.2 DestinationEngine Run the same text with scope enabled through first failure. SCN-1503-CURRENT-LINE
+CF-1504-001 REQUIRED 15.4 From column one on poge huga hiyo poyo, fh, f, F visit columns 6, 11, and 6. S0.8.3 DestinationEngine Run the exact forward FIND sequence. SCN-1504-FIND-FORWARD
+CF-1504-002 REQUIRED 15.4 From column 19, Fo lands at 17 and lower-case repeat of stored F lands at 14. S0.5.4 RepeatResolver Run the exact backward FIND sequence. SCN-1504-FIND-BACKWARD
+CF-1505-001 REQUIRED 15.5 From column one on poge huga hiyo poyo, th and t land at columns 5 and 10. S0.8.4 DestinationEngine Run the exact TILL sequence. SCN-1505-TILL-FORWARD
+CF-1505-002 REQUIRED 15.5 After new to from column 14, to and t land at columns 16 and 18. S0.8.4 DestinationEngine Run the exact new-target TILL sequence. SCN-1505-TILL-NEW
+CF-1506-001 REQUIRED 15.6 With ignore_case, fg visits columns 3, 6, and 8 and opposite repeat returns to 6 in the specified text. S0.7.6 CasePolicyResolver Run the exact ignore-case sequence. SCN-1506-IGNORE-CASE
+CF-1506-002 REQUIRED 15.6 With smart_case, lower-case h visits lower- and upper-case occurrences. S0.7.6 CasePolicyResolver Run the exact lower-case smart-case sequence. SCN-1506-SMART-LOWER
+CF-1506-003 REQUIRED 15.6 With smart_case, upper-case H visits only upper-case occurrences. S0.7.6 CasePolicyResolver Run the exact upper-case smart-case sequence. SCN-1506-SMART-UPPER
+CF-1507-001 REQUIRED 15.7 A wildcard trigger visits every specified symbol forward in order and backward in reverse order. S0.7.3 TargetPlanFactory Run forward through the full symbol string, then opposite through it. SCN-1507-SYMBOLS
+CF-1508-001 REQUIRED 15.8 Default-case direct preview count one produces columns 2,3,4,5,6,7,9,11,12,13,14,16 on the specified text. S0.10.3 DirectPreviewPlanner Run the exact count-one preview example. SCN-1508-DIRECT-ONE
+CF-1508-002 REQUIRED 15.8 Default-case direct preview count two produces columns 8,10,17,18,19 on the specified text. S0.10.3 DirectPreviewPlanner Run the exact count-two preview example. SCN-1508-DIRECT-TWO
+CF-1508-003 REQUIRED 15.8 Direct preview emits valid multibyte byte columns in both directions. S0.10.3 DirectPreviewPlanner Scan a mixed-width line forward and backward and validate each start. SCN-1508-DIRECT-MULTIBYTE
+CF-1509-001 REQUIRED 15.9 A repeated macro containing fax acquires a on every iteration and can remove all five a characters from the specified text. S0.6.8 AcquisitionService Run the exact five-iteration macro example and count inputs and resulting buffer. SCN-1509-MACRO
+CF-1510-001 REQUIRED 15.10 Fresh eligible acquisition creates CleverFChar feedback and same-line command motion preserves it. S0.10.4 FeedbackService Acquire and repeat on one line while inspecting overlay identity. SCN-1510-OVERLAY-LIFECYCLE
+CF-1510-002 REQUIRED 15.10 Cross-line command motion migrates the overlay anchor to the destination line. S0.10.5 FeedbackService Repeat into another line and inspect rebuild plan. SCN-1510-OVERLAY-LIFECYCLE
+CF-1510-003 REQUIRED 15.10 Unrelated CursorMoved, InsertEnter, and TextChanged events execute full finalization. S0.10.6 FeedbackService Deliver each event from equivalent populated states. SCN-1207-CURSOR-FINALIZE,SCN-1207-INSERT-FINALIZE,SCN-1207-TEXT-FINALIZE
+CF-1510-004 REQUIRED 15.10 Positive highlight timeout clears only feedback and preserves repetition history. S0.10.7 FeedbackService Fire the current timer and compare overlay and history fields. SCN-1510-TIMEOUT
+CF-1511-001 REQUIRED 15.11 Horizontal or all-motion fold-open policy opens all enclosing folds before primary acquisition and movement. S0.5.1 RepeatResolver Run from nested closed folds and inspect operation order. SCN-1511-FOLDS
diff --git a/conformance/scenario-schema.json b/conformance/scenario-schema.json
new file mode 100644
index 0000000..10fde22
--- /dev/null
+++ b/conformance/scenario-schema.json
@@ -0,0 +1,536 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://clever-f.invalid/conformance/scenario-schema.json",
+ "title": "clever-f host-neutral conformance scenarios",
+ "type": "object",
+ "required": ["format_version", "scenarios"],
+ "additionalProperties": false,
+ "properties": {
+ "format_version": { "const": 1 },
+ "scenarios": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/scenario" }
+ }
+ },
+ "$defs": {
+ "position": {
+ "type": "object",
+ "required": ["line", "byte_column"],
+ "additionalProperties": false,
+ "properties": {
+ "line": { "type": "integer", "minimum": 1 },
+ "byte_column": { "type": "integer", "minimum": 1 }
+ }
+ },
+ "selection": {
+ "type": "object",
+ "required": ["active", "kind", "anchor", "focus", "option"],
+ "additionalProperties": false,
+ "properties": {
+ "active": { "type": "boolean" },
+ "kind": {
+ "enum": ["none", "character", "line", "block"]
+ },
+ "anchor": {
+ "oneOf": [
+ { "$ref": "#/$defs/position" },
+ { "type": "null" }
+ ]
+ },
+ "focus": {
+ "oneOf": [
+ { "$ref": "#/$defs/position" },
+ { "type": "null" }
+ ]
+ },
+ "option": { "enum": ["inclusive", "exclusive"] }
+ }
+ },
+ "target": {
+ "type": "object",
+ "required": ["kind", "value", "first_code"],
+ "additionalProperties": false,
+ "properties": {
+ "kind": { "enum": ["character", "special_key", "code_fallback"] },
+ "value": { "type": "string" },
+ "first_code": { "type": "integer", "minimum": 0 }
+ }
+ },
+ "context_record": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "previous_descriptor": {
+ "oneOf": [
+ { "enum": ["f", "F", "t", "T"] },
+ { "type": "null" }
+ ]
+ },
+ "previous_landing": {
+ "oneOf": [
+ { "$ref": "#/$defs/position" },
+ { "type": "null" }
+ ]
+ },
+ "first_move": {
+ "oneOf": [
+ { "type": "boolean" },
+ { "type": "null" }
+ ]
+ },
+ "previous_target": {
+ "oneOf": [
+ { "$ref": "#/$defs/target" },
+ { "type": "null" }
+ ]
+ }
+ }
+ },
+ "state": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "contexts": {
+ "type": "object",
+ "additionalProperties": { "$ref": "#/$defs/context_record" }
+ },
+ "last_input_context": {
+ "oneOf": [
+ { "type": "string" },
+ { "type": "null" }
+ ]
+ },
+ "moved_forward": { "type": "boolean" },
+ "moved_forward_initialized": { "type": "boolean" },
+ "migemo_cache": {
+ "type": "array",
+ "items": { "type": "string" },
+ "uniqueItems": true
+ },
+ "repeat_timestamp_ms": { "type": "number" },
+ "highlight_timer": {
+ "oneOf": [
+ { "type": "string" },
+ { "type": "null" }
+ ]
+ },
+ "target_overlays": {
+ "type": "array",
+ "items": { "type": "string" },
+ "uniqueItems": true
+ },
+ "temporary_overlays": {
+ "type": "array",
+ "items": { "type": "string" },
+ "uniqueItems": true
+ },
+ "finalizers": {
+ "type": "array",
+ "items": { "type": "string" },
+ "uniqueItems": true
+ }
+ }
+ },
+ "input_packet": {
+ "type": "object",
+ "required": ["kind"],
+ "additionalProperties": false,
+ "properties": {
+ "kind": { "enum": ["text", "raw_bytes", "special_key", "error"] },
+ "text": { "type": "string" },
+ "bytes": {
+ "type": "array",
+ "items": { "type": "integer", "minimum": 0, "maximum": 255 }
+ },
+ "name": { "type": "string" },
+ "message": { "type": "string" }
+ }
+ },
+ "event": {
+ "type": "object",
+ "required": ["name"],
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "enum": [
+ "CursorMoved",
+ "InsertEnter",
+ "TextChanged",
+ "WinEnter",
+ "WinLeave",
+ "CmdwinLeave",
+ "ColorScheme"
+ ]
+ },
+ "time_ms": { "type": "number" },
+ "cursor": { "$ref": "#/$defs/position" },
+ "buffer_lines": {
+ "type": "array",
+ "items": { "type": "string" }
+ }
+ }
+ },
+ "configuration_value": {
+ "oneOf": [
+ { "type": "boolean" },
+ { "type": "integer" },
+ { "type": "string" },
+ { "type": "array", "items": { "type": "string" } },
+ { "type": "null" }
+ ]
+ },
+ "action_step": {
+ "type": "object",
+ "required": ["operation"],
+ "additionalProperties": false,
+ "properties": {
+ "operation": {
+ "enum": ["action", "event", "timer_callback", "set_cursor", "set_mode", "set_selection", "set_state", "editor_key"]
+ },
+ "action": {
+ "enum": [
+ "StartFindForward",
+ "StartFindBackward",
+ "StartTillForward",
+ "StartTillBackward",
+ "RepeatSameDirection",
+ "RepeatOppositeDirection",
+ "Reset",
+ "DiagnosticFullReset",
+ "DotRepeat"
+ ]
+ },
+ "event_index": { "type": "integer", "minimum": 0 },
+ "timer_identity": { "type": "string" },
+ "position": { "$ref": "#/$defs/position" },
+ "mode": { "type": "string" },
+ "selection": { "$ref": "#/$defs/selection" },
+ "state": { "$ref": "#/$defs/state" },
+ "key": { "type": "string" },
+ "count": {
+ "oneOf": [
+ { "type": "integer", "minimum": 1 },
+ { "type": "null" }
+ ]
+ },
+ "input_packet_indexes": {
+ "type": "array",
+ "items": { "type": "integer", "minimum": 0 }
+ },
+ "time_value_indexes": {
+ "type": "array",
+ "items": { "type": "integer", "minimum": 0 }
+ }
+ }
+ },
+ "action_outcome": {
+ "type": "object",
+ "required": ["after_step", "kind", "position", "complete", "successful_steps"],
+ "additionalProperties": false,
+ "properties": {
+ "after_step": { "type": "integer", "minimum": 0 },
+ "kind": {
+ "enum": ["movement", "neutral", "escape", "failed_search", "error", "empty"]
+ },
+ "position": { "$ref": "#/$defs/position" },
+ "complete": {
+ "oneOf": [
+ { "type": "boolean" },
+ { "type": "null" }
+ ]
+ },
+ "successful_steps": { "type": "integer", "minimum": 0 },
+ "effective_descriptor": {
+ "oneOf": [
+ { "enum": ["f", "F", "t", "T"] },
+ { "type": "null" }
+ ]
+ },
+ "buffer_lines": {
+ "type": "array",
+ "items": { "type": "string" }
+ },
+ "dot_payload": {
+ "type": "object",
+ "required": ["descriptor", "target"],
+ "additionalProperties": false,
+ "properties": {
+ "descriptor": { "enum": ["f", "F", "t", "T"] },
+ "target": { "$ref": "#/$defs/target" }
+ }
+ }
+ }
+ },
+ "state_snapshot": {
+ "type": "object",
+ "required": ["after_step", "state", "retained_fields", "cleared_fields"],
+ "additionalProperties": false,
+ "properties": {
+ "after_step": { "type": "integer", "minimum": 0 },
+ "state": { "$ref": "#/$defs/state" },
+ "retained_fields": {
+ "type": "array",
+ "items": { "type": "string" },
+ "uniqueItems": true
+ },
+ "cleared_fields": {
+ "type": "array",
+ "items": { "type": "string" },
+ "uniqueItems": true
+ }
+ }
+ },
+ "overlay_plan": {
+ "type": "object",
+ "required": ["after_step", "operation", "group", "identity"],
+ "additionalProperties": false,
+ "properties": {
+ "after_step": { "type": "integer", "minimum": 0 },
+ "operation": { "enum": ["create", "remove", "rebuild", "preserve"] },
+ "group": { "enum": ["CleverFCursor", "CleverFChar", "CleverFDirect"] },
+ "identity": { "type": "string" },
+ "window": { "type": "string" },
+ "anchor_line": { "type": "integer", "minimum": 1 },
+ "positions": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/position" }
+ },
+ "priority": { "enum": ["ordinary", "high"] },
+ "descriptor": { "enum": ["f", "F", "t", "T"] },
+ "target_plan": { "type": "string" }
+ }
+ },
+ "timer_operation": {
+ "type": "object",
+ "required": ["after_step", "operation", "identity"],
+ "additionalProperties": false,
+ "properties": {
+ "after_step": { "type": "integer", "minimum": 0 },
+ "operation": { "enum": ["start", "stop", "fire", "ignore", "set_inactive"] },
+ "identity": { "type": "string" },
+ "delay_ms": { "type": "integer", "minimum": 0 }
+ }
+ },
+ "redraw": {
+ "type": "object",
+ "required": ["after_step", "kind"],
+ "additionalProperties": false,
+ "properties": {
+ "after_step": { "type": "integer", "minimum": 0 },
+ "kind": { "enum": ["screen", "full", "suppressed"] }
+ }
+ },
+ "diagnostic": {
+ "type": "object",
+ "required": ["after_step", "level", "text"],
+ "additionalProperties": false,
+ "properties": {
+ "after_step": { "type": "integer", "minimum": 0 },
+ "level": { "enum": ["error", "warning", "info"] },
+ "text": { "type": "string" }
+ }
+ },
+ "host_operation": {
+ "type": "object",
+ "required": ["after_step", "operation"],
+ "additionalProperties": false,
+ "properties": {
+ "after_step": { "type": "integer", "minimum": 0 },
+ "operation": {
+ "enum": [
+ "open_fold",
+ "apply_cursor",
+ "apply_selection",
+ "read_input",
+ "hide_cursor_presentation",
+ "restore_cursor_presentation",
+ "register_finalizer",
+ "remove_finalizer"
+ ]
+ },
+ "identity": { "type": "string" },
+ "position": { "$ref": "#/$defs/position" },
+ "fold_level": { "type": "integer", "minimum": 1 }
+ }
+ },
+ "scenario": {
+ "type": "object",
+ "required": [
+ "id",
+ "title",
+ "source_refs",
+ "requirements",
+ "given",
+ "steps",
+ "expect"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "id": { "type": "string", "pattern": "^SCN-[0-9]{4}-[A-Z0-9-]+$" },
+ "title": { "type": "string" },
+ "source_refs": {
+ "type": "array",
+ "items": { "type": "string" },
+ "minItems": 1,
+ "uniqueItems": true
+ },
+ "requirements": {
+ "type": "array",
+ "items": { "type": "string", "pattern": "^CF-[0-9]{4}-[0-9]{3}$" },
+ "minItems": 1,
+ "uniqueItems": true
+ },
+ "given": {
+ "type": "object",
+ "required": [
+ "buffer",
+ "effective_encoding",
+ "cursor",
+ "mode",
+ "selection",
+ "pending_operator",
+ "count",
+ "configuration",
+ "input_packets",
+ "time_values_ms",
+ "events",
+ "state",
+ "host"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "buffer": {
+ "type": "object",
+ "required": ["lines"],
+ "additionalProperties": false,
+ "properties": {
+ "lines": {
+ "type": "array",
+ "items": { "type": "string" },
+ "minItems": 1
+ }
+ }
+ },
+ "effective_encoding": { "type": "string" },
+ "cursor": { "$ref": "#/$defs/position" },
+ "mode": { "type": "string", "minLength": 1 },
+ "selection": { "$ref": "#/$defs/selection" },
+ "pending_operator": {
+ "oneOf": [
+ { "type": "string" },
+ { "type": "null" }
+ ]
+ },
+ "count": {
+ "oneOf": [
+ { "type": "integer", "minimum": 1 },
+ { "type": "null" }
+ ]
+ },
+ "configuration": {
+ "type": "object",
+ "additionalProperties": { "$ref": "#/$defs/configuration_value" }
+ },
+ "input_packets": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/input_packet" }
+ },
+ "time_values_ms": {
+ "type": "array",
+ "items": { "type": "number" }
+ },
+ "events": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/event" }
+ },
+ "state": { "$ref": "#/$defs/state" },
+ "host": {
+ "type": "object",
+ "required": ["macro_register", "fold_open_policy", "closed_fold_levels", "timer_support", "cmdline_cursor_support"],
+ "additionalProperties": false,
+ "properties": {
+ "macro_register": {
+ "oneOf": [
+ { "type": "string" },
+ { "type": "null" }
+ ]
+ },
+ "fold_open_policy": {
+ "type": "array",
+ "items": { "enum": ["all", "horizontal", "vertical", "block", "insert", "jump", "mark", "percent", "quickfix", "search", "tag", "undo"] },
+ "uniqueItems": true
+ },
+ "closed_fold_levels": { "type": "integer", "minimum": 0 },
+ "timer_support": { "type": "boolean" },
+ "cmdline_cursor_support": { "type": "boolean" }
+ }
+ }
+ }
+ },
+ "steps": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/action_step" },
+ "minItems": 1
+ },
+ "expect": {
+ "type": "object",
+ "required": [
+ "action_outcomes",
+ "final_buffer",
+ "final_position",
+ "final_selection",
+ "state_snapshots",
+ "overlay_plans",
+ "timer_operations",
+ "prompts",
+ "redraws",
+ "diagnostics",
+ "host_operations"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "action_outcomes": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/action_outcome" }
+ },
+ "final_buffer": {
+ "type": "array",
+ "items": { "type": "string" },
+ "minItems": 1
+ },
+ "final_position": { "$ref": "#/$defs/position" },
+ "final_selection": { "$ref": "#/$defs/selection" },
+ "state_snapshots": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/state_snapshot" }
+ },
+ "overlay_plans": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/overlay_plan" }
+ },
+ "timer_operations": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/timer_operation" }
+ },
+ "prompts": {
+ "type": "array",
+ "items": { "type": "string" }
+ },
+ "redraws": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/redraw" }
+ },
+ "diagnostics": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/diagnostic" }
+ },
+ "host_operations": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/host_operation" }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/conformance/specification-observations.txt b/conformance/specification-observations.txt
new file mode 100644
index 0000000..44e2b1f
--- /dev/null
+++ b/conformance/specification-observations.txt
@@ -0,0 +1,7 @@
+SPECIFICATION OBSERVATIONS
+
+OBS-001
+Source: specification.txt, section 15.3
+Fixture: SCN-1503-MULTILINE and SCN-1503-CURRENT-LINE
+
+The source example names target "a" and specifies positions 1:9, 2:6, and 2:10. In the supplied buffer text, "a" starts at 1:6, 1:10, and 2:9. The fixtures preserve the specified position sequence for direct traceability. Confirm the target, buffer text, or expected positions before this fixture becomes executable.