Skip to content

Slack tracer: ordinary roles and reviewed chat pairing with current-authority intake #1415

Closed

Description

@DoodleBears

Parent and release target

Parent: #1372; coordination #48; Project #10; milestone v1.3.

The Human confirmed that Lark is the first tracer and ordinary pairing/roles must extend to Slack, Discord, QQ and WeChat. Existing #1046 owns Slack management pairing and native Allow once/Reject, not this ordinary-chat intake slice. Do not duplicate or take over #1046 or the existing Lark tasks.

One observable behavior

For one PersonaBot/current Slack App Binding, an unpaired intentional DM creates the existing metadata-only pending request without model work. The Owner approves that exact applicant with one existing primary behavior Role through the current pairing UI. Only a fresh DM then reaches the Bot Inbox and receives an own-app answer in the original Slack DM. Revocation rejects future intake and fresh re-pairing never restores old group memberships or person exceptions.

Acceptance

  • Qualify actual Slack DM event intake and trusted workspace/account/user/conversation identity on the selected Provider. Never derive authority from a display name, copied text or a public-channel mention.
  • Reuse Messaging's canonical ordinary pairing, Role, current Binding and revision checks, directory/permission queries and existing native Host/Client seam. No new receiver, permission store, natural-language ACL or global platform user directory.
  • Existing Web People/Roles/Requests UI supports the Slack applicant, review, primary Role and revoke path with explicit Bot/App scope. Direct authenticated Web Human input remains unchanged.
  • Pending/control/rejected traffic does not wake the model or replay blocked text; an approved person asks again. Disabled/replaced Binding, revoked pairing or unavailable Role fails closed at actual intake; a restart preserves current authority.
  • Existing authorization-group resolver remains shared. This slice does not add a new native approval control, broaden management grants or claim multi-group approval E2E; Slack tracer: verified pairing and native Allow once / Reject #1046 and the later group parity tracer retain those gates.
  • Prove real pending → Web review → fresh DM reply → revoke refusal → restart behavior with matched canonical Source Event/Admission/Outbox facts, focused regressions and GitHub-rendered light/dark/narrow/full-workflow evidence.
  • Use an isolated task-owned Profile and an explicitly authorized exclusive Slack receiver window. No app-scope or production takeover is implied by this issue; obtain any missing native authorization separately.
  • Update the relevant bilingual guide/ledger and pause after the first tracer PR for Human QA before group/open-conversation breadth. Do not merge or deploy automatically.

Dependencies and coordination

Status: Completed. PR #1436 merged at 5c96145 after Human-accepted qualified native QA2 flow, full exact-head CI, Standards/Spec review and complete PR visual evidence. QA2 and the receiver-free screenshot Host are stopped. This closes the bounded ordinary Slack DM path and reusable local QA setup; Slack native management controls/groups remain with their existing tickets. See the final acceptance/outcome comments.

Activity

  1. added this to the v1.3 milestone on Oct 11, 2026
  2. added
    ready-for-agentFully specified, ready for an AFK agent
    area:fullstackEnd-to-end Host and Client implementation
    feature:messagingMessaging module and external providers
    scope:tracerHuman-testable implementation slice
    on Oct 11, 2026
  3. DoodleBears commented on Oct 11, 2026

    @DoodleBears
    ContributorAuthor

    Agent work claim — Slack ordinary DM pairing

  4. added
    agent:activeOne or more coding-agent tasks currently claim this issue; see claim comments for task IDs
    in-progressHeld by an agent session; see Claim comment for who
    on Oct 11, 2026
  5. moved this from Todo to In Progress in IM Identities & Messagingon Oct 11, 2026
  6. DoodleBears commented on Oct 11, 2026

    @DoodleBears
    ContributorAuthor

    Agent work outcome — completed

    • Agent: Codex; task: codex/local/01a12734-8226-7ae3-8d1b-db08bde64d76 (not a DSH Session).
    • State: completed for Slack tracer: ordinary roles and reviewed chat pairing with current-authority intake #1415 ordinary Slack DM pairing and the Human-requested reusable Slack QA setup.
    • PR #1436 merged at 5c9614568c60d44a0823cf59afb7a1fa7f8fa0b3.
    • Human acceptance and final gates; full reviewed-head CI passed. Standards and Spec reviews had no findings. The PR contains actual native workflow, comparable UI screenshots and the exact-head browser-reviewed explanation.
    • Qualified: pending metadata-only DM → actual Web Role approval → fixed re-ask → new own-App model reply/current permissions/three bounded directories → revoke/restart refusal. Shared QA configuration stays machine-local and preserves Lark/legacy compatibility. Bilingual public guide includes scopes/reinstallation and actual full-flow captures.
    • QA2 receiver and receiver-free screenshot Host are stopped; shared review port is unbound. No deployment, schema migration, Provider pin promotion or other receiver takeover.
    • Remaining Project scope stays on original tickets: Slack native management pairing/Allow once/Reject (Slack tracer: verified pairing and native Allow once / Reject #1046), groups/other platforms, questions and saved rules. This outcome does not close or accept those branches.
    Earlier dated checkpoints — superseded by completed outcome

    Current checkpoint — qualified native Slack slice, Human feedback pending

    • Active task claim: Slack tracer: ordinary roles and reviewed chat pairing with current-authority intake #1415 (comment) ; task codex/local/01a12734-8226-7ae3-8d1b-db08bde64d76.
    • Draft PR Review ordinary Slack DM pairing through current Bot/App authority #1436 remains at 61a8fb4a2b23019fbec828fba097b1a20ff38271; full exact-head CI passed: https://github.com/BotHarness/DeepSeekBot/actions/runs/38168159069 . No merge, deployment, schema or Provider pin promotion.
    • Human completed the separately authorized QA2 token recovery. Both old receiving Tokens were revoked, a distinct connections:write Token stayed in the original private shared registry, and Socket Mode was restored. A native stop-state probe showed no same-App reply/reaction for more than 30 seconds. Earlier source-conflicted replies are still excluded from qualification; the outside owner was never identified.
    • Browser control recovered; actual signed-in DoodleBear/designated QA2 DM and task-owned Profile were verified. The existing review port was reused. Pending H and authenticated Web API approval/re-ask were matched to the task Host; API approval is not presented as a button interaction.
    • Fresh native I returned 9797 / QA Slack Member / no management capabilities. Its Source Event im-56527daaa45905d4d6f0e5fa0623e95efb43224ff541017d18fb55e899112b03 joined a handled/no-error Admission and provider-accepted Outbox ec47283c-7d04-40bd-b251-9170e3d02ad3; receipt 1791751409.319419 matched the rendered native reply.
    • Actual Web Revoke removed the paired person. Native J created request C69A7AAE18 only, with no 437/new model execution. Restart of the same Profile retained revocation/restriction/Role; native K received a pending notice only, with no 667.
    • The current browser then actually selected QA Slack Member in the Role dropdown and clicked Approve. C69A7AAE18 persisted approved/current Role revision; the native fixed re-ask appeared and neither old J nor K executed.
    • Fresh native L returned 10403, the current ordinary Role/empty management capabilities and all three existing read-only directories: 1 effective paired person, 1 known external DM, 1 observed paired person in this DM, with coverage limits and the not-complete/current-membership statement. Source Event im-8942eec0c28cf15410b04f0f158d3ed58b1236364bb4fe6321bc76fb7c52e229 joined a handled/no-error Admission and provider-accepted Outbox 65f00871-8f4a-4e81-a199-e82f3289417b; native receipt 1791751708.374919 matched.
    • Final Web revoke followed by native M produced request 20A301A59B only, with no 899. Only I/L exist as bridged instruction bodies and Admissions; pending G/H/J/K/M bodies are absent. The diagnostic now joins Source Event kind/ID: accepted Slack DM Admission reason is also human-dm, so filtering that reason out is invalid.
    • Owned QA2 receiver stopped after the run; exact process absent and review port unbound. No other task stack was stopped or reconfigured. QA1 has never been bound/started by this task.
    • Six actual cropped workflow screenshots are embedded in the PR body and publicly byte-verified at evidence commit 1bf52d8bd1e805d8703d0f4622087448d0d4fc03. They show runtime states on the candidate, not base/candidate comparison pairs.
    • Remaining gates: first-slice Human feedback, comparable light/dark/narrow baseline evidence, HTML browser visual review, final bilingual tutorial qualification updates/release checks, code review. Keep Draft and Project In progress. Do not broaden group/provider variants or merge/deploy automatically. Any additional receiver start needs a new coordinated window.
    Historical recovery checkpoints (superseded by the current checkpoint above)

    #1415 first Slack DM tracer — Draft review evidence

    • Task: codex/local/01a12734-8226-7ae3-8d1b-db08bde64d76; claim remains active.
    • Draft PR: Review ordinary Slack DM pairing through current Bot/App authority #1436; documentation head 61a8fb4a2b23019fbec828fba097b1a20ff38271 follows the CI-passed code/helper head.
    • Implemented: trusted Slack DM/current Binding → canonical metadata-only ordinary request → Web Role review → fixed ask-again → fresh same-app checked reply → current permissions/directory → revoke/restart/rebind fences. No Provider pin change, schema, new listener or native management/group parity.
    • Validation: 52 default-traffic plus 20 canonical pairing/Lark card regressions passed; lint/format/typecheck/build and release-ledger/ADR checks passed for the original pairing slice. The shared QA helper passed 10 regression tests, Bash syntax, lint/format/typecheck and ledger checks. Actual pre-change Lark reader/writer compatibility was validated with synthetic fixtures. Docs sync and Chinese OG font regeneration completed with no font diff. Full current-head CI passed: https://github.com/BotHarness/DeepSeekBot/actions/runs/38159615213 . CodeRabbit skips automatic review for Draft, so its status is not counted as code review.
    • Accessible exact-head explanation: Review ordinary Slack DM pairing through current Bot/App authority #1436 (comment) . Public artifacts fetched without credentials and byte-checked. Browser visual review remains blocked and is not counted as passed.
    • Human authorized reusing BotHarness Slack QA and approved the three-stage local wizard using the original shared registry. setup slack now selects separate Slack QA1/QA2/QA3 App/Workspace metadata and a current idle window, captures tokens through hidden input, then checks Socket Mode/DM scopes/events/install/App Home. Existing Lark values/default selection and older loaders remain compatible. No GitHub secrets or receiver startup. Saved metadata is not verified platform identity or a perpetual lease.
    • Human configured Slack QA1 BotHarness Cloud QA and QA2 BotHarness Slack QA, both in the designated test Workspace. This task selects QA2; the Human explicitly confirmed that its previous receiver, including other devices, is stopped and authorized Slack tracer: ordinary roles and reviewed chat pairing with current-authority intake #1415 exclusivity until this acceptance run ends.
    • QA2 installed App/Workspace/DM/sender identity and required DM scopes passed live checks after the specifically authorized im:read addition and reinstallation.
    • The signed-in native Slack browser was used for actual pending, approval/re-ask, fresh question and revoke attempts. Native execution correlation and revoke acceptance are unresolved; see checkpoint below.
    • The existing review port was reused for a task-owned isolated Host. That exact Host is now stopped; other Hosts were observed only. Earlier Client failures and recovered observations remain preserved.
    • Remaining acceptance: actual Slack pending → Web review → fixed re-ask → fresh own-app DM answer → revoke refusal → restart, matched canonical Source Event/Admission/Outbox facts, comparable full-workflow/light/dark/narrow screenshots and first-slice Human feedback. Keep Draft; do not broaden group/provider variants, merge or deploy before these gates.

    Native Slack checkpoint — incomplete, receiver stopped

    • Task: codex/local/01a12734-8226-7ae3-8d1b-db08bde64d76; Slack tracer: ordinary roles and reviewed chat pairing with current-authority intake #1415 claim remains active, PR Review ordinary Slack DM pairing through current Bot/App authority #1436 remains Draft.

    • Human authorized QA2 exclusivity and separately adding only im:read and reinstalling the designated App. The actual console change and reinstallation completed; live installed App/Workspace/DM/sender checks passed.

    • A dedicated ordinary Role with no management capabilities and the existing restriction were configured through Web UI. The unknown native DM produced a fixed pending notice and a canonical metadata-only request. Web approval persisted and delivered the fixed ask-again notice. No Admission was added by the pending request or approval.

    • A fresh native DM visibly returned 9797, but current permissions returned unavailable and the test Host did not contain its Source Event/Admission. After Web revocation, another new native DM visibly returned 437 without a corresponding test-Host Admission. These replies are not qualified as this candidate's execution; the revoke acceptance failed. The Human reconfirmed other receivers are stopped; execution-source and Provider/lifecycle diagnosis continues without presuming a different receiver or changing its ownership.

    • The exact task-owned Host was stopped. No other Host was stopped, no Provider pin was promoted, no merge or deployment occurred. First-slice Human acceptance is not requested on this incomplete result.

    • The bilingual website guide now documents DM Bot scopes, App-level Socket Mode scope, message.im, App Home and reinstallation, with two actual scope screenshots plus verified native pending and Web review captures. Complete reply/revoke workflow evidence awaits qualification; earlier messaging evidence is not substituted.

    • Latest read-only isolation checks: task Provider configuration is external-consumer; the exact owned Host is stopped. No running DSH Node Host was found in either available WSL distribution. Other Windows Hosts were inventoried without modification; these checks do not establish the origin of the observed replies.

    Native isolation diagnosis — current CI passed

    • Current implementation/tutorial head 61a8fb4a2b23019fbec828fba097b1a20ff38271 passed the full lint/format/typecheck/test/build/docs CI: https://github.com/BotHarness/DeepSeekBot/actions/runs/38168159069 . Draft review remains skipped by CodeRabbit.
    • A minimal fresh QA2 DM was sent with this task Host stopped. The signed-in native Slack client displayed the requested new marker reply. Read-only native history independently matched the request and later same-bot reply while the exact task PID was absent and its port unbound. The private one-command offline-origin check fails on this condition; this is active execution outside the stopped task Host, not this candidate proving a revoke defect.
    • No other Windows Host was stopped or reconfigured. Available WSL distributions had no observed DSH Node Host. Read-only checks of existing local Slack endpoints did not identify the active QA2 owner; unavailable endpoints are not taken as proof of absent receivers.
    • QA1 BotHarness Cloud QA App/Workspace, required DM scopes and an existing same-Human DM passed live read-only checks. Fresh empty Profile preparation reused the review port, but the launcher failed its authenticated health fetch. Its exact task-owned, receiver-free process was stopped; the review port is now unbound. The QA1 receiver has never been started and awaits the specifically coordinated QA1 window; no additional scope change is needed.
    • QA2 remains stopped in this task, source-conflicted results remain unqualified, and first-slice Human feedback remains open.
    • After the Human reported browser restoration, both T3 status and open still explicitly reported no automation host for this environment. The permitted fallback browser inventory was empty. No new native message or acceptance step was sent in this retry. Other Docker workloads were inspected only for process/mount metadata and remain untouched; their designated Ask-secret tracer: inline private input to protected CLI consumption #1380/Ask-secret tracer: protected reference consumption by an MCP consumer #1384 memory mounts do not identify the active QA2 receiver.

    Latest browser-restored QA2 retry — isolation still fails

    • The Human initially authorized a QA1 exclusive window, then explicitly steered this run back to QA2. QA1's empty preparation Host was stopped before any credentials were bound or any receiver was started. The existing review port remains unbound.
    • Browser control recovered and the signed-in Human/designated QA2 DM were verified. A second unique native stop-state probe immediately received its requested same-App marker reply. The private isolation-c.mjs readback matched that request/reply with the original task PID absent and review port unbound. The active outside execution condition is still present; no second QA2 receiver was started.
    • Read-only bounded Source Event searches in 42 local test databases and the existing dev VPS's current Core database did not locate this unique probe. These bounded observations do not identify or exclude all outside execution owners. No other task's process, container, configuration or remote service was changed.
    • Asked the Human to stop the remaining QA2 execution source before continuing native pairing. Existing scopes and QA2 authorization are retained; no new credentials or permissions are requested. PR remains Draft and real fresh-reply/revoke correlation remains incomplete.
    • On the Human's next retry request, a new stop-state probe D received a native eyes reaction from the selected App's verified bot user while this task Host was absent and the review port unbound. It had not produced a text reply at readback. The native browser and read-only history agree on the receipt reaction; the reaction-aware isolation check exits 1. A bounded explicit bridge identity query has not yielded a visible identity response. No receiver was started on this failed isolation precondition.
    • The empty alternate Profile subsequently completed its authenticated API preparation before its exact task-owned process was stopped. It never bound either App's credentials or started a Slack receiver. Earlier failed health-fetch evidence remains preserved separately.

    QA2 recovery authorized — Human credential cutover pending

    • A further marked stop-state probe F received the verified same-App eyes reaction while the exact task Host remained absent and its port unbound. Native isolation remains failed; no task receiver was restarted.
    • Corrected the bounded origin-search diagnostic to include Source Event body, rather than metadata alone. The corrected scan read 42 local test databases without skipped reads and found no match; the current VPS Core body/metadata scan also found no match. These observations still do not identify all possible execution owners. No other task stack was changed.
    • Actual QA2 Basic Information lists two old App-level Tokens. Both existing-token dialogs expose read-only properties and Done, with no Revoke or token-value control. No setting or credential was changed by browser inspection.
    • Human explicitly authorized the three-stage QA2 cutover: disable Socket Mode and revoke the two old receiving Tokens; generate one new connections:write App-level Token and hide-input it into the existing machine-local shared registry, preserving Bot Token/QA1/Lark; restore Socket Mode, then verify exclusive receipt before Slack tracer: ordinary roles and reviewed chat pairing with current-authority intake #1415 native acceptance. Human confirmed the other old Token can be retrieved from its original receiver configuration.
    • Official auth.revoke test=true accepted the locally configured QA2 App-level Token with ok:true/revoked:false. This was read-only; it did not revoke the Token or open a Socket consumer. The recovery wizard uses the official API at an explicit Human confirmation gate because the current console lacks a Revoke control.
    • Ephemeral recovery wizard/helper now live in the machine-local shared QA directory, outside Git. Bash syntax and synthetic guards, interrupted-revocation resume, rejection verification, save gate and preservation checks passed; wizard boilerplate matches its template. Shellcheck unavailable. The wizard has not been run interactively; no old Token has yet been revoked or new credential created, and Socket Mode is still enabled.
    • PR Review ordinary Slack DM pairing through current Bot/App authority #1436 remains Draft at the CI-passed head. Native fresh-reply/revoke/restart correlation and first-slice Human feedback remain open.

    QA2 credential recovery completed — native pending path requalified

    • Human completed the approved recovery wizard. Its private progress recorded both old App-level Token revocations, a distinct new Token saved to the original shared registry, and Socket Mode restored. Live read-only checks matched the new Token to that progress, verified Bot Token/App/Workspace/DM identity and all required scopes, and confirmed the task Host was stopped. No credential value is included in this evidence.
    • A new uniquely marked native DM was sent while the task Host remained absent. After more than 30 seconds, read-only history and the actual native browser showed neither a same-App reply nor receipt reaction. Unlike the earlier failed stop-state probes, the outside-receipt symptom did not reproduce in this bounded observation.
    • A fresh task-owned isolated Profile reused the existing review port. The first launch omitted --im-provider and its Slack endpoint returned 404; that receiver-free Host was stopped, and its evidence retained. The corrected launch verified the unchanged qualified Provider pin, authenticated API and actual Client shell, then connected exactly one QA2 account through the existing qualified credential seam.
    • Actual Web interaction bound the App, enabled restricted ordinary pairing and created QA Slack Member with empty management capabilities. A fresh native DM received the fixed pending notice; the Web review showed the same request. Canonical readback confirms one pending ordinary request, zero approved people, zero external Admissions, and neither old test instruction saved as Source Event body. The request/notice are matched to this task-owned Host. No calculator answer was returned for the pending message.
    • A real local Human DM reached the native model and its persisted Session contains the expected calculation, but it did not call channel_send, so no committed Channel reply is claimed for that prompt. Later visible-reply verification remains required.
    • Browser control then disconnected: T3 explicitly returned no automation host/Do not retry; the permitted fallback inventory contains no apps or browsers. Role selection/approval has not completed. The Human has been asked to restore this thread connection; native approval/re-ask, fresh checked reply, revoke/restart and first-slice feedback remain open.

    Authenticated review advanced; browser reopen unavailable

    • With browser controls unavailable, the existing authenticated Web API approved the exact current request 24DDC3526C against the current QA Slack Member Role revision. Canonical readback records approved/authenticated-web, the selected ordinary Role and empty management capabilities. This is API/Host behavior evidence, not proof the Role dropdown/Approve button succeeded.
    • Read-only native Slack history confirms the fixed approved/re-ask notification. Approval still produced zero external Admissions and stored neither old instruction body. No fresh checked model reply, revoke or complete interaction acceptance is claimed yet.
    • The Human asked to reopen the closed browser. Status reported no tab; reopening the old tab timed out. A corrected request to create a fresh tab explicitly returned no automation host/Do not retry. The task-owned receiver was stopped through its exact PID/port/home guard. The approved pairing persists for the next run; no other stack was stopped or reconfigured.
    • Resume from a real new native DM after the desktop browser connection returns. PR Review ordinary Slack DM pairing through current Bot/App authority #1436 remains Draft, exact-head CI still passed, and native fresh-reply/revoke/restart plus Human feedback remain open.
  7. 10 remaining items

  8. DoodleBears commented on Oct 11, 2026

    @DoodleBears
    ContributorAuthor

    Human acceptance and final merge gates

    Task: codex/local/01a12734-8226-7ae3-8d1b-db08bde64d76; original claim.

    The Human accepted this qualified #1415 Slack ordinary DM slice and explicitly authorized merging PR #1436. The recovered QA2 native flow matched pending → actual Web Role selection/Approve → fixed ask-again → fresh own-App answer/current Role and permissions/three directories → revoke refusal → restart. Earlier source-conflicted results remain excluded.

    • Exact reviewed head: 1710c42c3ce56e812bbd678633c2431ce87bfd24; base: 184edf23b422a69b9f04bdfde29e35e40c88f3a0.
    • Full CI passed, including full tests/build/docs. Standards and Spec reviews found no issues. Local timeout-only cases passed independently; the interrupted contended local full run is not counted as passed.
    • PR body contains the full actual workflow, matched dark/light desktop and narrow comparisons, and 14 GitHub-rendered verified images. Exact-head explanation is publicly byte-verified and browser-reviewed at desktop/narrow widths.
    • Bilingual tutorial, ADR-0174, architecture and release ledger qualification updated. No Provider pin/schema change or production deployment.
    • QA2 receiver remains stopped. The receiver-free screenshot Host is also stopped and its shared review port is unbound. No other owner's receiver was changed.
    • Slack groups and native management pairing/approval remain with their existing tickets. This acceptance does not claim those variants are qualified.
  9. moved this from In Progress to Done in Roadmapon Oct 11, 2026
  10. DoodleBears commented on Oct 11, 2026

    @DoodleBears
    ContributorAuthor

    Agent work outcome — completed

    • Agent: Codex; task: codex/local/01a12734-8226-7ae3-8d1b-db08bde64d76 (not a DSH Session).
    • State: completed for Slack tracer: ordinary roles and reviewed chat pairing with current-authority intake #1415 ordinary Slack DM pairing and the Human-requested reusable Slack QA setup.
    • PR #1436 merged at 5c9614568c60d44a0823cf59afb7a1fa7f8fa0b3.
    • Human acceptance and final gates; full reviewed-head CI passed. Standards and Spec reviews had no findings. The PR contains actual native workflow, comparable UI screenshots and the exact-head browser-reviewed explanation.
    • Qualified: pending metadata-only DM → actual Web Role approval → fixed re-ask → new own-App model reply/current permissions/three bounded directories → revoke/restart refusal. Shared QA configuration stays machine-local and preserves Lark/legacy compatibility. Bilingual public guide includes scopes/reinstallation and actual full-flow captures.
    • QA2 receiver and receiver-free screenshot Host are stopped; shared review port is unbound. No deployment, schema migration, Provider pin promotion or other receiver takeover.
    • Remaining Project scope stays on original tickets: Slack native management pairing/Allow once/Reject (Slack tracer: verified pairing and native Allow once / Reject #1046), groups/other platforms, questions and saved rules. This outcome does not close or accept those branches.
  11. removed
    agent:activeOne or more coding-agent tasks currently claim this issue; see claim comments for task IDs
    in-progressHeld by an agent session; see Claim comment for who
    on Oct 11, 2026
  12. added a commit that references this issue on Oct 12, 2026
    5c96145
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:fullstackEnd-to-end Host and Client implementationfeature:messagingMessaging module and external providersready-for-agentFully specified, ready for an AFK agentscope:tracerHuman-testable implementation slice

    Type

    No type

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions