Default ISSUE_SINK_TYPE to state-hub (no silent Forgejo issues), hard-fail prune apply without live-images protection, refresh-live-images script, disable TaskExecutor stub by default, and document consumer/sink contracts.
5.4 KiB
| id | type | title | domain | repo | status | owner | topic_slug | created | updated | state_hub_workstream_id |
|---|---|---|---|---|---|---|---|---|---|---|
| ACTIVITY-WP-0022 | workplan | IssueSink: stop default silent Forgejo issues for internal findings | infotech | activity-core | finished | codex | activity-core | 2026-07-21 | 2026-07-21 | d8e4a0c0-dc63-486b-b153-0292e63dba54 |
IssueSink: stop default silent Forgejo issues for internal findings
Origin
Filed from issue-core ISSUE-WP-0004-T05 after the work-record canon
alignment (CUST-WP-0060, founder-reviewed architecture draft §4.2).
Incident backdrop: daily-todo-md-stale-review (and any definition whose
rules call emit_tasks) treated IssueSink → issue-core → Forgejo as the
default always-on path. That produced tracker issues nobody was meant to
see as fleet coordination. Forgejo issue tracking is not the fleet
coordination mechanism; work records originate as repo files (ADR-001).
issue-core has retargeted its own docs to connector, not landing zone
(INTENT.md / SCOPE.md / ISSUE-WP-0004). This workplan is the
activity-core-side product fix: the default sink must not silently
create Forgejo issues for internal findings.
Related:
- issue-core:
workplans/ISSUE-WP-0004-align-with-work-record-canon.md - the-custodian: CUST-WP-0060 closure review item 6 (TODO-stale / IssueSink)
- activity-core:
ACTIVITY-WP-0021(prod reliability; T01 may restore or replace emit path — this WP owns the policy default) src/activity_core/issue_sink.py—ISSUE_SINK_TYPEdefaults to"state-hub"(ACTIVITY-WP-0022)
Goal
- Default is safe for internal findings: no silent Forgejo issue spam
when
ISSUE_SINK_TYPEis unset or when a definition is internal-only. - Intentional external issues remain possible (explicit config / sink type / per-definition opt-in).
- Internal outcomes go to the appropriate fleet surface (work-record intake, State Hub progress, working-memory, etc.) — not issue-core by default.
- Document the sink matrix for operators (rest / null / future intake).
Out of scope
- Implementing issue-core UUID ↔ external-id mapping (issue-core design
note
docs/uuid-external-id-mapping.md; stage-3 work-record arch). - Full redesign of every ActivityDefinition — only sink policy + the definitions that currently misuse IssueSink for internal findings.
- ACTIVITY-WP-0021 bridge 503 reliability work (coordinate, don't duplicate).
Tasks
Task: Decide default sink policy and config surface
id: ACTIVITY-WP-0022-T01
status: done
priority: high
state_hub_task_id: "1a0d9bf6-c822-42c8-9b67-8a9be16cce7d"
Choose and document:
- Safe default for
ISSUE_SINK_TYPE(e.g.nullor a future non-Forgejo sink) vs keeprestonly when explicitly enabled in prod overlays. - Per-definition or per-rule opt-in for external projection.
- Interaction with NullSink, tests, and railiance01 deployment env.
Reference: issue-core SCOPE “Default sink for internal automation findings” and ISSUE-WP-0004 origin.
Task: Implement default that does not create Forgejo issues
id: ACTIVITY-WP-0022-T02
status: done
priority: high
state_hub_task_id: "78f994f6-68bd-4f18-88b0-3a25b46e7563"
Code + config changes so unmatched / internal-finding paths cannot spam
Forgejo. Update tests (tests/test_issue_sink.py and callers of
get_issue_sink()). Preserve a documented path for intentional rest use.
Task: Reroute or pause definitions that abused IssueSink for fleet work
id: ACTIVITY-WP-0022-T03
status: done
priority: medium
state_hub_task_id: "d45f861d-4c5e-4721-8e02-50d7deafaefd"
At minimum: daily-todo-md-stale-review and any other definition that only
needs internal attention. Prefer work-record intake / State Hub progress
over Forgejo. Coordinate with CUST-WP-0060 item 6 and WP-0021 if still
paused.
Task: Operator docs and deployment env audit
id: ACTIVITY-WP-0022-T04
status: done
priority: medium
state_hub_task_id: "747a19ab-c6a5-4f8a-b294-a8dc0f82109f"
Document sink matrix; audit railiance01 / compose env for
ISSUE_SINK_TYPE, ISSUE_CORE_URL, ISSUE_CORE_API_KEY. Confirm defaults
match policy after T02.
Acceptance
- Unset / default config does not open Forgejo issues for internal findings
- Intentional external emit still works when explicitly configured
- TODO-stale (and peers) no longer depend on IssueSink→Forgejo for fleet visibility
- Tests and deploy docs match the new default
- Cross-link from issue-core ISSUE-WP-0004 remains accurate
See also
src/activity_core/issue_sink.py- issue-core
INTENT.md(pivot 2026-07-20) the-custodian/canon/standards/work-record-types_v0.1.mdthe-custodian/research/WorkOrchestrationArchitectureDraft.md§4.2
Closeout 2026-07-21
Policy decision (T01): ISSUE_SINK_TYPE default = state-hub. rest is
explicit opt-in only. Unknown/empty → state-hub.
Code (T02): DEFAULT_ISSUE_SINK_TYPE, factory fallback, tests.
Definitions (T03): daily-todo-md-stale-review already paused/disabled in
prod; SBOM task rules gated off; internal paths use reports / state-hub.
Docs (T04): docs/issue-core-emission-boundary.md sink matrix,
docs/task-emission-consumer-contract.md, .env.example, runbook.
Acceptance checkboxes:
- Default does not open Forgejo issues for internal findings
- Intentional
reststill available - TODO-stale not depending on IssueSink→Forgejo
- Tests and deploy docs match