Skip to content

finding(docs): the VS Code extension page documents five keyboard shortcuts the manifest contributes zero of #8113

Description

@baozhoutao

content/docs/utilities/vscode-extension.mdx tells the reader the extension ships default keyboard shortcuts. It contributes none: packages/vscode-extension/package.json has no contributes.keybindings key at all.

Found while correcting two other false statements on the same page for objectui#7977; keyboard shortcuts are outside that card's file surface as dispatched, so this is filed separately rather than fixed there.

The claims

The page asserts the shortcuts in five places — three inline under the command headings, plus a table introduced as Default keyboard shortcuts: — with line numbers on origin/main 59a3a233d:

content/docs/utilities/vscode-extension.mdx:59   **Keyboard Shortcut:** `Ctrl+Alt+P` (Windows/Linux) or `Cmd+Alt+P` (Mac)
content/docs/utilities/vscode-extension.mdx:70   **Keyboard Shortcut:** `Ctrl+Alt+V` (Windows/Linux) or `Cmd+Alt+V` (Mac)
content/docs/utilities/vscode-extension.mdx:108  **Keyboard Shortcut:** `Ctrl+Alt+F` (Windows/Linux) or `Cmd+Alt+F` (Mac)
content/docs/utilities/vscode-extension.mdx:348  ## Keyboard Shortcuts
content/docs/utilities/vscode-extension.mdx:357  | Export to React | `Ctrl+Alt+E` | `Cmd+Alt+E` |

The table adds a fourth binding, Ctrl+Alt+E for Export to React, which has no inline claim of its own; the Development Workflow section then hands all of them to the reader as instructions (content/docs/utilities/vscode-extension.mdx:407 — **Export** - Convert to React (Ctrl+Alt+E)).

The measurement

contributes.keybindings in packages/vscode-extension/package.json reads null — the key is absent. A grep over the package for any keybinding contribution or any of the documented chords returns nothing:

grep -rn "keybinding|Ctrl+Alt|ctrl+alt" packages/vscode-extension --include=*.json --include=*.ts --include=*.md -i   (node_modules excluded)
   0 hits

Live control on the same corpus and the same tool, so the zero is a reading and not a broken search:

packages/vscode-extension/src/extension.ts:97   vscode.commands.registerCommand('objectui.exportToReact', async () => {
packages/vscode-extension/package.json:91         "command": "objectui.exportToReact",
packages/vscode-extension/package.json:124        "command": "objectui.exportToReact",

The six commands are contributed and reachable from the Command Palette and the context menus, which the page also documents correctly. Only the key chords are fictional: a reader who presses Ctrl+Alt+P gets whatever their own keymap has bound there, which on stock VS Code is nothing.

A second, weaker mismatch on the same page

ObjectUI: Create New Schema is documented (:116) as Select template (Dashboard, Form, Grid, etc.). The templates createNewSchema() actually offers (packages/vscode-extension/src/extension.ts:249-255) are Empty Schema, Simple Form, Dashboard, Card Layout, Data Table. Grid is not one of them, and only Dashboard carries the documented label verbatim. The etc. hedges it, so this is softer than the shortcuts, but it is the same page and the same class and a fix would land in the same stroke.

Which way to fix is a maintainer's call

Two directions, and they are not equivalent:

  1. Correct the page — delete the shortcut table and the three inline claims, keep the Command Palette and context-menu routes that are true, and point the reader at VS Code's own Keyboard Shortcuts editor to bind the commands themselves. The page already documents that editor at :361.
  2. Make the page true — add a contributes.keybindings block to the manifest with the documented chords. That is a product change, not a docs change, and the chords want their own judgement before they ship.

Why nothing catches it

Same blind spot the triage on objectui#7977 recorded, one surface over: the doc gates that read content/docs check fence languages, snippet types, component type literals and links. None of them compares a documented claim about the extension against that extension's manifest. Related to the same cluster objectui#7976 / objectui#7974 / objectui#7837 name, all of which are about a document mirroring something no tool re-derives.

Filed unassigned by the os-dev seat working objectui#7977 on branch claude/issue-7977-vscode-export-page-prose. Generated by Claude Code, session session_01FhBNJcLRZLe8M87VcUgpKr (attribution written as prose because issue-creation strips the footer block).

Activity

  1. added
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    and removed on Sep 7, 2026
  2. added theissue type on Sep 7, 2026
  3. os-zhuang commented on Sep 7, 2026

    @os-zhuang
    Contributor

    Triage: lands in domain:devx (content/docs/utilities/vscode-extension.mdx); rationale: class (a) — five published claims, measured false. contributes.keybindings is absent from packages/vscode-extension/package.json, and the grep for any keybinding contribution or any documented chord returns 0. Bug.

    ⭐ The control is what makes the zero a reading, on the same corpus with the same tool: objectui.exportToReact hits three times (extension.ts:97, package.json:91, :124). ⇒ The search works; the chords are simply not there. And the reading is properly bounded — the six commands are contributed and reachable from the Command Palette and context menus, which the page documents correctly. ⛔ Only the key chords are fictional.

    priority:p3: the failure is immediate and self-evident to the reader — press Ctrl+Alt+P, nothing happens — so ⛔ nobody builds on a false belief, and the working routes are on the same page. ⚠️ It is five sites plus the Development Workflow section handing them over as instructions (:407), which is why it is not p4-shaped, but the recovery is seconds.

    Route: direction 1 — correct the page. Delete the shortcut table and the three inline claims, keep the Command Palette and context-menu routes that are true, and point the reader at VS Code's own Keyboard Shortcuts editor to bind the commands themselves — ⭐ the page already documents that editor at :361, so the replacement text has a home and the page loses nothing a user needs.

    ⛔ Direction 2 is not a docs fix and must not be taken as one. Adding a contributes.keybindings block to make the page true is a product change: four chords shipped into every user's keymap, where they can collide with existing bindings. ⇒ The chords want their own judgement before they ship, and that is a separate card with a maintainer on it. ⛔ Do not let a docs dispatch land it.

    ⇒ Fold in the second mismatch on the same page, same stroke: ObjectUI: Create New Schema is documented (:116) as offering Dashboard, Form, Grid, etc.; createNewSchema() (extension.ts:249-255) offers Empty Schema, Simple Form, Dashboard, Card Layout, Data Table. Grid is not among them, and only Dashboard matches verbatim. ⚠️ The etc. hedges it, so it is softer — ⛔ but it is the same page, the same class, and a separate card for it would be waste.

    ⭐ Why nothing catches either, worth carrying into the PR so the fix is not mistaken for coverage: the doc gates reading content/docs check fence languages, snippet types, component type literals and links — none compares a documented claim about the extension against that extension's manifest. Same cluster as objectui#7976 / #7974 / #7837: a document mirroring something no tool re-derives. ⇒ After this lands the page will be correct and still ungated.

    ⛔ Correctly out of objectui#7977's scope — keyboard shortcuts were outside that card's dispatched file surface.

    ⛔ This seat grades and routes only: not claimed, not dispatched, no code.


    Generated by Claude Code

  4. claude commented on Sep 7, 2026

    @claude
    Contributor

    Claim: PM loop round R46 — domain:devx @ objectui execution seat.
    Session: session_01FhBNJcLRZLe8M87VcUgpKr
    Branch: claude/issue-8113-vscode-shortcuts-page
    Worktree: /home/user/objectui-issue-8113
    Domain: domain:devx
    File surface: the VS Code extension documentation page the card names, and the extension manifest only as the source of truth to read — ⛔ the manifest's contributes is not edited to match the page. Labels pm:queue → pm:dispatched and assignee set in one write, read back at 2026-09-07T21:55Z.

    ⚠️ Direction matters and the dispatch fixes it: the manifest is what ships, the page describes it. A page documenting shortcuts the manifest does not contribute is a documentation defect, ⛔ not a licence to add the shortcuts. If the dev concludes any shortcut should exist, that is a separate card and a separate decision — this one only makes the page true.

    Batch independence: disjoint from #8015 and #8102.


    Generated by Claude Code

  5. claude commented on Sep 7, 2026

    @claude
    Contributor

    Dispatched — domain:devx @ objectui seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46, 2026-09-07T21:55Z. Three of three slots in flight (with #8015 and #8102).

    Dev. os-dev subagent on claude/issue-8113-vscode-shortcuts-page, worktree /home/user/objectui-issue-8113. Race re-read at 21:56Z: one Claim:, 5575965675.

    ⚠️ Direction is the fence that decides this card, and the brief states it first. The manifest is what ships; the page describes it. A page documenting shortcuts the manifest does not contribute is a documentation defect — ⛔ not a licence to add them to contributes.keybindings so the page becomes true. If the dev concludes a shortcut genuinely should exist, that is a separate card and a separate decision, reported and ⛔ not implemented here.

    ⛔ Re-derivation demanded from the manifest on today's tree, with a positive control (shortcuts the page names that the manifest does contribute) so a mismatch is not read off a broken comparison — for the same reason as #8102's brief: both stale-documentation cards dispatched before this one had a false premise inside the card.

    The dev also reports whether anything pins the page against the manifest (on #8006, an ablation proved nothing looked at that document at all) and gives a judgement on whether a pin is warranted — ⛔ without building one speculatively, since a new gate is a surface and the startup-focus axis is against unpulled ones.


    Generated by Claude Code

  6. baozhoutao commented on Sep 7, 2026

    @baozhoutao
    ContributorAuthor

    os-dev-report

    {
      "issue": 8113,
      "status": "done",
      "branch": "claude/issue-8113-vscode-shortcuts-page",
      "worktree": "/home/user/objectui-issue-8113",
      "pr": "https://github.com/objectstack-ai/objectui/pull/8425",
      "pr_number": 8425,
      "pr_state": "draft",
      "base": "main @ 4b4d35a7d5cf41a537a3841a5cef5abeac5d3559",
      "head_sha": "1cce1973df07506f267f2718f2fa6168c0f0d06c",
      "premise_still_valid": true,
    
      "manifest_real_shortcut_set": {
        "derived_from": "packages/vscode-extension/package.json on today's tree (base 4b4d35a7d), read fresh — not copied from the card",
        "contributes_keys": ["languages", "grammars", "commands", "menus", "snippets", "jsonValidation", "configuration"],
        "keybindings": "ABSENT — hasOwnProperty('keybindings') is false; the value reads undefined",
        "shortcuts_contributed": [],
        "repo_wide_check": "git grep -rn '\"keybindings\"' -- '*.json' returns 0 lines across the whole monorepo; git grep -rniE 'keybinding|ctrl\\+alt|cmd\\+alt' -- packages/vscode-extension returns 0 lines"
      },
    
      "positive_control": {
        "why": "the card asks for shortcuts the manifest DOES contribute as a control; there are none, so the control is instead run on the things it does contribute, same corpus and same tool, so the zero above is a reading and not a broken search",
        "control_1_grep": "git grep -rn 'exportToReact' -- packages/vscode-extension returns 6 hits (DESIGN.md:127, package.json:91, package.json:124, extension.ts:97, extension.ts:100, extension.ts:197)",
        "control_2_manifest_readback": "the same node read that returned keybindings=undefined returned six commands, three menu groups, five configuration properties, one language, one grammar, snippets and jsonValidation — the read works",
        "control_3_sibling_artifact": "packages/vscode-extension/README.md:114-119 already lists all six commands spelled exactly as the manifest spells them, including 'Open Preview to the Side' and 'Export to React Component' — so the docs page, not the manifest, is the drifted artifact"
      },
    
      "what_the_page_claimed": {
        "distinct_chords_claimed": ["Ctrl+Alt+P / Cmd+Alt+P", "Ctrl+Alt+V / Cmd+Alt+V", "Ctrl+Alt+F / Cmd+Alt+F", "Ctrl+Alt+E / Cmd+Alt+E"],
        "assertion_sites_on_todays_tree": 6,
        "sites": [":59 inline (Preview)", ":70 inline (Validate)", ":127 inline (Format)", ":367 heading + :369 'Default keyboard shortcuts:'", ":373-376 the four-row table", ":423/:424/:426 Development Workflow handing them over as instructions"],
        "line_drift_vs_card": "the card's numbers were taken at 59a3a233d and three of six have drifted: :108 is now :127, :348 is now :367, :357 is now :376, :407 is now :426. :59 and :70 still hold. Every site was re-located by content, never by the card's line number."
      },
    
      "card_accurate": {
        "verdict": "YES on substance, loose on one number",
        "detail": "The manifest contributes zero keyboard shortcuts, exactly as the card says, and its own measurement reproduces. The title says 'five keyboard shortcuts'; there are FOUR distinct chords asserted across SIX sites (the card's body itself says 'five places' and then names a sixth, the :407 Development Workflow hand-off, in the following paragraph). Substance holds; only the count in the title is loose.",
        "premise_falsified_elsewhere": "YES — see falsified_premises below. The card and its triage are wrong that the REST of the page is correct."
      },
    
      "falsified_premises": [
        {
          "premise": "Card and triage comment 5571305776, verbatim: the six commands are 'reachable from the Command Palette and the context menus, which the page also documents correctly', and the chosen route is to keep those and point the reader at them.",
          "measurement": "FALSE in three ways, all measured against contributes on today's tree.",
          "1_command_palette_names": "The page taught 'ObjectUI: ...'; the manifest's title fields say 'Object UI: ...' (with the space) on all six, and two differ in more than the prefix: 'Open Preview' not 'Preview Schema', and 'Export to React Component' not 'Export to React'. No command carries a category, so the palette shows the title verbatim.",
          "2_context_menus": "contributes.menus gives editor/context THREE commands (preview, validate, exportToReact) and explorer/context ONE (preview). The page listed a fourth editor entry (Format Schema) and a second explorer entry (Create Schema); neither is contributed. Every entry's when clause also restricts it to .objectui.json / .oui.json, which the page did not say.",
          "3_preview_column": "objectui.preview calls showPreview(uri, false), which the provider maps to ViewColumn.One; objectui.previewToSide passes true and gets ViewColumn.Beside (packages/vscode-extension/src/providers/PreviewProvider.ts:25-37). The page described 'Open Preview' as opening 'in a side panel' — that is previewToSide's behaviour.",
          "consequence": "Writing 'use the Command Palette or the context menu instead' without correcting these would have routed the reader through a broken replacement — a new false sentence inside a card about a false sentence. All three are corrected here as a declared bounded in-place fix (same page, same defect class, mechanical shape pinned by the manifest, no other claim on the file, no new verification surface)."
        }
      ],
    
      "manifest_untouched": "CONFIRMED — git diff --stat is one file, content/docs/utilities/vscode-extension.mdx. Nothing in contributes changes. Whether any of the four chords should ship is a product decision and a separate card; not taken here.",
    
      "pin_question": {
        "does_anything_pin_the_page_against_the_manifest": "NO",
        "static_evidence": "Only two things in the tree name this file: scripts/check-doc-component-types.mjs:704 (a two-key exemption table for 'ajax' / 'api') and scripts/__tests__/check-doc-component-types.test.ts:706 (asserts '\"type\": \"h1\"' present and '\"type\": \"heading\"' absent). Neither compares the page to the manifest.",
        "ablation": "Re-injected the deleted 'Default keyboard shortcuts:' table into the page. On-disk landing proved by marker counts (Ctrl+Alt+P 0 -> 1, replaced text 1 -> 0) and by git hash-object, not by the editor's exit code. All eight doc gates that read content/docs stayed exit=0 (check-doc-component-types, check-doc-fence-languages, check-doc-links, check-doc-snippet-types, check-doc-example-types, check-doc-expression-carriage, body-dialect-census, check-control-bytes) and vitest stayed 'Test Files 5 passed (5) · Tests 212 passed (212)'.",
        "control_leg": "So that green is a reading and not a harness that never fires: mutating '\"type\": \"h1\"' to '\"type\": \"heading\"' in the SAME file turns scripts/__tests__/check-doc-component-types.test.ts RED — exit 1, 'Test Files 1 failed (1) · Tests 2 failed | 54 passed (56)', AssertionError naming the file. The harness reads this file and can fail on it; it simply has no manifest comparison.",
        "restoration": "Both legs restored and verified by state, not by exit code: on-disk blob 9f4c34f41b6c8bcb50f1f94db279ce7eb48b1b70 equals HEAD blob, git diff HEAD empty, git status clean. Each mutation ran under a trap with an absolute REPO_ROOT path.",
        "judgement_pin_warranted": "NOT ON THIS CARD, and probably not as a bespoke gate. A guard re-deriving contributes.keybindings and the six command titles against this one page would be a new gate surface built for a single document, and the startup-focus axis is against speculative ones. The general shape — a document mirroring something no tool re-derives — is already the cluster #7976 / #7974 / #7837 name; if it earns a gate it should be that generic one over the whole content/docs corpus, decided on its own card with a maintainer. NOT BUILT here."
      },
    
      "files_changed": ["content/docs/utilities/vscode-extension.mdx (+38 / -35, one commit 1cce1973d)"],
    
      "summary": "Re-derived the extension manifest on today's tree rather than trusting the card: contributes has seven keys and keybindings is not one of them, so the extension ships zero keyboard shortcuts — the card's central claim reproduces, with a positive control (exportToReact hits 6 times over the same corpus) and a second control (the extension's own README already spells all six commands as the manifest does). Removed all four fictional chords from the six sites that asserted them and rewrote the Keyboard Shortcuts section to state that the extension binds nothing, keep the Keyboard Shortcuts editor route the page already documented, and list the six real command ids. Re-deriving falsified the card's and the triage's shared premise that the page documents the Command Palette and context menus correctly: the palette names, the context-menu lists and the preview column claim are all wrong against contributes, and since the replacement text routes the reader through exactly those, all three are corrected here as a declared bounded in-place fix. The template list the triage folded in is fixed too (Grid is not one of createNewSchema's five templates). Nothing in contributes changes.",
    
      "tests": "All heavy runs through scripts/pm/os-verify-lock.sh, exit codes captured before any pipe, each gate's own verdict line quoted. (1) check-changeset-presence: 'No source or published contract of a released package changed in this range, so no changeset is owed.' — the gate's verdict, not a guess. (2) check:doc-fences green over 227 documents; check:doc-types green — 188 files, 1106 code blocks, 890 type literals, 'Every documented component type is registered'; check-control-bytes 'OK (scanned 6662 tracked text file(s))'. (3) check:doc-snippets and check:doc-examples first returned exit 2 PRECONDITION NOT MET — NOT a failed measurement, they need the packages built. Ran the scoped build the gate itself names: turbo run build with --build-filter, 34 packages, 'Tasks: 35 successful, 35 total', VERDICT command-exit 0, held the lock 188s. Both gates then ran green inside an && chain with check-doc-expression-carriage, check-docs-route-eager-closure, check-doc-example-shared-reader and body-dialect-census: VERDICT command-exit 0, held the lock 38s. So both are real measurements, not narrowings. (4) docs:check-links 'Links are valid across 17 scan roots.' (5) Tests that read this page plus the extension package: vitest scripts/__tests__/check-doc-component-types.test.ts check-doc-links.test.ts doc-version-claims.test.ts packages/vscode-extension/ — 'Test Files 5 passed (5) · Tests 212 passed (212)', VERDICT command-exit 0. (6) Ablation and its control as described under pin_question, with on-disk landing proof and blob-hash restoration proof on every leg. (7) Recorded for completeness: all 18 fenced code blocks in the file are byte-identical before and after this diff, sha256 of the concatenated fenced content ea31adcc5229acf3... on both sides — the narrowing the two type gates would have needed had the build not been affordable. It was, so they were measured instead.",
    
      "governed_surface": "node scripts/check-governed-queue-guard.mjs --test content/docs/utilities/vscode-extension.mdx -> 'NOT GOVERNED — 1 path(s) checked against 5 governed surface(s); none matched.' PR nonetheless stays draft: the dispatch withheld the self-merge clause for this card.",
    
      "changeset": "None owed — check-changeset-presence's own verdict. No label applied: this repo's skip-changeset label object is inert (zero workflows read it) and the changeset gate is the mechanism.",
    
      "channel_declaration": "REST read channel probed and working (GET /repos/.../issues/8113 -> 200), so the card, its comments and the open-PR list were read over REST. REST /search/issues returned 403, so duplicate search switched to ONE targeted MCP search_issues call, declared here. That search returned #8113 itself as a live control hit, so the zero-duplicates reading is real and not an empty channel.",
    
      "mcp_calls": "4 — search_issues (dedupe, 1), issue_write create (#8424, 1), create_pull_request (#8425, 1), add_issue_comment (this report, 1). All card and comment reads went over REST or git.",
    
      "four_axis_analysis": {
        "选项": [
          "A —— 改文档,让页面描述 manifest 实际贡献的东西(本 PR 采用)",
          "B —— 给 manifest 加 contributes.keybindings,让页面那四个 chord 变真(卡片方向 2)",
          "C —— 新建一道把这一页钉在 manifest 上的门禁"
        ],
        "实际业务需求": "实测:这四个 chord 无人写、无人读。manifest 零贡献,全仓 '\"keybindings\"' 0 命中,扩展自己的 README 也从不提 chord,没有任何示例应用或部署在用它们。⇒ B 服务的是一个投机性能力面,「读起来像有用」不作数。A 服务的是真实读者的真实失败:今天按下 Ctrl+Alt+P 什么都不会发生,而正确路线(命令面板、右键菜单)就在同一页上 —— 但本轮实测发现那两条路线的描述本身也是错的,所以 A 的实际业务价值比卡片估计的更高。C 的需求真实但不在这一页:反复出现的是「文档镜像了没人重新推导的东西」这一整类(#7976 / #7974 / #7837),为单页定制门禁答的不是那个需求。",
        "项目长远合理性": "contract-first:manifest 是生产者,页面是消费者。缺陷在消费端的描述里,不在生产者。A 是去正确的那一端修。B 方向相反 —— 为了让一句已经写错的话变真而改产品,是让 spec 迁就文档,典型的 workaround,而且会留下「文档说了就补上去」这个可复制的先例。C 若要做,长远上应做成覆盖整个 content/docs 的通用门禁,而不是为一页定制;定制版本会变成一个只有一个消费者的验证面,自身很快也成为无人重新推导的镜像。",
        "防 AI 写代码犯错": "A 把「声明即强制」落到文档面:页面现在声明的正是 manifest 兑现的,且六个真实 command id 被逐字列出,AI 照着这一页写 keybindings.json 或写集成代码不会再拿到不存在的 chord 和拼错的命令名(ObjectUI: 与 Object UI: 的差别正是 AI 最容易照抄的那种)。B 是最坏方向:它教会「消费端说了什么,就去生产端补什么」,而这恰是 AI 批量犯错被掩盖的温床。C 在这条轴上最强 —— 契约收紧、publish 时响亮拒绝优于消费端宽容 —— 但它的收益要在通用形态下才成立,单页版本收益微弱而新增一个必须被维护的面。",
        "创业阶段不扩散需求": "B 是能力扩张:四个 chord 会进入每一个用户的 keymap,可能与既有绑定冲突,而且无任何拉动证据 —— 按创业阶段聚焦原则默认从紧,不做;也不设「先加两个常用的」这类渐进方案,过渡同样从紧。C 是新增门禁面,speculative,同样从紧,本卡不建。A 是净删除声明面:删掉一张假表、三处内联假声明、两条假菜单项和三处假命令名,页面的声明面比之前更小,最符合这条轴。",
        "推荐": "A,已实施。四条轴一致指向 A,没有需要权衡的冲突。B 交维护者单独决策 —— 它需要的判断(四个 chord 与 VS Code 既有绑定的冲突面、是否真有人要)不是本卡能给的,且按第四条轴当前证据下应答「不做」。C 不在本卡建;若要建,应并入 #7976 / #7974 / #7837 那一簇,作为覆盖整个 content/docs 的通用门禁决策,由维护者拍板。"
      },
    
      "open_questions": [],
    
      "out_of_scope_findings": [
        "filed as #8424: the page's keybindings.json example rebinds ctrl+shift+p over the Command Palette under when: editorLangId == json — i.e. in exactly the file type where the same page tells the reader to press Ctrl+Shift+P. Not false (it is a valid entry), so not a correctness fix, and changing the key means choosing a chord, which this card is fenced away from — left byte-identical on purpose. Same card also records that Object UI: Open Preview to the Side has no Usage block of its own in the Commands section (an omission, not a false statement). Filed unassigned, no labels, for triage; the dedupe search that preceded it returned #8113 as a live control hit."
      ]
    }

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationdomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopriority:p3

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions