A terminal deferred delivery was marking the reminder failed without creating the next daily run, which silently killed active 早安问候 subscriptions.
Co-authored-by: Cursor <cursoragent@cursor.com>
Cover upload now tries lead-card and card images before image_make; template spec requires bind-then-reply-2 subscribe flow and inline on-this-day history facts instead of external link grids.
Co-authored-by: Cursor <cursoragent@cursor.com>
Anchor queries boost retrieval for diplomacy, finance, and AI headlines; inline conversion now reads news002 wc/we/wt weather cards so drafts show city forecasts again.
Co-authored-by: Cursor <cursoragent@cursor.com>
Finish-sync guards now accept SEO/GEO disk enrichment instead of requiring
byte-identical HTML, and fragment writes no longer duplicate doctype. Users
canary mode keeps the full native pool while routing allowlisted identities
to :18015 without overriding memory settings.
Co-authored-by: Cursor <cursoragent@cursor.com>
MEMIND_SESSION_REPLY_IDLE_TIMEOUT_MS (off by default, min 30s) fails a reply
that stops streaming while no tool is running, and is recoverable like other
finish errors. The goose Finish reason is surfaced in session_finished.
Co-authored-by: Cursor <cursoragent@cursor.com>
launchd leaves goosed at a 256 soft nofile limit, causing EMFILE on busy
sessions. The run script now raises ulimit -n; the hardening script applies
this and the harness shim to the live pool with backup, rolling restart,
health checks and --rollback.
Co-authored-by: Cursor <cursoragent@cursor.com>
The 103 harness shim imported mysql2 from a Docker-only path, so every
harness_remember failed on the native pool. The shim resolves mysql2 from
the Portal runtime (or MEMIND_MYSQL2_MODULE) and ships in the runtime.
Co-authored-by: Cursor <cursoragent@cursor.com>
- news002 image/structure audit no longer throws: prune empty sections and
publish a best-effort page with a warning
- WeChat push strips images that failed to upload instead of refusing the draft
- forceGenerateOnce is cleared before running, so a failed run cannot loop;
the archived page is restored when generation fails
- degraded-page regeneration runs at most once per day
- content safety rules cover vulgar sexual terms and gossip/adult sites
Co-authored-by: Cursor <cursoragent@cursor.com>
Rules-first safety gate covering adult content, minor protection, legal
compliance (stock tips, crypto promotion, gambling, drugs, source
provenance for political news) and ethics (tragedy tone, discrimination,
gossip). Filters without blocking publication:
- SearXNG prefetch uses safesearch=2 and drops block-level results before
they can be supplemented into the page
- worker sanitizes the page after dedupe and after the image gate, with a
single batched model review; review-level items are removed fail-safe
when the reviewer is unavailable
- sections the gate filtered are exempt from fill/structure audits so
filtering never turns into a failed generation
- push/preview recheck removes block-level items and masks title/digest
- AI-assisted disclosure in page footer and WeChat draft, plus aigc and
content-safety meta markers
Co-authored-by: Cursor <cursoragent@cursor.com>
The proxy now forwards any api.weixin.qq.com/cgi-bin/* path (drafts, material
upload, etc.), binds to the 10.10.0.1 tunnel address, and uses a 120s timeout.
wechat-egress-fetch.mjs rewrites WeChat API URLs to the egress base when
MEMIND_WECHAT_EGRESS_BASE_URL is set.
Co-authored-by: Cursor <cursoragent@cursor.com>
Scheduled tasks can finish once the expected HTML is on disk and stable,
instead of waiting for Goose Finish. Adds news-item templates and scripts
for generating a single-event page and committing it as a WeChat draft.
Co-authored-by: Cursor <cursoragent@cursor.com>
Update template version exports and draft worker tests so fast release
guards pass with the news-engine integration branch.
Co-authored-by: Cursor <cursoragent@cursor.com>
Lock scheduled morning news to news002 with section-fill gates, headline lead-card normalization, SearXNG top-up to max, and push that keeps imageless cards as text while requiring uploaded images where present.
Co-authored-by: Cursor <cursoragent@cursor.com>
Reject weak or unreachable source images, auto-promote lead cards for
structure audit, and relax push gates while keeping text-only cards.
Co-authored-by: Cursor <cursoragent@cursor.com>
Integrate news002 image localization and compact wechat layout from main
while keeping SearXNG fallback enrichment in the draft worker.
Co-authored-by: Cursor <cursoragent@cursor.com>
Drop story cards without real images from HTML and WeChat drafts instead
of showing ph placeholders, and remove emptied sections for layout balance.
Co-authored-by: Cursor <cursoragent@cursor.com>
After enrichment fails to resolve og:image, swap out imageless story cards
with SearXNG candidates before the image gate rejects the draft.
Co-authored-by: Cursor <cursoragent@cursor.com>
Allow no-image candidates and create missing section shells so news002
image gate can pass after source-page enrichment on thin agent output.
Co-authored-by: Cursor <cursoragent@cursor.com>
When the post-generation audit fails, supplement missing core sections,
headlines, and brief items from prefetched SearXNG groups before re-running
image enrichment and the push gate.
Co-authored-by: Cursor <cursoragent@cursor.com>