@stage5/lumine 0.2.65 → 0.2.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,9 +15,13 @@ canonical structured data.
15
15
  server-owned Zero and Ciel user IDs are approved. Usernames and CLI flags are
16
16
  not authority.
17
17
  - `daily-run start` creates or returns a six-hour `delegated-admin` run with
18
- explicit scopes and one public actor. Every run-scoped CLI command loads the
19
- canonical active run and sends its ID; the API rejects a missing, expired, or
20
- mismatched run.
18
+ one allowlisted run scope and one public actor. `--scope full` is the full
19
+ daily-management review. `--scope featured` is only an authorization
20
+ envelope for a specifically requested Featured slice; it does not authorize
21
+ or imply the newspaper, queues, conduct review, logs, costs, sponsors,
22
+ carry-over work, or final full-run report. Every run-scoped CLI command loads
23
+ the canonical active run and sends its ID; the API rejects a missing,
24
+ expired, scope-mismatched, or actor-mismatched run.
21
25
  - The public content actor is Zero or Ciel. Mikey's operator ID is retained in
22
26
  private audit rows and is not embedded in public comment metadata.
23
27
  - Delegated HTTP work never authenticates as the bot, opens a bot socket, changes
@@ -59,6 +63,15 @@ Comment mode is stored only on the current run:
59
63
  - `draft`: server-generated drafts, no public comment.
60
64
  - `post`: drafts plus idempotent publication through the ordinary comment path.
61
65
 
66
+ A Featured-only run always uses comment mode `off` and grants only Featured
67
+ subject inspection, subject reveal, Featured mutation, and run completion. It can complete
68
+ without a sponsor-integrity scan. Completing it does not advance any full-run
69
+ content/cost/conduct window, queue-coverage record, last-completed identity, or
70
+ carry-over surfacing telemetry. Start one only when Mikey requested that slice; never turn a small
71
+ request into a full review merely because the technical command needs a run.
72
+ The API enforces these scopes, and the CLI also rejects out-of-scope operations
73
+ before calling endpoints outside the Lumine Admin router (notably Build review).
74
+
62
75
  ### Private AI-bucket maintenance
63
76
 
64
77
  AI identity buckets are private operator bookkeeping, not a Zero/Ciel public
@@ -210,9 +223,11 @@ coins, streaks, buckets, messages, or public content.
210
223
 
211
224
  ## Editorial priorities
212
225
 
213
- The CLI enforces none of this — it is the standing instruction for the operator
214
- or agent making the judgments, and it applies to every verb below: recommends,
215
- rewards, effort levels, Featured, skips, comments, and replies.
226
+ The CLI never makes the qualitative judgments in this section; they are the
227
+ standing instruction for the operator or agent and apply to every verb below:
228
+ recommends, rewards, effort levels, Featured, skips, comments, and replies. It
229
+ does enforce deterministic server-provable boundaries documented below, such
230
+ as the posting-date and lifetime-history gates for a new Featured addition.
216
231
 
217
232
  Public text authored as Ciel must be English. This is an operator and generation
218
233
  instruction, not a script or keyword test: writing systems do not identify a
@@ -337,9 +352,9 @@ is. Those go to Mikey.
337
352
 
338
353
  ## Escalation to Mikey
339
354
 
340
- A run is not finished when the mutations are done. Curation surfaces things only
355
+ A full daily management run is not finished when the mutations are done. Curation surfaces things only
341
356
  a human owner can decide, and a finding nobody reports is a finding that did not
342
- happen. **Every run ends with an escalation list**, and it belongs in the run's
357
+ happen. **Every full run ends with an escalation list**, and it belongs in the run's
343
358
  final report whether or not anyone asks for it.
344
359
 
345
360
  Keep that list narrow enough to be useful. Escalate concrete child-safety,
@@ -604,6 +619,7 @@ type DailyRun = {
604
619
  publicActorUserId: number;
605
620
  identityMode: "auto" | "zero" | "ciel";
606
621
  commentMode: "off" | "draft" | "post";
622
+ runScope: "full" | "featured";
607
623
  sessionKind: "delegated-admin";
608
624
  scopes: string[];
609
625
  status: "active" | "completed" | "failed" | "expired";
@@ -704,6 +720,7 @@ identity, or advances rotation.
704
720
 
705
721
  ```bash
706
722
  lumine admin daily-run start --identity auto --comment-mode off --json
723
+ lumine admin daily-run start --scope featured --identity auto --json
707
724
  lumine admin daily-run start --identity ciel --comment-mode draft \
708
725
  --run-key daily:2026-08-06:review --json
709
726
  lumine admin daily-run status --json
@@ -744,7 +761,7 @@ type DailyRunFail = DailyRunComplete;
744
761
 
745
762
  This is the approved Zero/Ciel Build Workshop sponsor role, not the ordinary
746
763
  AI Energy sponsor flow. Applications originate only from `lumine sponsor`.
747
- Website-management agents review them inside an active daily run:
764
+ Website-management agents review them inside an active full daily run:
748
765
 
749
766
  ```bash
750
767
  lumine admin sponsor applications list --status pending --json
@@ -773,10 +790,11 @@ cleared.
773
790
  `disqualify` makes it ineligible. `hold` and `flag` require an evidence note and
774
791
  remain open. The scan itself never changes sponsor status or applies a sanction.
775
792
  Use the separate, audited `sponsor status set` command for an explicit human
776
- decision. `daily-run complete` is rejected until the scan has covered its full
793
+ decision. Full `daily-run complete` is rejected until the scan has covered its full
777
794
  snapshot and no pending, held, or flagged case remains.
778
795
 
779
- Record only qualifying escalations as they are confirmed. `daily-run report`
796
+ During a full review, record only qualifying escalations as they are confirmed.
797
+ `daily-run report`
780
798
  then composes the active run's canonical audit events, successful mutations,
781
799
  completed queue scans, recorded escalations, and the most useful brief deltas
782
800
  into one result. Generate it before `complete`, because run-scoped reads require
@@ -784,7 +802,7 @@ the current active run. Queue coverage is written automatically only after an
784
802
  `--all` traversal reaches canonical exhaustion; an interrupted scan remains in
785
803
  its local checkpoint and cannot be misreported as complete.
786
804
 
787
- **Every agent-authored final management report includes a `Featured rotation`
805
+ **Every agent-authored final full-management report includes a `Featured rotation`
788
806
  section.** Base it on a fresh `featured list`. When capacity exists, make and
789
807
  report strong additions during the run under the standing approval above; do
790
808
  not defer them as proposals. Then name each current Subject proposed for
@@ -818,13 +836,17 @@ Starting with a run key that belongs to a finished or expired run fails with
818
836
  `CLI_ADMIN_RUN_KEY_ALREADY_USED`; supply a fresh `--run-key` (for example
819
837
  `daily:2026-08-07:2`) to start again the same day. Reusing the key of the
820
838
  live active run returns that run only when the requested `--comment-mode`
821
- and any explicit `--identity` match it; otherwise the start fails with
839
+ and `--scope`, plus any explicit `--identity`, match it; otherwise the start fails with
822
840
  `CLI_ADMIN_RUN_SETTINGS_MISMATCH` instead of silently returning a run with
823
841
  different scopes. The same check applies when a start without the active
824
842
  run's key would fall back to that active run.
825
843
 
826
- The default run key is `daily:YYYY-MM-DD` in Asia/Bangkok. Supply `--run-key`
827
- for a separate explicit run. `--idempotency-key` may be supplied to any
844
+ The default full-run key is `daily:YYYY-MM-DD` in Asia/Bangkok. Scoped Featured
845
+ runs receive a fresh `scoped:featured:...` key so completing one slice cannot
846
+ consume the day's full-run key or prevent a later explicitly requested slice.
847
+ They also use a dedicated API start endpoint, so an older API cannot ignore the
848
+ scope and silently create a full run; it fails before creating any run instead.
849
+ Supply `--run-key` for a separate explicit run. `--idempotency-key` may be supplied to any
828
850
  mutation when a caller needs the same retry identity across processes. The CLI
829
851
  generates a fresh key for every mutation invocation; if a mutation fails, its
830
852
  JSON error includes `details.retryIdempotencyKey` for a safe exact retry.
@@ -850,7 +872,7 @@ audit path: canonical todo state and its private `todo.create` / `todo.update`
850
872
  audit response commit together, and no public bot, public mutation count, or
851
873
  rotation signal is involved.
852
874
 
853
- Every successful `daily-run start` response automatically includes all
875
+ Every successful full `daily-run start` response automatically includes all
854
876
  unfinished items under `data.carryoverTodos`. The same run ID increments an
855
877
  item's surfacing telemetry at most once, even when start is retried. This is the
856
878
  canonical handoff: read it before discretionary new work, resume what can safely
@@ -860,6 +882,8 @@ still-unfinished set again. Completing a daily run never silently completes its
860
882
  todos. A CLI carrying this contract rejects a start response that does not echo
861
883
  the canonical handoff, so a newer CLI against an API deployed before the todo
862
884
  migration cannot quietly treat unsupported telemetry as an empty list.
885
+ A Featured-only start instead returns an explicitly suppressed, empty handoff
886
+ and performs no todo reads, writes, capacity checks, or surfacing increments.
863
887
 
864
888
  `kind` is `task` or `experiment`. New items may start `open`, `in_progress`, or
865
889
  `blocked`; updates may also use `completed` or `cancelled`. A progress note is
@@ -899,9 +923,10 @@ type AdminTodoList = Success<{
899
923
  type AdminTodoMutation = Success<{ todo: AdminTodo }>;
900
924
 
901
925
  type CarryoverTodos = {
926
+ included: boolean;
902
927
  items: AdminTodo[];
903
928
  count: number;
904
- surfacedForRunId: number;
929
+ surfacedForRunId: number | null;
905
930
  newlySurfacedCount: number;
906
931
  };
907
932
  ```
@@ -1009,6 +1034,18 @@ the spool and can be copied to a separate `--output` file, while `--checkpoint`
1009
1034
  remains resumable operational state. Subject `--after` is inclusive, and every
1010
1035
  opaque cursor is bound to its original filters.
1011
1036
 
1037
+ An automatic checkpoint filename includes a fingerprint of the exact request,
1038
+ so two scans with the same operation name and run ID but different subjects,
1039
+ server filters, client-side view filters, or result-transform inputs cannot
1040
+ overwrite one another. An exclusive adjacent lock rejects a
1041
+ second process using the same checkpoint while the first scan is active and
1042
+ recovers a lock only when its recorded process no longer exists. Resume still
1043
+ recognizes the pre-fingerprint default filename, validates its stored request
1044
+ fingerprint, and migrates it through the existing checkpoint path.
1045
+ Legacy Build-candidate checkpoints intentionally fail that validation because
1046
+ they did not bind the Site URL used to materialize candidate links; start those
1047
+ scans fresh so one result cannot mix origins.
1048
+
1012
1049
  For `--all --json`, stdout remains exactly one JSON value. Scan-start, first-
1013
1050
  page, every-tenth-page, and exhaustion progress is written to **stderr** with
1014
1051
  only page/scanned/candidate counts and the private checkpoint path. A long
@@ -1047,7 +1084,7 @@ learned during that review. The receipt binds the draft to the exact reviewed
1047
1084
  artifact without copying a version number by hand; the server owns the Build,
1048
1085
  version, method, and review-time fields around that understanding.
1049
1086
 
1050
- During every management run, scan recent Build candidates back through the
1087
+ During every full daily management review, scan recent Build candidates back through the
1051
1088
  run's review window alongside Subjects and the recommendation queue. An app
1052
1089
  that is thin, broken, private, unchanged since a prior substantive bot
1053
1090
  comment, or not meaningfully understood may be left alone. A new or materially
@@ -1201,6 +1238,9 @@ lumine admin subject creator set-made-by-poster 123 --json
1201
1238
  lumine admin subject feature 123 --json
1202
1239
  lumine admin subject unfeature 123 --json
1203
1240
  lumine admin featured list --json
1241
+ lumine admin featured history --subject-ids 50,40 --all --json
1242
+ lumine admin featured add --subject-ids 50,40 \
1243
+ --posted-after 2026-08-27T00:00:00+07:00 --json
1204
1244
  lumine admin featured reorder --subject-ids 30,20,10 --json
1205
1245
  lumine admin featured rotate --remove-subject-ids 30,20 \
1206
1246
  --add-subject-ids 50,40 --json
@@ -1233,12 +1273,58 @@ type FeaturedList = Success<{
1233
1273
  maximum: 20;
1234
1274
  }>;
1235
1275
 
1276
+ type FeaturedHistory = Success<{
1277
+ coverage: {
1278
+ complete: boolean;
1279
+ startedAt: number | null;
1280
+ updatedAt: number | null;
1281
+ };
1282
+ subjects: Array<{
1283
+ id: number;
1284
+ url: string;
1285
+ title: string | null;
1286
+ createdAt: number | null;
1287
+ deleted: boolean | null;
1288
+ featured: { member: boolean; order: number | null };
1289
+ knownFeatured: boolean;
1290
+ neverFeatured: boolean | null;
1291
+ firstRecordedFeaturedAt: number | null;
1292
+ lastRecordedFeaturedAt: number | null;
1293
+ }>;
1294
+ events: Array<{
1295
+ id: number;
1296
+ mutationId: string;
1297
+ subjectId: number;
1298
+ action: "featured" | "unfeatured" | "reordered" | "snapshot";
1299
+ fromPosition: number | null;
1300
+ toPosition: number | null;
1301
+ source: "website" | "lumine-admin" | "coverage-bootstrap";
1302
+ operation: string;
1303
+ actorUserId: number | null;
1304
+ operatorUserId: number | null;
1305
+ adminAuditId: number | null;
1306
+ occurredAt: number;
1307
+ }>;
1308
+ pagination: Pagination;
1309
+ }>;
1310
+
1236
1311
  type SubjectFeature = FeaturedList & {
1237
1312
  status: "success" | "already_done";
1238
1313
  changed: boolean;
1239
1314
  };
1240
1315
 
1241
1316
  type SubjectUnfeature = SubjectFeature;
1317
+ type FeaturedAdd = FeaturedList & {
1318
+ status: "success" | "already_done";
1319
+ changed: boolean;
1320
+ data: FeaturedList["data"] & {
1321
+ addition: {
1322
+ addSubjectIds: number[];
1323
+ postedAfter: number;
1324
+ finalSubjectIds: number[];
1325
+ };
1326
+ };
1327
+ };
1242
1328
  type FeaturedReorder = SubjectFeature;
1243
1329
  type FeaturedRotate = FeaturedList & {
1244
1330
  status: "success" | "already_done";
@@ -1267,6 +1353,34 @@ unknown/deleted IDs, missing current members, non-subject rows, and more than
1267
1353
  20 subjects. Permanent pins and editorial ordering policy are deliberately not
1268
1354
  hardcoded.
1269
1355
 
1356
+ `featured history` is the compact canonical evidence path. It returns only
1357
+ coverage metadata, per-subject lifetime summaries, and paginated mutation
1358
+ events; it does not repeat full audit before/after board snapshots. An event of
1359
+ any action proves the subject has appeared on Featured. `neverFeatured: true`
1360
+ is returned only when no event exists and the subject was created strictly
1361
+ after the finalized coverage boundary. `null` means the subject predates provable
1362
+ coverage—never convert that unknown into “never Featured.” Both the website
1363
+ editor and Lumine mutations write this append-only history in the same
1364
+ transaction as the canonical board replacement.
1365
+ For a retry whose board transaction committed but whose canonical detail reload
1366
+ failed, the audit-linked history event is the durable receipt: the API re-reads
1367
+ the current board and preserves the original changed-mutation accounting.
1368
+
1369
+ `featured add` is the atomic verb for genuinely new additions. The supplied
1370
+ IDs are placed at the front in descending relevance order while existing
1371
+ members retain their order. The server requires the whole batch to be absent,
1372
+ fit within the 20-subject maximum, have no Featured event, fall inside complete
1373
+ history coverage, and have a creation time strictly after `--posted-after`.
1374
+ That boundary accepts Unix seconds, an ISO-8601 date (interpreted as UTC), or
1375
+ an ISO-8601 timestamp with an explicit `Z`/numeric offset; timezone-free
1376
+ timestamps and permissively normalized dates are rejected.
1377
+ Any failed gate leaves the entire board unchanged. An exact completed retry is
1378
+ replayed from its audit response, while recovery after a committed board change
1379
+ is proven by that request's audit-linked history receipt. A fresh request for
1380
+ an already-present subject fails instead of inferring a retry from board shape.
1381
+ Use the ordinary singular `subject feature` only for an explicit manual
1382
+ override; it does not claim that a subject is new.
1383
+
1270
1384
  Featured rotate is the direct, atomic replacement verb for an approved
1271
1385
  rotation. `--remove-subject-ids` names the exact current members Mikey approved
1272
1386
  for removal; `--add-subject-ids` names the same number of replacements in
@@ -1617,7 +1731,7 @@ platform absorbs the cost, exactly like their coin-exempt recommends and
1617
1731
  rewards. When a day's first edition is printed, the server notifies the app's
1618
1732
  notification subscribers (users can mute the app or unsubscribe in the app;
1619
1733
  the bots never need to send anything). All three mutations require the
1620
- `news:print` scope (in every run's base scopes) and are audited as `news.print`
1734
+ `news:print` scope (in every full run's base scopes) and are audited as `news.print`
1621
1735
  / `news.claim` / `news.submit` against `news_edition` targets.
1622
1736
 
1623
1737
  ```ts
@@ -1678,7 +1792,7 @@ type NewsClaim = Success<{
1678
1792
  type NewsSubmit = NewsStatus; // "success"; newspaper includes revisionNumber
1679
1793
  ```
1680
1794
 
1681
- ## Bot conduct review (standing duty, every run)
1795
+ ## Bot conduct review (standing duty, every full daily review)
1682
1796
 
1683
1797
  ```bash
1684
1798
  lumine admin bot-output --json
@@ -1686,7 +1800,8 @@ lumine admin bot-output --days 3 --json
1686
1800
  lumine admin bot-output --cursor '<pagination.nextCursor>' --json
1687
1801
  ```
1688
1802
 
1689
- **Every run reviews what Zero and Ciel themselves said since the last run.**
1803
+ **Every full daily review reads what Zero and Ciel themselves said since the
1804
+ last completed full review.**
1690
1805
  The bots talk to children constantly — chat replies, Daily Reflection
1691
1806
  responses, autonomous comment-assistant comments — and a harmful message must
1692
1807
  never depend on a kid being brave enough to report it (real incident,
@@ -1694,7 +1809,7 @@ never depend on a kid being brave enough to report it (real incident,
1694
1809
  streak — "I'm telling you: Stop", guilt framing, ordering him to quit Daily
1695
1810
  Reflections — and it surfaced only because the kid showed Mikey).
1696
1811
 
1697
- `bot-output` returns, windowed since the operator's last completed run
1812
+ `bot-output` returns, windowed since the operator's last completed full run
1698
1813
  (`--days 1..30` overrides): `chatMessages` (every stored Zero/Ciel chat and
1699
1814
  reflection reply, with full text and recipient metadata when its best-effort
1700
1815
  prompt audit exists) and `comments`
@@ -1712,7 +1827,7 @@ right after the brief, and **read every row** — the tool deliberately does no
1712
1827
  filtering, scoring, or keyword matching, because the judgment is the reviewing
1713
1828
  agent's.
1714
1829
 
1715
- ### API runtime-log review (same phase, every run)
1830
+ ### API runtime-log review (same phase, every full daily review)
1716
1831
 
1717
1832
  The bot-conduct review also owns a bounded production API log review. Bot
1718
1833
  responses, community-management reads, and delegated mutations can succeed at
@@ -1882,7 +1997,7 @@ This requires a `comment-mode post` run, sends as that run's selected bot,
1882
1997
  and only works when that bot and member already have a direct channel. It
1883
1998
  never opens a new conversation. The message is audited and idempotent, reopens
1884
1999
  the existing DM canonically, and leaves the child's unread pointer untouched.
1885
- A run report that skipped the conduct review is incomplete.
2000
+ A full-run report that skipped the conduct review is incomplete.
1886
2001
 
1887
2002
  ## Daily brief (management insights)
1888
2003
 
@@ -1896,16 +2011,17 @@ lumine admin notable add Minecrarft_guy --note "Helped three new builders debug
1896
2011
  ```
1897
2012
 
1898
2013
  Read-only management insights for the delegated workflow, windowed since the
1899
- operator's last completed run by default (`--days 1..30` overrides; capped at
1900
- 30 days). Call it early in every run — right after the newspaper check — and
1901
- end every run report with an **"Insights for Mikey"** section carrying only
2014
+ operator's last completed full run by default (`--days 1..30` overrides;
2015
+ capped at 30 days). Call it early in every full daily review — right after the
2016
+ newspaper check — and end every full-run report with an **"Insights for
2017
+ Mikey"** section carrying only
1902
2018
  the deltas and anomalies worth his time, next to the escalation list. Never
1903
2019
  dump raw sections at him.
1904
2020
 
1905
- ### Application AI calendar-month cost (standing duty, every run)
2021
+ ### Application AI calendar-month cost (standing duty, every full daily review)
1906
2022
 
1907
- Run `lumine admin ai-costs monthly --json` during every website-management
1908
- run. This read-only command requires the active delegated run and returns one
2023
+ Run `lumine admin ai-costs monthly --json` during every full daily management
2024
+ review. This read-only command requires the active delegated run and returns one
1909
2025
  server-owned calendar summary from the canonical deduplicated application AI-
1910
2026
  cost ledger. It deliberately takes no `--days`: all boundaries are UTC calendar
1911
2027
  months, so the result is directly comparable from one run to the next.
@@ -2004,13 +2120,13 @@ owned. Deploy and verify the compatible `twinkle-api` route before publishing
2004
2120
  or installing the Lumine CLI release that invokes it; an older API will reject
2005
2121
  the new command instead of synthesizing figures locally.
2006
2122
 
2007
- ### Lumine media feature cost and cleanup watch (standing duty, every run)
2123
+ ### Lumine media feature cost and cleanup watch (standing duty, every full daily review)
2008
2124
 
2009
- Run `lumine admin media-costs monthly --json` during every website-management
2010
- run. This read-only, delegated-run-gated command reports the canonical Media
2125
+ Run `lumine admin media-costs monthly --json` during every full daily management
2126
+ review. This read-only, delegated-run-gated command reports the canonical Media
2011
2127
  Energy ledger for short clips, livestream input/viewer usage, and replay
2012
2128
  storage/viewing. Include in
2013
- **"Insights for Mikey"** on every run:
2129
+ **"Insights for Mikey"** in every full-run report:
2014
2130
 
2015
2131
  - current-month settled estimated cost, active reservations, cross-month
2016
2132
  carryover, guarded total, global limit, remaining headroom, and percent used;
@@ -2040,7 +2156,7 @@ conservative provider-cost estimates. It is not an AWS invoice. Photo capture
2040
2156
  uses existing Build runtime file storage rather than the paid Media Energy
2041
2157
  ledger; `operations.runtimeStorage.readyImages` therefore reports all ready
2042
2158
  Build runtime images, not camera captures alone. Reconcile delayed AWS
2043
- MediaConvert and IVS service charges every run as described below. S3 is shared
2159
+ MediaConvert and IVS service charges every full review as described below. S3 is shared
2044
2160
  with other Twinkle uploads, so report its service-level cost as shared context,
2045
2161
  not as photo-only spend.
2046
2162
 
@@ -2062,13 +2178,13 @@ Replay storage and write cost is conservatively embedded in an opted-in
2062
2178
  `live-input` reservation; `replay-viewer` is a separate kind. Report
2063
2179
  `operations.replays` (pending, processing, ready, failed, deleting,
2064
2180
  delete-failed, overdue finalization/deletion, expired-ready, bytes, and object
2065
- count) and `operations.replayViewers` on every run. A replay finalization or
2181
+ count) and `operations.replayViewers` on every full review. A replay finalization or
2066
2182
  deletion alert is an operational incident because private recording cleanup is
2067
2183
  part of the feature contract.
2068
2184
 
2069
- ### AWS monthly bill expectation (standing duty, every run)
2185
+ ### AWS monthly bill expectation (standing duty, every full daily review)
2070
2186
 
2071
- Starting 2026-08-27, every website-management run must also check AWS Cost
2187
+ Starting 2026-08-27, every full daily website-management review must also check AWS Cost
2072
2188
  Explorer and include the current calendar month's expected AWS bill in
2073
2189
  **"Insights for Mikey"**. This is an account-level infrastructure cost check,
2074
2190
  not the `aiSpending` application-cost section above. Never substitute one for
@@ -2140,9 +2256,9 @@ For the media watch, separately identify AWS Elemental MediaConvert and Amazon
2140
2256
  Interactive Video Service rows when present. Also report Amazon S3 as shared
2141
2257
  storage context, without attributing the whole S3 row to Lumine media.
2142
2258
 
2143
- ### Combined application AI and AWS cost (standing duty, every run)
2259
+ ### Combined application AI and AWS cost (standing duty, every full daily review)
2144
2260
 
2145
- Every website-management report must also give Mikey one **Combined AI + AWS
2261
+ Every full daily website-management report must also give Mikey one **Combined AI + AWS
2146
2262
  tracked operating cost** view. This is a mixed-source estimate, not an invoice
2147
2263
  or a claim to cover every company expense. Keep the independent AI and AWS
2148
2264
  figures visible so the total remains auditable.
@@ -2189,7 +2305,7 @@ farm-signal sections added that day; AI Card summon watch added 2026-08-24):
2189
2305
  report period can begin up to one day before or after the exact brief window,
2190
2306
  so use those bounds when describing it. `generatedAt` is the report
2191
2307
  snapshot time. **`endDayInProgress: true` means the trailing bucket was the
2192
- current UTC day at that snapshot and was still filling** — a daily run reads
2308
+ current UTC day at that snapshot and was still filling** — a full daily review reads
2193
2309
  it mid-day, before the after-school peak, so never report that bucket as a full day's
2194
2310
  spend. `aiSpending.byDay` contains the canonical daily rows. For a truthful
2195
2311
  daily figure, widen the window (`--days 2..7`), exclude the row whose
@@ -2621,7 +2737,7 @@ audited as `comment.edit` with the previous content in `beforeState` and
2621
2737
  `data.edit.previousContent`. Edit sparingly:
2622
2738
  kids may have already read the original, so a comment that changed meaning
2623
2739
  (not just wording) usually deserves a follow-up reply instead of a silent
2624
- rewrite. Inside a normal daily run it still requires that run's `comment:post`
2740
+ rewrite. Inside a full comment-enabled daily run it still requires that run's `comment:post`
2625
2741
  scope; for a one-comment repair, use the narrower correction session above.
2626
2742
 
2627
2743
  ## Direct bot chat messages
@@ -3044,6 +3160,19 @@ Deploy and verify the API's `/cli/admin/subjects/featured/rotation` route before
3044
3160
  publishing a CLI release that exposes `featured rotate`; an older API rejects
3045
3161
  the command without changing Featured state.
3046
3162
 
3163
+ For scoped runs and Featured history, also apply
3164
+ `add-lumine-admin-run-scope.sql` and `add-featured-subject-history.sql` before
3165
+ the API release. After every serving API worker is verified on that release
3166
+ and no pre-history worker or request remains running or in flight, run
3167
+ `finalize-featured-subject-history-coverage.sql`; only then publish a CLI
3168
+ that exposes `featured add`. The guard fails closed until that finalization.
3169
+ After coverage is finalized, rolling back to an API that does not record
3170
+ history is forbidden because it would create an unprovable lifetime gap.
3171
+ After any scoped run exists, an API whose review-window queries do not filter
3172
+ for `runScope = 'full'` is also rollback-incompatible because it would treat a
3173
+ narrow slice as a completed full review. A forward fix must preserve both
3174
+ contracts.
3175
+
3047
3176
  Legacy aliases such as `subjects list`, `subjects get`, `subjects featured`,
3048
3177
  `comments get`, and `recommend` remain accepted, but the singular command forms
3049
3178
  shown above are the canonical interface.