Repository navigation
feat(bin): record team channel announcements as updates on the day page - #271
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Intent
Poll the team channels for relevant updates, dates and features, and build it into the 30-minute pipeline. Lars's words: "I feel that we should also be polling these channels for relevant updates, dates, yeah, features. I think this AquaBoo furniture, the series two furniture is a good good example. So can we, like, build this into our pipeline?"
The example is Valerie Loutphi's post in #channel-team on 8 Oct 2026 14:21: "Aquablu Furniture (Limited Release)", a new cabinet for a complete REFILL+ Series 2 setup, a limited first batch of 50 units (pull-out FIZZ Pro drawer with spill capture, shelves for 6 flavour boxes, lockable doors, 1200 x 600 x 940 mm, 95 kg, no wheels; a wheeled version planned for end of year), with key dates (goes live on the webshop for partners to order), links to an internal fact sheet, Partner Wiki and partner email comms. Today such announcements are not read by the pass, which only reads @mentions of Lars, so launch dates, product changes and process updates reach Lars and the support agents only if he happens to see them.
What Changed
bin/fm-channel-intake.shadds anupdateclass, which only aslack-announcementssource can use (observerejects it from any other source). Updates never send a notification and never go on the to-do list. The brief lists them under what changed. Ontick, an update moves toinactive/after a 14-dayUPDATE_WINDOW, counted from when it was posted or last edited, and it moves even if it was edited. Comments,--helptext and log messages now name both the routine and update horizons.bin/fm-todo-items.py,bin/fm-todo-compose.pyandbin/fm-todo-render.shmapupdateledger records to a newupdatekind that carries apostedtime (the source epoch, or the creation time if there is none). The day page shows these in a collapsed "Updates (N)" fold, newest post first, with each post's time, label and link. A retired update is handled like retired routine chatter: it is not shown as a closure, and sync prunes it 30 days later.docs/channel-intake.mdadds a "Team announcement channels" section. It covers which posts to keep (launches and feature changes, dates and deadlines, price, availability or ordering changes, process or policy changes), the title and date convention, and when a post that asks for action gets an owed class instead. It also describes the durabledata/product-updates/log.mdentry the orchestrator appends, and adds anupdaterow to the class table. The bootstrap-diagnostics and daily-todo-freshness skills pointslack-announcementssources to that section, and new tests intests/fm-channel-intake.test.shandtests/fm-todo-render.test.shcover the class gate, retirement and the Updates fold.🤖 Generated with Claude Code
Risk Assessment
✅ Low: The change adds a new
updateclass that only aslack-announcementssource can record, and I traced it through every path that handles classes: notify-due, the to-do list, the brief, retirement, the todo-items fold and prune, and the composer's Updates fold. It never becomes owed or a notification, it ages out on its own two-week horizon (corrected updates included), and existing routine and owed behaviour is unchanged.Testing
The two targeted test files passed. I then drove the real fm-channel-intake.sh and fm-todo-render.sh against disposable lab homes. Steps covered: enrolling, tick, claim, the refused update from a non-announcement source, observing the Furniture post as an update, notify-due, todo, the brief, and the rendered day page (screenshot captured). I also re-observed an edit and advanced the clock past the 1-day and 14-day horizons, then rendered again. Every drivable scenario passed. The model-driven read of real team channels and the updates-log write are untested here because they need a live primary with the Slack connector. Lab homes were removed and the worktree is clean.
Evidence: Intake CLI transcript: enrol, claim, refused update from mention source, Furniture update observed, notify-due/todo empty of it, brief lists it
Source: Intake CLI transcript: enrol, claim, refused update from mention source, Furniture update observed, notify-due/todo empty of it, brief lists it
Evidence: Render command output
Source: Render command output
Evidence: Rendered day page (8 Oct) with Updates (2) fold
Source: Rendered day page (8 Oct) with Updates (2) fold
Evidence: Edit and retirement over time (+2d stays; +14d unedited retires; edited retires at +15d)
Source: Edit and retirement over time (+2d stays; +14d unedited retires; edited retires at +15d)
Evidence: Edited post re-renders as the same single row with the moved date
Source: Edited post re-renders as the same single row with the moved date
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
✅ **Review** - passed
✅ No issues found.
bin/fm-channel-intake.sh:2021- Two user-visible messages still describe the old routine-only retirement. The brief's 'Detection limits' line says routine traffic leaves after 86400s and that 'nothing ... corrected ever leaves', but updates now leave after 14 days, edited ones included. The to-do journal also records a retired update as 'the intake retired it as routine'. Behaviour is correct; only the wording is out of date.bash tests/fm-channel-intake.test.sh(all pass, including test_team_announcements_are_information_not_asks)bash tests/fm-todo-render.test.sh(all pass, including test_team_updates_fold_newest_post_first)Lab home viabin/fm-lab-home.sh create, with a mention source (slack-channel) and an announcement source (slack-announcements):fm-channel-intake.sh sources,tick,claimAdversarial:observe --source C_MENTIONS --class updatewas refused with exit 2observe --source C_TEAM --class update --source-epoch 1791462060 --link …for the Furniture post, plus an older price-list update and an obligation ask; thencomplete,items,notify-due,todo,brieffm-todo-render.sh render, then a headless Chrome screenshot of the day page with the Updates fold openedEdit: re-observing the same ref at +1h returnedupdated <same key>Time-travel ticks with FM_CHANNEL_INTAKE_NOW at +2d, +14d30m and +15d, withitems --state open|inactiveandstatusRender at +15d: no Updates fold, no Closed entry; the journal shows superseded/source closuresSecond lab home: render, edit the post to move the date, re-render, and confirm one row now carries the new date✅ **Document** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.