HEL-870 assembly: memory/persona/mood/life/proactive-contact joined into one runnable candidate on an additive R4 migration (no existing table or row replaced; no visual changes beyond mechanical proactive flag passthrough) - src/cybergril/memory/seman… #11

Open
leefer wants to merge 60 commits from leefer/hel-870-assembly AGit into main
Owner

Co-authored-by: multica-agent github@multica.ai

Co-authored-by: multica-agent <github@multica.ai>
leefer added 60 commits 2026-10-26 21:07:58 +08:00
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
- 13 modified / 8 added / 1 deleted per CHANGES.json (author package 76bc120b)
- docs/requirements v1.10 + prototypes/hel-799 + PROVENANCE from bundle, verified byte-identical to 63799f0
- AGENTS.md + scripts/check_requirements.py restored from governance commit 63799f0

Co-authored-by: multica-agent <github@multica.ai>
- browser_check.py: 视觉观察 → 视觉观察(模拟) (author renamed the aria-label, selector not migrated)
- import_check.py: handle the dirty-settings leave confirmation before opening the record (pre-existing gap, fails at base db571ba too)
- rework_browser_check.py: long-user-line reply budget 10s→60s (approved hel-799 dwell ≈2.4s/page), conditional 继续 resume (toLatest resumes flow in the approved prototype), 600ms settle before measuring compact typing nav transition
- regenerated docs/frontend + docs/rework evidence from this Linux run

Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
- 6 modified + handoff JSON per CHANGES-HEL-824.json, all hashes verified against git 4321aeb and package bytes
- rework_browser_check: skip full-text sheet at micro height (<420px design hides the control); migrate stale 返回日子 selector to 结束交谈 · 回到日子
- fresh run evidence: web build 25/25 unit tests, backend 142/142 (py3.12), all four browser checks PASS incl. new compact first-press and 700ms slow-frame sections (slow_frames_new_turn_to_reply_s=2.32s), layout regression 320/390/1024/1600 both themes

Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Audited manager handoff against af28ffd (v1.10):
- 59 original items byte-identical, open_items unchanged
- source hashes verified incl. other-agent-discussion sha256
- user quote 01a1734c verified against platform comment
- check_requirements passes vs main / hel-835-unified-review / product target

Co-authored-by: multica-agent <github@multica.ai>
- Bounded source review of mem0ai/mem0 @2c81af3 (embedded lib, Apache-2.0,
  upstream-maintained extract/consolidate/hybrid-search; SQLite history)
- Zep CE screened out (4-container stack, legacy/docker-compose.ce.yaml:5-71)
- 8-mechanism matrix from discussion takeaways: requirement/current/candidate/
  thin-adapter/to-verify per mechanism
- Recommendation shifts from v2 Option C (self-maintained port) to Route E
  (direct SDK adoption + thin product adapters); Option C kept as verified
  fallback; spike-first with acceptance gates, no claim of final selection
- v2 report carried in verbatim as evidence base

Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
- Fixed mem0 source commit 2c81af3 (2.2.1) in isolated venv, qdrant embedded + fastembed local zh embeddings (95.3MB, within 500MB cap)
- Gate0 transport-level persistent debit ledger: 61st call blocked pre-send, failures count, cross-process persistence, retries disabled+counted (fake transport, zero network)
- Gate1 qdrant embedded checks: keyword_search functional (Chinese segmentation gap recorded honestly), restart subprocess, clean-copy restore, no telemetry collections
- Gate2 privacy with stub LLM: P1-P5 zero leak, first-share timing F1-F6 (failed/cancel/unconfirmed no migration, ack+judged migrates told content with anchors, duplicate receipt idempotent), full backup incl. unshared internal memories restores clean
- A/B same-material same-criteria: Mem0 paraphrase recall strictly better than current lexical path (S3, model answers in Chinese), S1-S9 all pass, no regression
- Headline findings: Chinese input extracted as English memories (default upstream prompt), BM25 lexical channel inert for Chinese, ADD-only infer confirmed with our update orchestration, custom metadata needs direct payload read
- 26/60 real outbound via persistent ledger (incl. one parse-failure retry), usage/latency per row; embeddings 28/500; HEL-835 quota untouched
- Experiment branch only: no merge to main/product, no deploy, no real-profile access; handoff JSON + dual-base requirement checks pass

Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
HEL-864: full-grammar whole-answer parsing for S6 affirmative verification - per manager independent review of 7aa9280: (1) affirms_promise_claim/affirms_promise_state rewritten as bounded-grammar full-parse (parse_supported_answer): the entire answer must be declarative (no question marks, no sentence-final 吗/呢/吧/嘛/呗) and EVERY clause must be fully consumed (fullmatch) as exactly one of P promise clause (subject? -> promise verb -> aspect 过/了? -> 周五(晚)? -> tell action -> receiver pronoun? -> correct object 面试结果, nothing further) / C closed-state clause / O open-state clause; whole answer needs >=1 P clause, state affirmation needs >=1 clause of required polarity and 0 of the opposite; (2) manager seven wrong-answer groups all now judged fail through the same real s6_result: foreign object without 结果 suffix (体检报告现在已经告诉我了), post-state object (现在已经告诉我了体检情况), bare-noun clause in earlier position (体检结果,现在已经告诉我了), whole-answer conflicting tail (但面试结果仍待告知), question mood (……吗?), conditional (如果你答应……), suffix denial (已经告诉我了是假的) - plus the same seven mirrored on the unresolved side; (3) EN equally verified with the same clause structure (old code failed even the EN positive with 'the interview result'; now 3 EN positives pass, 6 EN negatives fail); substring-assembly judges (clause_affirms_promise/clause_affirms_state/clause_foreign_object/_prefix_negated) removed - no per-sentence blacklists, no 报告/吗/假 forbidden words, no new model, no generic semantic engine c65de003a1
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
HEL-866: validate the post-verb slot by verb class - per manager independent review of 5ebe407: _bind_state_clause no longer treats the slot after receive/fulfill verbs as tell's receiver; tell-verb post-verb slot = told receiver (scene receiver 我/me, omitted inherits, object NP may follow); receive-verb (收到/拿到/received/got) post-verb slot = the received object (interview result, omitted inherits per declared anaphora; explicit person pronoun 收到我/received me = receiving a person not the result, received me the interview result = extra person parameter, all fail conservatively); fulfill-verb (兑现/解决) post-verb slot = the fulfilled matter (promise/appointment, omitted inherits; 兑现我 fails); subject-slot rules unchanged from HEL-865 (tell/fulfill subject=promisor or omitted, receive closed recipient=scene receiver or omitted, open receive subject compatible with both readings); manager six negatives (haven't received me yet / haven't got me yet / haven't received me the interview result yet / 还没有收到我 / 还没拿到我 / 还没兑现我) all fail through the same real s6_result; per-class subject x post-verb-slot matrix covers subjects/direct objects/receivers/multi-param conflicts for tell/receive/fulfill in both languages, not just six sentences; canonical positives incl. 我还没有收到, haven't received it yet three readings (omitted/promisor/recipient subject), 还没兑现 omission, topic form and tell-with-receiver+object kept passing; no six-sentence or pronoun blacklist, no new model, no generic NLU engine, supported surface unchanged cf3423d44c
Co-authored-by: multica-agent <github@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
HEL-867: make the S6 overall predicate honor parsed polarity - per manager independent review of 5e90136: s6_result's resolved_affirms_closed/unresolved_affirms_open/unresolved_no_false_resolution now share the same parse_supported_answer as affirms_promise_state (same-source polarity) instead of whole-text bare-substring exclusion with PROMISE_CLOSED/OPEN word lists (retained as historical declaration, unwired) - the bare substring ignored negation context and read 'received the result' inside 'haven't received the result yet' as a resolution claim, rejecting correct unresolved answers the declared grammar already supported (present since 5ebe407, exposed by the manager's expanded 740-row independent check: 33 failures = 30 negation-aux x received x object combos + 3 overlapping receive-matrix rows); opposite polarity and no-false-resolution now judged by closed/open clause polarity binding the same scene declaration - a closed clause (incl. mixed open+closed) still fails, negated positive substrings no longer trigger; uncertain whole-text exclusion kept (uncertain forms are structurally unconsumable, belt-and-braces); audit867 prefix at 5e90136 worktree reproduces all mis-rejections through the same real s6_result (parse open+bound, affirms_promise_state true, gate false), postfix passes minimal family + 120-row grammar x predicate matrix + manager receive matrix; double-phase negatives (false resolution incl. I have received the notification, mixed polarity, maybe/foreign object/question/conditional, resolved side says open) stay failed; HEL-866 six + person-object matrix cells + canonical positives + haven't received it yet three readings + omission inheritance + 140 role combos + audit861-866 all held S6/S2/S3 sets unchanged; manager's original review866.py rerun 740/740 exit 0; audit861_reuse867 real orchestration + fake externals exit 0 (8 share gates supplied, unshared/unknown never in sent context, S8/S9 exits, unresolved block self-consistent, anchors); per-case flip self-check; zero-embed zero-network, ledger 458/500 read-only unchanged with identical line digest, prior evidence hashes untouched, real 26/60 and 13-request retest plan frozen; no new semantic engine, no sentence amnesty/banned words, no fixture or model-answer changes, supported surface unchanged 454e54cb59
Co-authored-by: multica-agent <github@multica.ai>
HEL-867 handoff: deliverable/acceptance/deferred/verification JSON; audit867_prefix reproduced at 5e90136 worktree (manager minimal unresolved positive 'you haven't received the result yet' + I/omitted subject + the notification family + 30 negation-aux x received x object cells + 3 overlapping receive-matrix rows all mis-rejected through the same real s6_result while parse open+bound and affirms_promise_state true - mis-rejection in the overall predicate layer) + audit867_postfix at code commit 454e54c (all previously mis-rejected correct unresolved forms pass; 120-row grammar x predicate matrix and manager receive matrix match expectations; double-phase negatives - false resolution clauses incl. I have received the notification, mixed polarity, maybe/foreign object/question/conditional, resolved side says open - all stay failed; resolved-side positives incl. EN recipient-subject received forms kept passing) + manager original review866.py rerun 740/740 exit 0 + audit861_reuse867 full rerun (8 share-gate calls all supplied, t1 unshared/t4 unknown companion raw text never enters sent context, S8/S9 recovery exits, unresolved-block self-consistency, anchor negatives no regression); per-case flip self-check proves exit code depends on every positive and negative; zero-embed zero-network, ledger 458/500 read-only unchanged with identical line digest 8037cbfb (word-surface 160, 181 rows), prior evidence hashes untouched, real 26/60 and 13-request retest plan frozen; dual-target requirement checks 4/4 pass vs origin/main and origin/agent/agent/de8874a3803b with/without handoff e06dcaf889
Co-authored-by: multica-agent <github@multica.ai>
HEL-868: fixed 13-call real A/B retest executed in one bounded round per rework860 _retest_plan under the original '同意测试' authorization after manager HEL-867 review lifted the stop gate - criteria/fixtures/orchestration untouched at e06dcaf (driver only captures per-call raw input/sent-context/answers and writes per-scenario outputs, never overwriting ab_scenarios.json); preflight zero-embed zero-network audit861_reuse868 + audit867_reuse868 both exit 0 with prior evidence and ledgers unchanged; 13/13 calls sent HTTP 200 (ADD1-5 anchored real extraction + QA1-8), real ledger continued on a SQLite-consistent backup of the original 26-row ledger (prefix line digest 03f92557 identical, original read-only preserved) now 39/60, embed ledger 458->498/500 (+40 dense, pre-computed debit guard held), usage 163041 tokens recorded per call; honest per-scenario results: S1/S4/S5/S8/S9 pass, S2/S3 mem0 side and S7 fail fail-closed because base-group batch-anchored infer hits carry the unshared t1 companion row in the group anchor and companion_unshared rejects them at every exit (zero leak markers in all sent contexts - the gate holds; row-level provenance for batch extractions is our adaptation gap, not visible to offline row-anchored fake payloads), S3 retrieval layer strictly better re-confirmed (11:11 target hits vs baseline 0:0) but model-use verdict fails without the gated content, S6 orchestration/status-in-block/unresolved-contrast all pass while both real answers are descriptive '资料里说...' unsupported by the pre-declared bounded grammar and honestly fail closed; no rerun, no criteria relaxation, no debug requests, no merge, no deploy; dual-target requirement checks 4/4 pass with handoff-HEL-868.json 81d50f28af
Co-authored-by: multica-agent <github@multica.ai>
HEL-869: read-only remediation evidence per manager independent review of 81d50f2 - recheck869.py reproduces the upstream rolling 10-message window from the fixed mem0 storage source (SHA256 5f5ecdad, byte-identical to the isolated venv install) in an independent in-memory SQLite with zero LLM zero embedding zero network (single 15-message batch truncates to 10; the real 9,1,1,2,2 add pattern keeps batch1 first-4 + later-6, dropping batch1 last-5) and verifies read-only that this round's mem0 messages hold 10/15 missing exactly t3 user/companion, t4 user/companion, t5 user with the restored public copy identical at 10, while the baseline main archive chat_message keeps all 15 verbatim per-role rows and the original calls inputs still carry all 15 - SDK messages is a rolling window, not a permanent quote archive, and no real user data was lost; erratum_HEL-869.json records six report-corrections without touching any original JSON (E1 S1 frozen criterion sampled only mem0 t1 so full-15 retention cannot be claimed, E2 this round used 46004 tokens = 44735+1269 while 163041 is the cumulative 39-call total, E3 raw QA6-13 map in order to plan QA1-8, E4 calls headline 'answered blue' is a stale run2 note vs this round's honest unknown answer, E5 in-process llm_calls_real=0/embed 39 are not authoritative vs persistent ledgers' 13 sent/40 dense, E6 S9 re-verified only the public instance with full private+public recovery reused from gate2 P5); README HEL-868 record annotated in place at the three corrected conclusions plus a HEL-869 section; plan-next-HEL-869.md delivers the decision-only minimal follow-up (main archive stays the permanent quote layer with reread via turn_ids anchors, mem0 interfaces reused, no upstream fork; batch-extraction line-level provenance proven by input-side pre-grouping where each add's anchor equals its actual input set with gate-side sha256 recompute - no gate bypass, no anchor trimming, no prompt-only promises; S6 verified via explicit-status questioning under the same frozen bounded grammar with no wording amnesty; Chinese custom_instructions deferred; upstream/ours responsibilities, risks incl. embed budget 498/500 remaining 2 as the hard blocker, and a staged minimal retest: stage0 offline zero-cost audit then stage1 ~14 requests/~40-46 embeddings pending quota decision); all three ledgers byte-identical before/after (03f92557/c9871277/9716c722), every e06dcaf result blob unchanged, no criteria/fixtures/orchestration edits, no real requests, no embeddings, no merge, no deploy; dual-target requirement checks 4/4 pass vs origin/main and origin/agent/agent/de8874a3803b with/without handoff-HEL-869.json 5671946267
Co-authored-by: multica-agent <github@multica.ai>
HEL-870 assembly: memory/persona/mood/life/proactive-contact joined into one runnable candidate on an additive R4 migration (no existing table or row replaced; no visual changes beyond mechanical proactive flag passthrough) - src/cybergril/memory/semantic.py productizes the audited Mem0 path per plan-next-HEL-869: input-side pre-grouping sends only public rows outbound (user rows always; companion rows only judged+acked with all-told candidates), every batch anchor turn_ids/turn_roles/input_sha256 equals that exact input set, and the read-time gate independently recomputes the fingerprint against the live archive and re-checks every companion row's share state, fail-closed rejecting no_payload/unknown_source/archive_missing/source_mismatch/hit_text_mismatch/anchor_turn_mismatch/role_text_conflict/companion_unshared with honest row_verbatim/row_anchor/batch provenance; main archive chat_message remains the ONLY permanent quote layer; sem_batch/sem_covered carry a lease-recovered idempotent job loop; EmbedLedgerGuard continues the single authoritative embed ledger and with embed_cap=0 (no approved budget) refuses every real embedding so the frozen 498/500 and 39/60 accounts and the HEL-835 gate stay untouched; fixed Mem0 2c81af3 is lazily imported with zero upstream fork, a deterministic stub backend exists for engineering verification and is never claimed semantic; MoodRuntime makes core.mood live (event impulses scaled by bazi strength sensitivity, heartbeat decay, state_snapshot persistence, restart recovery, model sees one word only); DyadRuntime makes the relationship ledger live (completed exchanges are rituals, daily regression, behavior hints stay instructions); life_activity adds start/continue/interrupt/resume/finish continuity across slots and restarts with chat-completion interrupts; reach_out implements the approved R4 scope from character.yaml (>=6h interval, hours 8-23, salience>=0.6, arousal>=0.5, intimacy>=0.4) with traceable already-public bases only, UNIQUE(basis) so restarts and duplicate tasks can never multiply messages, night suppression, absence-rule fail-closed, phi projection, and messages persisted as companion rows (proactive=1) fully synced on reopen; API health reports R4-assembly with per-capability honesty (voice/vision/weather/materials/backup stay false, semantic_memory names its backend); config/semantic.example.yaml sanitized config and docs/runbook-hel870.md (startup, locked deps, health, independent data dir, disable/rollback, experience chain list, budget request, R1-R7 seams); verification: 250 python tests pass on 3.11 venv + requirements.lock (61 new deterministic/fake-provider cases covering every gate negative, restart recovery, dedupe, red line and the full entry chain incl. reopen epoch sync), ruff clean, web typecheck + 42 vitest + build pass with the original author frontend untouched except the one-line proactive passthrough; dual-target requirement checks 4/4 pass vs origin/main and origin/agent/agent/de8874a3803b with handoff-HEL-870.json; zero real model calls, zero embeddings, zero outbound network this card; local unified-instance smoke on port 8360 (stub semantic) serves the built web and reports the life loop waiting; read-only server check recorded in the runbook (existing 8300-8350 services and voice ports observed, end-to-end voice availability NOT verified); not merged, not deployed, no production or shared services touched 31970c4dd3
Co-authored-by: multica-agent <github@multica.ai>
This pull request has changes conflicting with the target branch.
  • AGENTS.md
  • docs/requirements/README.md
  • docs/requirements/baseline.json
  • docs/requirements/changes.json
  • docs/requirements/changes.md
  • docs/requirements/coverage.json
  • docs/requirements/coverage.md
  • docs/requirements/current.md
  • docs/requirements/source-manifest.json
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin refs/pull/11/head:leefer/hel-870-assembly
git checkout leefer/hel-870-assembly
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: leefer/CyberGril#11