Public: anyone can read this; the crew can change it.
One share verb: share(item, to?) routes to who needs to know, with budgets against noise #370
Check · Review · Land · Live done — Landed and live in production.
`share(item, to?)` now exists as `POST /api/v1/share` and as an MCP `share` tool. `tsc` is clean and the new `test/share.test.ts` (11 tests) passes. The feed, MCP, kernel, migrate and parity tests also pass. I did not run the full `forge.json` check, which also covers many other suites.
shipped production is serving it deploy 7cfd21c
I merged main into the branch and pushed it. The merge conflicted in docs/FEED.md and forge.json, and I kept both sides in each.
docs/FEED.md:mainadded a "The page" section and this branch added "Sharing". Both are in, with the page section first.forge.json:mainaddedtest/feed-page.test.tsto the check. I kept that line and addedtest/share.test.tsafter it.
tsc is clean, and test/share.test.ts, test/feed.test.ts and test/feed-page.test.ts all pass (32 tests). I did not run the full forge.json check locally.
I merged main into the branch and pushed it. The merge conflicted in docs/FEED.md, forge.json and src/http/feed.ts, and I kept both sides in each.
docs/FEED.md:mainadded an "Offline" section. It now sits alongside "Sharing".forge.json:mainaddedtest/offline.test.tsto the check. I kept that line and addedtest/share.test.tsafter it.src/http/feed.ts:main'sPOST /api/v1/feed/tellsroute and this branch'sPOST /api/v1/shareroute are both registered, andparseTargetsis kept.
tsc is clean, and test/share.test.ts, test/feed.test.ts, test/feed-page.test.ts and test/offline.test.ts pass (43 tests). I did not run the full forge.json check locally.
share(item, to?)now exists asPOST /api/v1/shareand as an MCPsharetool.tscis clean and the newtest/share.test.ts(11 tests) passes. The feed, MCP, kernel, migrate and parity tests also pass. I did not run the fullforge.jsoncheck, which also covers many other suites.What changed
canReadthe repo and have that exact item among their own feed candidates. Otherwise they areunreachable, which is also what an unknown username gets. The sender must see the item too, or the call is a 404.addCommentThroughandtellas the sender, so the sender's own rights apply.share:feed item whose reason is "shared by X: …". It replaces the plain item and is boosted by3 × sender weight. Shares to people are stored in a newsharetable (migration 36), withsrc/core/shares.tsfor the data andsrc/feed/share.tsfor the verb.- Each person gets 5 delivered shares a day. - Extra shares queue, are delivered best-weighted first as room frees (checked on each feed read), and are dropped after 48 hours. - There is one share per item per recipient, ever. - Sender weight is
2·(opens+1)/(shares+2)over 90 days, clamped to 0.2–2. - A recipient who muted the app skips the share, and dismissing the item hides it. - A share also records asharedinteraction for the sender.rank.tsanditems.tsgain an optionalsaidreason override.forge.json's check now includestest/share.test.ts, anddocs/FEED.mdhas a Sharing section.Left out
To try it
Bob's
GET /api/v1/feedthen shows the boosted item.🤖 Generated with Claude Code
Closes #362