Colloquial phrasing with optional 一个/个 was falling through to agent_schedule,
so schedule-guard blocked false confirmations. Also strip orphaned 分 after HH:MM times.
Co-authored-by: Cursor <cursoragent@cursor.com>
MySQL JSON key order differs from JS stringify, which caused duplicate h5_tasks rows on re-run migrate.
Co-authored-by: Cursor <cursoragent@cursor.com>
Introduce Draft → Confirm → Commit flow for WeChat schedule intents behind
feature flags, plus h5_tasks dual-write/read aggregation and rollout scripts
so reminders and automations get explicit user confirmation before persisting.
Co-authored-by: Cursor <cursoragent@cursor.com>
The read_image poisoning fix had no end-to-end guard because scenarios could
only send text. Add an upload_images step that renders and uploads visually
distinct images, let chat steps attach them the same way the WeChat channel
does, and assert the generated page actually embeds every upload.
Co-authored-by: Cursor <cursoragent@cursor.com>
Image turns already get a vision-model description injected into the prompt,
but the agent kept calling read_image to "confirm" the pictures. Those tool
results carry base64 image parts that Goose persists, so every later turn
against the text-only chat provider failed with `unknown variant image_url`
before the agent could write the page. WeChat page requests therefore fell
through to the fail-closed delivery message.
Drop read_image for the turn whenever a vision model handles the images, say
so explicitly in the injected prompt, and teach the poison scan to recognise
tool image parts so already-polluted sessions rotate instead of failing again.
Co-authored-by: Cursor <cursoragent@cursor.com>
Turn off the low-balance 10 CNY signup bonus while keeping the 5 CNY
registration credit, split metering into independent formula A/B scopes,
and retry expired auto-renew subscriptions after recharge or hourly worker.
Co-authored-by: Cursor <cursoragent@cursor.com>
Wait for HTML materialization before releasing delivery contracts, pass
verified MindSpace URLs through proactive WeChat sends, resend on reconcile
when pages land late, and report deferred customer-service delivery as unsent.
Co-authored-by: Cursor <cursoragent@cursor.com>
Register branch disposition after 103 deploy/repair, and add a lightweight
103 repair script that avoids heavy runtime module imports.
Co-authored-by: Cursor <cursoragent@cursor.com>
Prevent duplicate active scheduled tasks, fail static preparing contracts
when HTML is missing, raise MindSpace remote timeout default to 30s, and
add 103 repair scripts for inspection follow-ups.
Co-authored-by: Cursor <cursoragent@cursor.com>
Scheduled automation now prepares and retries MindSpace delivery contracts,
blocks WeChat pushes when public HTML links are not ready, and reconciles
stuck static preparing contracts on each worker scan.
Co-authored-by: Cursor <cursoragent@cursor.com>
After a successful image report flow, Goose may keep image_url parts that
DeepSeek rejects on later turns while PUT scrub returns 405. Detect polluted
sessions up front, rotate to a fresh agent route with carried assistant
context, and recover image URLs from recent media on historical retries.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace the integration spawn that re-entered run_fast_release_guards with
static script checks so fast release guards can finish reliably.
Co-authored-by: Cursor <cursoragent@cursor.com>
Formalize fast release as --mode fast so verified changes can skip canary promotion and full Gate reruns while keeping backups and health checks.
Co-authored-by: Cursor <cursoragent@cursor.com>
rollback-portal-canary-prod.sh is part of the 103 canary workflow and must
not block impact selection when it changes alongside release scripts.
Co-authored-by: Cursor <cursoragent@cursor.com>
Phrases like "解读详细报告,做成页面" now bind to the in-session report
context instead of behaving like a brand-new page topic.
Co-authored-by: Cursor <cursoragent@cursor.com>
103 no longer runs goosed-prod Docker. Canary preflight now checks the
native 18006-18014 pool, and release-gate tests match 127.0.0.1 health probes.
Co-authored-by: Cursor <cursoragent@cursor.com>
103 retired Docker goosed on 2026-07-30. Portal canary now health-checks
18006-18014 and inherits those targets, instead of requiring goosed-prod-1.
Co-authored-by: Cursor <cursoragent@cursor.com>
The mocked second poll result was racing a 50ms deadline on a loaded
runner, so CI failed with an empty transcript.
Co-authored-by: Cursor <cursoragent@cursor.com>
Stable 103 already runs deepseek-no-think on 18036. Require that contract
instead of demanding a free port, so canary install does not fight production.
Co-authored-by: Cursor <cursoragent@cursor.com>
Shared paths like db.mjs were pulling PAGE/DATA live agent suites into every
hotfix. Keep those cases for actual page-data changes, resume passed suites on
the same artifact, and fail fast on Docker/port issues instead of rerunning 100+
scenarios.
Co-authored-by: Cursor <cursoragent@cursor.com>
DATA-01 told the agent not to stop at 方案确认, then failed because the first
reply no longer contains those words. Assert 问卷/后台 delivery instead.
Co-authored-by: Cursor <cursoragent@cursor.com>
Expired paid users were rebuilt as free with period_images_limit=0, which the quota system treats as unlimited. Write the catalog quota on rebuild and repair existing finite plans on schema ensure.
Co-authored-by: Cursor <cursoragent@cursor.com>
Goose cannot persist historical image scrub (PUT 405), so DeepSeek rejects
image_url on the next turn. Reattach the recent report image and rotate to a
fresh session instead of treating the follow-up as a missing page source.
Co-authored-by: Cursor <cursoragent@cursor.com>
CI failed on a 5ms/20ms race that let the LLM reply win before the timeout fallback. Give the abort path more slack so the guard stays deterministic.
Co-authored-by: Cursor <cursoragent@cursor.com>
Drop the user_confirmed_at gate so public, online, unexpired pages can enter sitemap/llms and receive SEO/GEO tags. Defaults now enable all discovery switches; stored all-off config is still preserved until admin saves.
Co-authored-by: Cursor <cursoragent@cursor.com>
Prevent silent drops when users send follow-up instructions during waiting or streaming by showing the message immediately, notifying them it is queued, and auto-flushing after the composer returns to idle.
Co-authored-by: Cursor <cursoragent@cursor.com>
Finish now releases static HTML delivery contracts in a finally block so
re-edited pages are not stuck at HTTP 409, and M成果 groups pages by
Asia/Shanghai calendar dates to avoid duplicate day headings.
Co-authored-by: Cursor <cursoragent@cursor.com>
Expose a DB-backed catalog of all online publications with SEO, GEO, total,
and bot view counts from h5_publication_views for the memind_adm dashboard.
Co-authored-by: Cursor <cursoragent@cursor.com>
load-env.mjs depends on memind-runtime-profile.mjs; include it in portal
runtime packaging so wechat-mp-menu.mjs works on 103 without manual scp.
Co-authored-by: Cursor <cursoragent@cursor.com>
Ship the M成果 page with list/delete UX, fix deletePage for incomplete page records, route /space/achievements, and add M成果 under the WeChat M空间 menu.
Co-authored-by: Cursor <cursoragent@cursor.com>
goosed stdio MCPs do not inherit Portal env, so scheduled_task_create
always reported worker disabled even when H5_REMINDER_WORKER_ENABLED=1.
Forward worker flags in sandboxMcpEnvs and add a regression test.
Co-authored-by: Cursor <cursoragent@cursor.com>