Repository navigation
Commit 230e494
docs(qa): studio-authoring.picklist-bound-select, the acceptance item of objectui#10202 (#21969)
Fixes #21957
Clause-②: no
## What changes
`docs/qa/platform-checklist/areas/studio-authoring.json` gains one item,
`studio-authoring.picklist-bound-select`: rev 1, `since: v17.7`, P2,
surface `mixed`. It is appended after
`studio-authoring.doc-on-app-menu`. It is part (d) of the director
ruling 6006062645 on objectui#10202 (letter A′). No other item changes,
no item index moves, and no other file is touched.
## Changes from the card's draft, and why
1. **`since` is `v17.7`, not `v17.6`.**
- 17.6.0 has already shipped: the `@objectstack/*@17.6.0` tags point at
`617f25f8` (2026-10-02).
- objectui PR 11669 merged later, on 2026-10-06, as objectui `c3623eb1`.
- No 17.7 tag exists yet. Of the 315 pending changesets, 146 declare a
minor bump and none a major, so the next release is 17.7.
- This week's sibling item
`access-security.public-form-withdrawal-layers` (PR #21964) also sets
`v17.7`.
- One condition: the feature ships in 17.7 only if `.objectui-sha` moves
past `c3623eb1` before the 17.7 cut. See "The console pin" below.
2. **The draft's third clause is split in two.** Its `"oracle": "mixed"`
is not in the gate's oracle set (`api`, `network`, `screenshot`, `dom`,
`log`, `test`, `build`). The draft's words are kept in both halves:
- the picker half is `dom`: picker options against `GET /meta/picklist`;
- the PUT half is `api`: the captured PUT body and status.
3. **The picklist fixture line now spells the recipe**, so a runner can
write it from the item's text alone:
- the file to edit, `examples/app-showcase/objectstack.config.ts`, and
the `defineStack` keys `picklists` and `picklistExtensions`;
- `definePicklist`, exported from `@objectstack/spec`;
- the extension's one value must be new: a repeated value is refused at
load with `INVALID_METADATA`;
- the extension may sit in the list's own package.
`packages/objectql/src/engine-picklist.test.ts` pins this: its
nested-plugin case merges an extension registered under the list's own
package;
- boot with `--compile`. Otherwise `os dev` serves an existing
`dist/objectstack.json`; it warns that the artifact is stale, but it
boots.
The fixture stays uncommitted, and nothing is added to `examples/`.
4. **The console fixture line names the merge it must carry**: objectui
PR 11669, merged as `c3623eb1`. A runner can then check whether the
console under test carries it.
5. **The spec citations are now anchors the gate resolves** (README,
"Write the symbol as an ANCHOR"):
- `PicklistSchema`, `PicklistExtensionSchema`,
`PicklistServedFieldSchema` and `definePicklist`;
- `FieldSchema.picklist`;
- the stack keys `picklists` and `picklistExtensions`.
This file's anchor census goes from 29 to 36, and all of them resolve.
The producer-obligation citation now also names objectui#10202, where
comment 5925784898 lives.
6. The history entry carries `"ref": "#21957"` and lists these changes.
## The console pin
On `main` (`80f9f7e6`), `.objectui-sha` is `0abd4f9f`. That pin does
**not** contain `c3623eb1`, the merge of objectui PR 11669. The reading
was taken in a shallow objectui checkout:
- `git merge-base --is-ancestor c3623eb1 0abd4f9f` exits 1;
- the control leg, `0abd4f9f~30` (`b65aa5e`) against `0abd4f9f`, exits
0;
- the reverse also exits 0: `0abd4f9f` is an ancestor of `c3623eb1`, 21
commits behind it.
So the console fixture line is load-bearing until the pin moves. That
line asks for `pnpm objectui:refresh` from an objectui at or after the
merge.
## Verification (at `eed17a88b`)
`dispatch-gates.mjs --commands` derives 13 gates for this diff, and all
13 were run. Exit codes were captured before any pipe. `--ran`
reconciles the list as 13 derived, 13 run, 0 NOT-MEASURED (a derived
zero).
| gate | exit | verdict |
|---|---|---|
| `pnpm check:platform-checklist` | 0 | OK: 15 areas, 275 items (271
active, 2 planned); symbol anchors 683/693 resolved (676/686 on the
base) |
| `node scripts/check-ci-filter-parity.mjs` | 0 | OK |
| `node scripts/check-closing-keyword-parity.mjs` | 0 | OK: 3 parsers
agree on all 9 keywords |
| `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 | 40
assertions |
| `node scripts/check-comment-mask-corpus.mjs` | 0 | 8297 files, 0
disagree |
| `pnpm --filter @objectstack/lint run check:doc-formula-expressions` |
0 | clean (see below) |
| `pnpm check:cross-package-test-inputs` | 0 | OK |
| `pnpm check:doc-authoring` | 0 | clean |
| `pnpm check:driver-memory-census` | 0 | OK |
| `pnpm check:gitlink-declared` | 0 | OK |
| `pnpm check:nul-bytes` | 0 | OK: no raw ASCII control bytes |
| `pnpm check:refd-timer-probe` | 0 | OK |
| `pnpm check:watch-hint-literal` | 0 | OK |
- `check:doc-formula-expressions` first exited 3: its prerequisite was
not met, because `@objectstack/formula` and `@objectstack/lint` were not
built. After `turbo run build --filter=@objectstack/formula
--filter=@objectstack/lint`, it was re-run and exited 0.
- `checklist-select.mjs` resolves the item as runnable under both
`studio-authoring.picklist-bound-select` and `since:v17.7`.
The diff is checklist JSON only and changes nothing a published package
ships, so the PR takes `skip-changeset`.
## Acceptance notes
- **Not run yet.** This PR writes the item; no run record exists. The
first run needs a console that carries objectui PR 11669 (see "The
console pin").
- **`coverage.json` is unchanged; the `picklist` kind stays waived.**
- The checklist's rules do not require a mapping for a new item.
- The waiver also names its own retirement edit: the promotion of the
planned `records-forms.picklist-shared-across-objects`.
- The waiver's premise, "No runtime reads a picklist", no longer holds.
The runtime half (#19519) has landed: see objectui#10202 comment
5925784898 and `packages/objectql/src/picklist-resolution.ts`.
- So the next sweep's waiver re-audit should rewrite or retire it.
Carrier: none.
- **The showcase has the same stale premise.** Its own coverage waivers
for `picklist` and `picklistExtensions` in
`examples/app-showcase/src/coverage.ts` say "declared ahead of its
runtime reader". Carrier: none.
- **Scope held.** The item's steps go only through the two designers
objectui#10202 repaired: Setup → Metadata → Object, and the Studio data
page. They never go through Studio → Access → OWD overview, a writer
known to fail that is filed on the objectui side.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01VF48aw8RPG6wzDnMgp6rtw)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent fb69825 commit 230e494
1 file changed
Lines changed: 97 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1451 | 1451 | | |
1452 | 1452 | | |
1453 | 1453 | | |
| 1454 | + | |
| 1455 | + | |
| 1456 | + | |
| 1457 | + | |
| 1458 | + | |
| 1459 | + | |
| 1460 | + | |
| 1461 | + | |
| 1462 | + | |
| 1463 | + | |
| 1464 | + | |
| 1465 | + | |
| 1466 | + | |
| 1467 | + | |
| 1468 | + | |
| 1469 | + | |
| 1470 | + | |
| 1471 | + | |
| 1472 | + | |
| 1473 | + | |
| 1474 | + | |
| 1475 | + | |
| 1476 | + | |
| 1477 | + | |
| 1478 | + | |
| 1479 | + | |
| 1480 | + | |
| 1481 | + | |
| 1482 | + | |
| 1483 | + | |
| 1484 | + | |
| 1485 | + | |
| 1486 | + | |
| 1487 | + | |
| 1488 | + | |
| 1489 | + | |
| 1490 | + | |
| 1491 | + | |
| 1492 | + | |
| 1493 | + | |
| 1494 | + | |
| 1495 | + | |
| 1496 | + | |
| 1497 | + | |
| 1498 | + | |
| 1499 | + | |
| 1500 | + | |
| 1501 | + | |
| 1502 | + | |
| 1503 | + | |
| 1504 | + | |
| 1505 | + | |
| 1506 | + | |
| 1507 | + | |
| 1508 | + | |
| 1509 | + | |
| 1510 | + | |
| 1511 | + | |
| 1512 | + | |
| 1513 | + | |
| 1514 | + | |
| 1515 | + | |
| 1516 | + | |
| 1517 | + | |
| 1518 | + | |
| 1519 | + | |
| 1520 | + | |
| 1521 | + | |
| 1522 | + | |
| 1523 | + | |
| 1524 | + | |
| 1525 | + | |
| 1526 | + | |
| 1527 | + | |
| 1528 | + | |
| 1529 | + | |
| 1530 | + | |
| 1531 | + | |
| 1532 | + | |
| 1533 | + | |
| 1534 | + | |
| 1535 | + | |
| 1536 | + | |
| 1537 | + | |
| 1538 | + | |
| 1539 | + | |
| 1540 | + | |
| 1541 | + | |
| 1542 | + | |
| 1543 | + | |
| 1544 | + | |
| 1545 | + | |
| 1546 | + | |
| 1547 | + | |
| 1548 | + | |
| 1549 | + | |
| 1550 | + | |
1454 | 1551 | | |
1455 | 1552 | | |
1456 | 1553 | | |
0 commit comments