Repository navigation
Commit 286eb9e
Fixes #23169
Clause-②: no
## What
This is the last open row of the family card:
`platform-core.lifecycle-retention-sweep` steps[4], the idle-proof step.
It is re-expected under the maintainer's ruling A: decision 6147446653,
answered 「23169 我同意。」, recorded in comment 6160866003. The checklist
step was stale, and the product is correct.
One file and one item change:
`docs/qa/platform-checklist/areas/platform-core.json`, item
`platform-core.lifecycle-retention-sweep`. Its revision goes from 2 to
3, with one appended `history` entry.
- **steps[4]** read "idle proof: … the log carries NO sweep line — an
idle sweep logs nothing". It is now a positive heartbeat check. One more
sweep runs on the now-clean DB: a second interval on steps[2]'s boot, or
a fresh boot plus 90 s with `OS_LOG_LEVEL=info` as in steps[2]. That
sweep still logs its one aggregate INFO line, `[lifecycle] sweep: N
policy(ies) applied, ~0 rows reaped, …`, and the reaped rows stay gone.
- N counts the policies applied, not rows.
- On an info-level boot, a missing line means no sweep reached its
print. It never means "idle".
- A boot at the default warn level never prints the line, so it proves
nothing.
- **fixtures.knownGaps[3]**, the "RULING OWED" entry, now reads "RULED,
no longer a gap" and keeps its reason. That follows the README rule that
a closed gap keeps its reason, and the RULED / CLOSED / FIXED prefixes
other items use. A run record scored against revision 2 or earlier stays
interpretable.
- **Unchanged:**
- steps[5], the kill switch, which is still bracketed by steps[2]'s
armed control;
- every acceptance clause;
- `negative`, `variants`, `traps`, `title` and `source`.
- No clause rested on steps[4] before, and none does now.
No product change: `packages/objectql` is not touched.
## Grounds, re-read at `c5dd7fce3`
- In `packages/objectql/src/lifecycle/lifecycle-service.ts`, `sweep()`
prints the aggregate line when `report.swept.length > 0 ||
report.errors.length > 0 || report.alerts.length > 0`.
- `reap()` runs `report.swept.push({ object, class: lc.class, policy,
cutoff, deleted: total })` for every applied policy, including a `total`
of 0.
- The rotation leg pushes its entry unconditionally.
- An archive-pending object goes to `report.skipped`, not to `swept`.
- A `deleted: 0` swept entry is pinned in
`lifecycle-service.no-tenant-column.test.ts`.
- **Attribution, corrected from the ruling record:**
- "one aggregate log line per sweep is the entire trace it leaves" is
the code comment at that print site.
- ADR-0057 §3.3's own text says the service's own deletes and rotations
"are not audited or activity-logged", and "Aggregate one summary row at
most."
- The item and its history entry attribute each wording to where it
actually lives.
## Method
The edit is one span-scoped scripted edit in Node, against BASE
`c5dd7fce3`. Each anchor (steps[4], knownGaps[3], the item-level
`revision` line, the history tail) was asserted to occur exactly once,
both in the file and in the item's span. After the write, the script
asserted on disk that:
- every byte outside the item's span is identical to BASE;
- the 29 other items parse identical to BASE;
- the item changed only in `fixtures`, `steps`, `revision` and
`history`, and inside those only in `knownGaps[3]` and `steps[4]`;
- the revision went from 2 to 3, and `history` is the base's 2 entries
plus 1.
## Verification at head `cad70efd0`
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derived 13 commands for 1 path. `--ran`
printed "13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN".
- **Exit 0, 12 gates:**
- check-ci-filter-parity;
- check-closing-keyword-parity, and its `--self-test`;
- check-comment-mask-corpus;
- check:cross-package-test-inputs;
- check:doc-authoring;
- check:driver-memory-census;
- check:gitlink-declared;
- check:nul-bytes;
- check:refd-timer-probe;
- check:watch-hint-literal;
- `@objectstack/lint` check:doc-formula-expressions, after building the
lint dependency closure under the verify lock.
- **`pnpm check:platform-checklist` exits 1 with "8 problem(s)", at BASE
and at head alike.**
- The sorted problem lines diff empty, and none is in `platform-core`.
- All 8 sit in `access-security`, `attachments-storage` and `search`,
which belong to the in-flight work of #23593. They are pre-existing and
not touched here.
- **`--anchor-census`** is identical at BASE and head: 724/741 anchors,
plus 10 on the named residual. `platform-core.json` holds 69 on both.
- **`node scripts/checklist-select.mjs
platform-core.lifecycle-retention-sweep`** returns 1 runnable item.
- **A control-byte self-scan** of the edited file found none.
**`skip-changeset`:** this is QA data outside every package.
- `git grep 'docs/qa' -- '*package.json'` exits 1, and the root package
is private.
- Positive control: `packages/spec/package.json` carries a `files` list.
There is no ablation or reverse verification: the diff is ledger text,
and no tested behaviour moved.
## Acceptance notes
- **The ruling record misattributes one quote.** Comment 6160866003 and
decision 6147446653 quote "one aggregate log line per sweep is the
entire trace it leaves" as ADR-0057 §3.3. It is the code comment at the
print site. The item and its history entry carry the correction; the
comments themselves are not edited. Carrier: this PR. Not filed.
- **No test pins the INFO aggregate line itself.** The report shape is
pinned, `deleted: 0` included; the print gate and its message are not. A
future change that silenced idle sweeps would turn steps[4] red only on
the next live run. Observation only; 承接者:无. Not filed.
---
_Generated by [Claude
Code](https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t)_
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 6792be6 commit 286eb9e
1 file changed
Lines changed: 9 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2418 | 2418 | | |
2419 | 2419 | | |
2420 | 2420 | | |
2421 | | - | |
| 2421 | + | |
2422 | 2422 | | |
2423 | 2423 | | |
2424 | 2424 | | |
| |||
2433 | 2433 | | |
2434 | 2434 | | |
2435 | 2435 | | |
2436 | | - | |
| 2436 | + | |
2437 | 2437 | | |
2438 | 2438 | | |
2439 | 2439 | | |
2440 | 2440 | | |
2441 | 2441 | | |
2442 | 2442 | | |
2443 | 2443 | | |
2444 | | - | |
| 2444 | + | |
2445 | 2445 | | |
2446 | 2446 | | |
2447 | 2447 | | |
| |||
2527 | 2527 | | |
2528 | 2528 | | |
2529 | 2529 | | |
| 2530 | + | |
| 2531 | + | |
| 2532 | + | |
| 2533 | + | |
| 2534 | + | |
| 2535 | + | |
2530 | 2536 | | |
2531 | 2537 | | |
2532 | 2538 | | |
| |||
0 commit comments