Repository navigation
Give every owner of a Project their own 09:00 digest - #1737
Conversation
The digest served one owner: memory was keyed by Project id and the whole build was gated on the GitHub identity. Memory and the last digest are now per (project, owner), one board read and one Project State read serve one render per owner, and delivery goes to each owner's own Session with no identity gate. A per-owner quiet window on the assistant record holds a due digest and delivers it once, labelled, when the window ends; a window that covers 09:00 delivers nothing. The opt-out stops generation and pauses the 09:00 task until one owner turns it back on. A cross-owner memory read is refused naming the boundary, and one owner's failing render is recorded on their own note while the other owner's digest is still delivered. Fixes #1733 Part of #1550 Docs-not-needed: docs/subsystems/core-host.md is updated in this commit.
|
Verdict: REQUEST_CHANGES at 67b4c62 Ran at this tip: CI at this tip: 16 check-runs, all terminal. Three code blockers and the body:
Not blockers, but decide and write down: Everything else reads correctly at this tip: |
The ask block compared a member id with the board's assignee, a Bot name, so it was empty for real Projects: the owner now comes from the card's own Bot. A memory record written before the owner dimension is read and migrated onto its primary owner instead of being replaced by the first write. A delivery with no Session of its own never falls back to another owner's main Bot, and its reason is recorded on that owner's own note. Fixes #1733 Part of #1550 Docs-not-needed: docs/subsystems/core-host.md is updated in this commit.
|
Written-by: Chief Decision on the two open questions in the review above — implement these, they are not a new design round.
The four blockers stand as written; |
|
Written-by: Dev
Ran at |
|
Verdict: PASS at e07239b Ran at this tip: Red first, at this tip: with only Tier: T3 — Range: The four REQUEST_CHANGES items on
Non-blocking, and now written down in |
Written-by: Dev
Part of #1550
Fixes #1733
Owner: Chief
Reviewer: Reviewer
Tip SHA: e07239b
Base: 22b94df (live main at branch time)
Docs:
docs/subsystems/core-host.mdupdated in this commit (the Project Assistant paragraph now states the per-owner memory, the owner boundary, the card owner rule and the held-digest limit).What changed
state.projectMemory[id].owners[ownerId], primary owner mirrored on the row; a pre-#1733 record is read and migrated on the first writetwo owners … no memory bleed,a memory record written before the owner dimension keeps its entriesidentity()projectBoardread + onelistProjectStateread, one render per ownertwo owners … from one readassignee(a Bot name), so it was empty for real ProjectsMAX_ACTIONABLE(5)a card lists for the owner of the Bot that owns it, through the real task and board pathcore/src/shared/**untouched, so the change stays T2holds the digest and delivers it once,covers 09:00 delivers nothingsetOwner(..., { off })stops generation and pauses the 09:00 task viart.scheduleEndpoint('schedule-pause'); re-enabling resumes itopting out stops generation and pauses the 09:00 task …read/digestwith an owner outsideownersOf(project)throwsbot/refusednaming the boundary; the assistant's own render walks every ownera cross-owner memory read is refused and names the boundarythe digest still reaches the owner in-app while the GitHub write refuses,an owner without a Session never receives another owner's digestone owner's render failing is recorded while the other … still goes outRan at the tip
TZ=UTC node --test core/test/project-assistant.test.js core/test/quiet-hours.test.js— 26 tests, 26 pass at the tip.core/src/host/store.jsat its base blob, 11 of the 17 cases incore/test/project-assistant.test.jsfail (4, 5, 8–13, 15, 16, 17); withcore/src/host/project-assistant.jsat base the suite fails to load becauseMAX_ACTIONABLEdoes not exist. Restored, 26/26 green.node scripts/ds-bot-patches.mjs check—ds-bot/matches the pin, 11 patches apply cleanly,core/equalsds-bot/+ patches.node .github/scripts/changelog.mjs check— fragments well formed.projects,store,project-state,project-board,project-board-view,workflow-store,workflow-doc,install): green;held-reply-seam,inbox-workflow-failure,project-board-entry,project-board-viewcannot load here (Cannot find package 'esbuild', nonpm ciin this container).Not run:
npm run verifyend to end andnpm run lintin this container (nocore/node_modulesinstall: the harness packages are not present, so oxlint andarch-docscould not execute here; the doc is updated, soarch-docshas its page). CI is the judge of those.Design notes
digest()returns{ owners: [...] }, one entry per owner, and the single-owner fields it returned before (day,skipped,changed,text,reason) are the first owner's, so the existing tool output is unchanged on a one-owner Project.digest()call, and the 09:00 task does not make one after a window ends. That limit is written down in the subsystem doc.read(id, owner)answers that owner's entries for a caller inside the list and refuses an owner outside it. Said so in the doc.Checkpoint
{
"pr": 1737,
"claim": "Chief",
"issue": 1733,
"summary": "Answers the review. The ask block finds a card's owner through the card's own Bot, because the board's assignee is a Bot name and never a member id, and the ask names the card's title. A memory record written before the owner dimension is read and migrated onto its primary owner instead of being replaced by the first write. An owner with no Session of their own never receives another owner's digest, and the reason is recorded on that owner's note. Docs state the boundary and the held-release limit.",
"files": [
"core/src/host/project-assistant.js",
"core/src/host/store.js",
"core/test/project-assistant.test.js",
"docs/subsystems/core-host.md",
"patches/ds-bot/0002-flybot-api-host.patch"
],
"checks": {
"ran": "TZ=UTC node --test core/test/project-assistant.test.js core/test/quiet-hours.test.js && node scripts/ds-bot-patches.mjs check",
"result": "green",
"at": "e07239b91c6acd4b4b42336aecf420288e7d72b2"
},
"next": "Reviewer: judge the new tip. npm run verify was not runnable here (no core/node_modules), so CI is the first full verify."
}