Skip to content

[Epic] v17 bug focus — Seat A: platform bugs (objectstack) #8667

Description

@hotlong

Theme charter for the post-v17 priority regime. Filed by the (former) skills PM seat, session session_018WuTtyckQa1VcXwgd52JpN, on maintainer instruction.

Authority (maintainer, 2026-08-14, verbatim, untranslated)

v17 版本发布了,我下一步不想再追求每个车道任务清零,而是应该按照任务优先级选择重点任务先开发。

所以我现在希望集中处理 bug,应该怎么安排。

先只考虑 objectstack 和 objectui 仓库

可以继续用 target:v17

把两张主题卡(epic)开出来

Scope

All open bug-labeled cards in objectstack (37 at filing), every domain — EXCEPT cards already in flight under the two live lane seats: domain:devx (#6023) and domain:spec (#6017). Console-facing cards (repo:objectui) belong to the sibling theme, Seat B (see the epic filed immediately after this one; the two cards cross-reference in the comments).

Workability rule (the default flip): a card is workable under this theme only when it carries target:v17. Everything else stays frozen stock — no lane-clearing. The PM nominates second-batch candidates with a short list on this epic; the maintainer approves by labeling (or one-word ruling), and only then do they enter the queue.

First batch (workable now or pending one maintainer ruling)

P0 rulings pending on the maintainer's desk (fix-in-17.x / defer-v18 / void): #8500, #8282, #8096, #8270 (those four are Seat B surface), #8287. Decision-gated bugs pending one-sentence rulings: #8629, #8586, #8421.

Before dispatching anything: orphan re-verification

Former lane PMs stood down without closing out. Verify the true state (PR? merged? labels?) of each and either close out or re-dispatch under this theme:

Operating rules

  • WIP cap: ≤3 dev agents in flight.
  • Pull order inside the theme: priority:p0 > pm:blocking > security > age.
  • Bug-fix PRs ride the normal merge queue (auto-merge allowed). Exception: any diff touching .claude/skills/**, skills/**, .claude/agents/os-dev.md, or AGENTS.md is ADR-class — draft + human merge, per standing rules.
  • Standard discipline unchanged: claim-before-code with session + branch, per-task worktrees, os-dev dispatch protocol, model tiering (default opus; fable where the mandatory clauses apply), union-after-final-commit with quoted HEAD.
  • Reporting: round reports on this epic (not per-lane); decisions surfaced to the maintainer via needs-user-decision or the round report.
  • Lane seat posts stay ⏳ vacant; the PM session taking this theme registers here with a claim comment (session ID + scope) and de-registers on stand-down.

Out of scope (by ruling)

hotcrm and cloud repos. Boundary note for the maintainer: hotcrm's four P0s (e.g. #703, wildcard grant union) accuse platform defects; whether to mirror their platform-side verification into this theme is an open maintainer call — until then, v17's authorization surface has no assigned verifier.

Done means

Every in-scope target:v17 bug is closed (fixed, or ruled defer/void with the ruling recorded); the five P0s all carry an explicit maintainer disposition.

Activity

  1. added theissue type on Aug 14, 2026
  2. hotlong commented on Aug 14, 2026

    @hotlong
    ContributorAuthor

    Sibling epic filed: #8668 — Seat B: console bugs (objectui repo + repo:objectui cards here). The two seats partition the in-scope bug set: console-facing surface is B's, everything else objectstack-side is A's.


    Generated by Claude Code

  3. hotlong commented on Aug 14, 2026

    @hotlong
    ContributorAuthor

    Ruling batch applied (maintainer 2026-08-14, verbatim: 「同意」 on the six-item list). Seat A queue changes:

    First batch now: #8193 · #8617 · #8262 · #8154 · #7987 · #8287, then #8629 / #8586→#8421 as serials clear.


    Generated by Claude Code

  4. hotlong commented on Aug 14, 2026

    @hotlong
    ContributorAuthor

    Decision-box ruling batch applied (maintainer 2026-08-14, verbatim: 「同意你的建议」 on the eight-item list). Seat A queue changes:

    Decision box after this batch: 1 item — #8446, which is a personal maintainer action (file the pre-drafted better-auth upstream issue), not a seat task.

    Updated first batch: #8193 · #8617 · #8262 · #8154+#8155 (coupled) · #7987 · #8287 · #8613 · #8504, with #8629 / #8586→#8421 / #8641-probe as serials and smalls behind them.


    Generated by Claude Code

  5. hotlong commented on Aug 14, 2026

    @hotlong
    ContributorAuthor

    Routing update (maintainer 2026-08-14, verbatim: 「spec 车道的项目经理上班了,相关任务还是由他处理。」): the two domain:spec cards leave this seat's ladder — #8586 and #8641 route to the live spec lane seat (#6017, notified). Consequence for this seat: #8421's serial start condition is now cross-seat — it begins after the spec seat lands #8586. First batch unchanged: #8193 · #8617 · #8262 · #8154+#8155 · #7987 · #8287 · #8613 · #8504; remaining serials here: #8629 (after #8555), #8421 (after spec's #8586).


    Generated by Claude Code

  6. hotlong commented on Aug 14, 2026

    @hotlong
    ContributorAuthor

    Charter amendment (maintainer 2026-08-14, verbatim, untranslated): 「spec 车道的项目经理上班了,spec任务还是由他处理。」「其他人不得接手」 — standing exclusivity rule, stronger than the routing note above: ⛔ every domain:spec task is the spec lane seat's (#6017) alone; this seat must never claim, dispatch, or take over a spec card under any circumstances — the scope carve-out for live lane seats (devx, spec) is now a hard prohibition for spec, not a courtesy. Cross-seat serials remain the one sanctioned interaction shape: wait for the spec seat's merges (e.g. #8421 after #8586), never do their work.


    Generated by Claude Code

  7. hotlong commented on Aug 14, 2026

    @hotlong
    ContributorAuthor

    Nomination — three v17 authorization/security candidates, measured on 17.0.0 GA

    Nominating only; no labels applied, and the first-batch list above is untouched. Per this epic: "The PM nominates second-batch candidates with a short list on this epic; the maintainer approves by labeling".

    This is the boundary note in this card's own Out of scope section coming due — "hotcrm's four P0s (e.g. #703, wildcard grant union) accuse platform defects; whether to mirror their platform-side verification into this theme is an open maintainer call — until then, v17's authorization surface has no assigned verifier." Under maintainer ruling 2026-08-14 (verbatim 「同意」) the hotcrm side ran that verification: five security/authorization cards re-probed on GA under real Bearer tokens (objectstack-ai/hotcrm#1152). Two closed green; the three below survived and are filed here as platform cards. Nothing else from hotcrm enters this theme.

    candidate class state on 17.0.0 GA
    #8681 security org-admin sets ship object_permissions['*'].allowExport = true; an app cannot deny the export axis to an org admin, and the sets answer not_overridable
    #8679 bug controlled_by_parent children still refuse an RLS-widened master — PR #6909 fixed the by-id write path only
    #8682 bug undeclared fields still reach the driver: hooks run, an auto-number is consumed, and the full INSERT with values is logged at ERROR

    Why each is worth a slot

    #8681 is the one I would rank first. It is the same shape as #703 — a platform wildcard grant that erases an app's explicit-allow declaration — on the one axis that #5491 / PR #6684 did not sweep. It is measured, not inferred: a wildcard export grant confers export on a principal with no admin status, and a more specific per-object false beats the wildcard, so a supported opt-out shape already exists and is simply out of an app's reach. Bulk egress with no app-side denial is a security posture question, not a bug-fix question, which is why it is nominated rather than queued.

    #8679 is a partial-fix follow-up rather than a new defect: #5493 closed via merged PR #6909, and the rc.2 symptom really is gone. What survives is the derived-write path, where security/explain and the master-editability check now return opposite verdicts for the same principal, record and operation. Cheap to bound because the disagreement is between two named call sites.

    #8682 is the lowest severity of the three, and half of it has already been fixed upstream (the false [REST] Unhandled error label is gone). It is nominated for the surviving half: a mistyped field name in a client request writes the whole row's values to disk at ERROR level, confirmed with planted canaries.

    Not nominated (closed green on GA, recorded for the ledger)


    Generated by Claude Code


    Generated by Claude Code

  8. hotlong commented on Aug 14, 2026

    @hotlong
    ContributorAuthor

    Nomination — 4 platform cards mirrored from the hotcrm GA close-out sweep

    Posted by the hotcrm PM seat, session session_01XAK3brMLjd4ykF4QAhFnuo, from hotcrm#1153 (sub-issue of hotcrm#1150). These are nominations, not labels — nothing here carries target:v17 and the first-batch list above is untouched, per this epic's "the PM nominates … the maintainer approves by labeling" and hotcrm#1150's "Seat A decides nothing".

    This is also the boundary case this epic's Out of scope section flagged: "whether to mirror their platform-side verification into this theme is an open maintainer call." Each card below is a platform defect re-measured live on 17.0.0 GA, not an rc-era report carried forward — every one of the six cards in that sweep was re-probed and two of them died on contact and were closed, so this list is what survived measurement.

    # card one-line evidence class
    #8686 Seed loader writes untenanted rows while REST stamps an org — two autonumber scopes on one single-tenant install, duplicate business identifiers, silent live REST + sequence-table + index DDL
    #8687 Unknown top-level stack key named but not rejected — and the diagnostic is not a warning, so --strict cannot catch it schema parse + controlled validate runs, 88-vs-88 warning diff
    #8688 Missing required master-detail parent answers 422 with no fields[]; the same field present-but-unresolvable answers 400 with fields[] (#7474 residual) six-branch REST comparison, one server/session
    #8689 A record-change flow's start condition is not evaluated on the re-entrant dispatch its own write causes — the loop-breaker is the sole guard, and says so two flows, record-id-filtered engine WARNs, guard terms read back

    Notes that may affect ranking

    One adjacent finding, filed but deliberately NOT nominated

    #8690 — an unparseable date comparand on a datetime filter returns HTTP 200 with zero rows and no diagnostic, while an unknown {placeholder} on the same request is rejected 400 FILTER_TOKEN_UNKNOWN. Found while probing hotcrm#520 to closure. Leaving it to ordinary triage rather than pushing it into this batch, but flagging it here because it is the same silent-empty-result family that cost hotcrm three weeks on #520 and it is reachable by any caller holding a declared preset name.

    Two cards from the same sweep were CLOSED, not nominated

    Recorded so the account-book stays honest about what measurement actually produced: hotcrm#520 (datetime window filtering) and hotcrm#779 (ctx.previous empty on multi: true) both failed to reproduce on GA and were closed with their readings. #779's close specifically confirms #5574 → PR #6697 landed correctly, including that the new 10000-row per-row dispatch ceiling refuses loudly and writes nothing rather than masking the old silent no-op.


    Generated by Claude Code


    Generated by Claude Code

  9. hotlong commented on Aug 14, 2026

    @hotlong
    ContributorAuthor

    Nomination — 1 platform card for target:v17, from the hotcrm GA close-out browser sweep

    Nomination only: no labels applied, no change to the first-batch list. Filed from objectstack-ai/hotcrm#1154 (parent hotcrm#1150).

    #8691 — record:reference_rail has no ComponentPropsMap row, so an entry filter is accepted everywhere and honoured nowhere

    Downstream: hotcrm#986. This is a packages/spec fix, which is why it comes to this desk rather than Seat B — nothing in the console renderer has to change.

    Measured on @objectstack/spec 17.0.0 GA: ComponentPropsMap has 37 component keys, six record:* among them, and no record:reference_rail. With no row, PageComponent.properties stays an open bag and nothing parses a rail entry on any path.

    Reverse verification on a real app, direction fixed before running — planted filter: [{ field:'status', op:'neq', value:'completed' }] on a rail entry whose object has 3 related rows, 2 of them not completed:

    stage result
    tsc --noEmit exit 0
    objectstack validate passed — reference_rail appears 0 times in output
    objectstack build exit 0 — 0 times
    shipped artifact filter present verbatim in dist/objectstack.json
    rendered rail badge unchanged at 3, the completed row still listed

    The same build run emits loud component-props-unknown-key / component-props-invalid warnings for record:related_list, record:activity and page:accordion in the same file — the rail is silent purely because it is undeclared. Control: ComponentPropsMap['record:related_list'].safeParse with a bogus key does reject.

    Why v17. This is the exact failure shape #4001 was closed to eliminate, still open on this component: metadata that typechecks, validates, builds, publishes and does nothing, while the source now claims it filters. It is the class of error an AI metadata author produces most readily and a human reviewer catches least — the diff looks correct and every gate is green. The fix tightens an existing shape rather than expanding the authorization surface, so it needs no ruling on business pull and no new capability: one strict row describing what the renderer already reads, turning a silent no-op into a loud publish-time rejection.

    The downstream card's other two gaps (rail title cannot reach pluralLabel; title is an untranslatable literal) are console/objectui surface and genuine capability expansion — they are explicitly excluded from #8691 and are not nominated anywhere, because the only consumer found repo-wide is a single rail on one detail page and the pull question is unanswered. Recommend they stay frozen until the maintainer rules.

    Card is unassigned and was duplicate-checked (nearest hit: #1894, closed).

    Two console cards from the same sweep — objectui#4644, objectui#4645 — went to #8668 instead, since this epic's Scope section routes repo:objectui work to Seat B. Flagging that here because hotcrm#1154 named #8667 as the nomination target for all survivors; three of its five cards were console surface, so the instruction and the epic boundaries disagreed. Resolved in favour of the epic boundaries.


    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

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions