Skip to content

feat(DropdownMenu): touchOpen="press" opens the menu on a finger's press-down - #7240

Closed
vjeux wants to merge 3 commits into
meta:mainfrom
vjeux:menu-touch-press-open
Closed

vjeux wants to merge 3 commits into
meta:mainfrom
vjeux:menu-touch-press-open

Conversation

@vjeux

@vjeux vjeux commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

User need

A finger opens a DropdownMenu on the click after it lifts, or after a 500 ms hold: right for a trigger on a scroller. A trigger outside any scroller (a control in a fixed bar) could open on the press like an iOS pull-down button; instead it lags, and a finger cannot press and drag onto a row. Only the caller knows where the trigger sits.

Problem and solution fit

  • Primary: touchOpen?: 'tap' | 'press' on DropdownMenu, passed to a new useMenuPress option of the same name. With 'press' a finger's press-down opens the menu as a mouse press does; the settle rule and FR1–FR4 continue (a slide onto a row picks it; a tap leaves the menu open).
  • Supporting: the open is tentative until the finger enters the menu; if the browser takes the press first (pointercancel: a scroll, a pinch) the menu closes and the scroll proceeds. menuPressStep gains optional touchOpen and isTentative, and cancel() no longer steps the machine. The press is preventDefaulted (no compatibility mousedown stealing focus); the existing invoker hold keeps the lift from light-dismissing the menu.

Current specification

module:DropdownMenu/useMenuPress is current for FR1–FR7; its trigger half (FR8, FR9, DEC-4) is proposed under OQ1. This PR amends proposed FR9 and adds proposed DEC-8, a concept row, and a line in component:DropdownMenu FR8 (draft). The one owner decision: admitting touchOpen (DEC-8), on the OQ1 ruling.

Public delta and caller burden

  • DropdownMenu and useMenuPress: touchOpen, default 'tap' (today's behavior); bottom-sheet presentation ignores it. menuPressStep: two optional fields.
  • The caller decides whether the trigger sits outside any scroller; for a drag from it to pick a row, the trigger refuses panning with touch-action: pinch-zoom (none would also block page zoom).
<DropdownMenu touchOpen="press" button={{label: 'Spaces', xstyle: styles.ownsTouch}}>...</DropdownMenu>

Design and alternatives

Rejected (DEC-8): holding the page still from the press, which blocks scrolls; a movement threshold of the model's own, which closes the menu on the drag to its rows. The browser decides what a scroll is (FR4).

Evidence

  • 17 new jsdom cases: 13 fail on main, 4 pin unchanged paths.
  • Real Chromium, 390×844, CDP touch, new story: the press opens the menu before the lift, the tap keeps it open; press, slide, lift picks the row once; a scroll starting on a panning trigger scrolls and closes the menu. All three fail on main (no open within 250 ms).

Writing rubric results

R1 narration: none. R2 research: none. R3 evidence: FR9 cites DEC-4, DEC-8, tests. R4 rejected alternatives: one line in DEC-8. R5 change references: none. R6 open questions: OQ1 unanswered; one sentence ties DEC-8 to it.

Scope

  • One capability is added.
  • Unrelated fixes, cleanup, and policy changes were removed or split.
  • Consumer docs, focused tests, and migration evidence ship with the feature.
  • Public text and artifacts contain no internal Meta context.

Testing

  • Review round (e48a755): the settle effect's JSDoc in menuPressGesture.ts said dismiss means a mouse released outside the menu; it now also names the press-open the browser takes for a scroll or pinch, which settles with dismiss true. Comment only; typecheck, eslint (strict), the menuPressGesture and useMenuPress suites (66 tests) pass.

  • Review round (rebased onto main c743ae0, 166c0ce): the changeset, both touchOpen JSDocs and both docs offered touch-action: none for a press-open trigger; none also blocks a page pinch-zoom that starts on it, so they now say pinch-zoom, as the TouchOpenPress story declares. The dense docs said onDismiss is never called for a finger; with touchOpen: 'press' it is, when the browser takes the press for a scroll or pinch, and the dense block now names touchOpen. A new Chromium case on a phone pins the story trigger at pinch-zoom and pinches from it: the page zooms (scale 5); set to none, the case fails and the scale stays 1. DropdownMenu, ContextMenu, hooks, Selector and CLI suites: 1482 tests; menu press and menu hover focus Chromium specs: 24; typecheck, eslint (strict), check:knowledge and the Storybook build pass.

  • Rebased onto main cab6e90, no conflicts or changes: main's new pr-a11y TopNav step runs a spec file the previous head predates. The record is unchanged: DEC-8 and the FR9 press clause stay proposed, because OQ1 asks the module owner to rule on the trigger model they rest on. DropdownMenu, ContextMenu, menuPressGesture, useMenuPress and doc-prop suites: 451 tests; typecheck, check:knowledge: clean.

  • Rebased onto main b7860bc after feat(DropdownMenuSubMenu): header and footer around a sub-menu's rows #7530 merged, as one commit; the useMenuPress record conflict keeps both verification rows (this FR9 press row beside feat(DropdownMenuSubMenu): header and footer around a sub-menu's rows #7530's ORD1a). No other change. DropdownMenu, ContextMenu, useMenuPress, menuPressGesture and doc-prop suites: 419 + 65 tests; MenuPress Chromium spec: 16; typecheck, lint:strict, check:knowledge, Storybook build: clean.

  • Review round 3: the touchOpen JSDoc in useMenuPress.ts now carries the same touch-action: none / pinch-zoom condition as the changeset and the option docs (comment only; pre-commit lint and repo checks pass).

Rebased onto main 22c592a7a5 (one commit; only the FR8 cell met main's newer rows):
  vitest DropdownMenu, ContextMenu, Selector, hooks, docProp*   Tests 1114 passed
  playwright DropdownMenu/__tests__ --project=chromium   60 passed
  typecheck, lint:strict, check:knowledge, storybook:build   ✓
  red on main: `MenuPress.a11y.chromium.spec.ts` against a `main` build: 3 failed (the touchOpen="press" cases), 13 passed

# rebased onto main ddb8aa12ce; every result below is from that head
pnpm exec vitest run packages/core/src/hooks/menuPressGesture.test.ts packages/core/src/hooks/useMenuPress.test.tsx \
  packages/core/src/DropdownMenu/DropdownMenu.test.tsx -t "touchOpen"
  main's menuPressGesture.ts, useMenuPress.ts, DropdownMenu.tsx: 13 failed, 4 passed · with the change: 17 passed

pnpm exec vitest run packages/core/src/DropdownMenu packages/core/src/ContextMenu packages/core/src/Selector \
  packages/core/src/hooks/useMenuPress.test.tsx packages/core/src/hooks/menuPressGesture.test.ts \
  packages/core/src/hooks/useLongPress.test.tsx packages/core/src/docPropLiterals.test.ts \
  packages/core/src/docPropReferences.test.ts packages/core/src/utils/pressableCoverage.test.ts --maxWorkers=4
  Test Files  14 passed (14)   Tests  601 passed (601)

pnpm storybook:build   (this branch, and the branch with main's three component files)
ASTRYX_STORYBOOK_DIR=<main components build> pnpm exec playwright test \
  packages/core/src/DropdownMenu/__tests__/MenuPress.a11y.chromium.spec.ts --project=chromium -g touchOpen
  3 failed   (no open within 250 ms of the press: Expected true, Received false)
pnpm exec playwright test packages/core/src/DropdownMenu/__tests__/MenuPress.a11y.chromium.spec.ts --project=chromium
  15 passed (17.5s)
  ... -g touchOpen --repeat-each=3   9 passed (12.2s)

pnpm -F @astryxdesign/core typecheck      ✓
pnpm exec eslint (DropdownMenu, the press-model hooks and tests, the story)   ✓ 0 problems
pnpm check:knowledge                      ✓ Knowledge templates and records are aligned.
node scripts/check-changesets.mjs         ✓
node scripts/check-sync.js                ✓

Not run on WebKit here (it cannot launch on this machine).

@vercel

vercel Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
astryx Ready Ready Preview Oct 24, 2026 10:37pm UTC

Request Review

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Meta Open Source bot. label Oct 9, 2026
@astracat-bot

astracat-bot Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

AI review status for this pull request.

Review status Updated
❓ Needs maintainer input (for maintainers only) Oct 24, 2026, 11:37 PM UTC

@github-actions github-actions Bot added the needs:spec-owner-review Current knowledge records await owner approval label Oct 9, 2026

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change is waiting on a maintainer spec decision before it can be approved.

touchOpen="press" is a well-contained opt-in: the default behavior is unchanged, the press reuses the existing settle and drag-to-pick mechanics, the tentative open correctly withdraws when the browser takes the press for a scroll, and the new cases pass alongside the surrounding press-model suites. No code changes are being requested here.

What is missing is governing spec authority for the addition itself. The claims it rests on — proposed FR9 as amended and new proposed DEC-8 in module:DropdownMenu/useMenuPress — depend on the still-unanswered OQ1 ruling on whether press-to-open is the menu trigger model. Approval needs a maintainer to provide or identify the governing spec admitting finger press-open on a trigger that opts in because it sits outside any scrolling region, including the tentative open that closes again if the browser takes the press for a scroll before the finger reaches the menu.

Once that ruling exists, this review found no other blocker: the scope is one cohesive capability, existing callers and other menu surfaces keep today's behavior, and bottom-sheet presentation is unaffected.

[Automated review]

@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

PR Analysis Report

📚 Storybook Preview

View Storybook for this PR

🧪 Sandbox Preview

View Sandbox for this PR

No new or modified components detected.

Bundle Size Summary

Gzip figures measure each package's entry file, not the code an import pulls in.

Package Entry (ESM) Entry gzip before Entry gzip after Delta
@astryxdesign/core 4.9KB 1.2KB 1.2KB 0B

Accessibility Audit

Status: No accessibility violations detected.

Visual Regression

46 of 502 shot(s) changed.

A change here is a question, not a failure: check whether the after is the
picture you intended. Record that review on the PR. Baseline maintenance is an
explicit dispatch of CI; this report never rewrites the baseline or adds a release gate.

component story theme mode pixels
Selector Indicator Space Bottom Sheet Narrow End RTL neutral light 753,933
Selector Indicator Space Bottom Sheet Wide Start neutral light 740,072
RichTextEditor Markdown parity: side by side probe dark 556,900
RichTextEditor Markdown parity: side by side probe light 538,816
Chat Full AI Chat probe light 230,823
Chat Full AI Chat probe dark 229,805
Collapsible Dividers probe dark 66,445
Collapsible Dividers probe light 66,445
Chat Default neutral dark 36,304
Chat Default neutral light 35,767
Chat Empty State probe light 23,531
Chat Empty State probe dark 22,622
ChatAutoScroll Scroll Behavior Comparison neutral dark 15,378
ChatAutoScroll Scroll Behavior Comparison neutral light 14,107
Chat With Attachments probe light 13,406
Chat With Attachments probe dark 11,232
ProgressBar With Target Mark probe dark 7,895
ProgressBar With Target Mark probe light 7,895
Markdown Default neutral dark 7,573
Markdown Default neutral light 7,566

and 26 more.


Generated by PR Enrichment workflow | Storybook | Sandbox | View full report

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change is waiting on a maintainer spec decision before it can be approved.

touchOpen="press" is a well-contained opt-in: the default behavior is unchanged, the press reuses the existing settle and drag-to-pick mechanics, the tentative open correctly withdraws when the browser takes the press for a scroll, and the new cases pass alongside the surrounding press-model suites in this review. No code changes are being requested here.

What is missing is governing spec authority for the addition itself. The claims it rests on — proposed FR9 as amended and new proposed DEC-8 in module:DropdownMenu/useMenuPress — depend on the still-unanswered OQ1 ruling on whether press-to-open is the menu trigger model. Approval needs a maintainer to provide or identify the governing spec admitting finger press-open on a trigger that opts in because it sits outside any scrolling region, including the tentative open that closes again if the browser takes the press for a scroll before the finger reaches the menu.

Once that ruling exists, this review found no other blocker: the scope is one cohesive capability, existing callers and other menu surfaces keep today's behavior, and bottom-sheet presentation is unaffected. This review reran the jsdom suites; the real-Chromium touch results recorded on the PR were not rerun here.

[Automated review]

@adzruladzman988-cell adzruladzman988-cell left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

    • ARIANNA JOY - Resume _ Actors Access.pdf

@vjeux

vjeux commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

/approve-spec 6cd4056

@github-actions github-actions Bot removed the needs:spec-owner-review Current knowledge records await owner approval label Oct 11, 2026
@vjeux
vjeux force-pushed the menu-touch-press-open branch from 6cd4056 to 3b6c68a Compare October 11, 2026 17:59
@github-actions github-actions Bot added the needs:spec-owner-review Current knowledge records await owner approval label Oct 11, 2026
@vjeux

vjeux commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

/approve-spec 3b6c68a

@github-actions github-actions Bot removed the needs:spec-owner-review Current knowledge records await owner approval label Oct 11, 2026

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change is waiting on a maintainer spec decision; no code changes are requested. touchOpen="press" is opt-in, keeps today's tap behavior by default, and its new cases pass along with the surrounding menu press-model suites. But no current spec admits it yet: proposed DEC-8 and the amended FR9 in module:DropdownMenu/useMenuPress rest on the still-open OQ1 (whether press-to-open is the menu trigger model), and the passing spec-owner check approves those record edits only as written, which still mark them "proposed; pending owner review". Approval needs a maintainer to rule on OQ1 and record DEC-8 and the FR9 press clause as governing spec (a finger's press-down open, and the tentative open that closes again when the browser takes the press for a scroll, plus the touchOpen prop on DropdownMenu), or to identify an existing current claim that already admits them.

[Automated review]

@vjeux
vjeux force-pushed the menu-touch-press-open branch from 3b6c68a to eea5ea8 Compare October 11, 2026 21:36
@vjeux

vjeux commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

/approve-spec eea5ea8

@vjeux

vjeux commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

metadata-only rewrite: commit author identity; tree unchanged

The new head eea5ea8 has the same tree as the previous head 3b6c68a (294e934a23).

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change is waiting on a maintainer spec decision; no code changes are requested. touchOpen="press" is opt-in, keeps today's tap behavior by default, and its new tests pass alongside the existing menu press-model suites. No current spec admits it yet: proposed DEC-8 and the amended FR9 press clause in module:DropdownMenu/useMenuPress rest on the still-open OQ1, the record text approved for this revision still marks them "proposed; pending owner review", and the DropdownMenu component record is a draft. Approval needs a maintainer to rule on OQ1 for a finger's press-down open on an opted-in trigger (including the tentative open that closes again when the browser takes the press for a scroll, and the touchOpen prop) and record that ruling in the module record, or to identify an existing current claim that already admits it.

[Automated review]

@vjeux
vjeux force-pushed the menu-touch-press-open branch from eea5ea8 to 4345f00 Compare October 12, 2026 00:36
@vjeux

vjeux commented Oct 12, 2026

Copy link
Copy Markdown
Contributor Author

/approve-spec 4345f00

@github-actions github-actions Bot added the needs:spec-owner-review Current knowledge records await owner approval label Oct 21, 2026

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is waiting on a maintainer spec decision; no code change is requested. touchOpen="press" is opt-in and keeps today's tap as the default, and in real Chromium a finger's press opens the menu, a press-slide-lift picks a row once, and a scroll that starts on a panning trigger closes the menu again. Approval needs the module owner to rule on OQ1 in useMenuPress.spec.md, admitting or rejecting DEC-8 and the FR9 press clause (including the withdrawn open and drag-to-pick's touch-action condition), to record that ruling as current, and to approve the resulting head, because this rebased head has no spec-owner approval.

[Automated review]

vjeux added 2 commits October 24, 2026 14:36
…ess-down

A finger opened a DropdownMenu on the tap's click or after the long-press
delay; nothing let a trigger outside a scroller open on the press, as a
mouse press does. touchOpen="press" (a useMenuPress option of the same
name) opens the menu on the finger's press-down; the settle rule and
FR1-FR4 continue from the press, so a slide onto a row picks it. The open
is tentative until the finger enters the menu: if the browser takes the
press first (pointercancel: a scroll, a pinch), the menu closes again, and
no touchmove preventer is installed, so a scroll that starts on the
trigger still scrolls.

Rebased onto main after meta#7530 as one commit; review rounds are folded in
unchanged.
…m, never none

Two findings from the stack that builds on touchOpen. The changeset, the touchOpen JSDoc on DropdownMenu and useMenuPress, and both docs offered touch-action none or pinch-zoom for a trigger whose press should slide onto a row. none also blocks a page pinch-zoom that starts on the trigger; pinch-zoom keeps a one-finger pan from starting there, which is all the slide needs, and is what the TouchOpenPress story declares. They now recommend pinch-zoom and say why none is wrong. The dense docs said useMenuPress never calls onDismiss for a finger, but with touchOpen 'press' it does when the browser takes the finger's press for a scroll or a pinch before it reaches the menu; that line now says so, and the dense block names touchOpen. A Chromium case on a phone pins the story trigger's touch-action at pinch-zoom and pinches from it: the page zooms (scale 5); with the story set to none it fails, and a pinch from that trigger leaves the scale at 1.

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is waiting on a spec decision; no code change is needed for it. touchOpen="press" keeps today's tap as the default, and on this head a finger's press opens the menu, a press-slide-lift picks a row once, and a pan that starts on a panning trigger closes the menu again, in jsdom and in real Chromium. No current spec admits it yet: DEC-8 and the FR9 press clause in useMenuPress.spec.md, and the FR8 sentence in DropdownMenu.spec.md, are proposed. So an engineering owner needs to admit or reject the press-open, including that a press the browser cancels still fires onClick and onOpenChange(true) before closing and that drag-to-pick needs touch-action: pinch-zoom on the trigger, record that decision in the module record, and approve the resulting head by commenting /approve-spec <full head SHA> (the author may do so as an engineering owner). Either way, the MenuPressEffect JSDoc in menuPressGesture.ts should also say that a cancelled tentative open sets dismiss.

[Automated review]

…ss-open

menuPressStep is exported, and with touchOpen 'press' a cancel before the finger reaches the menu settles with dismiss true, but the settle effect's JSDoc still said dismiss means a mouse released outside the menu. It now names both causes. Comment only.

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is waiting on a spec decision; no code change is needed for it. touchOpen="press" keeps today's tap as the default, and on this head a finger's press opens the menu, a press-slide-lift picks a row, and a pan that starts on a panning trigger closes the menu again, in jsdom and in real Chromium. No current spec admits the press-open yet: DEC-8 and the FR9 press clause in useMenuPress.spec.md, and the FR8 sentence in DropdownMenu.spec.md, are still proposed, so an engineering owner needs to admit or reject it (or identify a current claim that already covers it), including that a press the browser cancels still fires onClick and onOpenChange(true) and moves focus to the trigger, and that drag-to-pick needs touch-action: pinch-zoom on the trigger. If it is admitted, record that decision as current in the module record and approve the resulting head by commenting /approve-spec <full head SHA> (the author may do so as an engineering owner).

[Automated review]

@cixzhang

cixzhang commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Posted by Cindy's agent on her behalf.

Requested change before approval: align with the touch gestures spec instead of adding a prop.

  • Drop the new touchOpen="press" prop.
  • Follow spec:AST-094 DEC-1/FR11: under a coarse pointer, DropdownMenu opens on press by default (press, slide, release), except where the trigger sits inside a scroll view and AST-094 says otherwise.
  • Callers who need today's behavior use the existing presentation pin (architecture:public-component-api INV16), not a new prop.
  • If the component truly can't tell that its trigger is inside a scroller, please raise that here as a spec question.

The menu PRs stacked on this one inherit the same change.

vjeux added a commit to vjeux/astryx that referenced this pull request Oct 25, 2026
…esses (spec:AST-094 FR29)

Under DropdownMenu's touch modes, a finger on a trigger in a fixed bar opens
the menu as it presses, and inside a scroll view once the 150 ms
content-touch delay has passed with no scroll (a scroll that starts first
takes the touch; 13 px of drift is allowed before the open). The finger that
opened the menu picks a row only after moving 10 px (UIMenu's handoff), so a
menu that appears under a resting finger never picks the row beneath it.
DropdownMenu resolves its presentation through usePresentation: the touch
modes are the default under a finger, and presentation="popover" pins the
pointer behavior, a tap's click open, the 500 ms hold and the settle rule
(spec:AST-094 FR25).

useMenuPress gains touchModel ('pointer' by default, 'uikit' for this
trigger); longPressDelayMs keeps its released meaning and 500 ms default
under the pointer model. The menu table registers through registerMenuTable(),
called by the menu's touch module; nothing registers on import.

Carries, from meta#7240 (by its owner): the settle-rule JSDoc and the dense-docs
onDismiss line. Its touchOpen prop and tentative open are not taken.
@vjeux

vjeux commented Oct 25, 2026

Copy link
Copy Markdown
Contributor Author

Agreed: closing in favor of #8078. A finger now opens a menu as it presses on a trigger in a fixed bar, and after the 150 ms content-touch delay inside a scroll view, as the touch default per spec:AST-094 FR29 (#8316), with no touchOpen prop; presentation="popover" keeps today's tap and 500 ms hold. #8078 carries the pieces of this pull request its model uses.

@vjeux vjeux closed this Oct 25, 2026
@vjeux
vjeux deleted the menu-touch-press-open branch October 25, 2026 05:03
vjeux added a commit to vjeux/astryx that referenced this pull request Oct 25, 2026
…esses (spec:AST-094 FR29)

Under DropdownMenu's touch modes, a finger on a trigger in a fixed bar opens
the menu as it presses, and inside a scroll view once the 150 ms
content-touch delay has passed with no scroll (a scroll that starts first
takes the touch; 13 px of drift is allowed before the open). The finger that
opened the menu picks a row only after moving 10 px (UIMenu's handoff), so a
menu that appears under a resting finger never picks the row beneath it.
DropdownMenu resolves its presentation through usePresentation: the touch
modes are the default under a finger, and presentation="popover" pins the
pointer behavior, a tap's click open, the 500 ms hold and the settle rule
(spec:AST-094 FR25).

useMenuPress gains touchModel ('pointer' by default, 'uikit' for this
trigger); longPressDelayMs keeps its released meaning and 500 ms default
under the pointer model. The menu table registers through registerMenuTable(),
called by the menu's touch module; nothing registers on import.

Carries, from meta#7240 (by its owner): the settle-rule JSDoc and the dense-docs
onDismiss line. Its touchOpen prop and tentative open are not taken.

This branch was successfully deployed

1 active deployment
Preview — e48a7553 Deployed Oct 24, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Meta Open Source bot. needs:spec-owner-review Current knowledge records await owner approval

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants