surfaces/.planning/phases/01-matrix-qa-polish/01-06-PLAN.md
Mikhail Putilovskij 6ced154124 feat(matrix): land QA follow-ups and refresh docs
- harden Matrix onboarding/chat lifecycle after manual QA
- refresh README and Matrix docs to match current behavior
- add local ignores for runtime artifacts and include current planning/report docs

Closes #7
Closes #9
Closes #14
2026-04-05 19:08:58 +03:00

9.3 KiB
Raw Permalink Blame History

phase plan type wave depends_on files_modified autonomous gap_closure requirements must_haves
01-matrix-qa-polish 06 execute 2
01-05
adapter/matrix/reactions.py
adapter/matrix/converter.py
adapter/matrix/handlers/settings.py
tests/adapter/matrix/test_converter.py
tests/adapter/matrix/test_reactions.py
tests/adapter/matrix/test_dispatcher.py
tests/adapter/matrix/test_invite_space.py
true true
truths artifacts key_links
Matrix adapter no longer presents or parses reaction-era UX for confirmations or skill toggles.
A Matrix user who opens `!settings` sees a strict read-only snapshot without mutation prompts.
Matrix room behavior remains correct when chat ids are allocated dynamically instead of assuming legacy `C1` transport identity.
path provides
adapter/matrix/reactions.py Command-only Matrix helper text with no reaction numbering.
path provides
adapter/matrix/converter.py Matrix command conversion without reaction callback support.
path provides
tests/adapter/matrix/test_dispatcher.py Settings and invite regressions aligned to room-based Matrix behavior.
from to via pattern
adapter/matrix/reactions.py tests/adapter/matrix/test_reactions.py command-only skills/help text !skill on/off
from to via pattern
adapter/matrix/handlers/settings.py tests/adapter/matrix/test_dispatcher.py strict read-only dashboard assertions Изменить
Remove the remaining reaction-era Matrix UX, make `!settings` strictly read-only, and harden Matrix tests so they stop hiding dynamic or room-based behavior behind legacy `C1` assumptions.

Purpose: Verification still found user-facing reaction remnants and brittle tests that can pass while the actual adapter contract is wrong. This plan cleans those leftovers without rewriting Phase 01 history. Output: Command-only Matrix adapter helpers, strict !settings snapshot output, and updated Matrix regressions aligned with room ids and dynamic chat allocation.

<execution_context> @/Users/a/.codex/get-shit-done/workflows/execute-plan.md @/Users/a/.codex/get-shit-done/templates/summary.md </execution_context>

@.planning/STATE.md @.planning/ROADMAP.md @.planning/phases/01-matrix-qa-polish/01-CONTEXT.md @.planning/phases/01-matrix-qa-polish/01-VERIFICATION.md @.planning/phases/01-matrix-qa-polish/01-03-SUMMARY.md @.planning/phases/01-matrix-qa-polish/01-04-SUMMARY.md @.planning/phases/01-matrix-qa-polish/01-05-PLAN.md @adapter/matrix/reactions.py @adapter/matrix/converter.py @adapter/matrix/handlers/settings.py @tests/adapter/matrix/test_converter.py @tests/adapter/matrix/test_reactions.py @tests/adapter/matrix/test_dispatcher.py @tests/adapter/matrix/test_invite_space.py From `adapter/matrix/reactions.py`:
def build_skills_text(settings: UserSettings) -> str
def build_confirmation_text(description: str) -> str

From adapter/matrix/converter.py:

def from_room_event(event: Any, room_id: str, chat_id: str) -> IncomingEvent | None

From adapter/matrix/handlers/settings.py:

async def handle_settings(
    event: IncomingCommand, auth_mgr, platform, chat_mgr, settings_mgr
) -> list
Task 1: Remove reaction-era Matrix UX and update the immediately affected regressions adapter/matrix/reactions.py, adapter/matrix/converter.py, adapter/matrix/handlers/settings.py, tests/adapter/matrix/test_reactions.py, tests/adapter/matrix/test_converter.py, tests/adapter/matrix/test_dispatcher.py adapter/matrix/reactions.py, adapter/matrix/converter.py, adapter/matrix/handlers/settings.py, tests/adapter/matrix/test_reactions.py, tests/adapter/matrix/test_converter.py, tests/adapter/matrix/test_dispatcher.py, .planning/phases/01-matrix-qa-polish/01-CONTEXT.md - Test 1: `build_skills_text` renders only command-driven guidance and never mentions `1..9`, `👍`, ``, or reaction lookup. - Test 2: `converter.py` no longer treats Matrix reaction events as supported callbacks. - Test 3: `handle_settings` returns a dashboard snapshot with skills/soul/safety/chats status and does not advertise `Изменить: !skills, !soul, !safety`. Finish the cleanup promised by D-06, D-12, and the verification report, and rewrite the tests that would otherwise block the task from being executable. Remove reaction-only constants and lookup helpers from `adapter/matrix/reactions.py` if they are no longer needed, or reduce the module to text-formatting helpers only. Remove `from_reaction` support from `adapter/matrix/converter.py` and any imports that only exist for reaction handling. Update `handle_settings` so the primary dashboard is a strict read-only snapshot; it may still show current skills, soul, safety, and active chats, but it must not tell the user to mutate settings from that surface.

In the same task, update tests/adapter/matrix/test_reactions.py, tests/adapter/matrix/test_converter.py, and the !settings assertion in tests/adapter/matrix/test_dispatcher.py so the verify command matches the code you just changed. Do not leave those test rewrites for Task 2.

Do not remove the dedicated mutable subcommands themselves (!skills, !soul, !safety) because D-13 and D-14 explicitly keep them. The restriction applies only to the !settings dashboard copy. cd /Users/a/MAI/sem2/lambda/surfaces-bot && pytest tests/adapter/matrix/test_reactions.py tests/adapter/matrix/test_converter.py tests/adapter/matrix/test_dispatcher.py -q <acceptance_criteria>

  • adapter/matrix/reactions.py contains no reaction-number skill labels or reaction lookup helpers in user-facing output.
  • adapter/matrix/converter.py no longer exports or relies on from_reaction.
  • adapter/matrix/handlers/settings.py no longer renders the mutation prompt in the !settings dashboard.
  • tests/adapter/matrix/test_reactions.py, tests/adapter/matrix/test_converter.py, and the dashboard assertion in tests/adapter/matrix/test_dispatcher.py are updated in the same task.
  • Mutable settings subcommands remain implemented outside the !settings snapshot. </acceptance_criteria> Matrix adapter surfaces are command-only and !settings is strictly read-only.
Task 2: Remove the remaining brittle `C1` assumptions from room-based Matrix regressions tests/adapter/matrix/test_dispatcher.py, tests/adapter/matrix/test_invite_space.py tests/adapter/matrix/test_dispatcher.py, tests/adapter/matrix/test_invite_space.py, .planning/phases/01-matrix-qa-polish/01-VERIFICATION.md - Test 1: Invite tests assert dynamic chat allocation or stored metadata progression instead of assuming the canonical Matrix identifier is always `C1`. - Test 2: Dispatcher regressions distinguish Matrix room ids from logical core chat ids and avoid using `C1` as a proxy for transport identity. - Test 3: The full Matrix suite stays green after those room-based assertions are tightened. Update the remaining Matrix regressions so they match the intended room-based adapter behavior. In invite and dispatcher tests, stop using `C1` as a stand-in for Matrix room identity where that hides dynamic behavior; instead assert against stored `room_meta`, `next_chat_index`, chat lists returned by the manager, or explicit non-`C1` setup values. Keep any remaining `C1` use only where the core chat manager contract itself is under test and not acting as a proxy for Matrix room ids.

Prefer small, explicit fixtures over broad rewrites. The tests should make it obvious which identifier is the Matrix room_id and which is the logical core chat_id. This task should only clean up the residual room-vs-chat assumptions that remain after Task 1's reaction/settings rewrites. cd /Users/a/MAI/sem2/lambda/surfaces-bot && pytest tests/adapter/matrix -q <acceptance_criteria>

  • tests/adapter/matrix/test_dispatcher.py distinguishes room ids from chat ids in its Matrix-facing assertions.
  • tests/adapter/matrix/test_invite_space.py validates dynamic chat metadata progression without hardcoding the phase outcome as C1.
  • pytest tests/adapter/matrix -q passes after the updates. </acceptance_criteria> The Matrix regression suite enforces command-only, room-based behavior and no longer masks defects with legacy assumptions.
Run `pytest tests/adapter/matrix -q` and confirm the full Matrix suite is green with no reaction-era behavior covered as supported flow. Run `pytest tests/ -q` after the wave completes, per `01-VALIDATION.md`, and confirm the full repository suite remains green.

<success_criteria>

  • No Matrix adapter code parses or advertises reaction-era skill/confirmation UX.
  • !settings is a strict snapshot surface.
  • The full repository suite stays green after the Matrix gap-closure wave. </success_criteria>
After completion, create `.planning/phases/01-matrix-qa-polish/01-06-SUMMARY.md`