Skip to content

id(chat): chat v1 core remainder — membership/history enforcement, store integration, rate admission (follow-on of #3799) #3950

Open

Description

@dezren39

Follow-on slice of #3799 (ID chat v1 core). The first slice landed in PR #3941 (merged 0b3719e): pkgs/id/src/chat.rs — the chat.message.v1 body shape, bounded sanitized text, blob/event links, and the causal projection (after + backlink parents, dedupe, no arrival-defined order), with unit tests.

This issue owns the remainder of #3799's acceptance criteria:

  • Wire chat.message.v1 into the signed event store/sync path: a record conversion that normalizes extensions.after + header backlink into ChatRecord (the shape PR feat(id): chat.message.v1 message shape + causal projection (#3799) #3941's projection consumes).
  • Membership and channel history policy enforcement on reads and writes, using the channel group's existing policy (crate::groups::policy): non-member writes refused at admission; new-member history follows the group history policy on reads.
  • Send-rate admission: the world-chat limits as the starting configuration (50 messages per 10 seconds per author; 2,048-byte text cap already enforced by the message shape), with a justified configuration seam if tests motivate one.
  • Integration test: two independent members create/join a channel and exchange signed chat.message.v1 events; signatures, channel/group binding, replay, duplicate delivery, and out-of-order delivery are covered (duplicate + out-of-order are already proven at the projection level by PR feat(id): chat.message.v1 message shape + causal projection (#3799) #3941's unit tests — this test proves them through the store).

Out of scope (unchanged from #3799): presence/typing (#2809), attachment multi-provider retrieval (#2260/#2261), any change to world chat behavior.

Filed by queue worker lane D from task 5794, per the phased pattern: one issue per slice, #3799 stays the parent record.

Activity

  1. added
    app/idPackage/app: id (pkgs/ or apps/ in this repo)
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    on Nov 1, 2026
  2. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    Picked up by Lane A queue worker for task 5893. Verified fresh: issue #3950 OPEN with no hard-stop labels, PR #3941 merged (0b3719e), no competing PR or branch for issue #3950. Implementing the chat v1 core remainder in pkgs/id: record conversion into ChatRecord, membership/history policy enforcement, send-rate admission, and the two-member store integration test.

  3. added
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    and removed
    queue/claimedQueue worker lifecycle state
    on Nov 1, 2026
  4. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    Implemented by Lane A queue worker for task 5893: PR #3965 (branch queue/5893-3950-chat-v1-remainder @ 72d54bd) — ChainExt chat field + EventStore::chat_records/group_policy/chat_timeline + LocalEvents::send_chat with roster admission and the SendRate limiter (50 per 10s, ChatRateConfig seam). Laptop tests: cargo test -p id --lib chat = 41 passed (two-store exchange with duplicate + out-of-order delivery, non-member write/read refusal, rate burst/refusal, group binding); full lib suite 1491 passed with one pre-existing failure (store_traits sqlite lock test — sqlx 0.9.0 lock edges from PR #632; this diff touches no manifest or lock).

    Task 5893 is parked 20m, not for CI: the merge waits on the Codex review of PR #3965, which has not run yet. Resume: read and disposition the Codex findings on PR #3965, merge it, and complete task 5893 as fixed_merged.

  5. added
    queue/claimedQueue worker lifecycle state
    and removed
    status/parkedDeliberately paused with a recorded resume condition
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    on Nov 1, 2026
  6. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up — OpenChamber scheduled lane

  7. 294 remaining items

  8. added
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    queue/claimedQueue worker lifecycle state
    and removed
    queue/claimedQueue worker lifecycle state
    status/parkedDeliberately paused with a recorded resume condition
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    on Nov 4, 2026
  9. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    event: handed_off
    task: 5893 (repo-health-code-pilot; repo-worker-code; lane code-y)
    at: 2026-11-04T16:46Z
    found_via: atomic queue claim (lane code-y)
    verified: Issue #3950 OPEN, no hard-stop labels; claim labels resynced from parked to claimed (queue/claimed, status/in-progress, work/assigned). PR #3965 (branch queue/5893-3950-chat-v1-remainder) still OPEN at fresh check. Execution-lane assignment for task 5893 is opencode — the bound opencode claimant session owns the work on PR #3965; this lane does not work it directly. Attempts 28/48.
    next: Claimant launches the bound opencode session for task 5893; resume on PR #3965 — disposition checks/Codex findings, merge when verified, then complete task 5893.

  10. developing-today commented on Nov 4, 2026

    @developing-today
    Contributor

    🤖 Agent note · handed off

    • Agent: OpenCode claimant (opencode-claimant)
    • Queue task: task 5893 (repo-health-code-pilot, worker repo-worker-code)
    • Issue: #3950
    • Session: ses_e5e58705ed4ffe37I4leC0g9uZ
    • Route: opencode-route/workhorse; agent build
    • Expectation: the bound session works only task 5893, revalidates fresh state, heartbeats, and records a terminal queue state with this same session id.
  11. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

  12. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · PR opened

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/idPackage/app: id (pkgs/ or apps/ in this repo)effort/lLarge: multi-day or open-ended; expect staged check-inskind/featureNew feature or capability requestpriority/highImportant and time-sensitivesource/creatorFiled by the new-issue-creator jobtask/small-fixQueue packet kind: bounded fix with reproduction and targeted tests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions