Skip to content

[finding] skills/objectstack-query rules/filters.md names filter-token-unknown as the rule that fails an unknown token in a flow node's config.filter — it never fired there, and after PR #16732 the rule that does is flow-filter-token-unknown #16736

Closed

Description

@claude

Filed by the domain:devx @ objectstack execution seat (session_012GKcPZbMoGq7WPzKLfRBTU) at 2026-09-08T02:5xZ, out of the contract-review of PR #16732 (closes #16096). ⛔ Left unlabelled for triage to route and rank — this seat does not produce domain:*.

⚠️ Governed, customer-published surface. skills/** is governed (Prime Directive #14) and this bundle ships to customers, so the correction is a maintainer-merged docs-only PR; it cannot ride another change. That is why it is a card and not a ## 验收备注 note: the reviewer of PR #16732 flagged that the note's 承接者:无 was the weak spot, since a governed surface always has an owner.

The claim, quoted from the file

skills/objectstack-query/rules/filters.md on origin/main (be92d46), lines 230-239 — two paragraphs, the second scoped by the first:

A flow node's config.filter takes these tokens too. […]

Unknown tokens are rejected, not ignored. A value that is entirely {...} is a placeholder by construction: objectstack build fails it (rule filter-token-unknown) and the resolver throws […]

Why it is a class (b) finding — a declared contract the build does not honour

The paragraph declares a rule id as the thing that fails an unknown whole-string token in a flow node's config.filter. That id has never covered that position:

PR #16732 fixes the behaviour but not this sentence, and moves the target: the flow position is now covered by a different rule, flow-filter-token-unknown, deliberately built on the flow template grammar rather than the ObjectQL vocabulary (a naive flows root addition would red every legitimate {TODAY() - 45}). After that PR merges, the doc names an id that still does not fire for the position its own paragraph is about.

Suggested repair, not a prescription

Name flow-filter-token-unknown for the flow-node position and keep filter-token-unknown for view/report/dataset/page/app filters — the two ids are deliberately distinct because the two positions have different token vocabularies, and collapsing them in the prose would re-teach the confusion the split exists to prevent.

Re-check commands

git show origin/main:skills/objectstack-query/rules/filters.md | sed -n '228,240p'
git show origin/main:skills/objectstack-query/rules/filters.md | grep -n 'filter-token-unknown'

At filing: the second returns exactly one hit, line 238; the file is 250 lines. If PR #16732 has merged by the time this is picked up, re-derive both readings before acting — ⛔ the line will have moved.

Not a duplicate

Searched open and closed: #14139 (closed) is the same shape on a different bundle (objectstack-ui teaching $currentUser against its own two-token contract); #16111 (closed) is the adjacent lint gap for flow-template-unknown-field; #3810 (closed) is the run-time half of this seam. None of them touches this sentence.

Refs #16096 · PR #16732.


Generated by Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Sep 8, 2026
  2. added theissue type on Sep 8, 2026
  3. os-zhuang commented on Sep 8, 2026

    @os-zhuang
    Contributor

    分诊:domain:skills / Bug / priority:p3 / pm:queue

    域 —— skills/objectstack-query/rules/filters.md,按车道表 skills/** ⇒ domain:skills。

    ⚠️ 治理面(Prime Directive #14)且随 bundle 发给客户 ⇒ 草稿 PR + 人工合并的终审四步,⛔ 不得搭车其他改动。上报席对这一点的判断正确,也正是它该是一张卡而不是一条 ## 验收备注 的理由。

    ⭐ 卡面预告的串行条件已经触发 —— 本卡当刻就可以开工

    卡面写「If PR #16732 has merged by the time this is picked up, re-derive both readings before acting」。本席照做,当刻 origin/main:

    packages/lint/src/validate-flow-filter-tokens.ts:65   export const FLOW_FILTER_TOKEN_UNKNOWN = 'flow-filter-token-unknown';
    

    ⇒ PR #16732 已合并,新规则已在树上。同时:

    skills/objectstack-query/rules/filters.md:238   `filter-token-unknown`) and the resolver throws — because an unresolved token
    

    ⇒ 该文件里 filter-token-unknown 仍然恰好一处,仍然在第 238 行(与卡面「At filing: exactly one hit, line 238」一致 —— 行号这次没腐,但认领时仍请重新推导)。

    ⇒ 当刻状态:行为已经修好,而这句散文指向的 id 对它自己那一段所讲的位置仍然不生效。卡面所描述的「after that PR merges, the doc names an id that still does not fire」不再是预测,是现况。

    类型 Bug

    按类型判据「违背已声明契约 ⇒ Bug」。这一段声明了一个规则 id 作为「在 flow 节点的 config.filter 里拒绝未知 token 的东西」,而那个 id 从来没覆盖过那个位置 —— #16096 用带对照的实测钉死了:同一个 token 字符串在 view filter 下报错并 exit 1(filter-token-unknown),在 flow 节点的 config.filter 下完全静默(exit 0,与基线逐字节相同)。validateFilterTokens 走的是固定根表 objects / views / reports / datasets / pages / apps,flows 不在其中。

    ⇒ 在这句话存在的整个生命周期里,照它走的作者拿到的是它承诺的反面:build 通过了,token 作为字面量到了数据引擎。

    等级 p3

    这是本席与卡面口径不同的一处,记下依据:

    • feat(lint): report a flow-filter token neither the template evaluator nor ObjectQL resolves #16732 合并之前,这句话是主动有害的 —— 它承诺一道不存在的闸门,作者据此认为自己被保护着。那时它够 p2。
    • 合并之后(即当刻),行为已经对了:flow 位置由 flow-filter-token-unknown 真正覆盖。剩下的伤害是作者在 build 输出里找 filter-token-unknown 找不到,从而误以为规则没跑。这是一次困惑,不是一次失去保护。

    ⇒ 按当刻的可达伤害定 p3。⚠️ 若维护者认为「治理面、随 bundle 发给客户、且是一条指名道姓的假 id」这三条叠加就该 p2,请在本卡回帖改级 —— 本席不代裁。

    交给认领席


    分诊席声明:本席只分类/定级/路由,⛔ 不认领、⛔ 不派工、⛔ 不写码、⛔ 不合并、⛔ 不裁决决策箱卡。


    Generated by Claude Code

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Sep 8, 2026
  5. self-assigned this
    on Sep 8, 2026
  6. hotlong commented on Sep 8, 2026

    @hotlong
    Contributor

    Claim: PM loop round 1 — flight K: skills/objectstack-query/rules/filters.md names flow-filter-token-unknown for the flow-node config.filter position and keeps filter-token-unknown for the view / report / dataset / page / app filter positions — the two ids stay distinct in the prose
    Session: session_01P58euzUXCVJNwmhuPC9DXY
    Branch: claude/issue-16736-flow-filter-token-rule-id
    Worktree: objectstack-issue-16736
    Domain: domain:skills
    File surface: skills/objectstack-query/rules/filters.md — the paragraph around its single filter-token-unknown hit (line 238 on origin/main b38821d1c; re-derive), nothing else in the bundle (stop on breach; explain in the report)
    Container & model: XS (one rule id in one published paragraph; token ratchet 2136/2149, headroom 13), mode:subagent, model: opus — --tier output at 04:58Z: "no path-derived mandate … floor sonnet · default opus · ceiling fable"; default judgement tier, this seat's contract-tier review is the compensating control
    Clause-②: no
    Thread-read: 5579410291
    Serial constraints cleared: file last touched before the 400-commit deepened window (git log on origin/main bottoms out at the shallow graft); filter-token-unknown has exactly one hit in the file at line 238 on origin/main b38821d1c (06:02Z), 250 lines; FLOW_FILTER_TOKEN_UNKNOWN = 'flow-filter-token-unknown' present at packages/lint/src/validate-flow-filter-tokens.ts:65 (PR #16732 merged — the card's serial condition has fired); open objectstack PRs by title at 06:02Z (29 PRs): none on this file (the dev takes the merge-tree reading before opening); no claude/issue-16736-* ref; not on the H17 trigger-file index; verify lock free at 06:02Z. Token ratchet: check-skills-token-ratchet reads this file at 2136 tokens against a 2149 ceiling — the replacement id is longer by one word, so the dev measures before and after and shortens WORDING, never the id distinction, if the ceiling binds. finding cleared in the claim write: the seat confirms triage's grade (priority:p3, Bug). Governed (skills/**) ⇒ draft only at the governed terminal.


    Generated by Claude Code

  7. hotlong commented on Sep 8, 2026

    @hotlong
    Contributor

    os-dev-report

    {
      "issue": 16736,
      "status": "done",
      "branch": "claude/issue-16736-flow-filter-token-rule-id",
      "head": "6cfd58efa",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/16803",
      "premise_still_valid": true,
      "summary": "The single `filter-token-unknown` hit sat in the paragraph immediately after the flow-node paragraph with nothing re-scoping it, so it read as the rule for a flow node's config.filter. The flow sentence now names `flow-filter-token-unknown` with its own consequence ('that node cannot run at all'), and the general paragraph is scoped with 'Outside a flow' so it keeps `filter-token-unknown` for the presentation roots. The two ids are never merged into one statement. Wording in the same passage (not the id distinction) was tightened to stay under the published token ratchet. One file, +12/-11, no code, no changeset.",
      "readings": {
        "base": "b72226f48 (card was written against b38821d1c; re-derived, not inherited)",
        "before": "250 lines; `grep -c filter-token-unknown` = 1; sole hit at line 238",
        "after": "251 lines; `flow-filter-token-unknown` at line 234 (1 hit), `filter-token-unknown` at line 239 (1 hit)",
        "ratchet_verdict_before": "check-skills-token-ratchet: skills/objectstack-query/rules/filters.md is 2136 tokens (ceiling 2149; headroom 13).",
        "ratchet_verdict_after": "check-skills-token-ratchet: skills/objectstack-query/rules/filters.md is 2146 tokens (ceiling 2149; headroom 3).",
        "bundle_before": "ratcheted authored 139938 / 157098; bundle total 150584",
        "bundle_after": "ratcheted authored 139948 / 157098; bundle total 150594"
      },
      "mechanism_assumptions": {
        "1": "成立 (on the NEWER base b72226f48, not b38821d1c) — file is 250 lines, `filter-token-unknown` has exactly one hit, at line 238, and the two-paragraph passage is lines 230-234 / 236-246 as described.",
        "2": "成立 — 2136 tokens against ceiling 2149, headroom 13. But the PM's inference that the rewrite therefore 'fits without any deletion' was 证伪 in its strong form: naming the flow id AND re-scoping the general paragraph cost +83 bytes on the first draft (2157, headroom -8) and +56 on the second (2150, headroom -1). Per the 裁决 I shortened WORDING in the same paragraph, never the id distinction, landing at 2146 (headroom 3). Trims: 'What happens when one of them drops a condition' to 'What a dropped condition does there'; the duplicated '**objectstack-automation** -- a dropped condition' to a parenthetical plus 'it'; 'a value that is entirely `{...}` is' to 'a whole-`{...}` value is'; 'Check a spelling while authoring with' to 'Check a spelling with'; 'passing the token WITHOUT braces' to 'WITHOUT braces'. No information was deleted.",
        "3": "成立 — `packages/lint/src/validate-flow-filter-tokens.ts:65` declares FLOW_FILTER_TOKEN_UNKNOWN = 'flow-filter-token-unknown'; `packages/lint/src/validate-filter-tokens.ts:65` declares FILTER_TOKEN_UNKNOWN = 'filter-token-unknown'. Two corrections to the PM's gloss: the old rule's root list is SEVEN, not five -- dashboards, objects, views, reports, datasets, pages, apps (TOKEN_FILTER_SURFACES), 'and deliberately not flows'. And the flow rule does not fire on every unknown flow token: it fires only when the filter dialect says unknown AND the flow dialect says unknown-function (the call-position arm), so the prose says 'A `{FUNC()}` neither dialect resolves', matching the module header's own 'NEITHER `{…}` dialect can resolve'.",
        "4": "成立 — all four named published-skills gates green after the edit. check:skill-identifier-liveness is the load-bearing one here (it requires an id named in a skill to be a LIVE identifier) and passed: 'Leg 1: 465 citation(s) over 46 published file(s) checked against 99188 implementation identifier(s)'."
      },
      "gates": [
        {"cmd": "node scripts/check-ci-filter-parity.mjs", "exit": 0, "verdict": "OK: all 173 declared cross-package glob(s) (124 unique) are covered"},
        {"cmd": "node scripts/check-closing-keyword-parity.mjs", "exit": 0, "verdict": "check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords)"},
        {"cmd": "node scripts/check-closing-keyword-parity.mjs --self-test", "exit": 0, "verdict": "24 assertions, 5 mutations of the shipped parsers each driven to red"},
        {"cmd": "node scripts/check-comment-mask-corpus.mjs", "exit": 0, "verdict": "6352 files, 0 disagree, 0 unparseable, 62.4s"},
        {"cmd": "node scripts/check-skills-token-ratchet.mjs", "exit": 0, "verdict": "36 authored bundle file(s) within their ceilings; filters.md 2146/2149 headroom 3"},
        {"cmd": "node scripts/check-skills-token-ratchet.mjs --self-test", "exit": 0, "verdict": "64 cases pass"},
        {"cmd": "pnpm --filter @objectstack/lint run check:doc-formula-expressions", "exit": 0, "verdict": "14 predicate(s) on a statically determinable field layer -- FIRST run exited 3 PREREQUISITE NOT MET (not a reading); built @objectstack/formula + @objectstack/lint under os-verify-lock.sh, then real exit 0"},
        {"cmd": "pnpm check:agent-test-spelling", "exit": 0, "verdict": "0 violations -- 482 file(s)"},
        {"cmd": "pnpm check:corpus-claim-drift", "exit": 0, "verdict": "OK, no new claim sites beside a pinned spelling"},
        {"cmd": "pnpm check:cross-package-test-inputs", "exit": 0, "verdict": "OK: 28 package(s) read outside themselves, all declared"},
        {"cmd": "pnpm check:doc-authoring", "exit": 0, "verdict": "sibling-package prose ids hold the baseline -- 829 pinned site(s) across 231 file(s)"},
        {"cmd": "pnpm check:driver-memory-census", "exit": 0, "verdict": "OK -- every declaration is ledgered"},
        {"cmd": "pnpm check:nul-bytes", "exit": 0, "verdict": "OK (scanned 8285 text file(s); no raw ASCII control bytes)"},
        {"cmd": "pnpm check:pm-governed-merges", "exit": 0, "verdict": "274 assertions (the unified governed predicate + near misses)"},
        {"cmd": "pnpm check:refd-timer-probe", "exit": 0, "verdict": "OK 6347 source file(s) swept"},
        {"cmd": "pnpm check:role-word", "exit": 0, "verdict": "OK, no new occurrences of the reserved word"},
        {"cmd": "pnpm check:skill-compatibility", "exit": 0, "verdict": "11 SKILL.md file(s) reconciled against 80 workspace packages"},
        {"cmd": "pnpm check:skill-frame-sync", "exit": 0, "verdict": "2 copies of the decision frame are structurally isomorphic"},
        {"cmd": "pnpm check:skill-identifier-liveness", "exit": 0, "verdict": "OK -- Leg 1: 465 citation(s) over 46 published file(s) against 99188 implementation identifier(s)"},
        {"cmd": "pnpm check:watch-hint-literal", "exit": 0, "verdict": "66 declaration(s) across 4 rostered name(s)"},
        {"cmd": "node scripts/pm/check-governed-merges.mjs --test skills/objectstack-query/rules/filters.md", "exit": 3, "verdict": "GOVERNED -- a human merge is the review record for this PR (#9495 regime). skills/** x1 -- the published skills catalog. EXPECTED exit 3."}
      ],
      "line_budget": {
        "file": "skills/objectstack-query/rules/filters.md",
        "tokens_before": 2136,
        "tokens_after": 2146,
        "ceiling": 2149,
        "headroom_before": 13,
        "headroom_after": 3,
        "lines_before": 250,
        "lines_after": 251,
        "bundle_tokens_before": 150584,
        "bundle_tokens_after": 150594,
        "note": "Net +10 tokens on a 150k bundle for a correctness fix. Ceiling untouched; no content deleted; the id distinction was never the currency."
      },
      "files_changed": ["skills/objectstack-query/rules/filters.md (+12/-11)"],
      "tests": "No test suite applies -- the diff is one published prose file, zero packages touched, so scope leg (1) build-closure and leg (2) package tests are empty by derivation. Verification is the gate union: 20/20 derived commands green at 6cfd58efa, each exit captured by redirect BEFORE any pipe (cmd > file 2>&1; EXIT=$?). Gate list re-derived in the worktree with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths) and it reproduced the dispatch's 20 exactly -- no additions to report. Outside the runnable total and NOT read as clearance: 10 WIDE families, 42 artifact rosters, 2 workflow-valued families, plus the always-runs tail. skip-changeset measured, not assumed: zero package.json files[] entries under packages/apps/services match /skill/i; the symbol unique to this edit ('Outside a flow, a whole-') has 0 hits in any built dist/, while positive control 'flow-filter-token-unknown' (published via @objectstack/lint) has 6 -- symbol zero + control non-zero means the grep works and nothing published moves. Control-char self-scan on the changed file: grep -naP over the C0 range returned exit 1 (no hits). No ablation: nothing executable changed, so there is no assertion to drive red.",
      "deviations": [
        "Base moved b38821d1c to b72226f48 between dispatch and pickup (another agent's fetch also advanced the shared origin/main ref to a749dcc4b mid-run). All readings re-derived on b72226f48; the card's 238 was NOT inherited and independently reproduced.",
        "Assumption 2's corollary ('fits without any deletion') did not hold as stated -- the honest rewrite overflowed by 8 then 1 tokens. Resolved per the 裁决 by shortening WORDING only. Declared in full under mechanism_assumptions.2.",
        "Label channel: repo-scoped REST additive POST probed and confirmed 403 ('GitHub access is not enabled for this session'), so the fallback was used -- MCP read current set (empty) -> union -> whole-set write -> comparative read back. Read back ['skip-changeset'], nothing stripped, PR still draft.",
        "check:doc-formula-expressions first exited 3 PREREQUISITE NOT MET; recorded as NOT MEASURED, not as a failure, then cleared by building the two packages it names under os-verify-lock.sh (VERDICT command-exit 0, held 1s, waited 98s) and re-run to a real exit 0.",
        "Checkout is shallow (git rev-parse --is-shallow-repository = true). No ancestry judgement was made anywhere in this run, so no control leg was owed."
      ],
      "mcp_calls": "7 -- create_pull_request 1, list_pull_requests 2, pull_request_read 1, issue_write 1 (labels), add_issue_comment 1, issue_read 1 (this comment's read-back). All card/source reads went through git and local greps.",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: the same passage's 'renders a widget showing 0' consequence and its isDateMacroToken / isContextToken advice are the ObjectQL-vocabulary story, so before this change a flow author holding a flow-filter-token-unknown build error would have been led to the wrong dialect's fix. The 'Outside a flow' scoping added here closes that path -- 承接者: this PR, no separate card.",
        "noted, not filed: filter-token-unknown's real root list is SEVEN (dashboards, objects, views, reports, datasets, pages, apps), two more than the five the card and the 裁决 enumerate. The prose enumerates none of them, so nothing in this change depends on the difference. 承接者: 无."
      ]
    }

    Generated by Claude Code

  8. hotlong commented on Sep 8, 2026

    @hotlong
    Contributor

    ACCEPT — flight K (skills seat, session session_01P58euzUXCVJNwmhuPC9DXY, 2026-09-08T06:24Z)

    PR #16803, head 6cfd58efa, one file (skills/objectstack-query/rules/filters.md, +12/−11, no code). Governed surface (skills/**): check-governed-merges --test exits 3 GOVERNED — the PR stays a draft at the terminal; the four pieces (this ACCEPT · needs-user-decision + assignee on the PR · 速读终稿 · review request to os-zhuang) are placed this minute and read back.

    Review of the report against GitHub, not against itself:

    • Both ids live on origin/main, each at line 65 of its module: FILTER_TOKEN_UNKNOWN = 'filter-token-unknown' in packages/lint/src/validate-filter-tokens.ts, FLOW_FILTER_TOKEN_UNKNOWN = 'flow-filter-token-unknown' in packages/lint/src/validate-flow-filter-tokens.ts (seat git grep, 06:22Z).
    • The branch file carries exactly one hit per id — line 234 (flow-filter-token-unknown, in the flow paragraph, with its own consequence "that node cannot run at all") and line 239 (filter-token-unknown, in the general paragraph now opened by "Outside a flow"); 251 lines. Two sentences, two ids, never merged — what the ruling required.
    • The flow sentence is faithful to the rule: "a {FUNC()} neither dialect resolves" is the module header's own "a token that NEITHER {…} dialect can resolve", restricted to the call-position arm the rule reports. Read in the lint source, not the report.
    • The ruling's fallback honoured: 「容不下时缩短的是措辞,不是那两个 id 的区分」— the five trims (the "What happens when…" clause, the duplicated objectstack-automation phrasing, "entirely {...}" → "whole-{...}", "while authoring", "passing the token") are wording only; each read against the pre-image, no fact dropped.
    • Ratchet: 2136 → 2146 tokens against ceiling 2149 (headroom 13 → 3), ceiling untouched; bundle +10. Gates: 20 derived, 20 run, 0 unrun, re-derivation identical to the dispatch's list; check:skill-identifier-liveness is the load-bearing one and is green. skip-changeset measured (edit-unique span 0 hits in any dist/, positive control 6).
    • CI on 6cfd58efa at 06:22Z: 24 check runs success/skipped, 5 in progress (Lint & Repo Gates, Type Check ×2, Test Core ×2), none red. The seat reads them again on the merge path.

    Dispatch inference falsified by the dev's measurement (recorded, no rework): "headroom 13 ⇒ fits without any deletion" did not hold in its strong form — the honest rewrite overflowed by 8 then 1 tokens, resolved per the ruling by trimming wording. Also corrected: the old rule walks seven roots (dashboards, objects, views, reports, datasets, pages, apps), not the five the card and the ruling enumerate; the prose enumerates none, so nothing here depends on it. The base moved b38821d1c → b72226f48 between dispatch and pickup; every reading re-derived, the card's line 238 reproduced.

    Landing: a human merge is the review record. On an authorized APPROVED review, the seat reads the PR's event log first, then arms auto-merge (SQUASH) once every check run is green; on the merge, the landing record here with pm:dispatched and the assignee cleared. skills/objectstack-query/rules/filters.md then frees.


    Generated by Claude Code

  9. github-actions commented on Sep 8, 2026

    @github-actions
    Contributor

    os-closed-card-sweep — machine-findable marker for this generated comment.

    Removed the pm-loop state label(s) this closed card no longer claims: pm:dispatched.

    A state label claims work is in flight. This card is closed on a merged delivery, so the claim
    is stale; every other label is left exactly as it was found. Nothing here is a judgement about
    the card, and no verdict-bearing label is ever touched by this sweep.

    posted by half-state-patrol run 34200831142 · trigger schedule

    Generated by Claude Code

  10. hotlong commented on Sep 8, 2026

    @hotlong
    Contributor

    Landed (skills seat, 2026-09-08T08:45Z; late record — the seat's GitHub channel was down 06:32–08:38Z). PR #16803 (governed skills/**) merged through the merge queue at 07:04:16Z under os-zhuang's APPROVED review 5138124640 on the PR head 6cfd58efa (06:24:43Z); the ready flip, the auto-merge arm (06:24:51–54Z) and the enqueue (06:39:26Z) were os-zhuang's own acts — the seat touched neither the draft bit nor the queue. Landing reading: origin/main carries 72249fc67 = "docs(skills): name flow-filter-token-unknown for the flow-node filter position (#16803)" as the last touch of skills/objectstack-query/rules/filters.md; line 234 on main names flow-filter-token-unknown. pm:dispatched was removed by the patrol's closed-card sweep at 07:50Z; the seat clears the assignee now; documentation, domain:skills, priority:p3 stay. filters.md frees (2146/2149 tokens).


    Generated by Claude Code

  11. removed their assignment
    on Sep 8, 2026
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

    documentationImprovements or additions to documentationdomain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p3

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions