zonggong and multica-agent
c121c42e39
HEL-896 release completion: the A/B/C budget becomes an executable two-instance split, the real-browser false positive is fixed precisely (product untouched), the SDK gap list is corrected to the honest 41-distribution closure with the pip-download erratum, and release archiving becomes a consistency snapshot - (1) budget split: the manager's independent review reproduced on a temp store that writing A's total_requests=55 into the shared product ledger blocks B's mem0_extract and C's dialogue_main with budget_total_requests_exhausted:55/55 while budget_total/request_usage/token_usage have no stage or authorization-source column; docs/budget-package-hel895.md gains §6 making the split executable: A lives ONLY on the isolated 8360 team-test instance with its own DB and models.yaml (55/500000 one-shot totals plus same-value daily category caps), the user instance NEVER carries one-shot totals (its budget_total rows are record-only, no gate), A is sealed by stop+consistent-snapshot archiving with budget_total never zeroed and restart/archive proving the seal holds, old test data has no import path into the user instance (release checklist forbids copying the 8360 data dir), B starts only after baiqizhi approval writes llm_cap/embed_cap per the 500+180 formula with the authority frozen prefix, the real-Mem0 smoke is counted INSIDE B's 60/180, B cap-hit queues batches (no retry burn, no lost rows, FTS fallback, chat uninterrupted) and first-week end requires a fresh approval to continue, and §6.4 gives one responsible limited recommendation (A 55/500k isolated, B 60 LLM/180 embeds, C daily table) plus errata for the two unsafe original claims ('A shares C's daily account' and 'WAL single file copies whole'); tools/verify_budget_split_hel896.py 8/8 on temp stores and stand-ins only (S0 exact-shape repro of the manager's finding, S1 team instance consumes the §1 step plan to 55 then hard-stops with the tightest gate winning - life daily 8/8 rejects before the total, S2 seal survives restart and backup-API archive, S3 user instance B/C unblocked after A with dialogue 60/semantic 40/daily-token stacking and rejections booking nothing, S4 the misconfigured-total guard on the user instance, S5 repo configs and authoritative facts untouched, real caps all stay 0); (2) browser false positive fixed without touching any product file: web/tests/hel895_real.mjs B3 used '!!stage || any visible button' and clicked the FIRST button containing 回 which is the 日子与回忆 home nav button, so stage=false still PASSed and the screenshot stayed on days - the verbatim original rerun reproduces the false 7/7 with B3 stage=false (docs/rework/hel896/browser-before/), and the revised test passes 9 checks by precise interaction: B2 asserts the letter card carries her exact words plus the talk-nav unread aria-label, B3a waits for the VISIBLE reach card (aside.reach.show, aria-hidden=false, non-zero box, exact words) over days, B3b clicks only THAT card's 回她 button and strictly asserts the conversation stage .conversation .sr contains the reach-out text with the unread mark cleared, B4/B5 prove dedup by server message id (data-mid in the record panel: zero duplicates, gap and live reach-outs each exactly once), B5 asserts /api/health epoch bumps exactly +1 (1->2) before rechecking, B6 counts the page's OWN permissions.query/getUserMedia calls from first document load (0/0, instrumented via Page.addScriptToEvaluateOnNewDocument after Page.enable), B7 runs the service under a temp loopback models config (CYBERGRIL_MODELS, all caps 0) plus a sitecustomize socket guard that REJECTS and eagerly reports non-loopback connects (0 attempts, 0 non-loopback DNS lookups, report survives signal death) - under precise interaction the stage really plays, unread really clears, dedup and epoch semantics really hold: it was a test defect, not a product defect, so no interface change and nothing to escalate; (3) SDK honesty: tools/audit_sdk_offline_hel896.py (read-only, zero downloads/installs/inference) computes the 3.11-Linux closure from the installed 3.10 pinned metadata - 55 dists, 41 missing from the product venv (28 pure + 13 native incl. grpcio/numpy/onnxruntime/tokenizers/sqlalchemy/protobuf), all three top-level pins are py3-none-any (no 'cp311 wheel' needed for them), mem0ai's installed direct_url is the local fixed source hel857-src and hel857-data/mem0-2c81af3.tar.gz hashes exactly to the lock's 9dcef930...dda23 (an index mem0ai==2.2.1 wheel proves nothing), the wheel built during hel857 lived only in an ephemeral cache and hatchling is not offline-available, exactly 3 of the 41 are cache-reusable today for 3.11 (greenlet 3.5.6 cp311, pillow 12.3.0 cp311, truststore 0.10.5 py3-none-any - version+tag verified), the fastembed model cache is measured (Qdrant/bge-small-zh-v1.5 + bm25, ~92MB, placement = instance data dir copy), and the seq48-51 pip event is settled by cache forensics: uv's pip-26.2.2 wheel entry (files.pythonhosted.org, sha256 fd7f4dfa...) was CREATED 2026-10-27 02:10:04 inside the HEL-895 run window as the ONLY new cache entry, so that step DID fetch from the network - the prior card's zero-download claim is corrected to 'download' by the conservative reading (byte-level download vs conditional request is indistinguishable from cache evidence) while the lock install itself added no new cache entries; deploy/hel895-release-candidate.md §4 is rewritten to this accurate list, all future installs forced offline/no-index; (4) release archiving: tools/release_snapshot_hel896.py implements the two safe modes (stop+wal_checkpoint(TRUNCATE)+copy, or online SQLite backup API), writes per-file sha256 manifests carrying the exact code commit, per-table row-count verification and a verify-mode rollback drill; its selftest reproduces the manager's WAL finding (online naive copy of the main .db: 'no such table: companion') and proves both fixed modes complete (backup API and checkpoint copies both hold companion=1/chat_message=1, archive hashes+rows verify, commit 04eff61 recorded); §5 of the release doc now carries the copy-paste commands covering the product DB, semantic vector root, history root and the authoritative embed ledger, archives are never deleted, and the section explicitly does NOT claim R6 complete backup; regression on this head: pytest 299/299 (3.11.16 venv + requirements.lock offline), ruff clean (src/tests/tools), web typecheck 0 errors / lint 0 errors 1 pre-existing warning / vitest 55/55 / build passes with CSS still index-DdDYzR5S.css, pinned-SDK reruns all green (close-ownership 16/16, shutdown-queued 12/12, inflight 6/6, semantic-recovery 7/7, mem0-real 12/12, reports in docs/rework/hel896/regression/), check_release_offline R1-R7 passes, real-HTTP pagination 7/7 rerun saved as docs/rework/hel896/http-pagination-rerun.json with the original hel895 evidence byte-untouched, requirement checks 6/6 (origin/main, de8874a3803b, 152479b, each with and without handoff-HEL-896.json); handoff-HEL-896.json written; zero real LLM, zero real embeddings, zero new downloads beyond existing caches, authoritative ledgers and freezes (39/60, 498/500, 2 frozen, HEL-835 gate) untouched, not deployed, PR#11 appended-not-merged, no visual changes, R5/R6/R7 honestly deferred
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-27 03:06:23 +08:00
zonggong and multica-agent
04eff611e7
HEL-895 release candidate: the approved kernel 152479b + the HEL-881-passed proactive-inbox frontend bf234570 assembled into one auditable head, with the full post-synthesis battery, the release package and the one-approval budget execution package - integration is a clean merge (the mainline 31970c4..152479b never touched web/, so the merge brings exactly the visual director's six frontend files plus handoff-HEL-875/880.json; web/ is verbatim bf234570 and src/tests/tools/config are verbatim 152479b, all HEL-874..894 backend fixes preserved, no redesign, no visual decision, the unpushed b48d28b test merge superseded); verification rerun on the merged head: 299 python tests pass on the 3.11.16 venv + requirements.lock offline, ruff clean (src/tests/tools), web typecheck 0 errors / lint 0 errors 1 pre-existing warning / vitest 55/55 / build passes with CSS still index-DdDYzR5S.css (visual untouched), pinned-SDK regressions on hel857-venv (3.10.12, deterministic 512-dim stand-in, loopback-only, temp ledgers): verify_close_ownership_hel894.py 16/16, verify_shutdown_queued_hel889.py 12/12, verify_inflight_lifecycle_hel886.py 6/6, verify_semantic_recovery_hel885.py 7/7, verify_mem0_real_hel874.py 12/12, check_release_offline_hel882.py R1-R7 15/15 (R6 honestly records the 3.11 mem0 gap); NEW real-HTTP pagination contract 7/7 (tools/verify_http_pagination_hel895.py: the real product service seeded with 327 rows proves the reverse-page + limit+1 probe + next_before + epoch contract the approved frontend depends on, the public field allowlist with proactive exactly on reach-out rows, and a mechanical port of inbox.ts fetchAfter proving the HEL-880 gap semantics against the real backend - 5-page cap leaves the gap, the next call closes it and hands the two new reach-outs exactly once); NEW real-server browser 7/7 (web/tests/hel895_real.mjs: Chromium CDP against the real API + built dist - real boot, reach card arriving over real HTTP, stage playback, the 260-row long-absence gap regression, SIGTERM restart epoch+1 with no duplicate rows, zero permission requests; evidence docs/rework/hel895/); deliverables: deploy/hel895-release-candidate.md (exact head, manifest, install reference, health matrix, disable/rollback, the exact 3.11 fixed-SDK gap verified offline - product venv imports fine, no mem0/qdrant/fastembed wheels in any local cache, hel857-venv 3.10 fixed stack untouched and un-mixed, zero downloads, resolution path unchanged per hel874-release.md §4) and docs/budget-package-hel895.md (the A/B/C tables as one approvable package: per-send four-gate stacking semantics, the cross/duplicate/missed accounting verdict - A totals stack on daily category caps by design, B extraction LLMs are dual-counted in llm_ops cumulative AND the semantic daily gate by design, embeds count only as items, all four request categories plus the global token pool cover every outbound site, failures/cancels conservatively billed with no refunds, cap-hit stop semantics and evidence - all still cap=0 defaults, the 39/60 and 498/500 freezes and the HEL-835 gate untouched); requirement checks 6/6 (origin/main, origin/agent/agent/de8874a3803b and the actual mainline 152479b, each with and without handoff-HEL-895.json); zero real LLM, zero real embeddings, zero downloads, authoritative ledgers and freezes unwritten, not deployed, PR#11 appended-not-merged, no visual changes, R5/R6/R7 honestly deferred
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-27 02:23:08 +08:00
zonggong and multica-agent
68f3eefeca
HEL-895: mechanically integrate the approved proactive-inbox frontend ( bf23457, HEL-881 passed) onto the unified mainline 152479b
...
The mainline 31970c4..152479b never touched web/ (verified: git diff 31970c4 152479b -- web/ is empty), so this merge brings in exactly the two HEL-875/880 commits and nothing else: the visual director's six frontend files verbatim (web/src/adapters/inbox.ts, real.ts, app/RealApp.tsx, chat/ChatPanel.tsx + tests) with CSS untouched, plus handoff-HEL-875.json and handoff-HEL-880.json for governance provenance. No backend file changes, no redesign, no visual decisions made here; all HEL-874..894 backend fixes stay byte-identical.
Containment verified before merging: bf23457 is NOT an ancestor of 152479b (1ae243f + bf23457 were the only mainline-missing work); the old b48d28b test merge was never pushed and is superseded by this fresh integration at the current head.
Co-authored-by: multica-agent <github@multica.ai >
2026-10-27 01:55:45 +08:00
zonggong and multica-agent
152479b350
HEL-894 rework: a cancelled close owns nothing it did not start — aclose cancellation is now a two-phase ownership protocol - the manager's independent pinned-SDK review of ceb0f35 reproduced two combo holes in the HEL-889 close path: (1) cancelling aclose AFTER backend.aclose began made the shielded finish keep running unowned in the background while the outer except already released the lock and cleared closing — the layer was reported reusable (closing=false/closed=false/client usable), a new tick claimed a batch onto real HTTP, then the orphaned finish closed Qdrant under it (SDK-only branch: batch failed on 'QdrantLocal instance is closed' with row_done=0/llm_used=1; with the caller closing the store afterwards the late worker died on ProgrammingError 'Cannot operate on a closed database' and the reopened batch sat pending), and (2) cancelling a SECOND aclose that was still WAITING for the close lock ran the same except and cleared the FIRST closer's flag (first close still pending but signal=false, a new batch ran to done while the original worker was still on the wire). SemanticMemory.aclose now states the revocation boundary explicitly: the DRAIN phase (nothing closed yet) stays revocable — a cancelled caller leaves everything open, resets the closing signal and the layer remains usable (HEL-889 semantics preserved); the FINISH phase (backend.aclose begun) is irreversible — a cancelled caller keeps the closing markers (a half-closed layer is never reported usable, ticks keep refusing), keeps the lock, and waits — repeated cancels only re-shield — for the layer-owned close task it started (self._close_task, created exactly once with asyncio.create_task and stored on the layer, never dropped to the background) to land before propagating CancelledError, so resources close exactly once; _finish_close also joins this layer's OWN executor via asyncio.to_thread so a cancelled caller can never block the event loop on a synchronous shutdown wait (caller-injected executors stay caller-owned), and signal reset is ownership-gated by owns_close: only the call that actually acquired the lock and set the signal may clear it, and only while no close task exists — a lock waiter cancelled on acquisition touches nothing; module docstring, aclose docstring and the app lifespan comment state the same contract; verification: 299 python tests pass on 3.11.16 venv + requirements.lock offline (5 new tests/test_rework_hel894.py cases, all barrier-driven real product paths: finish-phase cancel keeps ownership and refuses new work with zero sends and zero budget / repeated cancels during finish land the close exactly once / a same-phase second aclose waits then returns idempotently while a third cancelled lock-waiter touches nothing / waiter-cancel + owner draining + refused new tick + original worker completing combo / drain-phase cancel still re-arms for reuse), ruff clean (src/tests/tools), no frontend changes (frontend checks not re-run, stated honestly); pinned mem0 2.2.1 on the deterministic boundary (512-dim stand-in before TextEmbedding construction, loopback-only): new tools/verify_close_ownership_hel894.py 16/16 reruns the manager's two negatives in the same shape with assertions restated for the new protocol (F1 SDK-only: after the cancel closing=true/closed=false/client usable and the cancelled caller does not return before its close lands; the new tick is refused with zero gateway arrivals, batch queued/owner NULL/attempts 0 and llm_used=0; after the gate the close lands exactly once with live_workers=0 and the reopened batch is intact queued/row_done=0/llm_used=0 — before the fix the same run gave closing=false, a claimed batch, QdrantLocal instance is closed, failed/pending with row_done=0/llm_used=1; F2 + store-close branch: same shape and no late error — before: ProgrammingError; W waiter cancel: closing stays set, the new batch stays queued, the original worker completes done/row_done=1 after release and the owner's close then lands once); the manager's review_hel889_cancel.py re-run VERBATIM on the pristine ceb0f35 first reproduced both defects exactly (docs/rework/hel894/before-ceb0f35.json matches the manager's independent JSON), and on the fixed tree stops honestly at its own premise assert server.arrived — 'a finish-phase-cancelled layer still starts new real HTTP' is structurally gone because tick refuses while closing is held (verbatim-after-fix.log; original negative and baseline kept); regressions all green: verify_shutdown_queued_hel889.py 12/12 (queued cancel, timeout drain, between-rows resume, drain-cancel re-arm, concurrent close all preserved), verify_inflight_lifecycle_hel886.py 6/6, verify_semantic_recovery_hel885.py 7/7, verify_mem0_real_hel874.py 12/12, check_release_offline_hel882.py R1-R7 15/15, both manager review_hel882_{partial,extra}.py scripts re-run verbatim pass (extra's uv rc=2 is its own expected negative), HEL-889 same-shape rerun review_hel886_edges_rerun_hel889.py passes; crash semantics unchanged and still honest (unknown wire outcomes billed, proof-gated retries, strict-once not claimed); runbook §4 gains the HEL-894 cancellation-ownership paragraph, docs/requirements/handoff-HEL-894.json written, dual-target requirement checks 4/4 (origin/main and origin/agent/agent/de8874a3803b, with and without handoff); zero real LLM, zero real embeddings, zero non-loopback outbound, authoritative ledgers and freezes untouched, not deployed, PR not merged, no visual changes
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-27 01:43:54 +08:00
zonggong and multica-agent
ceb0f35418
HEL-889 evidence: add the same-shape rerun JSON referenced by docs/rework/hel889/README.md
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-27 01:24:31 +08:00
zonggong and multica-agent
440d95cad8
HEL-889 rework: shutdown never closes under a live worker, and a queued-cancelled worker is released by the authoritative future state — SemanticMemory now runs batch workers on its OWN dedicated ThreadPoolExecutor and keeps each work item's concurrent.futures.Future: cancelling the awaiting tick propagates to that future, and its post-cancel state is the deterministic queued/started oracle (the manager's review_hel886_edges.py reproduced the old false-liveness on the shared default executor: register _live, await to_thread, executor busy -> cancel tick cancels the QUEUED item, _run and its finally never run, _live=1 forever with the batch pending and recovery permanently skipping a worker that does not exist, restart the only way out; now a CANCELLED future proves nothing ever ran: _release_never_started removes the registry entry idempotently and returns the batch to queued with its attempt restored and zero sends, while a running/finished future keeps HEL-886 semantics — the worker thread owns the batch fate, single send, no reclaim, no resend), and aclose becomes a real ownership protocol instead of a bounded promise it could break: a closing flag makes tick refuse new claims and makes both backends' _add_group_sync check should_stop BEFORE each row's wire work (a _ShutdownAbort at a boundary keeps finished rows' sem_row_done proofs and requeues only the unsent remainder — never a mid-row cut, and a single-row batch still completes done); never-started workers are cancelled out of the executor queue under the same authoritative CANCELLED proof; started workers finish their current row and flush, and aclose WAITS for every live worker to actually exit before backend/executor close — drain_timeout only bounds the polite phase (after expiry: honest warning, keep waiting; a live worker is never treated as dead), bounded in practice because Mem0Backend now sets the gateway OpenAI client's timeout (gateway_timeout config, default 60s) instead of the 600s default that made the drain effectively open-ended; a cancelled aclose closes NOTHING (shielded finish, closing signal reset, layer stays usable), concurrent aclose calls serialize on an asyncio.Lock and are idempotent, and the app lifespan comment now states the ownership contract — the manager's fixed-SDK reproduction of the OLD timeout branch (loopback gateway accepts the first HTTP then withholds the answer, aclose(drain_timeout=0.05) returns with the worker alive, app closes the store, late worker dies on 'QdrantLocal instance is closed'/'Cannot operate on a closed database', reopen shows pending/row_done=0/llm_used=1) is closed: aclose does not return while the worker is alive, the worker's writes land BEFORE the app-order store.close(), and the reopened store shows done + row_done=1 + full entry_ids with llm_used=1 and zero late errors; crash semantics unchanged and still honest (unknown wire outcomes billed, proof-gated retries, strict-once not claimed); verification: 294 python tests pass on 3.11.16 venv + requirements.lock offline (7 new tests/test_rework_hel889.py cases, all barrier-driven real product paths: queued-cancel release + in-process recovery via injected single-worker executor / shutdown-timeout never closes under the live worker and flushes before app-order store close / between-rows abort requeues and the next process sends ONLY the missing row / shutdown-before-start zero sends then resumes / cancelled aclose leaves everything open / concurrent aclose serializes / closed layer refuses new claims), ruff clean (src/tests/tools), no frontend changes (frontend checks not re-run, stated honestly); pinned mem0 2.2.1 on the deterministic boundary (512-dim stand-in before TextEmbedding construction, loopback-only): new tools/verify_shutdown_queued_hel889.py 12/12 (Q1 queued-cancel phantom released and recovered in-process with the manager's 41s lease probe, S1 fixed-SDK shutdown-timeout branch, S2 between-rows abort + missing-row-only resume proven by gateway POST counts, S3 cancelled aclose, S4 concurrent aclose), the manager's review_hel886_edges.py re-run VERBATIM on the pristine f1b50ad first reproduced both defects exactly (docs/rework/hel889/edges-verbatim-before-fix-f1b50ad.json matches the manager's independent JSON), the same-shape rerun review_hel886_edges_rerun_hel889.py now passes both scenarios with every original result key (queued: done/attempts=1/registered 0/entries 1/row_done 1; timeout: aclose_returned_while_worker_alive=false, late_worker_error null, persisted done+entry_ids+row_done=1, llm_used=1) while the verbatim original stops at its own premise assert executor._work_queue.qsize()==1 — batch workers no longer ride the loop default executor, the encoded defect is structurally gone (original negative and baseline kept); regressions all green: verify_inflight_lifecycle_hel886.py 6/6 (single-send preserved), verify_semantic_recovery_hel885.py 7/7, verify_mem0_real_hel874.py 12/12, check_release_offline_hel882.py R1-R7 15/15, both manager review_hel882_{partial,extra}.py scripts re-run verbatim pass, review_hel885_inflight.py still fails at its 2-add barrier exactly as documented in HEL-886; runbook §4 gains the HEL-889 ownership/queued-cancel semantics, config/semantic.example.yaml documents gateway_timeout, docs/requirements/handoff-HEL-889.json written, dual-target requirement checks 4/4 (origin/main and origin/agent/agent/de8874a3803b, with and without handoff); zero real LLM, zero real embeddings, zero non-loopback outbound, authoritative ledgers and freezes untouched, not deployed, PR not merged, no visual changes
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-27 01:24:11 +08:00
zonggong and multica-agent
f1b50ad91a
HEL-886 rework: a live worker is never treated as dead, and a fully-completed batch finalizes without new budget - SemanticMemory gains an in-process live-worker registry (batch_id -> _LiveWorker, registered BEFORE the thread starts, so the batch is provably active from the moment the claim commits) and the batch's whole execution (row building, anchor verify, resume set, real adds, terminal sem_batch write) moves INTO the worker thread function, because asyncio.to_thread cannot interrupt a running call: cancelling the tick cancels only the waiter, and the old finally that marked the still-running batch failed and cleared its owner was the exact double-send the manager reproduced live with the pinned SDK (first HTTP accepted but unanswered -> cancel tick -> failed written while the add was on the wire -> second tick re-claimed and sent the same sentence again: 2 HTTP, 2 vectors, 1 row_done entry, the late worker's result dropped); recover() now fails only expired pending batches WITHOUT a live worker, so a lease past 40s with the thread still inside its add is never reclaimed and concurrent ticks cannot re-send an active row (same 1-HTTP/1-vector/1-record outcome on the manager's clock-injection lease variant), while a genuinely dead owner (crash/restart, no registered worker) keeps the honest conservative recovery: unknown wire outcome, ledger holds stay billed (HEL-885), the retry sends only rows without a completion proof, and strict-once is NOT claimed for arbitrary crashes without remote idempotency (module docstring + runbook say so in words); new SemanticMemory.aclose() drains live workers (bounded wait, honest warning on timeout) BEFORE backend/store close so shutdown never orphans durable writes, and the app lifespan now drains through it; Mem0Backend/StubBackend extract the sync core _add_group_sync (async add_group contract unchanged) where the completion set (vector-store anchors + sem_row_done + skip) is proven BEFORE any budget gate: a batch whose every row is already complete returns done with ZERO new HTTP/embed/LLM after restart (the manager's third example: llm_cap=1 fully spent, row really completed, 'row persisted, final status did not' crash window -> was queued/semantic_llm_budget_exhausted, now done with entry_ids intact, cap unchanged, nothing refunded), while any missing row keeps the hard fail-closed gate - finalization never buys headroom; verification: 287 python tests pass on 3.11.16 venv + requirements.lock offline (6 new tests/test_rework_hel886.py cases: in-flight cancel never double-sends / expired lease with live worker never reclaims + concurrent ticks single-send / dead-owner lease still recovers / shutdown drains the live worker before close proven by post-aclose durable writes / all-rows-done restart finalizes with zero new HTTP / partially-done keeps refusing), ruff clean (src/tests/tools), web tsc + 42 vitest + build via npm ci --offline, pinned mem0 2.2.1 on the deterministic boundary (512-dim stand-in installed before TextEmbedding construction, loopback-only): the manager's review_hel885_inflight.py re-run VERBATIM now fails exactly at its worker_done 2-add barrier (the assertion that a second send must happen; before the fix the same script passed with 2 HTTP/2 vectors - baseline JSON kept), the same-shape rerun with the barrier at ONE completed add passes both scenarios with 1 HTTP/1 vector/1 sem_row_done, batch pending while in flight, done with full entry_ids, and the all-done restart finalizes done with zero new HTTP and llm_used still 1; new tools/verify_inflight_lifecycle_hel886.py 6/6 (L1 cancel single-send full record, L2 lease-expired-live no reclaim, L3 shutdown drain before close, L4a all-done finalize without budget, L4b partial keeps the hard gate, L5 dead-owner recovery still works); regressions all green: verify_semantic_recovery_hel885.py 7/7, verify_mem0_real_hel874.py 12/12, check_release_offline_hel882.py R1-R7 15/15, both manager review_hel882_{partial,extra}.py scripts re-run verbatim pass; dual-target requirement checks 4/4 with handoff-HEL-886.json; zero real LLM, zero real embeddings, zero non-loopback outbound, authoritative ledgers and freezes untouched, not deployed, PR not merged, no visual changes
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-27 00:30:47 +08:00
zonggong and multica-agent
78b6267d3a
HEL-885 rework: per-row progress matches what was really sent, cross-day and unknown-outcome accounting stay conservative, positive caps require the ledger authority, and the release dependency-fill command actually exists - every Memory.add now carries an anchor for exactly its own row (the HEL-882 whole-batch anchor let the first stored vector mark unsent rows complete; the manager's real-SDK partial reproduction showed the user's original words never leaving the process), a row finishing with a legitimately EMPTY extraction gets a durable sem_row_done record (r4.sql additive table) written inside the worker thread the moment its add completes, resume skips = vector-store anchors ∪ sem_row_done so no row is lost, none falsely complete, and finished work is never re-sent across budget-refusal/crash/restart/lease/concurrency, entry_ids merge across partial attempts, and the swallowed-failure detection is per-row; PersistentBudget.settle/release book on hold.day (the old write to state.day manufactured -80 used on the new day and re-opened headroom the reservation day had already spent; token_usage/request_usage refund the paying day, budget_total stays global) and the empty-budget_total TypeError crash in total_requests_used/total_tokens_used is fixed - the old one-shot-total test passed only because that crash surfaced as chat.error, it now books the total honestly; _atomic_reserve no longer purges aged reserve: rows (a crashed worker's hold is an UNKNOWN outcome - an hour-old timeout is not proof the call never happened; unknown consumption stays billed across restarts, only a provably-unsent release() ever removes a hold, embed_ops and llm_ops share the fix); Mem0Backend refuses construction before importing mem0 when any cap>0 lacks a (non-empty dict) authority block - ledger_authority_required - or when the prefix check fails, closing the fresh-empty-ledger bypass the manager reproduced live, config/semantic.example.yaml ships the authority block as REQUIRED with the explicit cumulative formula (embed_cap=500+approved-increment e.g. 680, embed_reserve=2 frozen untouched, min_used=498; never write 180 as the cumulative cap of a 498-used account) mirrored into docs/budget-plan-hel874.md §2 with the HEL-885 accounting rules; deploy/hel874-release.md §4 replaces the nonexistent uv pip download (rc=2, re-verified) with python3 -m pip download --only-binary :all: --platform manylinux2014_x86_64 --python-version 3.11 --implementation cp --abi cp311 + sha256 manifest + uv pip install --no-index --find-links offline merge + same-process co-import verdict, honest missing-materials list unchanged (no 3.11 wheels cached, zero downloads this card, no version swaps), and tools/check_release_offline_hel882.py gains R7 probing both command surfaces offline; verification: 281 python tests pass on 3.11.16 venv + requirements.lock offline (9 new tests/test_rework_hel885.py cases: partial batch claims only the sent row / empty-extraction row completes and is never resent / process restart sends only the missing row / concurrent ticks never double-send / cross-day settle and release book on the reservation day / aged unknown llm+embed reservations never refunded / missing-empty-malformed-wrong authority all fail closed; test_resume_never_loses_or_duplicates_rows rewritten to drive the REAL product path instead of hand-planting single-row anchors the product never wrote), ruff clean (src/tests/tools), web tsc + 42 vitest + build via npm ci --offline, pinned mem0 2.2.1 install on the deterministic boundary: contract re-run 12/12 (harness now hands a synthetic authority prefix - production defaults not relaxed), new tools/verify_semantic_recovery_hel885.py 7/7 (S0 authority fail-closed, S1 per-row partial with exactly 1 HTTP, S2 restart sends only the missing row proven by HTTP count since mem0 prompts legitimately carry old rows in rolling history, S3 lease recovery + concurrent ticks single-send, S4a/S4b unknown reservations kept), both manager review scripts re-run VERBATIM against this head (partial: completed=[2] only, resume done with 2 entries, HTTP=2, user words actually sent; extra: new-day used=0, over-cap request refused, aged reservation second_allowed=false, uv probe still rc=2), release offline check R1-R7 green, dual-target requirement checks 4/4 with handoff-HEL-885.json; zero real LLM, zero real embeddings, zero non-loopback outbound, authoritative ledgers and freezes untouched, not deployed, PR not merged, no visual changes
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-27 00:01:44 +08:00
zonggong and multica-agent
59fb06304f
HEL-882 evidence: manager review scripts re-run verbatim against e291058 (api repro blocked - 0 provider calls, used unchanged, honest chat.error; sdk repro 1 - exactly 1 loopback HTTP, llm_ops=1, max_retries=0; sdk repro 2 - mid-add swallow now requeues without burning attempts and resumes done with real entry ids after the cap is raised; sdk repro 3 - stub coverage no longer blocks the real rebuild, enqueue 1→tick→done→search hit→no resend proven live by the add-on), deterministic-boundary pinned-install contract re-run 12/12 with final ledger rows persisted before temp cleanup, and the release offline check green across checkout/import/health/fail-closed caps/approved-caps run/data preservation plus the honest mem0 3.11 co-import gap; zero real LLM, zero real embeddings, zero non-loopback outbound, authoritative ledgers untouched
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 23:30:36 +08:00
zonggong and multica-agent
e291058754
HEL-882 rework: execution-table caps become real hard gates at the wire, SDK hidden retries and mid-add failures recover without loss, the 8360 release package runs offline, and the HEL-874 embedding evidence is corrected - every real provider exit (create/dialogue/life/gist/judgment/growth/proactive phrasing + mem0's internal extraction LLM) now persistently pre-allocates request count (per-category daily + one-shot totals in request_usage/budget_total, BEGIN IMMEDIATE) and a conservative token estimate before sending, refuses at the tightest cap (BudgetStop, no more downgrade-and-keep-calling) and survives restarts; known usage settles to actual, unknown/disconnect/failure keeps the full reservation; ledger guards gain per-day tops (embed_daily/llm_daily) and verify_ledger_authority rejects a fresh file bypassing the frozen 498/500 prefix; the mem0 SDK client's hidden OpenAI retries are disabled (max_retries=0) so every actual send is gated and answered failures (even 5xx) settle as used with only httpx.ConnectError-grade unsent requests released; embed refusals the SDK swallows into empty adds are re-raised as budget errors so the batch re-queues without burning an attempt and resumes when the cap returns, add_group resumes at vector-store level (src_group anchors: only missing rows resent, crash/restart/concurrency never duplicate), sem coverage is per-backend (stub batches no longer block a real rebuild, real done batches never resend) with backend-scoped batch keys; the release package is offline-executable: fresh-dir git clone, cybergril service account, PYTHONPATH in the unit so the lock-only venv imports the product, shipped caps explicitly 0 (=refuse by design until approved), deploy/mem0-stack.lock + accurate 3.11 wheel gap with a no-download path (hel857-venv is 3.10; never present stub/FTS as the real memory experience), and tools/check_release_offline_hel882.py verifies checkout/import/health/fail-closed/approved-run/data-preservation on loopback with echo stand-ins; evidence corrected per manager review: docs/rework/hel874/erratum-hel882.json + README appendix record that e978e87's verification did real local embeddings from cache (provable lower bound 12, exact total unrecoverable, temp sandbox gone) while zero-real-LLM/zero-download/zero-outbound stand, old JSONs and authoritative ledgers untouched, and tools/verify_mem0_real_hel874.py now installs the deterministic 512-dim stand-in before TextEmbedding construction plus non-loopback socket rejection (zero model loads) with final_embed_rows persisted before temp cleanup; verification: 272 python tests pass on 3.11.16 venv + requirements.lock offline (16 new: manager api repro blocked with 0 provider calls, sdk repro 1-HTTP/max_retries=0/llm_ops=1, mid-add swallow requeued-then-resumed, resume-no-duplicate, stub-to-mem0 rebuild, daily embed cap, unified mem0-LLM gate, authority refusal, restart-persistent counters, tightest-constraint settle/release), ruff clean (src/tests/tools), web tsc + 42 vitest + build via npm ci --offline, pinned-install deterministic re-run 12/12, manager review scripts re-run evidence attached in delivery, dual-target requirement checks 4/4 with handoff-HEL-882.json; zero real calls, zero real embeddings, zero non-loopback outbound, authoritative ledgers and freezes untouched, not deployed, PR not merged, no visual changes
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 23:20:18 +08:00
leefer and multica-agent
bf234570c0
HEL-880: preserve inbox pagination gaps until reach-outs are delivered
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 22:28:54 +08:00
zonggong and multica-agent
e978e878df
HEL-874 rework: bounded verbatim readback reaches the real provider input, real pinned Mem0 2.2.1 SDK contract verified live and the adapter's five wiring defects fixed, budget gates made provable (atomic reserve/settle embed ledger + independent llm_ops cap), definite-cap real-check execution table, 8360 isolated release package prepared (not deployed), 2026-10-26 user originals recorded source-only - semantic.context now quotes chain-verified archive rows (original words + role + when, <=200-char window with visible trim marker, summary demoted to a one-line pointer, same min(600,budget) cap) and episodic.context flips from gist-first-120-chars to verbatim-first (<=240) + role + date, both proven by tests/test_readback_hel874.py capturing the actual messages handed to the provider through the real API path: a detail absent from the gist yet quoted verbatim from a turn pushed outside the recent-20 window, the same for a semantic chain hit, and an unshared companion row never leaking through FTS, semantic or any anchor (AM-001); tools/verify_mem0_real_hel874.py runs the FIXED install itself (mem0ai 2.2.1 2c81af3, real embedded qdrant, real fastembed from the existing cache, deterministic 127.0.0.1 fake gateway, temp ledgers only): before=31970c4 dies at construction (second QdrantClient on the same path rejected by the SDK - recorded), and source-level findings confirmed live and fixed - unscoped search raises ValueError in 2.2.1 (add now carries user_id scope, search passes filters+top_k since limit is silently ignored), payload reads ride the SDK's own vector_store.client, the old outer search debit double-counted (wrapper is now the single accounting point), the SDK's internal extraction LLM was ungated (LlmLedgerGuard with its own llm_ops table, cap default 0) and check-then-debit could overshoot under concurrency (EmbedLedgerGuard now reserves atomically in BEGIN IMMEDIATE, releases on failure/cancel, purges stale holds); after fixes all 12 checks pass (construction/anchor payload/user scope/1 LLM + 2-3 embeds per add measured/extraction input set provably only prior gated batches incl. old memories and rolling history/unshared canary zero outbound/search single debit/concurrency never over cap/close-reopen intact/both zero caps refuse with ZERO outbound LLM requests), evidence in docs/rework/hel874/; mood sensitivity returns to the original repo's continuous rule 1.35-0.70*strength (bazi.sensitivity_from_strength, foundation commit 1012d8b) replacing HEL-870's invented 1.25/0.8 step and is labeled an engineering heuristic, never user-approved bazi science (external agent formulas remain not adopted); docs/budget-plan-hel874.md gives definite caps for the one-time team check (55 requests/0 embeds), first-week semantic activation (<=60 extract LLM / <=180 embeds) and user daily use with code-level hard-gate facts and authorization sources (old 20-30/100-200 were estimates, not approved quota; frozen 39/60 and 498/500 untouched and never挪用); deploy/hel874-release.md + cybergril-hel874-8360.service.example prepare the isolated fresh-empty-data-dir release with health capability matrix and data-preserving rollback (NOT executed, PR#11 not merged, no user-facing loop, no experience address); sources/comment-evidence-full-experience-20261026.json adds the two 2026-10-26 user originals (01a17806, 01a1780e full-experience-then-iterate) with authorship verified and manifest appended only - baseline/current/coverage/changes untouched; verification: 256 python tests pass on 3.11.16 venv + requirements.lock offline (3 new real-provider-input readback cases incl. AM-001 negative, mem0 fake rebuilt to mirror the real 2.2.1 surfaces, 9 cases), ruff clean, web tsc + 42 vitest + build pass, local 8360 stub smoke (loopback, isolated temp DB) health R4-assembly all green then stopped, real-SDK script re-run 12/12 after final edits, dual-target requirement checks 4/4 pass with handoff-HEL-874.json; zero real model calls, zero real embeddings, zero outbound (fake gateway on loopback + existing local model cache only), authoritative ledgers and freezes untouched, no existing services or profiles touched
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 22:13:45 +08:00
leefer and multica-agent
1ae243f286
HEL-875: 接上真实主动留言,保全视觉总监原始补丁
...
Apply the exact eight-file HEL-875 patch from the visual director on 31970c4 . Independently reran 49 frontend tests, typecheck/lint/build and original Python requirement checks. Candidate only; intake found pagination overflow dropping older reach-outs after >250 new records, requiring author repair before approval or deployment.
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 22:08:58 +08:00
zonggong and multica-agent
31970c4dd3
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
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 21:03:42 +08:00
zonggong and multica-agent
5671946267
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
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 04:09:58 +08:00
zonggong and multica-agent
81d50f28af
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
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 03:49:33 +08:00
zonggong and multica-agent
e06dcaf889
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
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 03:35:21 +08:00
zonggong and multica-agent
454e54cb59
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
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 03:34:30 +08:00
zonggong and multica-agent
5e90136f90
HEL-866 handoff: deliverable/acceptance/deferred/verification JSON; audit866_prefix reproduced at 5ebe407 worktree (manager six receive/fulfill person-object wrong-answer groups - resolved side fixed to canonical positive, only unresolved side replaced - all pass=true; per-class subject x post-verb-slot matrix person cells incl. recipient-subject 'I haven't received me yet' reading all reproduced) + audit866_postfix at code commit cf3423d (all six plus person-object matrix cells and structural variants judged fail through the same real s6_result; canonical positives incl. 我还没有收到, haven't received it yet three readings, 还没兑现 omission, topic form and tell-with-receiver+object all kept; 140 role combos and audit861-865 held S6/S2/S3 sets unchanged) + audit861_reuse866 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 (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
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 03:15:06 +08:00
zonggong and multica-agent
cf3423d44c
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
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 03:14:24 +08:00
zonggong and multica-agent
5ebe407d3f
HEL-865 handoff: deliverable/acceptance/deferred/verification JSON; audit865_prefix reproduced at 070f4fd worktree (manager eight role-crossed wrong-answer groups - each replacing only one side with the other side the canonical positive - all pass=true) + audit865_postfix at code commit c0cb540 (all eight judged fail through the same real s6_result; structural variants incl. other pronouns/other promise verb/EN her-us-we-I/mixed multi-promise clauses all fail, both-period negatives honestly kept; omission-inheritance positives incl. wo-hai-mei-you-shou-dao all kept) + audit861_reuse865 full rerun (share gates/real exits/S8/S9/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 (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
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 02:56:16 +08:00
zonggong and multica-agent
c0cb540c9f
HEL-865: bind same-promise roles (promisor/receiver/action/object/status) to the one scene declaration - per manager independent review of 070f4fd: parse_supported_answer now captures and validates role slots per clause instead of discarding subject/receiver after regex consumption; pre-declared scene target from p1 user quote (promisor=user '你/you', told-receiver=companion '我/me', object=interview result) with declared anaphora for omitted slots (promise clause omitted subject->promisor, omitted receiver->scene receiver; state clauses by verb class: tell-verb subject=promisor, receive-verb recipient=scene receiver with open-side receive subject compatible with both receiver-not-told and promisor-not-received readings, fulfill-verb subject=promisor); explicit different recipient (现在已经告诉你了/told them), promise to someone else (告诉她/her), reversed promisor (我答应/我承诺/I promised...), multi-clause role conflicts and unknown roles (we/我们/他) all fail conservatively; canonical positives incl. 我还没有收到 and omission-inheritance forms kept passing; no eight-sentence or pronoun blacklist, no new model, no generic NLU engine, supported surface unchanged (EN closed-receive subject slot still excludes promisor pronouns)
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 02:54:40 +08:00
zonggong and multica-agent
070f4fd89b
HEL-864 handoff: deliverable/acceptance/deferred/verification JSON; audit864_prefix reproduced at 7aa9280 worktree (manager seven wrong-answer groups plus seven unresolved-side mirrors all pass=true) + audit864_postfix at code commit c65de00 (all fourteen judged fail through the same real s6_result - full-grammar whole-answer parse: declarative mood gate + every clause fully consumed as promise/closed/open structure; positives, HEL-862 four groups, HEL-863 three groups, audit861 held sets, S2/S3 no regression; EN equally verified 3 positives pass 6 negatives fail, old-code EN positive failure honestly recorded) + audit861_reuse864 full rerun (share gates/real exits/S8/S9/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 (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
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 02:30:54 +08:00
zonggong and multica-agent
c65de003a1
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
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 02:29:18 +08:00
zonggong and multica-agent
7aa928025b
HEL-863 handoff: deliverable/acceptance/deferred/verification JSON; audit863_prefix reproduced at 6859696 worktree (manager three new wrong-answer groups all pass=true) + audit863_postfix at code commit fcda71e (all three judged fail through same real s6_result - negated tell action and same-clause object mis-binding fail at promise binding layer, state bound to medical result fails at closed-state binding layer; positives, HEL-862 four groups, audit861 held sets, S2/S3 no regression; per-case flip self-check proves exit code depends on every positive and negative) + audit861_reuse863 full rerun (share gates/real exits/S8/S9/unresolved-block self-consistency/anchor negatives no regression); zero-embed zero-network, ledger 458/500 read-only unchanged (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
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 02:08:47 +08:00
zonggong and multica-agent
fcda71e6a2
HEL-863: bind tell-action polarity, state and object to the same promise claim - per manager independent review of 6859696: (1) clause_affirms_promise now enforces the full supported grammar in one pass - promise verb with non-negated prefix -> tell action whose connecting span is negation-free (答应不告诉我面试结果 is a promise NOT to tell, rejected) -> optional closed-class receiver pronoun -> correct object immediately following (告诉我体检结果而面试结果是另一件事 mis-binds the promise object, rejected); (2) clause_foreign_object structural class: a clause mentioning any other ...结果 object (体检结果) cannot support promise OR state affirmation for the interview promise - 体检结果现在已经告诉我了 no longer proves the interview promise closed; bare anaphor 结果已收到 and 面试结果已经告诉我了 still bind correctly; conservative fail for unparsable extra objects/predicates/negations, no per-sentence blacklists, no new model
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 02:03:12 +08:00
zonggong and multica-agent
6859696075
HEL-862 handoff: deliverable/acceptance/deferred/verification JSON; audit862_prefix reproduced at a5ef23f worktree (manager four wrong-answer groups all pass=true) + audit862_postfix at code commit 60cd7fd (all four judged fail through same real s6_result, positives kept, per-case flip self-check proves exit code depends on every positive and negative) + audit861_reuse862 full rerun (share gates/real exits/S8/S9/held criteria no regression); zero-embed zero-network, ledger 458/500 read-only unchanged, prior evidence hashes untouched; remote delivery fix noted in README (pending push)
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 01:40:57 +08:00
zonggong and multica-agent
60cd7fd70d
HEL-862: bind promise object/action/polarity/status to one clause-scoped claim - per manager independent review of a5ef23f: (1) affirms_promise_claim rewritten as clause-structural grammar (single clause must chain promise verb with no negation morpheme in prefix -> tell action -> correct object interview-result; object word appearing in another clause no longer counts, negated promise (未曾答应) rejected structurally, telling-only statement without promise verb no longer passes on 告诉 keyword, mixed action word list and enumerated claim-negation blacklist dropped); (2) resolved/unresolved state affirmation via affirms_promise_state/clause_affirms_state (declared closed/open phrase sets scored clause-locally with negation-morpheme prefix polarity - 并非已经告诉我 no longer counts as affirmed closed); manager review four wrong-answer groups (negated promise / negated closed / object bound to other action / no promise asserted) all judged fail through the same real s6_result, correct interview resolved/unresolved positives and declared-equivalent open synonym kept passing; no new model, no generic semantic engine, supported-expression restriction fails conservatively
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 01:38:04 +08:00
zonggong and multica-agent
a5ef23f5b5
HEL-861 handoff: deliverable/acceptance/deferred/verification JSON; audit861_prefix reproduced at 22472e4 worktree + audit861_postfix regenerated at final code commit efaa3c2 (zero-embed, zero-network, ledger 458/500 read-only unchanged, prior evidence hashes untouched); dual-target requirement checks pass vs origin/main and origin/agent/agent/de8874a3803b with handoff (4/4)
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 01:21:39 +08:00
zonggong and multica-agent
efaa3c27be
HEL-861 cleanup: drop superseded mixed PROMISE_TERMS word lists (split into object/action/negation/uncertainty sets by affirms_promise_claim)
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 01:21:30 +08:00
zonggong and multica-agent
ffd8cdf7cf
HEL-861: thread explicit share-state source through all real exits and affirmatively validate promise object/action/state - per manager independent review of 22472e4: (1) run() builds explicit synthetic share-state store (t1 told=0 negative, t2/t3 told=1 verifiable positives, t4 unrecorded=unknown) and passes the same CompanionShareGate through S2/S3/S4/S6/S7 plus recovery exits S8/S9 (8 gate calls all supplied); CompanionShareGate fail-closed (no db/missing file/no record/told=0 all denied, None no longer defaults True, missing-db no longer raises); companion-anchored hit without gate rejected share_gate_missing; (2) s6_result affirmative validation via affirms_promise_claim pure function (correct object interview-result AND action term AND claim not negated AND no uncertainty) - wrong object/unknown/negated answers no longer pass on keywords; evidence audit861_prefix (both gaps reproduced at 22472e4 worktree) + audit861_postfix (zero-embed, zero-network, all rejected/positives kept, ledger 458/500 unchanged, prior evidence hashes untouched)
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 01:20:29 +08:00
zonggong and multica-agent
22472e4b92
HEL-860 handoff: deliverable/acceptance/deferred/verification JSON; audit860_postfix regenerated at final commit 6595153 (zero-embed); dual-target requirement checks pass vs origin/main and origin/agent/agent/de8874a3803b with handoff (4/4)
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 00:50:04 +08:00
zonggong and multica-agent
6595153473
HEL-860: close all real Q&A exits behind the source gate and judge promise status affirmatively - per manager independent review of 9f3e6a3: (1) ungated assemble_block removed, S2/S3/S4/S6/S7 mem0-side final assembly all through s7_gated_assembly per-hit chain (S6 status annotation rides the same gate via annotator; unresolved contrast excludes result-claim entries for self-consistency), fake full-run captures 8 QA exits/5 gated with poison never sent; (2) anchor cross-validation rejects anchor_turn_mismatch and role_text_conflict (verbatim companion raw mis-anchored as user row, t2/t1 list disagreement) while same-turn user positive kept; (3) S6 criteria affirm closed on resolved side and open on unresolved side with request-ok, unknown/identical/says-open/claims-received all fail; (4) S2 total criterion uses actually-sent contexts plus request success, hitword-without-context fails; audit859 fixed (status_annotation_in_block key, exit code reflects negatives+positives, AUDIT859_REUSE_STORE mode); evidence audit860_prefix/postfix (zero-embed) + rework860_offline 26/26 + audit859_reuse860; unified ledger 390->458/500 (suite 66 + audit859 reuse 2), card new embeds 68<=70 keep 42>=40, zero real model calls, run1/run2 and 26/60 untouched
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 00:49:21 +08:00
zonggong and multica-agent
9f3e6a33c7
HEL-859 evidence: pre/post negative audit (prefix reproduces all manager-audit bypasses on 892d0d2, postfix @192d959 all rejected via real exits with same-turn user positive kept), full offline suite rework859_offline.json 22/22 exit 0, README revision record with old/new table, handoff HEL-859; dual-target requirement checks pass vs origin/main and origin/agent/agent/de8874a3803b; new evidence independently named, run1/run2 and 26/60 real ledger untouched
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 00:19:27 +08:00
zonggong and multica-agent
192d959d97
HEL-859: fail-closed source chain + layered acceptance criteria per manager audit - s7 resolver/assembly cross-validate hit text vs payload vs history derivation, turn membership in group, row-level turn_roles share gate (same-turn unshared companion hit rejected through real resolver+assembly, same-turn user positive kept; wrong-turn/forged-text/no-history/missing-anchor all rejected); S2/S3/S6 criteria layered retrieval/detail-in-context/model-use with wrong answers judged fail (S2 gated reread enters model context, gist-only explicit subtest; S6 resolved status annotated into block + unresolved counterfactual); unified embed ledger continues manager audit debit 165+65=230/500 keyword 86; itemized 13-call retest plan (5 adds + 8 QA); zero real model calls, run1/run2 evidence untouched
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-26 00:17:53 +08:00
zonggong and multica-agent
892d0d2e30
HEL-858: rework per manager independent review - fixture (turn,role) integrity gate, spoken-text share bridge with partial/missing negatives + full restored P1-P5/F1-F8, known-id S4/S6 orchestration with readback and post-update re-retrieval, S7 anchor chain (input fingerprint) with wrong/unknown-source rejection, card-level persistent embed ledger (history rebuilt <=100), _flat/exit-code fixes; zero real model calls, run1/run2 evidence and 26/60 ledger untouched
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-25 23:53:10 +08:00
zonggong and multica-agent
e31ae2d946
HEL-857: approved Mem0 isolation spike - zero-model gates all pass, A/B synthetic scenarios within 26/60 real-call budget
...
- 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 >
2026-10-25 23:19:26 +08:00
zonggong and multica-agent
bb9cbe915e
HEL-847 v4: Mem0 capability corrections per manager review - additive-only infer, backend filter/BM25 facts, pre-isolation privacy design, concrete spike spec
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-25 22:23:53 +08:00
zonggong and multica-agent
800d3b75b6
HEL-847 v3: GOV-006 reweighing - Mem0 embedded SDK as primary candidate, 8-mechanism adaptation matrix
...
- 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 >
2026-10-25 22:06:31 +08:00
zonggong and multica-agent
575f2acfc5
HEL-847: apply v1.11 governance patch (GOV-006 mature-reuse principle, 60 items)
...
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 >
2026-10-25 21:56:31 +08:00
zonggong and multica-agent
af28ffdcb5
HEL-835: evidence corrections per third review - 23 calls, day2 conclusion downgraded, old probe downgraded, null-fingerprint withdrawn, probe start deviation disclosed; 15/15 paired-window correction proof; real follow-up plan
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-25 09:17:34 +08:00
zonggong and multica-agent
c5167ca7c5
HEL-835: day2 handoff, dual-target requirement checks with handoff
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-25 09:06:59 +08:00
zonggong and multica-agent
65df25271e
HEL-835: guard v3 - done-delta streams settle ok on early close; 36/36
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-25 09:03:09 +08:00
zonggong and multica-agent
b98ab6ab50
HEL-835: deploy record updated for guard v2, restored service, prepared probe
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-24 14:53:01 +08:00
zonggong and multica-agent
96cdf07d73
HEL-835: probe seed backfills message_id provenance
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-24 14:52:15 +08:00
zonggong and multica-agent
468f0bbb6c
HEL-835: probe seed upsert memory_search flag
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-24 14:50:39 +08:00
zonggong and multica-agent
87afc34cd3
HEL-835: fix probe seed insert columns
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-24 14:50:26 +08:00
zonggong and multica-agent
e27274448d
HEL-835: fix probe seed companion identity_json shape
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-24 14:49:47 +08:00
zonggong and multica-agent
0b24fefc5d
HEL-835: synthetic retrieval probe seed script and runbook (approved plan, zero model calls)
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-24 14:49:06 +08:00
zonggong and multica-agent
d57ab77732
HEL-835: fix guard entrypoint main() invocation
...
Co-authored-by: multica-agent <github@multica.ai >
2026-10-24 14:47:34 +08:00