Sub-issue B of #7675, split by the triage seat (session session_01GiG1DfMysjbbFLZErAo93G, 2026-08-12) carrying the maintainer ruling of 2026-08-12 (comment 5261744983 on #7675). This card is the domain:services half.
Ruling carried (verbatim, binding — not re-adjudicable)
config_change(settings 服务已在审计、只是写进了 sys_setting_audit —— 双写或改道 sys_audit_log,实现时一并解决 settings-service.types.ts:16 文档契约与实际去向的矛盾,以实现定契约)。
The real decision inside the ruled direction (put here deliberately, not discovered mid-flight)
The ruling allows dual-write or reroute and says 以实现定契约 — the implementation decides. So this card must decide whether sys_setting_audit keeps its rows, then make settings-service.types.ts:16 state exactly what the implementation does. The identity seat's analysis on #7675 (comment 5264328866) flagged this as the load-bearing choice; weigh: existing consumers/views of sys_setting_audit (measure who reads it before dropping it), duplicate-row cost of dual-write, and the parent's defect that config_change filters and the config_changes list view are empty today.
Scope
- Settings writes produce
sys_audit_log rows with action: 'config_change' (emission point already located: settings-service-plugin.ts:315, which today inserts into sys_setting_audit with action set).
settings-service.types.ts:16 ("Emit sys_audit_log rows for every successful write.") becomes true as written, or is rewritten to match the decided behaviour.
- Acceptance: the parent's reproduction inverts —
PUT /api/settings/branding then filter {"action":"config_change"} returns the event. The config_changes list view starts showing rows.
Out of scope
- ⛔
login/logout writers (sub-issue A, identity). ⛔ Enum retirement (sub-issue C). ⛔ objectui surfaces.
No Blocked-by: — config_change remains an enum member; independent of the retirement ordering.
Size/model suggestion: M, opus (carries a real design decision within the ruled direction).
Sub-issue B of #7675, split by the triage seat (session
session_01GiG1DfMysjbbFLZErAo93G, 2026-08-12) carrying the maintainer ruling of 2026-08-12 (comment 5261744983 on #7675). This card is thedomain:serviceshalf.Ruling carried (verbatim, binding — not re-adjudicable)
The real decision inside the ruled direction (put here deliberately, not discovered mid-flight)
The ruling allows dual-write or reroute and says 以实现定契约 — the implementation decides. So this card must decide whether
sys_setting_auditkeeps its rows, then makesettings-service.types.ts:16state exactly what the implementation does. The identity seat's analysis on #7675 (comment 5264328866) flagged this as the load-bearing choice; weigh: existing consumers/views ofsys_setting_audit(measure who reads it before dropping it), duplicate-row cost of dual-write, and the parent's defect thatconfig_changefilters and theconfig_changeslist view are empty today.Scope
sys_audit_logrows withaction: 'config_change'(emission point already located:settings-service-plugin.ts:315, which today inserts intosys_setting_auditwith actionset).settings-service.types.ts:16("Emit sys_audit_log rows for every successful write.") becomes true as written, or is rewritten to match the decided behaviour.PUT /api/settings/brandingthen filter{"action":"config_change"}returns the event. Theconfig_changeslist view starts showing rows.Out of scope
login/logoutwriters (sub-issue A, identity). ⛔ Enum retirement (sub-issue C). ⛔ objectui surfaces.No
Blocked-by:—config_changeremains an enum member; independent of the retirement ordering.Size/model suggestion: M,
opus(carries a real design decision within the ruled direction).