Competitive Intelligence
logs/2026-06-20-ci-report-template-sync-incident.md
2026-06-20 CI report template and sync incident
Summary
The June 20 competitive research report went in circles because content generation, HTML formatting, Telegram delivery, and skill deployment were mixed together. The trusted report content was the AWS OpenSearch Serverless plus Meilisearch v1.47 report, but several regenerated reports introduced stale or wrong narratives. The live Telegram runtime also used a different skill copy than the one being inspected locally.
Failures
- Stale data was treated as a candidate for "today's report" because the pipeline was rerun before establishing the trusted artifact. The correct June 20 content was
/Volumes/Data/Dropbox/Downloads/2026-06-20.html. - Multiple competitive-research skill copies existed: global Codex skill, ChowMes workspace copy, Obsidian workspace copy, and VPS runtime paths. The Telegram wrapper used the Obsidian workspace skill path, not every local copy.
- Template work and content work were conflated. Renderer changes were made while also trying to regenerate reports, which hid whether the problem was data, template, or delivery.
- The HTML mobile layout looked acceptable on desktop but failed in Telegram's iPhone document viewer: cramped hero, tiny stat cards, duplicated bottom-line content, small body type, and long URLs that made evidence hard to scan.
- The Vault archive originally contained raw/debug clutter such as
raw/,ci.sqlite, and one-off OCR/debug text files, even though the user only wanted final reports and briefs archived. - The report was sent more than once with similar filenames, creating a risk that Telegram or the user would inspect an older cached attachment.
Fixes Applied
- Treated the user-provided June 20 HTML as the source of truth before further work.
- Restored the June 20 HTML and matching Markdown artifacts to the live VPS path and local Vault archive.
- Confirmed the live Telegram wrapper calls
/opt/data/knowledge/obsidian/MyOS/Projects/Competitive Intelligence/skills/competitive-research/scripts/daily-research-run.py. - Patched the live renderer in
ci_core.pyand synced it to both VPS skill paths: /opt/data/knowledge/obsidian/MyOS/Projects/Competitive Intelligence/skills/competitive-research/scripts/ci_core.py/opt/data/skills/competitive-research/scripts/ci_core.py- Synced the secondary ChowMes workspace copy of
ci_core.pyto match the live renderer hash. - Fixed the mobile HTML report layout:
- shorter hero summary
- no duplicate "Competitive pulse - YYYY-MM-DD" title inside the content card
- larger mobile body text
- less cramped stat cards
- cleaner phone-width spacing
- evidence URLs wrapped with
overflow-wrapandword-break - Resent the Telegram attachment with a distinct filename:
competitive-research-2026-06-20-mobile-fixed.html. - Added
scripts/sync-competitive-research-archive-from-hermesto mirror only finalreports/andbriefs/into the Vault. - Pruned local Vault debug clutter while leaving VPS raw/audit data intact.
Guardrails
- Never rerun research to answer "show/send today's report" until the trusted artifact for that date is identified.
- For today's report fixes, separate the work into: content artifact, HTML renderer, Telegram delivery, and archive sync.
- Verify the live wrapper path before editing a skill. For this workflow, Telegram uses the Obsidian workspace skill root, and
/opt/data/skills/competitive-researchis a compatibility link to that live path. - If a report is being checked on mobile, send a fresh distinct attachment filename after each HTML layout change.
- Do not judge mobile formatting only from desktop browser rendering. Telegram's document viewer must be treated as the acceptance surface.
- Keep the Vault archive clean: final
reports/andbriefs/only. Keepraw/,ci.sqlite, and debug extraction files on the VPS unless debugging.
Verification Evidence
- Current June 20 report path:
/Volumes/Data/Dropbox/AI-Development/Personal/Obsidian-Vault/MyOS/Projects/Competitive Intelligence/artifacts/competitive-research/reports/2026-06-20.html - Current report hash after mobile fix:
a340dc591a70f5e197f8af18eb764960d1aaa1e548a985adb827f641a6a4b4c4 - Live renderer hash after mobile fix:
831405bd2b49d7517035f968836358525849701f958c4d0d9f2ce01fdcfcba96 - Content checks retained:
Decision-ready competitive signal,OpenSearch Serverless,Meilisearch v1.47 - Layout checks added:
AWS + Meilisearch,font-size: 15.5px,id="bottom-line"
Open Follow-Up
- The global Codex skill copy under
/Users/arijitchowdhury/.codex/skills/competitive-researchmay still differ from the live Obsidian workspace skill. Future cleanup should declare one canonical source and install/sync from it deliberately.