|
254 | 254 | "title": "Filtered roll-up summaries recompute only through their own filter", |
255 | 255 | "since": "v16", |
256 | 256 | "status": "active", |
257 | | - "revision": 2, |
| 257 | + "revision": 3, |
258 | 258 | "priority": "P1", |
259 | 259 | "surface": "mixed", |
260 | 260 | "personas": [ |
|
263 | 263 | "fixtures": { |
264 | 264 | "app": "showcase", |
265 | 265 | "requires": [ |
266 | | - "a parent with several filtered roll-ups in different filter shapes (showcase_expense_report: equality / boolean / operator / unfiltered)" |
267 | | - ], |
268 | | - "knownGaps": [ |
269 | | - "the visual filter-editor half needs a summary field in a WRITABLE package — the showcase ships read-only, so Studio editing is not reachable on stock fixtures (#3358)" |
| 266 | + "a parent with several filtered roll-ups in different filter shapes (showcase_expense_report: equality / boolean / operator / unfiltered)", |
| 267 | + "the editor-half clause additionally needs a writable target package — obtained at runtime via POST /packages/:id/duplicate (ADR-0070 D4 'duplicate base'), not a stock fixture" |
270 | 268 | ] |
271 | 269 | }, |
272 | 270 | "steps": [ |
|
276 | 274 | "PATCH one line's status approved→rejected over /api/v1/data/showcase_expense_line/:id; re-read the parent and recompute again", |
277 | 275 | "PATCH a different line's billable true→false; re-read the parent", |
278 | 276 | "DELETE one line; re-read the parent — a delete must move every roll-up whose filter matched the deleted row, including the unfiltered total", |
279 | | - "(editor half, blocked) on a writable package: edit a summary field's child-row filter in Studio's visual filter editor, save, and re-read the persisted metadata" |
| 277 | + "on a writable package: POST /packages/com.example.showcase/duplicate {targetPackageId: <scratch id>} (ADR-0070 D4 'duplicate base' — the platform's supported writable-base route) to clone the showcase base, then in Studio's visual filter editor edit the duplicated expense-report's summary field child-row filter, save, and re-read the persisted metadata over the meta API" |
280 | 278 | ], |
281 | 279 | "acceptance": [ |
282 | 280 | { |
|
304 | 302 | "evidence": "before/after value table" |
305 | 303 | }, |
306 | 304 | { |
307 | | - "clause": "the child-row filter is settable via the visual editor on a writable package", |
| 305 | + "clause": "the child-row filter is settable via the visual editor on a writable package obtained through the platform's own duplicate-base route", |
308 | 306 | "oracle": "screenshot", |
309 | | - "verify": "edit a summary field's filter in Studio on a writable package and confirm the persisted metadata via the meta API", |
| 307 | + "verify": "POST /packages/com.example.showcase/duplicate to clone the showcase base into a writable target package (ADR-0070 D4), open the duplicated parent's summary field in Studio's visual filter editor, edit its child-row filter, save, and confirm the persisted metadata via the meta API", |
310 | 308 | "evidence": "editor screenshot + saved metadata read" |
311 | 309 | } |
312 | 310 | ], |
313 | 311 | "negative": [ |
314 | 312 | "an untouched-filter roll-up that moves on an edit outside its filter (e.g. rejected_count changing on the billable flip) is a FAIL even if every touched value is right" |
315 | 313 | ], |
316 | | - "blocked": { |
317 | | - "by": "fixture", |
318 | | - "ref": "#3358 (editor half needs a writable-package summary field fixture)" |
319 | | - }, |
320 | 314 | "traps": [ |
321 | 315 | "seed-data-thin" |
322 | 316 | ], |
323 | 317 | "source": [ |
324 | 318 | "#3358 §2 (recompute half proven; editor half explicitly left unticked)", |
325 | | - "examples/app-showcase/src/data/objects/expense-report.object.ts (the six roll-up shapes and their filters)" |
| 319 | + "examples/app-showcase/src/data/objects/expense-report.object.ts (the six roll-up shapes and their filters)", |
| 320 | + "packages/runtime/src/domains/packages.ts (POST /packages/:id/duplicate — ADR-0070 D4 'duplicate base', the writable-target route)", |
| 321 | + "docs/adr/0070-package-first-authoring.md §D4 ('clone a base into a new writable package')" |
326 | 322 | ], |
327 | 323 | "history": [ |
328 | 324 | { |
|
336 | 332 | "date": "2026-08-07", |
337 | 333 | "change": "expanded to deep-test contract: concrete steps, multi-clause acceptance, negatives, variants", |
338 | 334 | "ref": "claude/platform-test-checklist-ocwugl" |
| 335 | + }, |
| 336 | + { |
| 337 | + "revision": 3, |
| 338 | + "date": "2026-08-25", |
| 339 | + "change": "retargeted clause 5 (the visual filter-editor half) at the platform's supported runtime path per the maintainer ruling on #9788 (2026-08-19, 「接受你的所有建议」): the stock showcase does NOT boot with a writable package, so the runner instead clones the showcase base via POST /packages/:id/duplicate (ADR-0070 D4 'duplicate base') to get a writable target for the visual editor. Removed the item-level blocked.by:fixture entry and the matching fixtures.knownGaps line — the clause is runnable on every boot now, not fixture-blocked. Oracle stays screenshot: the clause specifically tests the VISUAL editor, corroborated by a meta-API read of the persisted filter", |
| 340 | + "ref": "#9788" |
339 | 341 | } |
340 | 342 | ] |
341 | 343 | }, |
|
0 commit comments