Skip to content

automation: a flow's successMessage is copied verbatim, so a {{ }} hole naming a run variable reaches the user raw #28054

Closed

Description

@objectstack-fleet

domain:server#1 · os-elon-musk · session_016WV4cyVSbyvGiXWKxk8GG8

Filing gate: ① user-visible UX defect, reach: named producer HotCRM (enrolment screen flow, hotcrm#2371 / hotcrm#2376), and ④ per-layer child of #27381 (row 3).

Question

Should a flow's successMessage (and errorMessage) become a template text slot over the run's variables, like a screen node's description or an end node's message?

Reading — origin/main bc496bf, 2026-10-30T10:42Z

Probe: AutomationEngine.registerFlow + execute of a flow with successMessage: '{{enrolledCount}} contacts enrolled' whose one node sets enrolledCount = 3 (vitest probe in packages/services/service-automation, not committed). Output:

{"success":true,"successMessage":"{{enrolledCount}} contacts enrolled","output":{"enrolledCount":3}}
  • FlowSchema.successMessage (packages/spec/src/automation/flow.zod.ts) is a plain z.string(); its docblock says "{var} is NOT interpolated here". It is not one of FLOW_NODE_TEXT_SLOTS (packages/spec/src/automation/flow-text-slot-template.ts), so no door judges or compiles its holes either.
  • The engine copies flow.successMessage onto the result unrendered at every terminal exit: AutomationEngine.execute (engine.ts), dag-traversal.ts, run-resume.ts.
  • The console's FlowRunner / flowResponse.ts (ui/packages/app-shell) shows it verbatim after the flows.FLOW.successMessage translation.

Suspected fix sites

  • Contract: type successMessage/errorMessage as flow text slots ({{ }} holes over the run's variables), judged at the same doors as the node text slots — packages/spec, domain:spec.
  • Runtime: render them against the run's variables at each terminal exit before they ride the result — packages/services/service-automation, domain:server. Open point for whoever builds it: the console translates by key, so the translated sentence must be rendered too (render server-side after translation, or ship the variables).

Lane guess: spec contract first, server render after; triage decides.

Business reason

A screen flow cannot say "3 contacts enrolled" when it finishes; HotCRM ends its enrolment flow on an extra result screen instead of a toast. An autolaunched flow invoked as an action already reaches the same numbers through the action's {{ result.output.* }}, so the two paths answer the same author differently.

Dedupe: semantic search "flow successMessage interpolate run variables template" in objectstack issues, 1 hit (#24546 closed, unrelated resume variables).

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 审批与自动化 | none | P③

    Triage: p3 · domain:server · area:automation · child of #27381 (row 3) · 2026-10-30T10:56Z

    ⛔ Not a claim.

    • Read fresh. A HotCRM 18.2.0 wording row with a workaround in place. It is p3 under 「低优先级的先不考虑」, as its parent is, and it is not dispatched on its own.
    • Graded direction, for when it is picked up: making successMessage / errorMessage a template slot over run variables is new authorable semantics (Clause-②: yes), so it comes back here as p1 before code.
    • enhancement, pm:queue.

    Generated by Claude Code

  2. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC

    Triage: p1 · domain:spec first · pm:queue · 2026-11-01T12:18Z

    Ruling-ref: 「定级你可以自己决定」 (Leehom, 2026-11-01T12:11Z), under which the server seats grade this lane's cards. ⛔ Not a claim.

    • Re-graded p1. triage record 6520989262 graded the direction (a flow's successMessage / errorMessage become template slots over the run's variables) as new authorable semantics, Clause-②: yes, and said the card "comes back here as p1 before code". This is that re-grade. The business pull is still HotCRM's enrolment flow ending on an extra result screen, because it cannot say "3 contacts enrolled" (hotcrm#2371 / hotcrm#2376).
    • Lane: domain:spec first. The first fix site is the contract in packages/spec: FlowSchema.successMessage / errorMessage become flow text slots that the doors judge, the same way as FLOW_NODE_TEXT_SLOTS (packages/spec/src/automation/flow-text-slot-template.ts). That is the spec seat's red line, so the server lane cannot open it.
    • Server half, after the contract lands. The engine renders the slots against the run's variables at every terminal exit (engine.ts, dag-traversal.ts, run-resume.ts). The spec seat either carries that half in the same PR or cuts it as a domain:server child. Either way it follows the contract and never comes before it.
      • The card already names the console's translate-by-key point (render after translation, or ship the variables). Whoever builds the render settles it.
    • Labels: priority:p3 → priority:p1, domain:server → domain:spec, and pm:queue stays.

    Generated by Claude Code

  3. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V

    Claim: PM loop round 3 · 2026-11-01T12:49Z
    Session: session_017ihL2fi9zfJhUTubyJYb6V
    Account: marchtian
    Branch: claude/issue-28054-flow-message-template
    Worktree: objectstack-issue-28054
    Domain: domain:spec
    Seat: domain:spec#4
    Ruling-ref: triage's graded direction (6520989262: the two messages become template slots over the run's variables, Clause-②: yes) and the p1 re-grade into domain:spec (6557839820, under 「定级你可以自己决定」), which leaves this seat the choice of carrying the server render in the same PR. This seat carries it: a slot the doors accept as a template that the engine still copies raw would ship {{ }} to users, the exact defect this card names.
    File surface:

    • spec: packages/spec/src/automation/flow.zod.ts#FlowSchema.successMessage/errorMessage (describe, docblock); flow-text-slot-template.ts (the flow-level slots join the one text-slot registry, or the measured equivalent, so the same doors judge and compile their holes).
    • server: packages/services/service-automation terminal exits (engine.ts, dag-traversal.ts, run-resume.ts), rendered through the existing node text-slot renderer against the run's variables.
    • also: the console only where its translate-by-key path must render the translated sentence (ui/packages/app-shell flowResponse.ts / FlowRunner); tests; regenerated artefacts; changesets.
    • On a breach the dev stops and explains it in the report.
      Container & model: M, mode:subagent, model: TIER_DEFAULT (opus) under the quota-exhaustion exemption (maintainer 「你没有fable了,使用 opus开发完之后等契约复审」), effort: high
      Clause-②: yes (widening)
      Metadata-protocol: semantic
      Responsibility: a screen flow can end on "3 contacts enrolled" as its toast, with no extra result screen (HotCRM enrolment, hotcrm#2371 / fix(objectql): stamp tenant org-key onto un-pinned business seed rows #2376) | successMessage / errorMessage become flow text slots over the run's variables: judged at the node-slot doors, rendered at every terminal exit | the other two data/automation: refusal wording a package cannot reach: a state_machine message has no from/to holes, two failing validation rules arrive joined by '; ', and a screen flow's successMessage cannot read run variables #27381 rows (state_machine holes, joined validation messages)
      Thread-read: none
      Premise: holds on 3944d2e12a.
    • FlowSchema.successMessage / errorMessage (flow.zod.ts:1079-1080) are plain z.string() and are not in FLOW_NODE_TEXT_SLOTS (flow-text-slot-template.ts:223).
    • The engine copies flow.successMessage raw at engine.ts:6278, dag-traversal.ts:1286 and run-resume.ts:1878.
    • The card's probe output ("{{enrolledCount}} contacts enrolled" returned verbatim) is the base reading.
    • Metadata-protocol: semantic, not added: a stored message containing {{ x }} changes meaning from literal to hole. Whether any stored first-party message contains {{ is for the dev to measure.
      Serial constraints: not measured at claim time. The dev reads the open-PR file lists for the five runtime files and flow-text-slot-template.ts before opening the PR.
  4. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V
    os-dev-report

    {
      "issue": 28054,
      "status": "done",
      "branch": "claude/issue-28054-flow-message-template",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28720",
      "head_sha": "e99d244155d80f1d7b3d4fd4bed948c557b184dc",
      "session": "session_017ihL2fi9zfJhUTubyJYb6V",
      "premise_still_valid": true,
      "summary": "FlowSchema.successMessage / errorMessage are now flow text slots (FLOW_TEXT_SLOTS, flowTextSlotSources): double-brace holes over the run's variables, judged at registerFlow and validateStackExpressions the way a node text slot is (textSlotTemplateRefusal, then validateExpression('template')). The engine renders both at every terminal exit (execute, executeWithoutRetry, resumeInternal, retryExecution) through renderFlowTextSlot, the end-node message path: translation picked by flowTerminalMessageKey in AutomationContext.locale, then holes filled; errorMessage over the variables at the failure point. The console overlay of flows.FLOW.successMessage/errorMessage is removed per the #22507 ruling A, so toasts are drawn as served.",
      "gates": {
        "dispatch_gates": {
          "derived": 112,
          "run": 112,
          "exit0": 111,
          "exit3": [
            "pnpm check:dual-build-cjs-loads (PREREQUISITE NOT MET: 34 workspace packages without dist; nothing measured)"
          ],
          "reran_after_prereq_build": [
            "pnpm --filter @objectstack/spec run check:skill-examples :: exit 0",
            "pnpm check:i18n-walk-parity :: exit 0"
          ],
          "ran_reconciliation_exit": 0,
          "ran_verdict": "112 derived, 111 run, 1 NOT-MEASURED, 0 UNRUN"
        },
        "ran_list": [
          "node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0",
          "node scripts/check-adr-0087-registration.mjs --self-test :: exit 0",
          "node scripts/check-adr-links.mjs :: exit 0",
          "node scripts/check-adr-links.mjs --self-test :: exit 0",
          "node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0",
          "node scripts/check-closing-keyword-parity.mjs :: exit 0",
          "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
          "node scripts/check-comment-mask-adoption.mjs :: exit 0",
          "node scripts/check-comment-mask-adoption.mjs --self-test :: exit 0",
          "node scripts/check-comment-mask-corpus.mjs :: exit 0",
          "node scripts/check-dev-prereqs.mjs --self-test :: exit 0",
          "node scripts/check-doc-route-spelling.mjs --advisory :: exit 0",
          "node scripts/check-doc-route-spelling.mjs --self-test :: exit 0",
          "node scripts/check-docs-section-name.mjs :: exit 0",
          "node scripts/check-docs-section-name.mjs --self-test :: exit 0",
          "node scripts/check-dts-emitted.mjs --self-test :: exit 0",
          "node scripts/check-empty-changeset.mjs --base origin/main :: exit 0",
          "node scripts/check-empty-changeset.mjs --self-test :: exit 0",
          "node scripts/check-issue-citations.mjs :: exit 0",
          "node scripts/check-plugin-teardown-shape.mjs :: exit 0",
          "node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 0",
          "node scripts/check-sdui-manifest.mjs :: exit 0",
          "node scripts/check-sdui-manifest.mjs --self-test :: exit 0",
          "node scripts/check-section-landing-index.mjs :: exit 0",
          "node scripts/check-section-landing-index.mjs --self-test :: exit 0",
          "node scripts/check-tenant-audit-census.mjs :: exit 0",
          "node scripts/check-tenant-audit-census.mjs --self-test :: exit 0",
          "node scripts/ci/assert-turbo-remote-cache.mjs --self-test :: exit 0",
          "node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0",
          "node scripts/ci/prune-turbo-cache.mjs --self-test :: exit 0",
          "node scripts/docs-audit/check-affected-docs.mjs :: exit 0",
          "node scripts/docs-audit/check-drift-comment.mjs :: exit 0",
          "node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0",
          "node scripts/release-pending-publish.mjs --self-test :: exit 0",
          "pnpm --dir ui exec vitest run scripts/ :: exit 0",
          "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0",
          "pnpm --filter @objectstack/lint run check:doc-security-posture :: exit 0",
          "pnpm --filter @objectstack/spec run check:api-surface :: exit 0",
          "pnpm --filter @objectstack/spec run check:authorable-surface :: exit 0",
          "pnpm --filter @objectstack/spec run check:browser-reachable-entries :: exit 0",
          "pnpm --filter @objectstack/spec run check:docs :: exit 0",
          "pnpm --filter @objectstack/spec run check:dual-source-exports :: exit 0",
          "pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0",
          "pnpm --filter @objectstack/spec run check:empty-state :: exit 0",
          "pnpm --filter @objectstack/spec run check:entry-nameability :: exit 0",
          "pnpm --filter @objectstack/spec run check:export-origins :: exit 0",
          "pnpm --filter @objectstack/spec run check:exported-any :: exit 0",
          "pnpm --filter @objectstack/spec run check:generated :: exit 0",
          "pnpm --filter @objectstack/spec run check:liveness :: exit 0",
          "pnpm --filter @objectstack/spec run check:llms-txt :: exit 0",
          "pnpm --filter @objectstack/spec run check:skill-examples :: exit 0",
          "pnpm --filter @objectstack/spec run check:skill-refs :: exit 0",
          "pnpm --filter @objectstack/spec run check:strictness-ledger :: exit 0",
          "pnpm --filter @objectstack/spec run check:variant-docs :: exit 0",
          "pnpm --filter @objectstack/spec run check:yaml-examples :: exit 0",
          "pnpm check:changeset-gate-self-tests :: exit 0",
          "pnpm check:ci-filter-parity :: exit 0",
          "pnpm check:closed-ceremony-text :: exit 0",
          "pnpm check:corpus-claim-drift :: exit 0",
          "pnpm check:cross-package-test-inputs :: exit 0",
          "pnpm check:dispatcher-error-vocabulary :: exit 0",
          "pnpm check:doc-anchors :: exit 0",
          "pnpm check:doc-authoring :: exit 0",
          "pnpm check:doc-frontmatter :: exit 0",
          "pnpm check:docs-audit-scope :: exit 0",
          "pnpm check:docs-redirects :: exit 0",
          "pnpm check:docs-single-h1 :: exit 0",
          "pnpm check:docs-spec-enumerations :: exit 0",
          "pnpm check:docs-transcript-drift :: exit 0",
          "pnpm check:driver-memory-census :: exit 0",
          "pnpm check:dts-closure :: exit 0",
          "pnpm check:dual-build-cjs-loads :: exit 3",
          "pnpm check:durability-log-level :: exit 0",
          "pnpm check:engine-double-contract :: exit 0",
          "pnpm check:error-status-conformance :: exit 0",
          "pnpm check:gitlink-declared :: exit 0",
          "pnpm check:i18n-walk-parity :: exit 0",
          "pnpm check:issue-citations :: exit 0",
          "pnpm check:keyed-text-bounds :: exit 0",
          "pnpm check:lean-entry-closure :: exit 0",
          "pnpm check:logger-receiver-detach :: exit 0",
          "pnpm check:merge-driver :: exit 0",
          "pnpm check:nul-bytes :: exit 0",
          "pnpm check:objectql-double-limit :: exit 0",
          "pnpm check:org-identifier :: exit 0",
          "pnpm check:page-declaration-shape :: exit 0",
          "pnpm check:platform-checklist :: exit 0",
          "pnpm check:platform-object-tenancy-census :: exit 0",
          "pnpm check:pm-changeset-deadline-census :: exit 0",
          "pnpm check:pm-prior-rulings :: exit 0",
          "pnpm check:published-files :: exit 0",
          "pnpm check:published-readme-links :: exit 0",
          "pnpm check:query-options-erasure :: exit 0",
          "pnpm check:react-page-adapter-contract :: exit 0",
          "pnpm check:refd-timer-probe :: exit 0",
          "pnpm check:registry-log-declared :: exit 0",
          "pnpm check:rest-log-spy-declared :: exit 0",
          "pnpm check:role-word :: exit 0",
          "pnpm check:skill-identifier-liveness :: exit 0",
          "pnpm check:slot-lookup :: exit 0",
          "pnpm check:sourcemap-no-sources-content :: exit 0",
          "pnpm check:spec-docblock-symbol-anchors :: exit 0",
          "pnpm check:spec-parsed-alias :: exit 0",
          "pnpm check:system-context-census :: exit 0",
          "pnpm check:test-source-alias :: exit 0",
          "pnpm check:tier-file-adoption :: exit 0",
          "pnpm check:type-check-coverage :: exit 0",
          "pnpm check:type-check-debt :: exit 0",
          "pnpm check:undeclared-dep-imports :: exit 0",
          "pnpm check:vendor-version-stamps :: exit 0",
          "pnpm check:watch-hint-literal :: exit 0",
          "pnpm check:where-matcher :: exit 0"
        ],
        "suites": {
          "service-automation full": "exit 0 · 252 files / 3202 tests",
          "spec full": "exit 0 · 783 files / 23178 tests, 1 todo",
          "lint full": "exit 0 · 184 files / 7722 tests",
          "app-shell touched-path tests (149 files)": "exit 0 · 149 files / 1153 tests",
          "typecheck spec / service-automation / lint": "exit 0 / 0 / 0",
          "app-shell type-check": "exit 0",
          "closure build under verify lock": "exit 0",
          "check:generated --fix": "exit 0 (regenerated api-surface, export-origins; re-check green)"
        },
        "ablation": "one-time, after the fix commit: scripts/ablation-replace.mjs made renderFlowTerminalMessage return the authored text (anchor 1 -> 0, blob f261afa20a70 -> 9114f773e017); flow-terminal-message-template.test.ts went 11 failed / 6 passed; restored with git checkout HEAD -- path under a trap; git diff HEAD empty"
      },
      "dogfood_battery": "n/a — no ! in the PR title; the declared arm is (widening) (see deviations for the narrowing question)",
      "line_budget": {
        "files": 36,
        "insertions": 1004,
        "deletions": 316,
        "non_test_non_generated": {
          "insertions": 431,
          "deletions": 198
        },
        "human_merge_threshold": 3000,
        "verdict": "under"
      },
      "deviations": [
        "packages/spec/dropped-refinements.baseline.json grew by 22 sites (the two translated toast leaves under 11 published schemas): the leaves became flowTextSlotTranslation(), whose refine does not project to JSON Schema, exactly as the sibling screens.title/description and refusals.message leaves already recorded. Hand-edited per the ledger's own rule, with the list the build printed.",
        "packages/spec/liveness/translation.json: flows.successMessage/errorMessage rows repointed from the console to the engine (still live); evidence leads with engine.ts because check:liveness requires the cited file to name the key.",
        "A terminal message that throws FlowTextTemplateError (a currency hole with no tenant default currency) is left off the result with one warning instead of thrown, because the run has already ended; the end-node refusal throws because there the message is the verdict.",
        "ui FlowRunner.flowsTranslation-12075.test.tsx pins flipped to the served contract (not in the original plan's file list; found red by the touched-path console run).",
        "Merge of origin/main done once (to 9182ff62b2); main has since moved 4 commits, not merged again per the order."
      ],
      "first_party_messages_with_braces": 0,
      "files_changed": [
        ".changeset/28054-flow-message-template.md",
        "content/docs/automation/flows.mdx",
        "content/docs/references/api/automation-api.mdx",
        "content/docs/references/automation/flow.mdx",
        "content/docs/references/system/translation.mdx",
        "content/docs/ui/translations.mdx",
        "packages/lint/src/validate-expressions.test.ts",
        "packages/lint/src/validate-expressions.ts",
        "packages/services/service-automation/src/dag-traversal.ts",
        "packages/services/service-automation/src/engine.ts",
        "packages/services/service-automation/src/flow-registration-checks.ts",
        "packages/services/service-automation/src/flow-terminal-message-template.test.ts",
        "packages/services/service-automation/src/node-text-rendering.ts",
        "packages/services/service-automation/src/run-resume.ts",
        "packages/spec/api-surface/automation.json",
        "packages/spec/api-surface/system.json",
        "packages/spec/dropped-refinements.baseline.json",
        "packages/spec/export-origins/automation.json",
        "packages/spec/export-origins/system.json",
        "packages/spec/liveness/translation.json",
        "packages/spec/src/api/automation-api.zod.ts",
        "packages/spec/src/automation/flow-text-slot-template.test.ts",
        "packages/spec/src/automation/flow-text-slot-template.ts",
        "packages/spec/src/automation/flow.zod.ts",
        "packages/spec/src/contracts/automation-service.ts",
        "packages/spec/src/system/i18n-resolver.ts",
        "packages/spec/src/system/translation.test.ts",
        "packages/spec/src/system/translation.zod.ts",
        "ui/packages/app-shell/src/hooks/useConsoleActionRuntime.tsx",
        "ui/packages/app-shell/src/utils/__tests__/flowLaunch.translation-12075.test.tsx",
        "ui/packages/app-shell/src/utils/__tests__/flowResponse.test.ts",
        "ui/packages/app-shell/src/utils/flowLaunch.ts",
        "ui/packages/app-shell/src/utils/flowResponse.ts",
        "ui/packages/app-shell/src/views/FlowRunner.tsx",
        "ui/packages/app-shell/src/views/RecordDetailView.tsx",
        "ui/packages/app-shell/src/views/__tests__/FlowRunner.flowsTranslation-12075.test.tsx"
      ],
      "mcp_calls": "2 GitHub MCP calls — mcp__github__issue_read x2 (reads of #28054); 0 GitHub write tools. Non-GitHub: mcp__hearthbot__no_reply_needed (turn-end markers only, no post)",
      "api_writes": "2 — relay pr_create via POST /repos/objectstack-ai/objectstack/dispatches (run 41320310460, #28720); this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/28054/comments). git push is not a REST write.",
      "open_questions": [
        {
          "question": "The two keys now refuse a single-brace token and an uncompilable double-brace hole at registerFlow and objectstack validate, where any string was accepted before. Keep Clause-②: yes (widening) or re-declare a narrowing arm?",
          "options": [
            "A keep (widening): reach measured 0 first-party flow messages with a brace; the only refusals are strings that would otherwise render broken",
            "B re-declare (narrowing) with a ! title and a dogfood battery"
          ],
          "recommendation": "A, because the refused inputs are exactly the ones the card calls broken and measured reach is 0; but it is the seat's call under ADR-0146"
        }
      ],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — lint-flow-patterns.ts bare-$ advisory covers node text slots only, not the flow-level successMessage/errorMessage (polish; in Acceptance notes)"
      ],
      "independent_review": "none run (quota); the PR waits for the seat's contract-review hand-off"
    }
  5. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V

    Landed · 2026-11-01T18:27Z · PR #28720 was merged by the queue at 2026-11-01T18:26Z as b3572509b9. The card closed by Fixes, and this seat strips pm:dispatched in the same act.

    What landed (Clause-②: no (narrowing), Metadata-protocol: narrowed):

    • Text slots. A flow's successMessage and errorMessage are now {{ }} text slots, listed in spec's FLOW_TEXT_SLOTS. Their translation keys come from flowTerminalMessageKey.
    • Server render. The engine translates first, then fills the holes, on every terminal exit: first run, resume, retry and failure. A template that fails to render omits the message and logs a warning.
    • Doors. registerFlow and os validate refuse a single-brace {token} and a {{ }} that does not compile, with a fix hint. First-party flows had 0 such strings, and the dogfood battery passed.
    • Console. The client-side translation overlay is gone; the server answer is final.

    Record:

    • Contract review: FAIL 6561130776 on cccbc854 (red packages/verify pin, doubled flow wording), fixed in 5db38c69. The delta PASS 6561744828 on the landed head had no must-fix and no should-fix.
    • Tooling gap seen on the way: dispatch-gates does not derive packages/verify, so the local gate run missed the red pin.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions