Mail infra 60% done — continue or sunset (owner decision needed) #48

Open
opened 2026-05-03 23:30:23 +02:00 by claude · 6 comments
Collaborator

Migrated from state/L3/OPEN_LOOPS.md per ADR 0001 + AGENTS.md.

Source

state/L3/OPEN_LOOPS.md Mail infra '60% done' section + STATE_OF_PLATFORM v2 §5 risk/product HIGH + §6 secondary decisions.

What

Mail infra is 60% built but missing the last 40% needed to deliver primary user value (Iskra reads mail + replies). Specific gaps:

  • OPENCLAW_MAIL_OPENCLAW_DISPATCH_URL and _TOKEN empty (617b59fa Apr 12) — gateway healthy on RS 2000, but VPS 1000 OpenClaw not consuming
  • dispatch_openclaw_intake not configured — action-plane partially inactive
  • No first-class reply action (a931c692)
  • Telemetry gap: lastInboundAt/lastOutboundAt null on Signal/Matrix despite running=true

Why this needs owner decision

Not a tech bug. Product question: does this work still have owner value, or is the design pulling against operator's actual usage? 60% done with no recent progress = decision moment.

Options

  • (a) Continue — treat as Phase 02-adjacent priority; sequence the missing 40%
  • (b) Sunset — accept that 60% built without remaining 40% landing means the design didn't pull; remove from active scope
  • (c) Defer indefinitely — let drift naturally

Owner action

CHOOSE: (a), (b), or (c). Operator-attention required. STATE_OF_PLATFORM v2 §6 declined to recommend (insufficient product context).

Acceptance criteria

  • Operator chooses one of (a), (b), (c)
  • If (a): create wave / sub-plan for remaining 40%
  • If (b): mark in OPEN_LOOPS as abandoned; remove from STATE_OF_PLATFORM active list
  • If (c): set re-evaluate date (e.g., 30 days)
  • Issue closed when operator decision recorded + acted on
Migrated from `state/L3/OPEN_LOOPS.md` per ADR 0001 + AGENTS.md. ## Source `state/L3/OPEN_LOOPS.md` Mail infra '60% done' section + STATE_OF_PLATFORM v2 §5 risk/product HIGH + §6 secondary decisions. ## What Mail infra is 60% built but missing the last 40% needed to deliver primary user value (Iskra reads mail + replies). Specific gaps: - `OPENCLAW_MAIL_OPENCLAW_DISPATCH_URL` and `_TOKEN` empty (`617b59fa` Apr 12) — gateway healthy on RS 2000, but VPS 1000 OpenClaw not consuming - `dispatch_openclaw_intake` not configured — action-plane partially inactive - No first-class `reply` action (`a931c692`) - Telemetry gap: `lastInboundAt`/`lastOutboundAt` null on Signal/Matrix despite `running=true` ## Why this needs owner decision Not a tech bug. Product question: does this work still have owner value, or is the design pulling against operator's actual usage? 60% done with no recent progress = decision moment. ## Options - (a) **Continue** — treat as Phase 02-adjacent priority; sequence the missing 40% - (b) **Sunset** — accept that 60% built without remaining 40% landing means the design didn't pull; remove from active scope - (c) **Defer indefinitely** — let drift naturally ## Owner action CHOOSE: (a), (b), or (c). Operator-attention required. STATE_OF_PLATFORM v2 §6 declined to recommend (insufficient product context). ## Acceptance criteria - [ ] Operator chooses one of (a), (b), (c) - [ ] If (a): create wave / sub-plan for remaining 40% - [ ] If (b): mark in OPEN_LOOPS as abandoned; remove from STATE_OF_PLATFORM active list - [ ] If (c): set re-evaluate date (e.g., 30 days) - [ ] Issue closed when operator decision recorded + acted on
Collaborator

Iskra note — TaskFlow inbox-triage as the missing product layer

Piotr pointed at OpenClaw's taskflow-inbox-triage skill/example as an adjacent pattern:

My read: this is probably the right framing for the unfinished 40% here.

The current mail infra state looks less like "mail server not done" and more like:

transport/storage exists, but there is no owner-facing inbox workflow that turns mail into decisions, summaries, waits, and replies.

The TaskFlow pattern suggests a missing layer:

  1. Create one managed flow per mail batch / mailbox scan.
  2. Run a classifier over headers-first items.
  3. Persist routing state in stateJson.
  4. Move to waiting only when Piotr or another outside reply is needed.
  5. Resume when the decision/reply arrives.
  6. Finish with routed items + digest + explicit next actions.

Proposed reframing

Instead of continuing infra for infra's sake, define the next slice as:

Mail Inbox TaskFlow layer

Scope:

  • headers-only triage first;
  • classify into e.g. personal, business, newsletter, action_needed, waiting, archive;
  • produce Obsidian/Signal summary rather than raw mail noise;
  • create waiting states for items requiring Piotr's decision;
  • only after that, add first-class reply action.

Why this changes the decision

This makes option (a) more attractive, but with a narrower product slice:

  • not "finish mail infra" broadly;
  • not "build a full email client";
  • instead: prove one useful loop: mail arrives → Iskra classifies → Piotr sees only decisions/high-signal → flow waits/resumes → result is tracked.

If that first loop does not create value, then sunset becomes much easier to justify.

Suggested acceptance criteria for a continue decision

  • One mailbox scan creates a TaskFlow-style state object.
  • Headers-only classifier produces a triage summary.
  • At least one item can enter waiting with a clear owner decision prompt.
  • Summary lands in Obsidian and/or a short Signal digest.
  • No autonomous reply sending before explicit approval.
  • Reply action is designed as a later slice, not mixed into triage MVP.

My recommendation: continue, but only as a bounded product-MVP slice around inbox triage, not as another generic mail-infra wave.

## Iskra note — TaskFlow inbox-triage as the missing product layer Piotr pointed at OpenClaw's `taskflow-inbox-triage` skill/example as an adjacent pattern: - https://github.com/openclaw/openclaw/blob/main/skills/taskflow-inbox-triage/SKILL.md My read: this is probably the right framing for the unfinished 40% here. The current mail infra state looks less like "mail server not done" and more like: > transport/storage exists, but there is no owner-facing inbox workflow that turns mail into decisions, summaries, waits, and replies. The TaskFlow pattern suggests a missing layer: 1. Create one managed flow per mail batch / mailbox scan. 2. Run a classifier over headers-first items. 3. Persist routing state in `stateJson`. 4. Move to `waiting` only when Piotr or another outside reply is needed. 5. Resume when the decision/reply arrives. 6. Finish with routed items + digest + explicit next actions. ### Proposed reframing Instead of continuing infra for infra's sake, define the next slice as: **Mail Inbox TaskFlow layer** Scope: - headers-only triage first; - classify into e.g. `personal`, `business`, `newsletter`, `action_needed`, `waiting`, `archive`; - produce Obsidian/Signal summary rather than raw mail noise; - create `waiting` states for items requiring Piotr's decision; - only after that, add first-class `reply` action. ### Why this changes the decision This makes option (a) more attractive, but with a narrower product slice: - not "finish mail infra" broadly; - not "build a full email client"; - instead: prove one useful loop: **mail arrives → Iskra classifies → Piotr sees only decisions/high-signal → flow waits/resumes → result is tracked**. If that first loop does not create value, then sunset becomes much easier to justify. ### Suggested acceptance criteria for a continue decision - [ ] One mailbox scan creates a TaskFlow-style state object. - [ ] Headers-only classifier produces a triage summary. - [ ] At least one item can enter `waiting` with a clear owner decision prompt. - [ ] Summary lands in Obsidian and/or a short Signal digest. - [ ] No autonomous reply sending before explicit approval. - [ ] Reply action is designed as a later slice, not mixed into triage MVP. My recommendation: **continue, but only as a bounded product-MVP slice around inbox triage**, not as another generic mail-infra wave.
Author
Collaborator

Operator decision: DEFER 30d (2026-05-06)

Operator-confirmed via chat 2026-05-06: "Defer, nie odpuszczę tego."

Mail infra remains 60% built; remaining 40% (OPENCLAW_MAIL_OPENCLAW_DISPATCH_URL/_TOKEN, dispatch_openclaw_intake, first-class reply action, telemetry timestamps) parked until 2026-06-05 re-evaluation.

Re-evaluation criteria (post-30d)

  • Has operator pulled mail-Iskra-reply use case naturally in those 30 days? (signal: mentions, requests for fixes)
  • Has anything else in roadmap (Honcho subsystem v2, agent-access, Codex slop) created new urgency around mail?
  • Is there a clear product-value path to "Iskra reads mail + replies" without designing-by-committee?

If yes to ≥1: re-open as continue with concrete first slice. If no: convert to sunset decision (separate issue).

Action

Issue stays open. Label not-ready applied (operator deferred, not abandoned). Re-evaluate scheduled 2026-06-05.

## Operator decision: DEFER 30d (2026-05-06) Operator-confirmed via chat 2026-05-06: "Defer, nie odpuszczę tego." Mail infra remains 60% built; remaining 40% (`OPENCLAW_MAIL_OPENCLAW_DISPATCH_URL/_TOKEN`, `dispatch_openclaw_intake`, first-class reply action, telemetry timestamps) parked until 2026-06-05 re-evaluation. ### Re-evaluation criteria (post-30d) - Has operator pulled mail-Iskra-reply use case naturally in those 30 days? (signal: mentions, requests for fixes) - Has anything else in roadmap (Honcho subsystem v2, agent-access, Codex slop) created new urgency around mail? - Is there a clear product-value path to "Iskra reads mail + replies" without designing-by-committee? If yes to ≥1: re-open as `continue` with concrete first slice. If no: convert to `sunset` decision (separate issue). ### Action Issue stays open. Label `not-ready` applied (operator deferred, not abandoned). Re-evaluate scheduled 2026-06-05.
Collaborator

Parked from M08 to M10 per Iskra supplemental triage. Mail remains important, but #235 is the narrower current issue and needs live scope/evidence before execution. No runtime mutation was performed.

Parked from M08 to M10 per Iskra supplemental triage. Mail remains important, but #235 is the narrower current issue and needs live scope/evidence before execution. No runtime mutation was performed.
Author
Collaborator

Decision brief (M10 closure; operator-only — NOT a cousin call). Mail infra is ~60% done; operator decision needed: continue or sunset.

  • CONTINUE if the Iskra mail value-loop (read+reply, #235) is wanted and this infra is its foundation.
  • SUNSET if the value loop will run on a different path, or mail is not a near-term priority.
    This is operator-emotional / owner-attention. Held pending your go/no-go. (Related: #235 Iskra mail consumer is M08, also operator-gated.)
**Decision brief (M10 closure; operator-only — NOT a cousin call).** Mail infra is ~60% done; operator decision needed: continue or sunset. - CONTINUE if the Iskra mail value-loop (read+reply, #235) is wanted and this infra is its foundation. - SUNSET if the value loop will run on a different path, or mail is not a near-term priority. This is operator-emotional / owner-attention. Held pending your go/no-go. (Related: #235 Iskra mail consumer is M08, also operator-gated.)
Collaborator

Missive/OpenClaw Mail status update for future platform-owner thread:

  • The production UX is now manual per-thread @iskra grant in Missive, not broad default mailbox triage.
  • openclaw-mail-infra remains the canonical product implementation repo for the gateway/MCP/Missive API code.
  • platform is already carrying the desired-state hooks: modules/openclaw-mail-gateway, modules/openclaw-mail-worker, Traefik route for mail-gateway.pdurlej.com, runbooks/mail-loops.md, and Forgejo baseline ownership.
  • Follow-up for platform: clarify lifecycle ownership between platform and openclaw-mail-infra, and update this issue from the old “60% done / continue or sunset” framing to the current “live, platform-owned runtime contract” framing.
  • Related open safety PR: pdurlej/openclaw-mail-infra#9 (mail_send disabled by default on MCP).
  • Related docs cleanup issue: pdurlej/openclaw-mail-infra#10

No action taken here beyond documenting the handoff.

Missive/OpenClaw Mail status update for future platform-owner thread: - The production UX is now **manual per-thread `@iskra` grant in Missive**, not broad default mailbox triage. - `openclaw-mail-infra` remains the canonical product implementation repo for the gateway/MCP/Missive API code. - `platform` is already carrying the desired-state hooks: `modules/openclaw-mail-gateway`, `modules/openclaw-mail-worker`, Traefik route for `mail-gateway.pdurlej.com`, `runbooks/mail-loops.md`, and Forgejo baseline ownership. - Follow-up for platform: clarify lifecycle ownership between `platform` and `openclaw-mail-infra`, and update this issue from the old “60% done / continue or sunset” framing to the current “live, platform-owned runtime contract” framing. - Related open safety PR: https://git.pdurlej.com/pdurlej/openclaw-mail-infra/pulls/9 (`mail_send` disabled by default on MCP). - Related docs cleanup issue: https://git.pdurlej.com/pdurlej/openclaw-mail-infra/issues/10 No action taken here beyond documenting the handoff.
Collaborator

{
"confidence": 5,
"effort_hint": "medium",
"escalation": {
"kind": "operator",
"reason": "Issue explicitly asks whether to continue, reshape, or sunset partially built mail infrastructure."
},
"evidence_refs": [
{
"note": "Issue frames mail infrastructure as 60 percent built but missing primary user value.",
"type": "forgejo",
"value": "issue-title-body-labels-and-target-snapshot"
},
{
"note": "Body lists dispatch, reply-action, and telemetry gaps as remaining blockers.",
"type": "forgejo",
"value": "issue-body-gaps"
},
{
"note": "Body states this is a product decision about owner value rather than only a technical bug.",
"type": "forgejo",
"value": "issue-body-owner-decision"
}
],
"impact": 4,
"judge_actor": {
"name": "iskra",
"runtime": "openclaw"
},
"judged_at": "2026-06-08T01:00:00Z",
"labels_to_apply": [
"judge/p2",
"judge/operator-needed"
],
"piotr_fit": "medium",
"priority": "p2",
"rationale_summary": "This is P2 operator-needed work because further mail-infra effort should wait for a clear continue, reshape, or sunset decision.",
"reach": 4,
"recommended_next_action": "operator_needed",
"rerun_reason": "no_prior_judgment",
"schema": "openclaw.judge.v0",
"target": {
"kind": "issue",
"number": 48,
"repo": "pdurlej/platform"
},
"target_snapshot": {
"body_hash": "sha256:fb06643471c98576d2a2fb8821f89207f0e48e4df0d5cd5b5f3efdc18a40e308",
"commit_count": null,
"evidence_hash": "sha256:7b8840778c9ca13ee0c60fea3a87e0195fac8c55897182b75cb81bc8d0576305",
"head_sha": null,
"labels": [
"not-ready",
"operator-emotional",
"owner-attention",
"priority:p2",
"risk/product"
],
"labels_hash": "sha256:fa90ff9ac94fb51b79c49c821fa448320898faf97e97fa2f189309f3aaa6eafe",
"state": "open",
"title_hash": "sha256:7b5dad94d7c1fefb32a9a912c2e6be3aabe57f69274e5c1ae064ff314b8946b3",
"updated_at": "2026-06-07T16:11:05+02:00"
},
"top_caveat": "Do not spend more implementation time until the product value and preferred direction are confirmed."
}

<!-- openclaw.judge.v0 --> { "confidence": 5, "effort_hint": "medium", "escalation": { "kind": "operator", "reason": "Issue explicitly asks whether to continue, reshape, or sunset partially built mail infrastructure." }, "evidence_refs": [ { "note": "Issue frames mail infrastructure as 60 percent built but missing primary user value.", "type": "forgejo", "value": "issue-title-body-labels-and-target-snapshot" }, { "note": "Body lists dispatch, reply-action, and telemetry gaps as remaining blockers.", "type": "forgejo", "value": "issue-body-gaps" }, { "note": "Body states this is a product decision about owner value rather than only a technical bug.", "type": "forgejo", "value": "issue-body-owner-decision" } ], "impact": 4, "judge_actor": { "name": "iskra", "runtime": "openclaw" }, "judged_at": "2026-06-08T01:00:00Z", "labels_to_apply": [ "judge/p2", "judge/operator-needed" ], "piotr_fit": "medium", "priority": "p2", "rationale_summary": "This is P2 operator-needed work because further mail-infra effort should wait for a clear continue, reshape, or sunset decision.", "reach": 4, "recommended_next_action": "operator_needed", "rerun_reason": "no_prior_judgment", "schema": "openclaw.judge.v0", "target": { "kind": "issue", "number": 48, "repo": "pdurlej/platform" }, "target_snapshot": { "body_hash": "sha256:fb06643471c98576d2a2fb8821f89207f0e48e4df0d5cd5b5f3efdc18a40e308", "commit_count": null, "evidence_hash": "sha256:7b8840778c9ca13ee0c60fea3a87e0195fac8c55897182b75cb81bc8d0576305", "head_sha": null, "labels": [ "not-ready", "operator-emotional", "owner-attention", "priority:p2", "risk/product" ], "labels_hash": "sha256:fa90ff9ac94fb51b79c49c821fa448320898faf97e97fa2f189309f3aaa6eafe", "state": "open", "title_hash": "sha256:7b5dad94d7c1fefb32a9a912c2e6be3aabe57f69274e5c1ae064ff314b8946b3", "updated_at": "2026-06-07T16:11:05+02:00" }, "top_caveat": "Do not spend more implementation time until the product value and preferred direction are confirmed." } <!-- /openclaw.judge.v0 -->
Sign in to join this conversation.
No labels
W6d-automerge-calibration
agent/claude-code
agent/codex
agent/hermes
agent/iskra
agent/ollama
agent/patchwarden
automerge-candidate
class/security-sensitive
cutover-gate
dependency/blocked
dependency/blocks-others
dependency/cross-repo
dependency/needs-confirmation
domain:agents
domain:ci
domain:docs
domain:forgejo
domain:infra
domain:memory
domain:runtime
domain:signal
domain:ux
flow/architecture
flow/blocked
flow/deployed
flow/done
flow/implementation
flow/intake
flow/maintained
flow/observed
flow/ready
flow/refining
flow/retired
flow/review
iterating
judge/codex-candidate
judge/hermes-candidate
judge/low-confidence
judge/needs-refinement
judge/operator-needed
judge/p0
judge/p1
judge/p2
judge/p3
judge/park
judge/patchwarden-candidate
judge/stale-priority
kind/adr
kind/bug
kind/chore
kind/feature
kind/infra
kind/ops
kind/refactor
kind/research
large-impact
merge/auto
merge/manual
merge/manual-dependency-conflict
merge/manual-failing-tests
merge/manual-merge-conflict
merge/manual-missing-review
merge/manual-operator-preference
merge/manual-red-zone
merge/manual-security-sensitive
merge/manual-unclear-scope
merge/manual-unknown
meta
mode:operator-only
mode:patchwarden-iskra-approved
mode:safe-auto
needs-operator-decision
needs-triage
not-ready
observed/erroring
observed/needs-followup
observed/pending
observed/retire-candidate
observed/unused
observed/used
operator-emotional
owner-attention
phase/02
phase/03
priority:p0
priority:p1
priority:p2
priority:p3
proposed
ready-for-agent
ready-for-operator
recovery
review:claude-reviewed
review:codex-reviewed
review:dziadek-reviewed
review:needs-human
risk/exposure
risk/process
risk/product
risk/runtime
safety:external-write
safety:no-prod-mutation
safety:prod-impact
safety:secret-touch
size/large
size/medium
size/small
size/tiny
size/unknown
source/adr
source/agent-generated
source/manual
source/operator-chat
source/voice-note
status:blocked
status:codex-ready
status:merged:pending-evidence
status:needs-evidence
status:operator-needed
status:parked
tier/full
tier/lite
tier/stacked
tier:0-platform-substrate
tier:1-iskra-value-layer
tier:2-tools-products-modules
type:bug
type:chore
type:docs
type:feat
type:policy
type:research
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
pdurlej/platform#48
No description provided.