Compare commits

..

7 Commits

Author SHA1 Message Date
efe8fd6383 deployer(ET): auto-commit from deployer run_id=531
Some checks failed
CI / test (push) Has been cancelled
CI / test (pull_request) Successful in 45s
2026-06-10 00:17:17 +03:00
f5ae43b252 tester(ET): auto-commit from tester run_id=530
All checks were successful
CI / test (push) Successful in 42s
CI / test (pull_request) Successful in 44s
2026-06-10 00:13:15 +03:00
24432e1dea reviewer(ET): auto-commit from reviewer run_id=529
All checks were successful
CI / test (push) Successful in 45s
CI / test (pull_request) Successful in 43s
2026-06-10 00:11:01 +03:00
0d62e617ab fix(notifications): escape all card data fields at the render boundary (ORCH-095)
All checks were successful
CI / test (push) Successful in 40s
CI / test (pull_request) Successful in 41s
render_task_tracker sends/edits the live card with parse_mode=HTML. _fmt_minutes
returns the literal "<1м" for a sub-minute stage; interpolated raw into HTML text
Telegram parsed "<1м" as an opening tag -> editMessageText 400 can't parse
entities -> edit_telegram EDIT_FAILED -> update_task_tracker early return
(anti-duplicate ORCH-087) -> the card froze (incident ORCH-093, message_id 18854).

Close the whole "unescaped data in HTML text" class per ADR-001: a module-local
_esc(x)=html.escape(str(x)) (never-raise) wraps every DATA slot (durations, status
label, model, effort, token/cost metrics) exactly once at the render boundary in
render_task_tracker/_stage_line. Source functions stay HTML-agnostic (_fmt_minutes
still returns "<1м"; escape on the boundary renders it visually identical as
&lt;1м, so the visible format is unchanged). Intentional MARKUP slots (num_html /
link_for / _done_link / already-escaped esc_title) are NOT escaped, so the issue
number stays a clickable <a> tag and nothing is double-escaped.

A previously-frozen card auto-recovers on the next stage transition (a new safe
render edits in place, 200) — no new code, no touch to edit_telegram /
update_task_tracker / the orphan ledger, so the ORCH-087 anti-duplicate invariant
is preserved (a transient edit failure still does not spawn a new card).

STAGE_TRANSITIONS / QG_CHECKS / check_* / notification transport / DB schema are
untouched. New tests/test_tracker_html_escape.py (TC-01..TC-11); full suite green.

Refs: ORCH-095

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 00:07:17 +03:00
30e194c254 architect(ET): auto-commit from architect run_id=526
All checks were successful
CI / test (push) Successful in 42s
2026-06-09 23:56:33 +03:00
d986632126 analyst(ET): auto-commit from analyst run_id=525
All checks were successful
CI / test (push) Successful in 43s
2026-06-09 23:50:15 +03:00
e761b1e06a docs: init ORCH-095 business request
All checks were successful
CI / test (push) Successful in 43s
2026-06-09 23:45:51 +03:00
2 changed files with 0 additions and 26 deletions

View File

@@ -1,12 +0,0 @@
---
deploy_status: SUCCESS
work_item: ORCH-095
hook_exit_code: 0
deployed_by: deploy-finalizer
---
# Deploy log — ORCH-036 executable self-deploy
Прод-деплой завершён хост-хуком с exit-code `0` -> `deploy_status: SUCCESS`.
Вердикт зафиксирован детерминированным finalizer'ом (Фаза C), не LLM.

View File

@@ -1,14 +0,0 @@
---
post_deploy_status: HEALTHY
action_taken: NONE
work_item: ORCH-095
window_s: 900
checks_total: 30
checks_failed: 0
---
# Post-deploy log — ORCH-021 post-deploy monitor
Наблюдение прода завершено: `post_deploy_status: HEALTHY`, `action_taken: NONE`.
Окно наблюдения: 900s; опросов всего: 30, из них с провалом: 0.