Tasks: the start opens the conversation
The last spec artifact. A DAG derived from the design and testing plan; each task names the testing-plan row that proves it. TDD: the test first, red, then green.
Task list
- [x] 1. The channel and the state —
channels/slack.py:open(work_item),_open_thread(…, origin);channels/state.py:CONVERSATION_ORIGINS+start;eventlog.py:channel.open_failed, thethread_openeddescription- Depends on: none
- Requirements: R1.2, R1.3, R1.5, R2.1, R2.2
- Test: T1 —
test_channels.py::test_open_posts_the_root_alone_and_binds_with_origin_start,::test_open_is_idempotent_for_a_bound_work_item,::test_open_fails_closed_like_post,::test_a_failed_open_binds_nothing; T10 —::test_an_unknown_origin_is_coerced_to_event;test_eventlog.pycatalog
- [x] 2. The bus and the opener —
channels/bus.py:open_conversation;channels/publishers.py:conversation_opener- Depends on: 1
- Requirements: R1.5, R1.6, R2.2, R3.1
- Test: T1 —
test_bus.py::test_open_conversation_opens_on_every_channel_that_can_and_skips_the_ledger,::test_a_failing_open_is_a_result_and_an_event_never_an_exception,::test_the_daemon_opener_reads_the_config_per_call_and_needs_a_channels_section
- [x] 3. The dispatcher seam and the wiring —
webhook/dispatcher.py:opener,_open_conversationsat the top of_spawn_for;webhook/daemon.py,poller/daemon.py(_build_dispatcher(cli_config_getter)),core/sessions._dispatcher_for- Depends on: 2
- Requirements: R1.1, R1.4, R3.2, R3.3
- Test: T1 —
test_control_integration.py::test_a_start_opens_the_conversation_once_before_the_checkout,::test_a_refused_start_opens_no_thread,::test_an_unauthorized_start_opens_no_thread,::test_a_raising_opener_never_fails_the_spawn,::test_the_opener_is_handed_the_ref_alone;test_core_sessions.py::test_the_facade_dispatcher_opens_with_the_config_it_was_given
- [x] 4. Scenarios — the four Gherkin scenarios in
test_channels_integration.py- Depends on: 3
- Requirements: R1.1–R1.5, R1.7, R2.1
- Test: T2; T8 — A3
::test_a_channel_outage_never_fails_the_spawn, A5test_channels.py::test_a_corrupt_state_file_still_opens_on_start
- [x] 5. Docs, capability docs, decision —
docs/capabilities/channels.md,docs/capabilities/interactive-sessions.md,docs/cli/commands/channels.md,docs/cli/commands/sessions.md,docs/cli/state.md,docs/config/cli/channels-options.md,skills/the-loop/reference/collaboration.md,decision-107+ index row- Depends on: 3
- Requirements: the capability-docs gate
- Test: T12 —
make check(markdownlint included)
- [x] 6. Verification — execute
testing-plan.md, recordevidence/verification.mdandevidence/security-review.md- Depends on: 4, 5
- Requirements: all
- Test: T1, T2, T8, T10, T12, T13
Dependency graph (DAG)
flowchart LR
T1["1 channel open + origin"] --> T2["2 bus + opener"]
T2 --> T3["3 dispatcher seam + wiring"]
T3 --> T4["4 scenarios"]
T3 --> T5["5 docs + decision"]
T4 --> T6["6 verification"]
T5 --> T6Checkpoints
After task 1 and after task 3: the named tests red → green recorded in evidence/verification.md. After task 4: the integration files green. After task 5: make check. Then the verification node, then the self-review rounds and the security review gate (evidence/security-review.md), then the PR with the reviewer briefing.
Review comments
Appended by the-loop's
record-feedbackhook when a human gate approves with comments (issue-109). Append-only and attributed: an approval never silently discards a reviewer's suggestions, and the feedback travels with the document it concerns rather than living in a side-channel tracker.