Repository navigation
feat(slack): personal lanes — picks by DM, ranked against one researcher's vault (#121) - #123
Merged
Merged
Conversation
…her's vault (#121) A [lanes.<name>] table names a recipient, their roots and their feeds. digest --lane posts the picks to the recipient's DM (conversations.open); slack sync --lane harvests only the recipient's DM reactions. Each lane's journal, posted ids and label ledger live under <state>/lanes/<name>/, so labels never cross lanes. A lane inherits no roots or feeds; inspect reports each lane and blocks one missing a recipient, roots or feeds; daily runs every lane after the shared day. Manifest gains im:write + im:history.
7 tasks done
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.
Closes #121.
What this does
A personal lane sends one researcher picks ranked against their own vault, as Slack DMs, alongside the shared channel digest.
arjev digest --lane <name> --post slack: opens the recipient's DM (conversations.open) before ranking, then posts a header ("arJev picks for you") plus one message per pick. The content boundary is the same as the channel's.arjev slack sync --lane <name>: harvests reactions and replies from the lane's DM. Only the recipient's reactions count, and keeps scaffold into the lane's own papers dir.lane_scopecontext variable routesstate_dir()andledger_path()to<state>/arjev/lanes/<name>/. Journal, posted ids, receipts and the ledger are all per-lane, and the persisted schemas are unchanged (invariant 8).arjev inspectprints onelane <name> <key>: <value>block per lane (recipient, roots, feeds, top, identity-bearing, directives). It blocks withblocked: lane <name>: no {recipient|roots|feeds} configured, or when the lane has zero identity-bearing notes.arjev dailyruns every lane after the shared day: the digest is retried like the shared one, then the lane sync. A failing lane never stops the others. Lanes are skipped (and logged) when no Slack token is available.keepandstagedalso take--lane.im:writeandim:history. Existing app: add the two scopes and reinstall to the workspace (the token stays the same).Acceptance criteria (#121)
cross_lane_labels == 0, tested both directions).[vault].roots).inspectreports each lane and blocks an empty-feeds lane, naming it.Tests
tests/test_lanes.py(21 tests, recorded Slack transport, no network). Full suite andruff check .are green, with one exception:test_init_template::test_no_lab_name_anywhere_in_the_templatefails locally only because my clone lives under~/harmoniqs/, so the fixture-vault path written into the template contains "harmoniqs". It passes from a neutral path, and CI is unaffected.Not in this PR
reviewandcalibratestay shared-only. A per-lane week-in-review is a follow-up if wanted.