aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-07-22 16:53:19 -0500
committerCraig Jennings <c@cjennings.net>2026-07-22 16:53:19 -0500
commitfb46b78003132d4281db2db1482118034e2424d8 (patch)
treee21ceca4992f5f1928b4e9897a22b348f29eebe8 /docs
parent5e609dcea19b0f776ee887bb41ac10a02194f281 (diff)
downloadpearl-main.tar.gz
pearl-main.zip
docs: collect specs under docs/specs/HEADmain
I moved the specs from docs/ root into docs/specs/ and repointed their cross-references.
Diffstat (limited to 'docs')
-rw-r--r--docs/specs/comment-deletion-spec.org (renamed from docs/comment-deletion-spec.org)0
-rw-r--r--docs/specs/default-view-spec.org (renamed from docs/default-view-spec.org)8
-rw-r--r--docs/specs/interactive-grouping-spec.org (renamed from docs/interactive-grouping-spec.org)0
-rw-r--r--docs/specs/issue-comment-editing-spec.org (renamed from docs/issue-comment-editing-spec.org)0
-rw-r--r--docs/specs/issue-conflict-handling-spec.org (renamed from docs/issue-conflict-handling-spec.org)0
-rw-r--r--docs/specs/issue-query-spec.org (renamed from docs/issue-query-spec.org)0
-rw-r--r--docs/specs/issue-representation-spec.org (renamed from docs/issue-representation-spec.org)0
-rw-r--r--docs/specs/issue-sort-order-spec.org (renamed from docs/issue-sort-order-spec.org)0
-rw-r--r--docs/specs/issue-sources-spec.org (renamed from docs/issue-sources-spec.org)0
-rw-r--r--docs/specs/labels-as-org-tags-spec.org (renamed from docs/labels-as-org-tags-spec.org)0
-rw-r--r--docs/specs/local-and-linear-views-spec.org (renamed from docs/local-and-linear-views-spec.org)16
-rw-r--r--docs/specs/modified-ticket-indicator-spec-review.org (renamed from docs/modified-ticket-indicator-spec-review.org)0
-rw-r--r--docs/specs/modified-ticket-indicator-spec.org (renamed from docs/modified-ticket-indicator-spec.org)10
-rw-r--r--docs/specs/multi-account-spec.org (renamed from docs/multi-account-spec.org)0
-rw-r--r--docs/specs/multi-state-filter-spec.org (renamed from docs/multi-state-filter-spec.org)8
-rw-r--r--docs/specs/refine-source-spec.org (renamed from docs/refine-source-spec.org)0
-rw-r--r--docs/specs/saved-query-sync-spec.org (renamed from docs/saved-query-sync-spec.org)0
-rw-r--r--docs/specs/ticket-save-model-spec.org (renamed from docs/ticket-save-model-spec.org)0
-rw-r--r--docs/specs/ticket-save-model-v2-spec.org (renamed from docs/ticket-save-model-v2-spec.org)0
-rw-r--r--docs/specs/todo-keywords-from-workflow-states-spec.org (renamed from docs/todo-keywords-from-workflow-states-spec.org)0
20 files changed, 21 insertions, 21 deletions
diff --git a/docs/comment-deletion-spec.org b/docs/specs/comment-deletion-spec.org
index 0af6f13..0af6f13 100644
--- a/docs/comment-deletion-spec.org
+++ b/docs/specs/comment-deletion-spec.org
diff --git a/docs/default-view-spec.org b/docs/specs/default-view-spec.org
index e20e932..82467cc 100644
--- a/docs/default-view-spec.org
+++ b/docs/specs/default-view-spec.org
@@ -126,16 +126,16 @@ None for existing configs. With no =:default-view= on any account and =pearl-def
#+begin_src org
,** TODO [#B] Default view — resolver + open command :feature:
-=pearl-default-view= defcustom (legacy) + =:default-view= account-plist key; =pearl--resolve-default-view= returns the active scope's default (per-account in accounts mode, defcustom in legacy); =pearl-open-default-view= dispatches nil → my-open-issues, a local-view name → =pearl-run-local-view=, a stale name → my-open-issues + message (never errors). Spec: [[file:docs/default-view-spec.org]] (phase 1).
+=pearl-default-view= defcustom (legacy) + =:default-view= account-plist key; =pearl--resolve-default-view= returns the active scope's default (per-account in accounts mode, defcustom in legacy); =pearl-open-default-view= dispatches nil → my-open-issues, a local-view name → =pearl-run-local-view=, a stale name → my-open-issues + message (never errors). Spec: [[file:docs/specs/default-view-spec.org]] (phase 1).
,** TODO [#B] Default view — set-default-view command :feature:
-=pearl-set-default-view= (the reserved =C-; L v D=): from a local-view buffer offers that view; otherwise prompts over local-view names with a clear-to-my-open-issues sentinel. Persists via =customize-save-variable= to the active account's =:default-view= (accounts mode) or =pearl-default-view= (legacy). Spec: [[file:docs/default-view-spec.org]] (phase 2).
+=pearl-set-default-view= (the reserved =C-; L v D=): from a local-view buffer offers that view; otherwise prompts over local-view names with a clear-to-my-open-issues sentinel. Persists via =customize-save-variable= to the active account's =:default-view= (accounts mode) or =pearl-default-view= (legacy). Spec: [[file:docs/specs/default-view-spec.org]] (phase 2).
,** TODO [#B] Default view — keymap, transient, docs :feature:
-Rebind top-level =C-; L l= to =pearl-open-default-view= (=f o= stays literal my-open-issues); bind =C-; L v D= to =pearl-set-default-view=; add the =.= set-default-view suffix to the transient Views group (=D= stays save-locally). Update keymap + menu tests + README (default view, =l= behavior, per-account scoping). Spec: [[file:docs/default-view-spec.org]] (phase 3).
+Rebind top-level =C-; L l= to =pearl-open-default-view= (=f o= stays literal my-open-issues); bind =C-; L v D= to =pearl-set-default-view=; add the =.= set-default-view suffix to the transient Views group (=D= stays save-locally). Update keymap + menu tests + README (default view, =l= behavior, per-account scoping). Spec: [[file:docs/specs/default-view-spec.org]] (phase 3).
,** TODO [#B] Default view — test surface :test:
-Unit: =pearl--resolve-default-view= returns =pearl-default-view= in legacy mode and the active account's =:default-view= in accounts mode; the accounts-mode setter rewrite updates only =:default-view= and preserves other plist keys; stale-name fallback. Command flow: nil default dispatches to =pearl-list-issues= (no project), an existing local-view name to =pearl-run-local-view=, a stale name to =pearl-list-issues= with the fallback message; setter from a local-view buffer offers that view, from elsewhere prompts with the clear sentinel, cancel leaves state unchanged; persistence calls =customize-save-variable= for the right scope. Surface: =C-; L l= → =pearl-open-default-view=, =C-; L f o= → =pearl-list-issues=, =C-; L v D= → =pearl-set-default-view=, transient Views =.= → set-default-view with no duplicate suffix. E2e/manual-verify: =C-; L l= opens the configured default; switching accounts switches which default opens. Spec: [[file:docs/default-view-spec.org]] (Acceptance criteria).
+Unit: =pearl--resolve-default-view= returns =pearl-default-view= in legacy mode and the active account's =:default-view= in accounts mode; the accounts-mode setter rewrite updates only =:default-view= and preserves other plist keys; stale-name fallback. Command flow: nil default dispatches to =pearl-list-issues= (no project), an existing local-view name to =pearl-run-local-view=, a stale name to =pearl-list-issues= with the fallback message; setter from a local-view buffer offers that view, from elsewhere prompts with the clear sentinel, cancel leaves state unchanged; persistence calls =customize-save-variable= for the right scope. Surface: =C-; L l= → =pearl-open-default-view=, =C-; L f o= → =pearl-list-issues=, =C-; L v D= → =pearl-set-default-view=, transient Views =.= → set-default-view with no duplicate suffix. E2e/manual-verify: =C-; L l= opens the configured default; switching accounts switches which default opens. Spec: [[file:docs/specs/default-view-spec.org]] (Acceptance criteria).
#+end_src
* Review dispositions
diff --git a/docs/interactive-grouping-spec.org b/docs/specs/interactive-grouping-spec.org
index 60e5541..60e5541 100644
--- a/docs/interactive-grouping-spec.org
+++ b/docs/specs/interactive-grouping-spec.org
diff --git a/docs/issue-comment-editing-spec.org b/docs/specs/issue-comment-editing-spec.org
index 6a1b0c8..6a1b0c8 100644
--- a/docs/issue-comment-editing-spec.org
+++ b/docs/specs/issue-comment-editing-spec.org
diff --git a/docs/issue-conflict-handling-spec.org b/docs/specs/issue-conflict-handling-spec.org
index 09acaf6..09acaf6 100644
--- a/docs/issue-conflict-handling-spec.org
+++ b/docs/specs/issue-conflict-handling-spec.org
diff --git a/docs/issue-query-spec.org b/docs/specs/issue-query-spec.org
index 75dcc4b..75dcc4b 100644
--- a/docs/issue-query-spec.org
+++ b/docs/specs/issue-query-spec.org
diff --git a/docs/issue-representation-spec.org b/docs/specs/issue-representation-spec.org
index 912cee9..912cee9 100644
--- a/docs/issue-representation-spec.org
+++ b/docs/specs/issue-representation-spec.org
diff --git a/docs/issue-sort-order-spec.org b/docs/specs/issue-sort-order-spec.org
index 478b074..478b074 100644
--- a/docs/issue-sort-order-spec.org
+++ b/docs/specs/issue-sort-order-spec.org
diff --git a/docs/issue-sources-spec.org b/docs/specs/issue-sources-spec.org
index a4374c3..a4374c3 100644
--- a/docs/issue-sources-spec.org
+++ b/docs/specs/issue-sources-spec.org
diff --git a/docs/labels-as-org-tags-spec.org b/docs/specs/labels-as-org-tags-spec.org
index cc15e1c..cc15e1c 100644
--- a/docs/labels-as-org-tags-spec.org
+++ b/docs/specs/labels-as-org-tags-spec.org
diff --git a/docs/local-and-linear-views-spec.org b/docs/specs/local-and-linear-views-spec.org
index 0a836ee..de8943a 100644
--- a/docs/local-and-linear-views-spec.org
+++ b/docs/specs/local-and-linear-views-spec.org
@@ -341,28 +341,28 @@ All settled with Craig on 2026-06-01, across the first open-question pass and th
#+begin_src org
,** TODO [#B] local/Linear views — direct rename, no aliases :feature:
-Rename the saved-query defcustom and existing commands directly to the local/Linear view vocabulary. No obsolete aliases; remove the old =q= saved-query bindings; update Craig's config in the same change. Spec: [[file:docs/local-and-linear-views-spec.org]] (Implementation phases, phase 1).
+Rename the saved-query defcustom and existing commands directly to the local/Linear view vocabulary. No obsolete aliases; remove the old =q= saved-query bindings; update Craig's config in the same change. Spec: [[file:docs/specs/local-and-linear-views-spec.org]] (Implementation phases, phase 1).
,** TODO [#B] local/Linear views — create and edit :feature:
-Add =pearl-create-local-view=, =pearl-edit-local-view=, the metadata-preserving =pearl--save-local-view= writer, local Replace/Rename/Cancel collision handling, account stamping/preservation, and shared builder internals with =pearl-list-issues-filtered= (save offer reworded to "save this local view?"). Spec: [[file:docs/local-and-linear-views-spec.org]] (Implementation phases, phase 2).
+Add =pearl-create-local-view=, =pearl-edit-local-view=, the metadata-preserving =pearl--save-local-view= writer, local Replace/Rename/Cancel collision handling, account stamping/preservation, and shared builder internals with =pearl-list-issues-filtered= (save offer reworded to "save this local view?"). Spec: [[file:docs/specs/local-and-linear-views-spec.org]] (Implementation phases, phase 2).
,** TODO [#B] local/Linear views — keymap and transient :feature:
-Expose the view noun under clean product vocabulary (local view / Linear view / filter / publish / save locally) in the keymap and transient. No "query" in user-facing labels. View-operation labels avoid "source"; the unified picker =pearl-pick-source= keeps "source" deliberately (it spans views, filters, and browser-only favorites). Spec: [[file:docs/local-and-linear-views-spec.org]] (Implementation phases, phase 3).
+Expose the view noun under clean product vocabulary (local view / Linear view / filter / publish / save locally) in the keymap and transient. No "query" in user-facing labels. View-operation labels avoid "source"; the unified picker =pearl-pick-source= keeps "source" deliberately (it spans views, filters, and browser-only favorites). Spec: [[file:docs/specs/local-and-linear-views-spec.org]] (Implementation phases, phase 3).
,** TODO [#B] local/Linear views — picker labels + cross-store dedup :feature:
-Reword the picker candidates and scope labels to =[local]= / =[local → Linear:SCOPE]= / =[linear]=, and implement the cross-store rule: dedupe same-=CustomView=-id tracked-local-plus-favorite to the local entry; show same-name different-id local and Linear views both. Spec: [[file:docs/local-and-linear-views-spec.org]] (Implementation phases, phase 4).
+Reword the picker candidates and scope labels to =[local]= / =[local → Linear:SCOPE]= / =[linear]=, and implement the cross-store rule: dedupe same-=CustomView=-id tracked-local-plus-favorite to the local entry; show same-name different-id local and Linear views both. Spec: [[file:docs/specs/local-and-linear-views-spec.org]] (Implementation phases, phase 4).
,** TODO [#B] local/Linear views — publish local view :feature:
-Present the existing publish/sync path as =pearl-publish-local-view=, preserving first-publish create and re-publish update-by-id behavior. Spec: [[file:docs/local-and-linear-views-spec.org]] (Implementation phases, phase 5).
+Present the existing publish/sync path as =pearl-publish-local-view=, preserving first-publish create and re-publish update-by-id behavior. Spec: [[file:docs/specs/local-and-linear-views-spec.org]] (Implementation phases, phase 5).
,** TODO [#B] local/Linear views — save Linear view locally :feature:
-Implement normalize-then-match reverse compilation for readable =CustomView.filterData=, structured refusal reasons, favorited-Linear-view candidates, and forked local-view persistence through =pearl--save-local-view=, as =pearl-save-linear-view-locally=. Reverse-compile contract per the dimension table: distinct =:state= vs =:state-type=, =:open t= mapped from the exact open-state =nin= (generic =nin= refuses), priority canonicalized to numeric 0..4, singular id/scalar keys accept only =eq= or one-element =in=, plural keys (=:labels=, =:state-type=) explicitly whitelisted, and multi-value =in= on singular keys refuses. Spec: [[file:docs/local-and-linear-views-spec.org]] (Implementation phases, phase 6).
+Implement normalize-then-match reverse compilation for readable =CustomView.filterData=, structured refusal reasons, favorited-Linear-view candidates, and forked local-view persistence through =pearl--save-local-view=, as =pearl-save-linear-view-locally=. Reverse-compile contract per the dimension table: distinct =:state= vs =:state-type=, =:open t= mapped from the exact open-state =nin= (generic =nin= refuses), priority canonicalized to numeric 0..4, singular id/scalar keys accept only =eq= or one-element =in=, plural keys (=:labels=, =:state-type=) explicitly whitelisted, and multi-value =in= on singular keys refuses. Spec: [[file:docs/specs/local-and-linear-views-spec.org]] (Implementation phases, phase 6).
,** TODO [#B] local/Linear views — docs :feature:
-Update README and package summary with filter / local view / Linear view vocabulary, the publish / save-locally lifecycle, command surface, and representability boundary. No "query" in user-facing text. Spec: [[file:docs/local-and-linear-views-spec.org]] (Implementation phases, phase 7).
+Update README and package summary with filter / local view / Linear view vocabulary, the publish / save-locally lifecycle, command surface, and representability boundary. No "query" in user-facing text. Spec: [[file:docs/specs/local-and-linear-views-spec.org]] (Implementation phases, phase 7).
,** TODO [#B] local/Linear views — naming and behavior test surface :test:
-Unit: direct renames without aliases, absence of user-facing "query" vocabulary (=pearl-pick-source= explicitly allowed, not banned), metadata-preserving edit, local collision policy, account ownership guard for run/edit/publish/publish-current/delete (delete makes no Linear call on mismatch), cross-store duplicate display/dedupe, tracked-local run/refresh dispatch (=pearl-run-local-view= runs the local filter, not =pearl--query-view-async=), picker labels, reverse-compile round trips and refusals (per-dimension, including =:state= vs =:state-type= with multi-type =in=, =:open t= exact-predicate success and generic-=nin= refusal, priority canonicalization and out-of-range refusal, singular multi-value =in= refusal for =assignee.id=/=assignee.email=/=project.id=/=cycle.id=/=team.key=/=label id=, and the plural =:labels= / =:state-type= exceptions), normalizer fixtures, structured refusals. Integration: copy-down candidate fixtures, stale ids, missing/nil =filterData=, GraphQL errors, publish update-by-id regression, delete does not call Linear on account mismatch, refresh re-runs local filter for a local-view buffer vs server-side for a native Linear-view buffer. E2e / manual-verify: create -> edit -> run local -> publish -> re-publish update -> save Linear view locally -> refuse unrepresentable view -> delete local/tracked views. Spec: [[file:docs/local-and-linear-views-spec.org]] (Acceptance criteria).
+Unit: direct renames without aliases, absence of user-facing "query" vocabulary (=pearl-pick-source= explicitly allowed, not banned), metadata-preserving edit, local collision policy, account ownership guard for run/edit/publish/publish-current/delete (delete makes no Linear call on mismatch), cross-store duplicate display/dedupe, tracked-local run/refresh dispatch (=pearl-run-local-view= runs the local filter, not =pearl--query-view-async=), picker labels, reverse-compile round trips and refusals (per-dimension, including =:state= vs =:state-type= with multi-type =in=, =:open t= exact-predicate success and generic-=nin= refusal, priority canonicalization and out-of-range refusal, singular multi-value =in= refusal for =assignee.id=/=assignee.email=/=project.id=/=cycle.id=/=team.key=/=label id=, and the plural =:labels= / =:state-type= exceptions), normalizer fixtures, structured refusals. Integration: copy-down candidate fixtures, stale ids, missing/nil =filterData=, GraphQL errors, publish update-by-id regression, delete does not call Linear on account mismatch, refresh re-runs local filter for a local-view buffer vs server-side for a native Linear-view buffer. E2e / manual-verify: create -> edit -> run local -> publish -> re-publish update -> save Linear view locally -> refuse unrepresentable view -> delete local/tracked views. Spec: [[file:docs/specs/local-and-linear-views-spec.org]] (Acceptance criteria).
#+end_src
* Out of scope (vNext)
diff --git a/docs/modified-ticket-indicator-spec-review.org b/docs/specs/modified-ticket-indicator-spec-review.org
index a89041f..a89041f 100644
--- a/docs/modified-ticket-indicator-spec-review.org
+++ b/docs/specs/modified-ticket-indicator-spec-review.org
diff --git a/docs/modified-ticket-indicator-spec.org b/docs/specs/modified-ticket-indicator-spec.org
index 4725a2c..1ea337c 100644
--- a/docs/modified-ticket-indicator-spec.org
+++ b/docs/specs/modified-ticket-indicator-spec.org
@@ -152,19 +152,19 @@ Priorities are =[#B]=: Craig bumped the parent task and these phases from =[#C]=
#+begin_src org
** TODO [#B] Modified-ticket indicator: mode-line count + dirty classifier :feature:
-Viewer-aware pushable-dirty count (=pearl--buffer-dirty-issue-count=), appended to =pearl--mode-line-lighter= as "N unsaved" while preserving =Pearl[account]=, cached buffer-locally with =force-mode-line-update=. Spec: [[file:docs/modified-ticket-indicator-spec.org]] (phase 1).
+Viewer-aware pushable-dirty count (=pearl--buffer-dirty-issue-count=), appended to =pearl--mode-line-lighter= as "N unsaved" while preserving =Pearl[account]=, cached buffer-locally with =force-mode-line-update=. Spec: [[file:docs/specs/modified-ticket-indicator-spec.org]] (phase 1).
** TODO [#B] Modified-ticket indicator: field-region highlight overlays :feature:
-=pearl-modified-highlight= (inherits =diff-changed=) painted over the changed field's region per the field-to-region map, with heading bubble-up and own-comment coverage, behind a single =pearl--redecorate-buffer= entry point. Spec: [[file:docs/modified-ticket-indicator-spec.org]] (phase 2).
+=pearl-modified-highlight= (inherits =diff-changed=) painted over the changed field's region per the field-to-region map, with heading bubble-up and own-comment coverage, behind a single =pearl--redecorate-buffer= entry point. Spec: [[file:docs/specs/modified-ticket-indicator-spec.org]] (phase 2).
** TODO [#B] Modified-ticket indicator: live recompute lifecycle :feature:
-Buffer-local after-change idle debounce, post-save recompute (read the scan, not the outcome), full-pass redecorate after render/merge/sort/regroup/open/mode-enable, timer + viewer-callback cleanup on disabled/killed buffers. Spec: [[file:docs/modified-ticket-indicator-spec.org]] (phase 3).
+Buffer-local after-change idle debounce, post-save recompute (read the scan, not the outcome), full-pass redecorate after render/merge/sort/regroup/open/mode-enable, timer + viewer-callback cleanup on disabled/killed buffers. Spec: [[file:docs/specs/modified-ticket-indicator-spec.org]] (phase 3).
** TODO [#B] Modified-ticket indicator: read-only + unknown comment treatment :feature:
-=pearl-modified-local= (muted highlight) for non-own dirty comments and =pearl-modified-unknown= for pre-viewer ones, via an async viewer classification pass; excluded from the count and bubble-up. Spec: [[file:docs/modified-ticket-indicator-spec.org]] (phase 4).
+=pearl-modified-local= (muted highlight) for non-own dirty comments and =pearl-modified-unknown= for pre-viewer ones, via an async viewer classification pass; excluded from the count and bubble-up. Spec: [[file:docs/specs/modified-ticket-indicator-spec.org]] (phase 4).
** TODO [#B] Modified-ticket indicator test surface :test:
-Count semantics, mode-line account integration, overlay idempotence, own-comment bubble-up, read-only/unknown behavior, save-clear vs conflict-persist, merge persistence, idle-trigger cleanup, customization toggles. Spec: [[file:docs/modified-ticket-indicator-spec.org]] (Test surface).
+Count semantics, mode-line account integration, overlay idempotence, own-comment bubble-up, read-only/unknown behavior, save-clear vs conflict-persist, merge persistence, idle-trigger cleanup, customization toggles. Spec: [[file:docs/specs/modified-ticket-indicator-spec.org]] (Test surface).
#+end_src
* Open questions (for Craig)
diff --git a/docs/multi-account-spec.org b/docs/specs/multi-account-spec.org
index f60adb1..f60adb1 100644
--- a/docs/multi-account-spec.org
+++ b/docs/specs/multi-account-spec.org
diff --git a/docs/multi-state-filter-spec.org b/docs/specs/multi-state-filter-spec.org
index 8bf6ac4..26475be 100644
--- a/docs/multi-state-filter-spec.org
+++ b/docs/specs/multi-state-filter-spec.org
@@ -113,16 +113,16 @@ None. =(:state "X")= entries keep working (a string still compiles to =state.nam
#+begin_src org
,** TODO [#B] Multi-state filter — compiler, reverse-compile, validator :feature:
-=:state= accepts a list (=state.name.in=); =pearl--rc-match-state= inverts =state.name.in= to a scalar (one) or list (many) and drops the multi-name refusal; =pearl--validate-issue-filter= validates =:state= as a string or a list of non-empty strings; a list-valued =:state= keeps precedence over =:state-type= / =:open=. Spec: [[file:docs/multi-state-filter-spec.org]] (phase 1).
+=:state= accepts a list (=state.name.in=); =pearl--rc-match-state= inverts =state.name.in= to a scalar (one) or list (many) and drops the multi-name refusal; =pearl--validate-issue-filter= validates =:state= as a string or a list of non-empty strings; a list-valued =:state= keeps precedence over =:state-type= / =:open=. Spec: [[file:docs/specs/multi-state-filter-spec.org]] (phase 1).
,** TODO [#B] Multi-state filter — builder multi-select :feature:
-The State prompt becomes =completing-read-multiple= with the =[ Any. ]= sentinel filtered out and one-to-string, many-to-list mapping. Spec: [[file:docs/multi-state-filter-spec.org]] (phase 2).
+The State prompt becomes =completing-read-multiple= with the =[ Any. ]= sentinel filtered out and one-to-string, many-to-list mapping. Spec: [[file:docs/specs/multi-state-filter-spec.org]] (phase 2).
,** TODO [#B] Multi-state filter — docs + boundary reconciliation :docs:
-README filter section + =:state= docstring document multi-state selection; the local/Linear views spec's reverse-compile dimension table, singular-vs-plural rule, refusal list, acceptance, and README copy-down paragraph add =state.name.in=[NAMES...] as a plural-capable exception; the named-states vNext item is ticked off. Lands with phase 1. Spec: [[file:docs/multi-state-filter-spec.org]] (phase 3).
+README filter section + =:state= docstring document multi-state selection; the local/Linear views spec's reverse-compile dimension table, singular-vs-plural rule, refusal list, acceptance, and README copy-down paragraph add =state.name.in=[NAMES...] as a plural-capable exception; the named-states vNext item is ticked off. Lands with phase 1. Spec: [[file:docs/specs/multi-state-filter-spec.org]] (phase 3).
,** TODO [#B] Multi-state filter — test surface :test:
-Unit: =(:state ("A" "B"))= → =state.name.in=, =(:state "A")= → =eq=, list keeps precedence over =:open=, validator accepts list / rejects empty-name; reverse-compile round-trip + direct =state.name.in= JSON fixtures (one→scalar, many→list); builder/assemble-filter one→string, many→list, sentinel→no key; source-header round-trip of =:filter (:state ("A" "B"))=. Integration: a local view with =(:state ("A" "B"))= runs the normal path. E2e/manual: build a two-state filter, run it, copy down a multi-named-state Linear view, confirm refresh preserves the =#+LINEAR-SOURCE= filter. Spec: [[file:docs/multi-state-filter-spec.org]] (Acceptance criteria).
+Unit: =(:state ("A" "B"))= → =state.name.in=, =(:state "A")= → =eq=, list keeps precedence over =:open=, validator accepts list / rejects empty-name; reverse-compile round-trip + direct =state.name.in= JSON fixtures (one→scalar, many→list); builder/assemble-filter one→string, many→list, sentinel→no key; source-header round-trip of =:filter (:state ("A" "B"))=. Integration: a local view with =(:state ("A" "B"))= runs the normal path. E2e/manual: build a two-state filter, run it, copy down a multi-named-state Linear view, confirm refresh preserves the =#+LINEAR-SOURCE= filter. Spec: [[file:docs/specs/multi-state-filter-spec.org]] (Acceptance criteria).
#+end_src
* Review dispositions
diff --git a/docs/refine-source-spec.org b/docs/specs/refine-source-spec.org
index 998a37d..998a37d 100644
--- a/docs/refine-source-spec.org
+++ b/docs/specs/refine-source-spec.org
diff --git a/docs/saved-query-sync-spec.org b/docs/specs/saved-query-sync-spec.org
index a17239e..a17239e 100644
--- a/docs/saved-query-sync-spec.org
+++ b/docs/specs/saved-query-sync-spec.org
diff --git a/docs/ticket-save-model-spec.org b/docs/specs/ticket-save-model-spec.org
index dd99add..dd99add 100644
--- a/docs/ticket-save-model-spec.org
+++ b/docs/specs/ticket-save-model-spec.org
diff --git a/docs/ticket-save-model-v2-spec.org b/docs/specs/ticket-save-model-v2-spec.org
index c16a0d8..c16a0d8 100644
--- a/docs/ticket-save-model-v2-spec.org
+++ b/docs/specs/ticket-save-model-v2-spec.org
diff --git a/docs/todo-keywords-from-workflow-states-spec.org b/docs/specs/todo-keywords-from-workflow-states-spec.org
index 81f296c..81f296c 100644
--- a/docs/todo-keywords-from-workflow-states-spec.org
+++ b/docs/specs/todo-keywords-from-workflow-states-spec.org