From 21a3faf8e6315c0cf27a1baef3b5232a1a24a42a Mon Sep 17 00:00:00 2001 From: Aryan Date: Mon, 26 Oct 2026 14:37:50 +0530 Subject: [PATCH 1/8] Carry publisher provenance and preserve applicability when official guidance differs --- ROADMAP.md | 2 +- commandcode.js | 2 + db.js | 19 +-- docs/ARCHITECTURE.md | 4 +- docs/GITHUB_NOTICE_LIFECYCLE.md | 2 +- docs/IMPLEMENTATION_PLAN.md | 10 +- docs/MEMORY_PILOT_PREPARATION.md | 4 +- docs/README.md | 1 + docs/RUNBOOK.md | 4 +- docs/SOURCE_CONFLICTS.md | 38 ++++++ docs/SUPPORT_MASTER_PLAN.md | 15 +-- docs/SUPPORT_PROGRESS.json | 2 +- helpcenter.js | 3 +- prompt.js | 3 + retrieval.js | 14 ++- scripts/verify-support-db.js | 28 ++++- sourceProvenance.js | 107 ++++++++++++++++ test/sourceProvenance.test.js | 202 +++++++++++++++++++++++++++++++ 18 files changed, 429 insertions(+), 31 deletions(-) create mode 100644 docs/SOURCE_CONFLICTS.md create mode 100644 sourceProvenance.js create mode 100644 test/sourceProvenance.test.js diff --git a/ROADMAP.md b/ROADMAP.md index db28dbc..3bd09f5 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,6 +1,6 @@ # Mira roadmap -**October26 current state:** #86 merged647b549 after1202/no-model8, exact-head hosted Node20/24/real PostgreSQL, independent review and merged-main CI. [Lifecycle details](docs/GITHUB_NOTICE_LIFECYCLE.md). The old PR backlog is cleared; new work is Mira repository presentation and local #83 source provenance/conflict handling. #62 stays open for reproduced narration/context loss despite merged diagnostics. Production stays c6f482d; no paid run, public Omi test issue or memory enablement. Main implementation64/100; delivery56/100;44 left. Technical identifiers remain unchanged under the Mira product name. +**October26 current state:** #86 is operator-deployed as647b549/dba28f7d, explicitly confirmed by Aryan; fresh health/startup pass, one running instance, optional features and automatic deploy off. Notice smoke remains pending. #89's Mira repository guide is mergeda9c9508 with all checks/review; no runtime change after production. Current draft #83 adds publisher provenance, conservative explicit-scope date ordering and shared conflict policy, with twelve synthetic regressions; accuracy/review/CI gates remain. #62 stays open for narration/context loss. Main implementation64/100; delivery56/100;44 left. No paid run, agent deployment or memory enablement. ## Current audited dashboard — October 26, 2026 diff --git a/commandcode.js b/commandcode.js index 26a4728..285ff3a 100644 --- a/commandcode.js +++ b/commandcode.js @@ -8,6 +8,7 @@ const { SUPPORT_VOICE } = require('./supportVoice'); const { normalizeSubQuestions } = require('./retrieval'); const { isPreviousPost, splitHistory, previousContextBlock } = require('./supportContextFormat'); const { recordStage } = require('./answerStageEvidence'); +const { SOURCE_DATE_POLICY } = require('./sourceProvenance'); const PLANNED_HANDOFF_GUIDANCE = 'A person from the Omi team will reply in this thread if staff delivery succeeds. The application adds that line after delivery; do not repeat or claim it already happened. Don\'t tell the customer to contact support, email, use a contact form or post in another channel. Give relevant official steps and ask only for missing details.'; @@ -663,6 +664,7 @@ async function reviewAnswer({ question, threadHistory = [], draft, removedBySafe content: `${SUPPORT_VOICE}\n\nClarification: the ban on steps from static fallback applies only to troubleshooting a tech or firmware symptom. For a how-to FAQ, the Omi team static product facts are usable below the Help Center and docs when not contradicted; do not invent a source URL. For refund, billing, subscription, account, and data requests, answer any supported policy or procedure from official pages while keeping escalation for the human action. General policy pages cannot verify a specific order status, location, tracking, or delivery date; remove or reject any such claim unless a verified order lookup tool fact supports it. If understanding.dataLossRisk is true, retain a brief warning in the customer language not to reinstall, log out, or clear local recordings while staff checks; do not add an English warning to a non-English reply. Use the customer language and script throughout, including a localized source label; romanized Hindi stays romanized. Do not append an English Source line to an existing localized citation.${handoffPlanned ? ` ${PLANNED_HANDOFF_GUIDANCE}` : ''}`, }, { role: 'system', content: PUBLIC_REPLY_PRIVACY_POLICY }, + { role: 'system', content: SOURCE_DATE_POLICY }, ...(citationLimit === 4 ? [{ role: 'system', content: 'This request contains more than three distinct sub-questions. Its one Source line may contain at most four exact URLs from the retrieved evidence, instead of the ordinary two, when needed to support the requested parts. Keep each supported part brief and in the order asked.', diff --git a/db.js b/db.js index 7339a48..2b9742c 100644 --- a/db.js +++ b/db.js @@ -1,6 +1,7 @@ const fs = require('fs'); const { Pool } = require('pg'); const { chunkDocument, cleanDocument, queryTerms, sourceAuthority } = require('./retrieval'); +const { normalizeProvenance } = require('./sourceProvenance'); function sslFor(connectionString) { const value = String(connectionString || ''); @@ -51,6 +52,7 @@ async function initSchema() { body TEXT NOT NULL DEFAULT '', fetched_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); + ALTER TABLE doc_pages ADD COLUMN IF NOT EXISTS provenance JSONB NOT NULL DEFAULT '{}'::jsonb; CREATE TABLE IF NOT EXISTS doc_chunks ( url TEXT NOT NULL REFERENCES doc_pages(url) ON DELETE CASCADE, @@ -110,7 +112,7 @@ async function initSchema() { const chunks = await client.query(`SELECT count(*)::int AS n FROM doc_chunks`); const pages = await client.query(`SELECT count(*)::int AS n FROM doc_pages`); if ((chunks.rows[0]?.n || 0) === 0 && (pages.rows[0]?.n || 0) > 0) { - const existing = await client.query(`SELECT url, title, body FROM doc_pages`); + const existing = await client.query(`SELECT url, title, body, provenance FROM doc_pages`); for (const page of existing.rows) { await replaceDocChunks(client, page); } @@ -232,21 +234,22 @@ async function replaceDocChunks(client, page) { return chunks.length; } -async function saveDocPage({ url, title, body }) { +async function saveDocPage({ url, title, body, provenance }) { if (!url) return; const page = { url: String(url), title: String(title || ''), body: cleanDocument(body), + provenance: normalizeProvenance(provenance), }; const client = await pool.connect(); try { await client.query('BEGIN'); await client.query( - `INSERT INTO doc_pages (url, title, body, fetched_at) - VALUES ($1, $2, $3, NOW()) - ON CONFLICT (url) DO UPDATE SET title = $2, body = $3, fetched_at = NOW()`, - [page.url, page.title, page.body] + `INSERT INTO doc_pages (url, title, body, fetched_at, provenance) + VALUES ($1, $2, $3, NOW(), $4::jsonb) + ON CONFLICT (url) DO UPDATE SET title = $2, body = $3, fetched_at = NOW(), provenance = $4::jsonb`, + [page.url, page.title, page.body, JSON.stringify(page.provenance)] ); await replaceDocChunks(client, page); await client.query('COMMIT'); @@ -265,9 +268,9 @@ async function searchDocPages(question, limit = 8, sources = []) { const wantedSources = Array.isArray(sources) ? sources.map(String).filter(Boolean) : []; const { rows } = await pool.query( `WITH query AS (SELECT websearch_to_tsquery('english', $1) AS value) - SELECT title, url, section, source, authority, body, chunk_index, + SELECT c.title, c.url, c.section, c.source, c.authority, c.body, c.chunk_index, p.provenance, ts_rank_cd(search_vector, query.value, 32) AS rank - FROM doc_chunks, query + FROM doc_chunks c JOIN doc_pages p ON p.url=c.url CROSS JOIN query WHERE search_vector @@ query.value AND (cardinality($3::text[]) = 0 OR source = ANY($3::text[])) ORDER BY (ts_rank_cd(search_vector, query.value, 32) * (1 + authority * 0.06)) DESC, diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 74878f3..59c25c7 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1,6 +1,8 @@ # Mira architecture -**October26 current state:** #86 merged647b549 after1202/no-model8, exact-head hosted Node20/24/real PostgreSQL, final independent review and merged-main CI. Its30-day subject-time replay guard, customer erasure and non-starvable cleanup are on main, awaiting release. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). Production stays c6f482d; no paid run, public Omi test issue or memory enablement. The product name is Mira; technical identifiers are stable. Separate #83 source-provenance work is local and not an accuracy claim. +**October26 current state:** Aryan confirmed his647b549/dba28f7d deployment; health/schema/Discord startup pass with one running instance and optional features/automatic deploy off. #86's notice smoke is still pending. Maina9c9508 adds only the reviewed Mira repository guide. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). No agent deployment, paid run or memory enablement. + +**#83 draft boundary:** one sourceProvenance module carries reliable publisher dates and explicitly declared software applicability through Help Center ingestion, parent-page JSONB, in-memory chunks, stored search and evidence formatting. Stored fusion/local ranking reorder only equivalent explicit scope/topic/source slots; they delete no source or complementary fact. One shared answer/review policy handles unresolved applicability/conflicts without a new model request. Existing budgets/authority/privacy/handoff paths remain. [Design, limitations and acceptance](SOURCE_CONFLICTS.md). This code is not on main and generated-answer accuracy remains unverified. ## Current integrated boundary — October 26, 2026 diff --git a/docs/GITHUB_NOTICE_LIFECYCLE.md b/docs/GITHUB_NOTICE_LIFECYCLE.md index 23eee49..32a18e9 100644 --- a/docs/GITHUB_NOTICE_LIFECYCLE.md +++ b/docs/GITHUB_NOTICE_LIFECYCLE.md @@ -1,6 +1,6 @@ # GitHub notice replay and receipt lifecycle — #86 -Merged October26 as647b549; not deployed. Aryan approved30-day receipt retention, payload-subject-age rejection and customer erasure. Local1202/no-model8, hosted Node20/24/real PostgreSQL and final independent85-test/signed HTTP/SQL/two-migration-probe review pass at62776f8; merged-main CI is green. Release/smoke remain required. This is notice deduplication, not the full #51 delivery outbox or universal exactly-once delivery. +Merged October26 as647b549 and operator-deployed asdba28f7d at12:59 IST, explicitly confirmed by Aryan. Fresh health/schema/Discord startup checks pass, one running instance, optional features and automatic deploy off; the notice smoke remains pending. Local1202/no-model8, hosted Node20/24/real PostgreSQL and final independent85-test/signed HTTP/SQL/two-migration-probe review pass at62776f8. This is notice deduplication, not the full #51 delivery outbox or universal exactly-once delivery. ## Send authority and subject time diff --git a/docs/IMPLEMENTATION_PLAN.md b/docs/IMPLEMENTATION_PLAN.md index 824d484..cc4f710 100644 --- a/docs/IMPLEMENTATION_PLAN.md +++ b/docs/IMPLEMENTATION_PLAN.md @@ -1,6 +1,14 @@ # Mira implementation checklist -**October26 current state:** #86 merged647b549 after1202/no-model8, exact-head hosted Node20/24/real PostgreSQL, independent review and merged-main CI. Release/smoke remain pending. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). Production stays c6f482d. Mira repository presentation and #83 source provenance are separate new work; no paid run, public Omi test issue or memory enablement. +**October26 current state:** Aryan deployed647b549 asdba28f7d; fresh health/schema/Discord startup pass, one running instance, optional features/automatic deploy off. #86 notice smoke remains pending. Maina9c9508 adds only the reviewed Mira repository guide. #83 source provenance/conflict handling is a separate draft; no paid run, public Omi test issue, agent deployment or memory enablement. + +## #83 source provenance and conflict handling — draft + +- [x] Observe missing publisher provenance across ingestion/chunks/evidence before implementation; preserve fetch time as a separate operational field. +- [x] Carry bounded publisher dates and explicit product/surface/version scope through production persistence/search/formatting; unknown/invalid/ambiguous metadata remains unknown and an undated refresh clears stale provenance. +- [x] Add source/topic/explicit-scope/date ordering without deleting rows or increasing budgets, plus one shared applicability/conflict policy in answer and both reviewer attempts. Preserve identifier punctuation and complementary safety details. +- [x] Twelve original synthetic regressions pass, including policy transport and six simultaneous fetches with10-second deadlines for two-/three-part questions. No provider call or protected case. +- [ ] Complete final full/no-model/current-head hosted PostgreSQL CI and independent review; then obtain authorization before any necessary generated-answer checks. A policy reaching a model is not proof of compliance. Keep #83 open and draft until its actual accuracy gates pass. ## Current audited execution — October 26, 2026 diff --git a/docs/MEMORY_PILOT_PREPARATION.md b/docs/MEMORY_PILOT_PREPARATION.md index 35acda0..ff1d1d4 100644 --- a/docs/MEMORY_PILOT_PREPARATION.md +++ b/docs/MEMORY_PILOT_PREPARATION.md @@ -1,6 +1,6 @@ # References-only memory pilot — preparation, not enablement -Updated October26,2026 against the merged references-only implementation. The exact notice wording below is approved; publication, configuration change, pilot, deployment and paid runs are not. #86 implementation/review and applicable privacy/security/processor/backup gates remain. +Updated October26,2026 against the merged references-only implementation. The exact notice wording below is approved; publication, configuration change, pilot and paid runs are not. Aryan deployed #86 as647b549/dba28f7d after its code/CI/review gates; the notice smoke and applicable privacy/security/processor/backup gates remain. Memory stays off. ## Approved customer notice — wording only, not published @@ -30,7 +30,7 @@ Within a process with disabled policy, new/queued captures recheck the switch, c ## Before enablement -- [ ] Resolve the duplicate-status release hold through reviewed disposition; #86 is not main/live. +- [ ] Accept the scoped duplicate-status notice smoke; #86 is deployed, health/startup verified, but notice delivery is not yet accepted. - [x] Exact revised notice wording approved by the October26 user-supplied reviewer decision, including AI-provider use. - [ ] Publish the approved notice in the test forum before capture, only under the later approved rollout. - [ ] Review processor/data use, applicable security/platform review, deletion and backups. Existing30-day support-memory approval stands. #86 has a separate30-day receipt lifecycle decision, not blanket approval for other operational metadata. diff --git a/docs/README.md b/docs/README.md index a14a1f6..74d80a6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,6 +10,7 @@ Start with the [master plan](SUPPORT_MASTER_PLAN.md). It is the current product | [Architecture](ARCHITECTURE.md) | Customer → evidence → answer/review → delivery → staff/engineering workflow | | [Implementation checklist](IMPLEMENTATION_PLAN.md) · [Roadmap](../ROADMAP.md) | Implemented boundaries, checks and next work | | [Mira’s voice](MIRA_PERSONALITY.md) · [Answer-quality contract](ANSWER_QUALITY_CONTRACT.md) | Considerate, useful and truthful support behavior | +| [Source conflicts](SOURCE_CONFLICTS.md) | Draft publisher provenance, applicability-aware ordering and unresolved-conflict policy | ## Operations, privacy and verification diff --git a/docs/RUNBOOK.md b/docs/RUNBOOK.md index 69600ba..0cf48c4 100644 --- a/docs/RUNBOOK.md +++ b/docs/RUNBOOK.md @@ -1,13 +1,13 @@ # Mira operations runbook -**October26 current state:** #86 merged647b549 with all required checks/review and green merged-main CI; its replay/retention change is not deployed. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). Production stays c6f482d; no paid run, public Omi test issue or memory enablement. Mira is the product name; repository/deployment identifiers remain unchanged. +**October26 current state:** Aryan confirmed deploying647b549 asdba28f7d at12:59 IST; fresh health/schema/Discord startup pass, one running instance, optional features and automatic deploy off. #86's notice smoke is still pending. Maina9c9508 adds only reviewed Mira repository documentation; #83 is a separate unmerged source-conflict draft. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). No agent deployment, paid run, public Omi test issue or memory enablement. Mira is the product name; technical identifiers remain stable. Do not delete receipt/cutoff rows to force webhook replay. The candidate ignores stale payload subject times, holds uncertain outcomes and retains a minimal customer/time cutoff after owner erasure; cleanup is mandatory even with optional features off. Fixed notice-retention errors mean pending cleanup, not erased records. An unexpected populated pre-lifecycle schema fails closed for review. Use an existing linked synthetic issue/thread for the next approved-release smoke; no new public issue. ## Current operation checkpoint — October 26, 2026 -Fresh read confirms c6f482d/3d4cb5d8 remains healthy/latest/one running instance, optional controls and automatic deploy off. #88/#87/#86 are merged; #86's30-day receipt/replay/erasure code passed all merge gates, but release/smoke remain pending. Revised memory notice wording is approved, not posted or enabled. No new public Omi issue may be created for the next smoke; use an existing linked synthetic case or reviewed alternative after the release/observer is ready. +Fresh read confirms647b549/dba28f7d is healthy/latest with one running instance, optional controls and automatic deploy off; Aryan explicitly confirms triggering it. #86's30-day receipt/replay/erasure code is deployed, but its notice smoke remains pending. Revised memory notice wording is approved, not posted or enabled. No new public Omi issue may be created for the smoke; use an existing linked synthetic case or reviewed alternative after the observer is ready. Use [the current master plan](SUPPORT_MASTER_PLAN.md), not historical deployment instructions below. Last verified production is exact `c6f482d` / `3d4cb5d8`, optional memory/context/fix-inbox and automatic deploy off. Bounded how-to/damage/order/private-preview checks passed. Operator-triggered synthetic publication #23602 was separately closed not planned with the approved test-only note; it is not a customer incident or resolution. diff --git a/docs/SOURCE_CONFLICTS.md b/docs/SOURCE_CONFLICTS.md new file mode 100644 index 0000000..5044068 --- /dev/null +++ b/docs/SOURCE_CONFLICTS.md @@ -0,0 +1,38 @@ +# Source provenance and conflicting guidance — #83 + +October26 draft implementation, not merged or deployed. This extends the existing ingestion → PostgreSQL/chunks → ranking → answer → review pipeline. It does not add a model call, a second knowledge store or a URL-specific exception. Main/production and all other acceptance requirements remain in the [master plan](SUPPORT_MASTER_PLAN.md). + +## Failure and contract + +An older official page can be cited correctly while giving an outdated rule. A recent fetch does not make its contents recent, and a newer page does not automatically apply to a different product, platform or version. Source authority still controls. Missing information is not a contradiction; older complementary facts and protective warnings must remain available. + +The shared answer/review policy requires the actual topic and product/surface/version applicability to be supported before treating a newer rule as superseding a conflicting one. Otherwise retain material uncertainty and use the existing person workflow. Document dates are not deployment, release or customer-account evidence. Injected-provider tests prove policy delivery and unchanged request count, not that a live model follows the policy. + +## Publisher metadata + +Help Center ingestion reads bounded Article JSON-LD bound to the fetched page's URL. It retains explicit datePublished/dateModified and, only when declared in about:SoftwareApplication, name/operatingSystem/softwareVersion. It does not infer product scope from an article title, language, viewport or a mention in body text. Missing/ambiguous/invalid/future dates stay unknown. Multiple contradictory article metadata records fail closed; sitemap/fetch times are never promoted to publication/update dates. + +The source page stores one sanitized provenance JSON object. Chunks receive it in memory; persisted search joins it from their parent page so reindexing cannot create competing provenance copies. Refreshing a page without reliable metadata clears the old provenance. Existing pages upgrade additively to an empty object, without invented dates or changes to their bodies. Valid provenance survives the real save/search/evidence path. Non-Help-Center sources may carry explicitly declared metadata through the same schema; this draft does not manufacture dates for sources whose adapters provide none. + +Formatted evidence includes bounded publisher dates/date origin and any explicit applicability. Incomplete applicability is marked as such. These fields count inside the existing evidence-character budget; no extra page fetches or tokens are requested by a separate process. Generated-answer cost/coverage effects still need approved evaluation. + +## Conservative deterministic ordering + +Both stored fusion and local ranking can reorder their already-ranked slots when documents have: + +- the same official source kind/authority; +- the same normalized heading (or title if no heading); +- identical explicitly declared product, surface and version identifiers; +- comparable reliable dates (updated versus updated, or published versus published). + +Newer documents occupy the earlier slots only within that group. Other topics, authorities and scopes keep their positions. Identifier punctuation is significant: version2.1 cannot become version2-1. Equal, unknown, unreliable or incomparable dates do not create preference. Rows are not deleted or declared obsolete. The fixed selectionReason enum explains the ordering; it is not proof of semantic contradiction or customer-version applicability. + +This narrow ordering is deliberately separate from resolving a claim. The existing answer/reviewer must still establish the actual applicability and contradiction from the evidence; a heading match alone is insufficient. Incomplete or differently worded topics remain available with their dates/uncertainty rather than being silently filtered. No broad claim that every official-source conflict is automatically solved follows. + +## Checks and readiness + +Twelve new synthetic tests cover ingestion/ambiguity, chunks, real formatted stored evidence, known-scope preference, authority/topic/surface/version exclusions, punctuation, absent/equal/unreliable/incomparable metadata, complementary safety facts, shared answer/normal+compact review policy delivery, and two-/three-part fetch guards. Observed red-before records distinguish four missing-provenance behaviors, two ordering behaviors, absent policy delivery and a subsequently caught identifier-normalization error. No protected inputs, customer messages or production writes are used. + +The two-/three-part checks assert all six page requests start before any completes, the per-request timeout remains10 seconds, and existing eight-chunk/9000-character output bounds hold. The real persistence/search/formatter owners are exercised against the isolated SQL engine, including an undated refresh and idempotent schema initialization. Hosted real PostgreSQL and final independent review remain required. The evaluation harness receives provenance through the same Help Center/chunk owners; its separate in-memory/storage limitations remain in the [evaluation guide](EVALUATION.md). + +Before readiness: complete current-head CI, independent scope/accuracy review and the required approved generated-answer checks. No paid comparison is authorized merely by this draft. Keep #83 open until its full acceptance is evidenced; #65 multipart accuracy and #62 narration/context loss remain separate unfinished work. No deployment, memory enablement or extra Discord smoke follows from these tests. diff --git a/docs/SUPPORT_MASTER_PLAN.md b/docs/SUPPORT_MASTER_PLAN.md index 5562eb0..d86ae37 100644 --- a/docs/SUPPORT_MASTER_PLAN.md +++ b/docs/SUPPORT_MASTER_PLAN.md @@ -1,6 +1,6 @@ # Mira: master product plan -Updated October 26, 2026 (IST). Audited against GitHub main `647b549bade498573e6fb2a16bf4544377884b1e`. Aryan sets product priorities; this is the single current product checklist. The product is Mira; existing repository/deployment/package identifiers remain unchanged. +Updated October 26, 2026 (IST). Audited against GitHub main `a9c9508ac9be03a2bfd0f571e90f6779b6d96a48`. Aryan sets product priorities; this is the single current product checklist. The product is Mira; existing repository/deployment/package identifiers remain unchanged. ## Current score — 56 / 100 done, 44 / 100 left @@ -15,7 +15,7 @@ This is **evidence-backed delivery completion, not answer accuracy, reliability | Combined delivery | **56/100** | **44/100** | 16 main + 16 tested + 16 reviewed + 8 verified operations | | Full A–E acceptance | **2/21** | **19/21** | Only A3 and B1 meet their complete original acceptance; partial foundations do not tick whole workstreams | -The previous 49/100 was stale, not evidence that seven new points shipped today. This audit adds three existing-main points for #70's **known-unsent queued recovery**, three for the reviewed **forum erasure/expiry/isolation and correction-link cleanup**, and one for #28's **observed private preview**. No credit for a full outbox, backup erasure, enabled memory, generalized accuracy or the unmerged replay fix. [Machine-readable evidence ledger](SUPPORT_PROGRESS.json) preserves the same 25 milestone IDs. +The previous 49/100 was stale, not evidence that seven new points shipped today. This audit adds three existing-main points for #70's **known-unsent queued recovery**, three for the reviewed **forum erasure/expiry/isolation and correction-link cleanup**, and one for #28's **observed private preview**. No extra point is added for the partial GitHub replay fence, documentation, a full outbox, backup erasure, enabled memory or generalized accuracy. [Machine-readable evidence ledger](SUPPORT_PROGRESS.json) preserves the same25 milestone IDs. There is **no defensible current-main “accuracy out of 100”** from these tests. The last accepted #59 comparison had 74/81 cases pass both structural runs (old main 70/81), plus independent reading; later deterministic privacy code and four bounded smokes do not turn that into a whole-product accuracy percentage. @@ -25,13 +25,14 @@ There is **no defensible current-main “accuracy out of 100”** from these tes | --- | --- | | **On main** | Concise support voice/routing/retrieval/clipping; #48 confidence/source-fit foundation; #59 calm practical AI-labelled voice; #41 staff case/pickup lifecycle; #60 localized closure; #76 request limits and #70 known-unsent recovery; #67/#80 in-thread/redirect cleanup; #81 localized rejected-review copy; #28 durable private engineering approvals; #84 application-owned public-intake privacy. | | **On main, disabled** | #61 references-only memory and bounded context, #73 SQL/reader safety rehearsal, #74 owner-scoped correction-link forgetting, #49 reviewed-fact/revocation foundation. Merged code is not permission to use customer history or publish facts. | -| **Last verified production** | Exact `c6f482d`, deployment `3d4cb5d8`; healthy/one running instance at the last scoped check, optional memory/context/fix-inbox and automatic deploy off. This is a dated receipt, not continuous health monitoring. | +| **Last verified production** | Exact647b549, deploymentdba28f7d, operator-triggered October26 at12:59 IST and explicitly confirmed by Aryan. Fresh read: healthy/one running instance, schema/Discord ready, zero startup failures; optional memory/context/fix-inbox and automatic deploy off. This is a dated receipt, not continuous health monitoring. | | **Passed limited release checks** | October25 phone-only how-to, damaged-item privacy, order-status privacy, and exact staff-authored sanitized private engineering preview. These are bounded scenarios, not full A–E acceptance. | | **Separate operator action** | Aryan clicked Publish after the preview stop point. Synthetic issue #23602 was created and, with his separate approval, closed not planned with a test-only note. Preserve history; no real customer incident, automatic publication or customer-resolution claim. | -| **Merged, awaiting release** | [#86](https://github.com/BasedHardware/omi-vector-bot/pull/86), merge647b549: **Receipt lifecycle approved October26:**30 days, original payload-subject-age rejection and customer erasure. Full1202/no-model8, isolated SQL, exact-head hosted Node20/24/real PostgreSQL and independent85-test/signed HTTP/SQL/two-migration-probe review pass; merged-main CI is green. [Lifecycle and limits](GITHUB_NOTICE_LIFECYCLE.md). Not deployed; no implicit memory enablement. | +| **Deployed, notice smoke pending** | [#86](https://github.com/BasedHardware/omi-vector-bot/pull/86), merge647b549: **Receipt lifecycle approved October26:**30 days, original payload-subject-age rejection and customer erasure. Full1202/no-model8, exact-head hosted Node20/24/real PostgreSQL and independent85-test/signed HTTP/SQL/two-migration-probe review passed. Aryan deployed it; health/startup pass, but the existing-linked-synthetic notice smoke is not yet accepted. [Lifecycle and limits](GITHUB_NOTICE_LIFECYCLE.md). No implicit memory enablement. | +| **Main-only documentation** | #89 mergeda9c9508 after review and green exact-head/merged-main CI: Mira naming, README/index, issue/PR guidance and current progress. No runtime change after production647b549. | | **Closed without merge** | #71, #75 and #82 failed their final accuracy/execution disposition; #29/#30/#68/#77/#78 were closed with remaining scope/evidence retained. Do not reopen or rerun them automatically. #65/#51/#56/#62 keep the unresolved needs. | -The earlier PR backlog is cleared, not the full product backlog. #88 merged884fb46; #87 merged928676b; #86 merged647b549 after all required checks/review. No separate deployment occurred. New work is #83 source-provenance/conflict handling and Mira repository presentation. Stay within the standing maximum of three open PRs, including ready PRs; every new PR starts draft. No count-driven merge or scope loss. Runtime/notice wording approvals do not grant deployment, settings, assignment, paid reruns or memory enablement. +The earlier PR backlog is cleared, not the full product backlog. #88 merged884fb46; #87 merged928676b; #86 merged647b549; #89 mergeda9c9508 after their checks/reviews. Aryan's647b549 rollout is verified separately. Current new work is #83 source-provenance/conflict handling. Stay within the standing maximum of three open PRs, including ready PRs; every new PR starts draft. No count-driven merge or scope loss. Runtime/notice wording approvals do not grant settings, assignment, paid reruns or memory enablement. ## Issues — audited decisions, not count-driven closure @@ -46,10 +47,10 @@ The earlier PR backlog is cleared, not the full product backlog. #88 merged884fb ## Execution order — continue after this audit 1. **Record and review this main-only dashboard/issue audit.** Keep fixed scoring, main versus draft versus live boundaries and all A–E requirements. -2. **#86 merged after its approved lifecycle gates passed.** Thirty-day receipt expiry, payload subject-time replay rejection, bounded/non-starvable cleanup and customer erasure are on main647b549. Full1202/no-model8, hosted Node20/24/real PostgreSQL and independent review passed. Release/smoke remain pending; it rides the next approved release using an existing linked synthetic issue/thread, never a new public Omi issue. Broader #85 retention and #51 outbox remain unfinished. +2. **#86 deployed by Aryan after its merge gates passed.** The647b549/dba28f7d startup and health checks pass. Complete the scoped notice smoke using an existing linked synthetic issue/thread, never a new public Omi issue; no repeat deployment is needed. Broader #85 retention and #51 outbox remain unfinished. 3. **#62's evidence-only implementation is merged as #88 / `884fb46`**, not deployed separately: real generation → reviewer → safety/presentation → clipping/send path, text-free keyed per-turn fingerprints, no customer text/identifiers, no filter behavior change or second presentation implementation. Nine new synthetic tests include actual handler/harness parity, concurrency and disabled-path coverage; full1174/offline8, exact-head CI and independent35-check scoped review pass at `c1fe9d6`, with independently confirmed behavioral sensitivity. **Keep #62 open:** a fresh independent synthetic check on integrated main still loses symptom/earlier-attempt context in a semicolon-joined narration sentence. Earlier language calling both narration/redirect repairs complete was too broad; #67/#80 repaired redirects, not this general narration path. Preserve prerequisites/safety when designing that repair. No historical causation or customer-resolution claim. Broader E2 execution-validity work remains #56. No paid call. 4. **Step5 preparation is drafted in [the memory pilot checklist](MEMORY_PILOT_PREPARATION.md)** from the actual implementation: test forum only, references not copied messages, 30 days, exact forgetting scope, real switch/restart timing, two-post scenario, 48-hour acceptance and rollback. The exact revised provider-disclosing notice wording is approved, but not published; no pilot has begun. Enablement still needs #86, processor/backup/privacy checks and Aryan's explicit enable instruction. -5. **#83 then #65 accuracy work**: general authority/topic/surface/version/date conflict handling, unchanged fetch/evidence budgets, synthetic tests and independent accuracy review. #83's isolated branch now carries publisher dates/known applicability through ingestion, chunks, PostgreSQL and formatted evidence; four observed pre-change failures now pass, full1206 and isolated SQL pass. This local provenance groundwork is not on main and does not yet resolve conflicting claims. No held-out tailoring or paid comparison without asking. Source selection must not equate an omitted detail with evidence of absence. +5. **#83 then #65 accuracy work**: [source provenance and conflict draft](SOURCE_CONFLICTS.md) carries publisher dates/explicit applicability through ingestion, chunks, PostgreSQL and evidence. It adds conservative same-topic/scope ordering and one shared answer/review policy; it never treats omission as contradiction or dates as release proof. Twelve new synthetic regressions pass, including unchanged fetch/timeout/evidence bounds. Full/current-head hosted CI, independent review and approved generated-answer quality gates precede readiness. Not on main, no general accuracy claim, no held-out tailoring or paid comparison without asking. 6. **Complete C then D/E through the same pipeline**: scoped memory pilot; minimized owner signals; private grouped review; real official-source/regression validator; authorization-controlled fact publication/revocation; offline nightly checks; honest weekly outcomes; end-to-end demonstration. #51/#53/#56 remain integrated reliability/operations dependencies, not a parallel rewrite. **Need Aryan now:** no repeat retention or notice-wording decision; both are supplied. Draft a one-line courtesy note for him about the closed synthetic issue, never send it on his behalf. No Discord test now and no paid rerun. Later, give one exact Discord input only after the relevant approved runtime/observer is ready. Aryan sends every message, command and button action. No memory flag until notice approval **and** an explicit enable instruction. diff --git a/docs/SUPPORT_PROGRESS.json b/docs/SUPPORT_PROGRESS.json index 83d3010..e112fca 100644 --- a/docs/SUPPORT_PROGRESS.json +++ b/docs/SUPPORT_PROGRESS.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "auditedOn": "2026-10-26", "timezone": "Asia/Kolkata", - "auditedMain": "647b549bade498573e6fb2a16bf4544377884b1e", + "auditedMain": "a9c9508ac9be03a2bfd0f571e90f6779b6d96a48", "rubric": "25 fixed milestones; one point per main implementation, tested, independently reviewed and relevant live/tool-operation verification", "notAccuracy": true, "milestones": [ diff --git a/helpcenter.js b/helpcenter.js index 0c7598c..29ccbbc 100644 --- a/helpcenter.js +++ b/helpcenter.js @@ -2,6 +2,7 @@ const SITEMAP = 'https://help.omi.me/sitemap.xml'; const HELP_FORUM = () => String(process.env.HELP_FORUM_CHANNEL_ID || '').trim(); const { cleanDocument } = require('./retrieval'); const { redactSensitive } = require('./privacy'); +const { articleProvenance } = require('./sourceProvenance'); function articleUrls(xml) { return [...String(xml || '').matchAll(/(https:\/\/help\.omi\.me\/en\/articles\/[^<]+)<\/loc>/g)].map( @@ -52,7 +53,7 @@ async function loadHelpCenter(fetchImpl, db) { const html = await res.text(); const body = htmlToText(html); if (!body) return; - await db.saveDocPage({ url, title: titleFromHtml(html, url), body }); + await db.saveDocPage({ url, title: titleFromHtml(html, url), body, provenance: articleProvenance(html,url) }); saved += 1; } catch (err) { console.error('[Help] article failed:', err.message); diff --git a/prompt.js b/prompt.js index 6ab1f78..a28d7d8 100644 --- a/prompt.js +++ b/prompt.js @@ -2,6 +2,7 @@ const { describe } = require('./router'); const { askedWhereRecordingsWent } = require('./honesty'); const { SUPPORT_VOICE } = require('./supportVoice'); const { splitHistory, previousContextBlock } = require('./supportContextFormat'); +const { SOURCE_DATE_POLICY } = require('./sourceProvenance'); const HOWTO_FAQ = [ 'Omi works with iPhone and Android. Keep the Omi app open. If you fully close it (swipe it away), it stops writing down what was said and the device disconnects.', @@ -145,6 +146,8 @@ ${SUPPORT_COMMUNICATION_POLICY} ${PUBLIC_REPLY_PRIVACY_POLICY} +${SOURCE_DATE_POLICY} + The person asking is a customer. They may paste a rant, a screenshot dump, numbered questions, or one messy paragraph. Read it like a person would. Figure out the actual problem. Think about their message before you look at the FAQ. What did they already do? What still fails? Answer that, not a generic setup guide. diff --git a/retrieval.js b/retrieval.js index e483ffa..0155651 100644 --- a/retrieval.js +++ b/retrieval.js @@ -1,6 +1,7 @@ const MAX_DOCUMENT = 60_000; const CHUNK_SIZE = 1_400; const CHUNK_OVERLAP = 220; +const { normalizeProvenance, provenanceLine, preferNewerApplicable } = require('./sourceProvenance'); const STOP_WORDS = new Set([ 'about', @@ -139,7 +140,7 @@ function splitLongPart(part, size = CHUNK_SIZE) { return out; } -function chunkDocument({ url, title, body }, { size = CHUNK_SIZE, overlap = CHUNK_OVERLAP } = {}) { +function chunkDocument({ url, title, body, provenance }, { size = CHUNK_SIZE, overlap = CHUNK_OVERLAP } = {}) { const clean = cleanDocument(body); if (!clean) return []; const parts = clean @@ -160,6 +161,7 @@ function chunkDocument({ url, title, body }, { size = CHUNK_SIZE, overlap = CHUN body: text, source: sourceKind(url), chunkIndex: chunks.length, + ...(provenance ? { provenance:normalizeProvenance(provenance) } : {}), }); const tail = text.slice(Math.max(0, text.length - overlap)); const boundary = tail.indexOf(' '); @@ -391,7 +393,7 @@ function mergeRanked(resultSets, limit = 8, { customerQuestion = '' } = {}) { .sort((a, b) => (phoneQuestion ? b.relevanceScore - a.relevanceScore : 0) || consumerSourceFit(customerQuestion, b) - consumerSourceFit(customerQuestion, a) || b.fusedScore - a.fusedScore || b.authority - a.authority); - return diverseTop(ranked, limit); + return diverseTop(preferNewerApplicable(ranked,row=>row.source||sourceKind(row.url)), limit); } function rankLocalChunks(queries, rows, limit = 8, { customerQuestion = '', subQuestions = [] } = {}) { @@ -430,9 +432,10 @@ function rankLocalChunks(queries, rows, limit = 8, { customerQuestion = '', subQ .sort((a, b) => (phoneQuestion ? b.relevanceScore - a.relevanceScore : 0) || consumerSourceFit(customerQuestion || queries?.[0], b) - consumerSourceFit(customerQuestion || queries?.[0], a) || b.rank - a.rank || b.authority - a.authority); + const preferred=preferNewerApplicable(ranked,row=>row.source||sourceKind(row.url)); return normalizeSubQuestions(subQuestions).length > 3 - ? selectSubQuestionEvidence(ranked, subQuestions, limit, { customerQuestion: customerQuestion || queries?.[0] }) - : diverseTop(ranked, limit); + ? selectSubQuestionEvidence(preferred, subQuestions, limit, { customerQuestion: customerQuestion || queries?.[0] }) + : diverseTop(preferred, limit); } function formatEvidence(rows, { maxChars = 9_000, maxPerPage = 2, onSources } = {}) { @@ -455,7 +458,8 @@ function formatEvidence(rows, { maxChars = 9_000, maxPerPage = 2, onSources } = const section = row.section ? ` — ${row.section}` : ''; const body = cleanDocument(row.body, 1_700); if (!body) continue; - const block = `[${id} | ${sourceLabel(kind)} | ${trust}]\n${row.title || 'Untitled'}${section}\n${url}\n${body}`; + const metadata = provenanceLine(row.provenance); + const block = `[${id} | ${sourceLabel(kind)} | ${trust}]\n${row.title || 'Untitled'}${section}\n${url}\n${metadata ? metadata+'\n' : ''}${body}`; const separatorChars = blocks.length ? 2 : 0; if (used + separatorChars + block.length > maxChars && blocks.length) break; blocks.push(block); diff --git a/scripts/verify-support-db.js b/scripts/verify-support-db.js index 8361f5a..6a44ae3 100644 --- a/scripts/verify-support-db.js +++ b/scripts/verify-support-db.js @@ -293,6 +293,32 @@ async function verifyGitHubNoticeReceipts(pool, prefix) { console.log('GitHub notice receipts: concurrent claims, uncertain/lost ACK fences, subject-age rejection after pruning, customer erasure/recreation, bounded non-starvable cleanup and text-free schema passed'); } +async function verifySourceProvenance(pool) { + // Use the production persistence/search owners against this isolated database. + // This runs after legacy-upgrade fixtures; it cannot pre-upgrade their schemas. + const db = require('../db'); + const original = { connect:db.pool.connect,query:db.pool.query }; + db.pool.connect = pool.connect.bind(pool); db.pool.query = pool.query.bind(pool); + try { + await db.initSchema(); + const url = 'https://help.omi.me/en/articles/synthetic-capture-provenance'; + const provenance = { publishedAt:'2025-01-02T03:04:05.000Z',updatedAt:'2026-02-03T04:05:06.000Z', + dateOrigin:'article-jsonld',applicability:{product:'synthetic-recorder',surface:'mobile',version:'2'} }; + await db.saveDocPage({url,title:'Capture provenance',body:'Capture provenance settings are available.',provenance}); + const rows = await db.searchDocPages('Capture provenance',8,['help']); + assert.ok(rows.length > 0); assert.deepEqual(rows[0].provenance,provenance); + const evidence = await require('../docs').storedDocs('Capture provenance',db); + assert.match(evidence,/Updated: 2026-02-03T04:05:06\.000Z/); + assert.match(evidence,/surface=mobile/); + // A refresh without dates clears obsolete metadata, never promotes fetched_at. + await db.saveDocPage({url,title:'Capture provenance',body:'Capture provenance settings remain available.'}); + assert.deepEqual((await db.searchDocPages('Capture provenance',8,['help']))[0].provenance,{}); + await db.initSchema(); + assert.deepEqual((await db.searchDocPages('Capture provenance',8,['help']))[0].provenance,{}); + console.log('Official source provenance: production save/search/evidence round trip, unknown-date refresh and additive schema passed'); + } finally { db.pool.connect=original.connect; db.pool.query=original.query; } +} + async function verify(pool) { const prefix = `test-${randomUUID()}`; @@ -894,7 +920,7 @@ async function verifyKnowledgePrivacy(pool, prefix) { (async () => { const pool = await isolatedPool(); - try { await verify(pool); } finally { await pool.end(); } + try { await verify(pool); await verifySourceProvenance(pool); } finally { await pool.end(); } })().catch((error) => { // SQL and connection errors can contain inputs. Never dump them or a URL. console.error(`Support database integration failed: ${error.name}; code=${String(error.code || 'check_failed').replace(/[^A-Za-z0-9_]/g, '')}`); diff --git a/sourceProvenance.js b/sourceProvenance.js new file mode 100644 index 0000000..e28a1a6 --- /dev/null +++ b/sourceProvenance.js @@ -0,0 +1,107 @@ +// Public source provenance, never crawl-time freshness or inferred product facts. +const DATE_ORIGINS = new Set(['article-jsonld', 'article-meta', 'declared']); +const SOURCE_DATE_POLICY = 'Keep the existing source-authority hierarchy. Prefer a newer document over a conflicting older rule only after the same topic, product, surface and version applicability is established from the evidence. Dates, titles, missing scope and crawl times do not establish applicability. A newer lower-trust page cannot override a higher-trust source. Keep complementary instructions and safety details; omission is not contradiction. If a material conflict or applicability remains unresolved, state uncertainty and escalate through the existing person workflow instead of asserting either rule. Document dates do not prove a release, deployment or account outcome.'; +function absoluteDate(value, now = Date.now()) { + if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2}))?$/.test(value)) return null; + const date = value.slice(0,10), day = Date.parse(date + 'T00:00:00Z'); + if (!Number.isFinite(day) || new Date(day).toISOString().slice(0,10) !== date) return null; + const parsed = Date.parse(value); + return Number.isFinite(parsed) && parsed <= now + 300000 ? new Date(parsed).toISOString() : null; +} + +function normalizeProvenance(value, now = Date.now()) { + if (!value || typeof value !== 'object' || Array.isArray(value)) return {}; + const out = {}, dates = {}; + if (DATE_ORIGINS.has(value.dateOrigin)) { + for (const field of ['publishedAt','updatedAt']) { + if (value[field] === undefined) continue; + const date = absoluteDate(value[field],now); + if (!date) return {}; + dates[field] = date; + } + if (dates.publishedAt && dates.updatedAt && dates.updatedAt < dates.publishedAt) return {}; + if (Object.keys(dates).length) Object.assign(out,dates,{dateOrigin:value.dateOrigin}); + } + const scope = {}; + for (const field of ['product','surface','version']) { + const item = value.applicability?.[field]; + if (typeof item === 'string' && /^[\p{L}\p{N} ._+:/-]{1,80}$/u.test(item) && item.trim()) scope[field] = item.trim(); + } + if (Object.keys(scope).length) out.applicability = scope; + return out; +} + +function pageIdentity(value) { + try { const url = new URL(value); url.hash = ''; return url.href; } catch { return ''; } +} + +function articleProvenance(html, url, now = Date.now()) { + const found = []; + const scripts = String(html || '').matchAll(/]*\btype\s*=\s*["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi); + let scanned = 0; + for (const match of scripts) { + if (++scanned > 16) break; + if (match[1].length > 64000) continue; + let root; + try { root = JSON.parse(match[1]); } catch { continue; } + const nodes = (Array.isArray(root) ? root : [root, ...(Array.isArray(root?.['@graph']) ? root['@graph'] : [])]).slice(0,32); + for (const node of nodes) { + const types = Array.isArray(node?.['@type']) ? node['@type'] : [node?.['@type']]; + if (!types.some(type => ['Article','TechArticle','NewsArticle','BlogPosting'].includes(type))) continue; + const identity = node.url || node.mainEntityOfPage?.['@id']; + if (!identity || pageIdentity(identity) !== pageIdentity(url)) continue; + const value = { dateOrigin:'article-jsonld' }; + if (node.datePublished !== undefined) value.publishedAt = node.datePublished; + if (node.dateModified !== undefined) value.updatedAt = node.dateModified; + // Scope is known only when the publisher explicitly names the software. + // A page's language, viewport or inferred topic is not application scope. + if (node.about?.['@type'] === 'SoftwareApplication') value.applicability = { + product:node.about.name, surface:node.about.operatingSystem, version:node.about.softwareVersion, + }; + found.push(normalizeProvenance(value,now)); + } + } + if (!found.length) return {}; + const unique = new Map(found.map(value => [JSON.stringify(value),value])); + return unique.size === 1 ? found[0] : {}; +} + +function provenanceLine(value) { + const data = normalizeProvenance(value), parts = []; + if (data.publishedAt) parts.push('Published: ' + data.publishedAt); + if (data.updatedAt) parts.push('Updated: ' + data.updatedAt); + if (data.dateOrigin) parts.push('date source=' + data.dateOrigin); + if (data.applicability) parts.push('Explicit applicability: ' + Object.entries(data.applicability).map(([key,value]) => key+'='+value).join('; ')); + if (parts.length && !['product','surface','version'].every(key=>data.applicability?.[key])) parts.push('applicability incomplete; do not infer from date'); + return parts.join(' | '); +} + +function preferNewerApplicable(rows, sourceOf) { + const result=[...rows], groups=new Map(); + const normalized=value=>String(value||'').normalize('NFKC').toLowerCase().replace(/[^\p{L}\p{N}]+/gu,' ').trim(); + const scopeIdentity=value=>String(value).normalize('NFKC').trim().toLowerCase().replace(/\s+/g,' '); + result.forEach((row,index)=>{ + const source=sourceOf(row); + if (!['help','docs','github','website'].includes(source)) return; + const data=normalizeProvenance(row.provenance), scope=data.applicability; + if (!['product','surface','version'].every(key=>scope?.[key])) return; + const topic=normalized(row.section || row.title); + if (!topic) return; + const dateKind=data.updatedAt?'updatedAt':data.publishedAt?'publishedAt':null; + if (!dateKind) return; + const group=JSON.stringify([source,topic,...['product','surface','version'].map(key=>scopeIdentity(scope[key])),dateKind]); + if (!groups.has(group)) groups.set(group,[]); + groups.get(group).push({index,row,at:data[dateKind]}); + }); + for (const group of groups.values()) { + if (group.length<2 || new Set(group.map(value=>value.at)).size<2) continue; + const ordered=[...group].sort((a,b)=>b.at.localeCompare(a.at)||a.index-b.index); + // Reorder only the already-ranked slots belonging to this proven scope. + // Nothing is removed; other authorities/topics retain their positions. + group.forEach((slot,index)=>{result[slot.index]={...ordered[index].row, + sourcePreference:'newer_same_topic_and_explicit_scope'};}); + } + return result; +} + +module.exports = { absoluteDate,normalizeProvenance,articleProvenance,provenanceLine,preferNewerApplicable,SOURCE_DATE_POLICY }; diff --git a/test/sourceProvenance.test.js b/test/sourceProvenance.test.js new file mode 100644 index 0000000..518dfa9 --- /dev/null +++ b/test/sourceProvenance.test.js @@ -0,0 +1,202 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const { loadHelpCenter } = require('../helpcenter'); +const { chunkDocument, formatEvidence, rankLocalChunks, mergeRanked } = require('../retrieval'); +const { storedDocs, relevantDocs } = require('../docs'); + +const url = 'https://help.omi.me/en/articles/synthetic-capture-settings'; +const publishedAt = '2025-01-02T03:04:05.000Z'; +const updatedAt = '2026-02-03T04:05:06.000Z'; +const provenance = { publishedAt, updatedAt, dateOrigin: 'article-jsonld', + applicability: { product: 'synthetic-recorder', surface: 'mobile', version: '2' } }; + +async function ingest(html) { + const pages = []; + await loadHelpCenter(async address => ({ ok: true, text: async () => address.endsWith('sitemap.xml') + ? `${url}2026-09-01` : html }), + { saveDocPage: async page => pages.push(page) }); + return pages[0]; +} + +test('official article dates survive ingestion without substituting crawl or sitemap time', async () => { + const page = await ingest(`Capture settings

Capture settings

Capture settings can be changed in the app.

`); + assert.deepEqual(page.provenance, { publishedAt, updatedAt, dateOrigin: 'article-jsonld' }); + const undated = await ingest('

Capture settings

Capture settings can be changed.

'); + assert.deepEqual(undated.provenance, {}, 'missing official dates stay unknown despite a recent sitemap/fetch'); +}); + +test('unrelated or conflicting structured article dates do not manufacture freshness', async () => { + const article = value => ``; + for (const metadata of [ + { url:'https://help.omi.me/en/articles/synthetic-other',dateModified:updatedAt }, + { dateModified:'yesterday' }, { dateModified:'2026-02-31T00:00:00Z' }, + { datePublished:updatedAt,dateModified:publishedAt }, + { dateModified:'2999-01-01T00:00:00Z' }, + ]) { + const page = await ingest(article(metadata) + '
Capture settings.
'); + assert.deepEqual(page.provenance, {}); + } + const ambiguous = await ingest(article({ dateModified:updatedAt }) + article({ dateModified:publishedAt }) + '
Capture settings.
'); + assert.deepEqual(ambiguous.provenance, {}, 'contradictory page metadata is not silently picked'); +}); + +test('chunks and formatted evidence preserve bounded provenance and explicit applicability', () => { + const chunks = chunkDocument({ url, title:'Capture settings',body:'Capture settings use the mobile app.',provenance }); + assert.deepEqual(chunks[0].provenance, provenance); + const evidence = formatEvidence(chunks); + assert.match(evidence, /Published: 2025-01-02T03:04:05\.000Z/); + assert.match(evidence, /Updated: 2026-02-03T04:05:06\.000Z/); + assert.match(evidence, /product=synthetic-recorder; surface=mobile; version=2/); + assert.ok(evidence.length <= 9000); +}); + +test('stored selection keeps date and scope metadata through the real evidence formatter', async () => { + const evidence = await storedDocs('How do I change capture settings?', { + searchDocPages: async (_query,_limit,sources=[]) => sources.includes('github') ? [] : [{ + url,title:'Capture settings',source:'help',body:'Capture settings use the mobile app.',chunk_index:0,rank:1,provenance, + }], + }); + assert.match(evidence, /Updated: 2026-02-03T04:05:06\.000Z/); + assert.match(evidence, /surface=mobile/); +}); + +function competingRows() { + const base = {title:'Capture pause',section:'Capture pause',source:'help',rank:1,chunk_index:0, + provenance:{...provenance,applicability:{...provenance.applicability}}}; + return [ + {...base,url:'https://help.omi.me/en/articles/synthetic-older-pause',body:'Capture pause is unavailable.', + provenance:{...base.provenance,updatedAt:'2025-02-03T04:05:06.000Z'}}, + {...base,url:'https://help.omi.me/en/articles/synthetic-newer-pause',body:'Capture pause is available in the application.'}, + ]; +} + +test('equally authoritative same-topic and explicit-scope evidence prefers the newer document without deleting either', () => { + const rows=competingRows(); + const local=rankLocalChunks(['Capture pause'],rows,8,{customerQuestion:'Explain capture pause.'}); + const stored=mergeRanked([rows],8,{customerQuestion:'Explain capture pause.'}); + for(const selected of [local,stored]) { + assert.equal(selected[0].url,rows[1].url); + assert.equal(selected.length,2); + assert.equal(selected[0].sourcePreference,'newer_same_topic_and_explicit_scope'); + } +}); + +test('date preference cannot override source authority, different topics, versions or surfaces', () => { + const variants = [ + {source:'website',url:'https://www.omi.me/pages/synthetic-pause'}, + {section:'Capture upload'}, + {provenance:{...provenance,applicability:{...provenance.applicability,version:'3'}}}, + {provenance:{...provenance,applicability:{...provenance.applicability,surface:'desktop'}}}, + ]; + for(const variant of variants) { + const [old,fresh]=competingRows(); + const selected=mergeRanked([[old,{...fresh,...variant}]],8); + assert.equal(selected[0].url,old.url); + assert.ok(selected.every(row=>!row.sourcePreference)); + } +}); + +test('unknown, equal, unreliable and incomparable dates or applicability do not manufacture precedence', () => { + const variants=[ + {},{...provenance,updatedAt:'2025-02-03T04:05:06.000Z'}, + {...provenance,updatedAt:'yesterday'}, + {...provenance,dateOrigin:'crawl-time'}, + {publishedAt:updatedAt,dateOrigin:'article-jsonld',applicability:provenance.applicability}, + {...provenance,applicability:{surface:'mobile'}}, + ]; + for(const candidate of variants) { + const [old,fresh]=competingRows(); + const selected=mergeRanked([[old,{...fresh,provenance:candidate}]],8); + assert.equal(selected[0].url,old.url); + assert.ok(selected.every(row=>!row.sourcePreference)); + } +}); + +test('punctuation in explicit version and product identifiers never merges different applicability scopes', () => { + for (const [field,older,newer] of [['version','2.1','2-1'],['product','recorder-a','recorder a']]) { + const [old,fresh]=competingRows(); + old.provenance={...old.provenance,applicability:{...old.provenance.applicability,[field]:older}}; + fresh.provenance={...fresh.provenance,applicability:{...fresh.provenance.applicability,[field]:newer}}; + assert.equal(mergeRanked([[old,fresh]],8)[0].url,old.url); + } +}); + +test('publisher-declared software scope survives ingestion; article language and layout never become product scope', async () => { + const page=await ingest(`
Capture settings.
`); + assert.deepEqual(page.provenance.applicability,{product:'Synthetic Recorder',surface:'Android',version:'2.1'}); + const unspecified=await ingest(`
Capture settings for version 2.
`); + assert.equal(unspecified.provenance.applicability,undefined); + assert.match(formatEvidence(chunkDocument(unspecified)),/applicability incomplete/); +}); + +test('newer complementary instructions and older safety details both survive unchanged evidence limits', async () => { + const [old,fresh]=competingRows(); + old.body='Capture pause has an indicator; keep local captures until upload is confirmed.'; + fresh.body='Capture pause is available from the toolbar.'; + const rows=[old,fresh]; + const evidence=await storedDocs('Explain capture pause.',{searchDocPages:async(_q,_n,sources=[])=>sources.includes('github')?[]:rows}); + for(const row of rows) {assert.ok(evidence.includes(row.url));assert.ok(evidence.includes(row.body));} + assert.ok(evidence.indexOf(fresh.url) { + const {queryAgent,reviewAnswer}=require('../commandcode'); + const {SOURCE_DATE_POLICY}=require('../sourceProvenance'); + const previous=process.env.CMD_API_KEY; + process.env.CMD_API_KEY='synthetic-source-policy-key'; + t.after(()=>{if(previous===undefined)delete process.env.CMD_API_KEY;else process.env.CMD_API_KEY=previous;}); + let calls=0,reviewAttempts=0; + const post=async(_url,body)=>{ + calls++; + const system=body.messages.filter(row=>row.role==='system').map(row=>row.content).join('\n'); + assert.equal(system.split(SOURCE_DATE_POLICY).length-1,1); + if (system.includes('final relevance and grounding gate') && ++reviewAttempts===1) + throw Object.assign(new Error('synthetic retryable review timeout'),{code:'ECONNABORTED'}); + return {data:{choices:[{message:{content:JSON.stringify({final_answer:'Capture pause depends on the documented application version.', + grounded:true,relevant:true,confidence:0.8,escalate:false,sources_used:['S1']})}}]}}; + }; + await queryAgent({question:'Explain capture pause.',route:{lane:'faq'},post}); + await reviewAnswer({question:'Explain capture pause.',draft:'Capture pause depends on the documented version.', + lane:'faq',sources:formatEvidence(competingRows()),post}); + assert.equal(calls,3); + assert.equal(reviewAttempts,2,'existing timeout retry exercises the compact reviewer path'); +}); + +test('two- and three-part live retrieval keeps the six parallel fetches and unchanged per-page timeout', async t => { + const budgets=[]; + t.mock.method(AbortSignal,'timeout',ms=>{budgets.push(ms);return new AbortController().signal;}); + const pages=['Capturealpha','Capturebeta','Capturegamma'].flatMap(term=>Array.from({length:3},(_,i)=>({ + title:`${term} guide ${i}`,url:`https://docs.omi.me/synthetic-${term.toLowerCase()}-${i}.md`, + }))); + for (const count of [2,3]) { + const started=[]; let release; + const waiting=new Promise(resolve=>{release=resolve;}); + const pending=relevantDocs('Capturealpha Capturebeta Capturegamma procedures',{ + queries:['Capturebeta','Capturegamma'], + subQuestions:pages.filter((_,i)=>i%3===0).slice(0,count).map(page=>({question:page.title,query:page.title})), + fetchImpl:async(address,options)=>{ + assert.ok(options.signal); + if(String(address).endsWith('/llms.txt'))return{ok:true,text:async()=>pages.map(page=>`- [${page.title}](${page.url}): Capture procedures`).join('\n')}; + started.push(address); await waiting; + return{ok:true,text:async()=> '# Capture procedure\nUse the documented controls.'}; + }, + }); + await new Promise(resolve=>setImmediate(resolve)); + try {assert.equal(started.length,6,'all six requests start before any page completes');} + finally {release();} + const evidence=await pending; + assert.ok(evidence.length<=9000); + assert.ok((evidence.match(/^\[S\d+ \|/gm)||[]).length<=8); + } + assert.ok(budgets.length>=12); + assert.ok(budgets.every(ms=>ms===10000)); +}); From 42619cfc9b3140e1ccd016fb71ba7693948b101c Mon Sep 17 00:00:00 2001 From: Aryan Date: Mon, 26 Oct 2026 14:54:23 +0530 Subject: [PATCH 2/8] Keep date preference within the same article topic and equivalent relevance --- ROADMAP.md | 2 +- docs/IMPLEMENTATION_PLAN.md | 4 ++-- docs/SOURCE_CONFLICTS.md | 7 ++++--- docs/SUPPORT_MASTER_PLAN.md | 2 +- retrieval.js | 18 +++++++++++++++--- sourceProvenance.js | 12 ++++++++---- test/sourceProvenance.test.js | 28 ++++++++++++++++++++++++++++ 7 files changed, 59 insertions(+), 14 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 3bd09f5..6d6fea2 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,6 +1,6 @@ # Mira roadmap -**October26 current state:** #86 is operator-deployed as647b549/dba28f7d, explicitly confirmed by Aryan; fresh health/startup pass, one running instance, optional features and automatic deploy off. Notice smoke remains pending. #89's Mira repository guide is mergeda9c9508 with all checks/review; no runtime change after production. Current draft #83 adds publisher provenance, conservative explicit-scope date ordering and shared conflict policy, with twelve synthetic regressions; accuracy/review/CI gates remain. #62 stays open for narration/context loss. Main implementation64/100; delivery56/100;44 left. No paid run, agent deployment or memory enablement. +**October26 current state:** #86 is operator-deployed as647b549/dba28f7d, explicitly confirmed by Aryan; fresh health/startup pass, one running instance, optional features and automatic deploy off. Notice smoke remains pending. #89's Mira repository guide is mergeda9c9508 with all checks/review; no runtime change after production. Draft #90/#83 adds publisher provenance, equivalent-topic/scope/relevance date ordering and shared conflict policy. The independent generic-heading displacement is reproduced/repaired, fourteen new regressions pass; final accuracy/re-review/CI gates remain. #62 stays open for narration/context loss. Main implementation64/100; delivery56/100;44 left. No paid run, agent deployment or memory enablement. ## Current audited dashboard — October 26, 2026 diff --git a/docs/IMPLEMENTATION_PLAN.md b/docs/IMPLEMENTATION_PLAN.md index cc4f710..6916e91 100644 --- a/docs/IMPLEMENTATION_PLAN.md +++ b/docs/IMPLEMENTATION_PLAN.md @@ -6,8 +6,8 @@ - [x] Observe missing publisher provenance across ingestion/chunks/evidence before implementation; preserve fetch time as a separate operational field. - [x] Carry bounded publisher dates and explicit product/surface/version scope through production persistence/search/formatting; unknown/invalid/ambiguous metadata remains unknown and an undated refresh clears stale provenance. -- [x] Add source/topic/explicit-scope/date ordering without deleting rows or increasing budgets, plus one shared applicability/conflict policy in answer and both reviewer attempts. Preserve identifier punctuation and complementary safety details. -- [x] Twelve original synthetic regressions pass, including policy transport and six simultaneous fetches with10-second deadlines for two-/three-part questions. No provider call or protected case. +- [x] Add source/article-title/section/explicit-scope/date ordering only for equivalent relevance/corroboration, plus one shared applicability/conflict policy in answer and both reviewer attempts. Preserve identifier punctuation and complementary safety details; the independent generic-heading displacement is reproduced and repaired. +- [x] Fourteen original synthetic regressions pass, including full-cap topic separation, stronger-match/query-corroboration guards, policy transport and six simultaneous fetches with10-second deadlines for two-/three-part questions. No provider call or protected case. - [ ] Complete final full/no-model/current-head hosted PostgreSQL CI and independent review; then obtain authorization before any necessary generated-answer checks. A policy reaching a model is not proof of compliance. Keep #83 open and draft until its actual accuracy gates pass. diff --git a/docs/SOURCE_CONFLICTS.md b/docs/SOURCE_CONFLICTS.md index 5044068..a3a4ddc 100644 --- a/docs/SOURCE_CONFLICTS.md +++ b/docs/SOURCE_CONFLICTS.md @@ -21,17 +21,18 @@ Formatted evidence includes bounded publisher dates/date origin and any explicit Both stored fusion and local ranking can reorder their already-ranked slots when documents have: - the same official source kind/authority; -- the same normalized heading (or title if no heading); +- the same normalized article title and section (a generic section such as Overview is insufficient); - identical explicitly declared product, surface and version identifiers; - comparable reliable dates (updated versus updated, or published versus published). +- equal existing relevance signals: stored rank contribution and query corroboration, or local keyword rank; source-fit remains equal too. -Newer documents occupy the earlier slots only within that group. Other topics, authorities and scopes keep their positions. Identifier punctuation is significant: version2.1 cannot become version2-1. Equal, unknown, unreliable or incomparable dates do not create preference. Rows are not deleted or declared obsolete. The fixed selectionReason enum explains the ordering; it is not proof of semantic contradiction or customer-version applicability. +Newer documents occupy the earlier slots only within that group. Other topics, authorities and scopes keep their positions; a date cannot replace a stronger match or broader corroboration across searches. Identifier punctuation is significant: version2.1 cannot become version2-1. Equal, unknown, unreliable or incomparable dates do not create preference. Rows are not deleted or declared obsolete. The fixed sourcePreference enum explains the ordering; it is not proof of semantic contradiction or customer-version applicability. This narrow ordering is deliberately separate from resolving a claim. The existing answer/reviewer must still establish the actual applicability and contradiction from the evidence; a heading match alone is insufficient. Incomplete or differently worded topics remain available with their dates/uncertainty rather than being silently filtered. No broad claim that every official-source conflict is automatically solved follows. ## Checks and readiness -Twelve new synthetic tests cover ingestion/ambiguity, chunks, real formatted stored evidence, known-scope preference, authority/topic/surface/version exclusions, punctuation, absent/equal/unreliable/incomparable metadata, complementary safety facts, shared answer/normal+compact review policy delivery, and two-/three-part fetch guards. Observed red-before records distinguish four missing-provenance behaviors, two ordering behaviors, absent policy delivery and a subsequently caught identifier-normalization error. No protected inputs, customer messages or production writes are used. +Fourteen new synthetic tests cover ingestion/ambiguity, chunks, real formatted stored evidence, known-scope preference, authority/topic/surface/version exclusions, punctuation, absent/equal/unreliable/incomparable metadata, complementary safety facts, shared answer/normal+compact review policy delivery, and two-/three-part fetch guards. The independent review reproduced a generic-heading collision that displaced relevant evidence at the eight-slot cap. The repaired key includes article title/section and relevance equivalence; new guards cover that full-cap case, stronger matches and multi-query corroboration. Observed red-before records also distinguish four missing-provenance behaviors, two ordering behaviors, absent policy delivery and an identifier-normalization error. No protected inputs, customer messages or production writes are used. The two-/three-part checks assert all six page requests start before any completes, the per-request timeout remains10 seconds, and existing eight-chunk/9000-character output bounds hold. The real persistence/search/formatter owners are exercised against the isolated SQL engine, including an undated refresh and idempotent schema initialization. Hosted real PostgreSQL and final independent review remain required. The evaluation harness receives provenance through the same Help Center/chunk owners; its separate in-memory/storage limitations remain in the [evaluation guide](EVALUATION.md). diff --git a/docs/SUPPORT_MASTER_PLAN.md b/docs/SUPPORT_MASTER_PLAN.md index d86ae37..0c5b329 100644 --- a/docs/SUPPORT_MASTER_PLAN.md +++ b/docs/SUPPORT_MASTER_PLAN.md @@ -50,7 +50,7 @@ The earlier PR backlog is cleared, not the full product backlog. #88 merged884fb 2. **#86 deployed by Aryan after its merge gates passed.** The647b549/dba28f7d startup and health checks pass. Complete the scoped notice smoke using an existing linked synthetic issue/thread, never a new public Omi issue; no repeat deployment is needed. Broader #85 retention and #51 outbox remain unfinished. 3. **#62's evidence-only implementation is merged as #88 / `884fb46`**, not deployed separately: real generation → reviewer → safety/presentation → clipping/send path, text-free keyed per-turn fingerprints, no customer text/identifiers, no filter behavior change or second presentation implementation. Nine new synthetic tests include actual handler/harness parity, concurrency and disabled-path coverage; full1174/offline8, exact-head CI and independent35-check scoped review pass at `c1fe9d6`, with independently confirmed behavioral sensitivity. **Keep #62 open:** a fresh independent synthetic check on integrated main still loses symptom/earlier-attempt context in a semicolon-joined narration sentence. Earlier language calling both narration/redirect repairs complete was too broad; #67/#80 repaired redirects, not this general narration path. Preserve prerequisites/safety when designing that repair. No historical causation or customer-resolution claim. Broader E2 execution-validity work remains #56. No paid call. 4. **Step5 preparation is drafted in [the memory pilot checklist](MEMORY_PILOT_PREPARATION.md)** from the actual implementation: test forum only, references not copied messages, 30 days, exact forgetting scope, real switch/restart timing, two-post scenario, 48-hour acceptance and rollback. The exact revised provider-disclosing notice wording is approved, but not published; no pilot has begun. Enablement still needs #86, processor/backup/privacy checks and Aryan's explicit enable instruction. -5. **#83 then #65 accuracy work**: [source provenance and conflict draft](SOURCE_CONFLICTS.md) carries publisher dates/explicit applicability through ingestion, chunks, PostgreSQL and evidence. It adds conservative same-topic/scope ordering and one shared answer/review policy; it never treats omission as contradiction or dates as release proof. Twelve new synthetic regressions pass, including unchanged fetch/timeout/evidence bounds. Full/current-head hosted CI, independent review and approved generated-answer quality gates precede readiness. Not on main, no general accuracy claim, no held-out tailoring or paid comparison without asking. +5. **#83 then #65 accuracy work**: [source provenance and conflict draft](SOURCE_CONFLICTS.md) carries publisher dates/explicit applicability through ingestion, chunks, PostgreSQL and evidence. It adds conservative equivalent-topic/scope/relevance date ordering and one shared answer/review policy; omission is not contradiction and dates are not release proof. An independent generic-heading collision was reproduced and repaired with full-cap/relevance guards; fourteen new regressions pass, including unchanged fetch/timeout/evidence bounds. Final current-head CI, independent re-review and approved generated-answer quality gates precede readiness. Not on main, no general accuracy claim, no held-out tailoring or paid comparison without asking. 6. **Complete C then D/E through the same pipeline**: scoped memory pilot; minimized owner signals; private grouped review; real official-source/regression validator; authorization-controlled fact publication/revocation; offline nightly checks; honest weekly outcomes; end-to-end demonstration. #51/#53/#56 remain integrated reliability/operations dependencies, not a parallel rewrite. **Need Aryan now:** no repeat retention or notice-wording decision; both are supplied. Draft a one-line courtesy note for him about the closed synthetic issue, never send it on his behalf. No Discord test now and no paid rerun. Later, give one exact Discord input only after the relevant approved runtime/observer is ready. Aryan sends every message, command and button action. No memory flag until notice approval **and** an explicit enable instruction. diff --git a/retrieval.js b/retrieval.js index 0155651..e748957 100644 --- a/retrieval.js +++ b/retrieval.js @@ -374,6 +374,7 @@ function diverseTop(rows, limit, maxPerPage = 2) { function mergeRanked(resultSets, limit = 8, { customerQuestion = '' } = {}) { const phoneQuestion = isConsumerPhoneQuestion(customerQuestion); const merged = new Map(); + const dateRelevance = new Map(); for (const rows of resultSets || []) { (rows || []).forEach((row, index) => { const key = `${row.url || ''}#${row.chunk_index ?? row.chunkIndex ?? index}`; @@ -386,14 +387,23 @@ function mergeRanked(resultSets, limit = 8, { customerQuestion = '' } = {}) { if (prior) { prior.relevanceScore += relevanceScore; prior.fusedScore += score; - } else merged.set(key, { ...row, authority, relevanceScore, fusedScore: score }); + const evidence = dateRelevance.get(prior); + evidence.matches += 1; + evidence.rankSum += Number(row.rank || 0); + } else { + const value = { ...row, authority, relevanceScore, fusedScore: score }; + merged.set(key, value); + dateRelevance.set(value, { matches: 1, rankSum: Number(row.rank || 0) }); + } }); } const ranked = [...merged.values()] .sort((a, b) => (phoneQuestion ? b.relevanceScore - a.relevanceScore : 0) || consumerSourceFit(customerQuestion, b) - consumerSourceFit(customerQuestion, a) || b.fusedScore - a.fusedScore || b.authority - a.authority); - return diverseTop(preferNewerApplicable(ranked,row=>row.source||sourceKind(row.url)), limit); + return diverseTop(preferNewerApplicable(ranked, row => row.source || sourceKind(row.url), row => [ + dateRelevance.get(row).matches, dateRelevance.get(row).rankSum, consumerSourceFit(customerQuestion,row), + ]), limit); } function rankLocalChunks(queries, rows, limit = 8, { customerQuestion = '', subQuestions = [] } = {}) { @@ -432,7 +442,9 @@ function rankLocalChunks(queries, rows, limit = 8, { customerQuestion = '', subQ .sort((a, b) => (phoneQuestion ? b.relevanceScore - a.relevanceScore : 0) || consumerSourceFit(customerQuestion || queries?.[0], b) - consumerSourceFit(customerQuestion || queries?.[0], a) || b.rank - a.rank || b.authority - a.authority); - const preferred=preferNewerApplicable(ranked,row=>row.source||sourceKind(row.url)); + const preferred=preferNewerApplicable(ranked, row => row.source || sourceKind(row.url), row => [ + row.rank, consumerSourceFit(customerQuestion || queries?.[0],row), + ]); return normalizeSubQuestions(subQuestions).length > 3 ? selectSubQuestionEvidence(preferred, subQuestions, limit, { customerQuestion: customerQuestion || queries?.[0] }) : diverseTop(preferred, limit); diff --git a/sourceProvenance.js b/sourceProvenance.js index e28a1a6..fe8949f 100644 --- a/sourceProvenance.js +++ b/sourceProvenance.js @@ -76,7 +76,7 @@ function provenanceLine(value) { return parts.join(' | '); } -function preferNewerApplicable(rows, sourceOf) { +function preferNewerApplicable(rows, sourceOf, relevanceOf) { const result=[...rows], groups=new Map(); const normalized=value=>String(value||'').normalize('NFKC').toLowerCase().replace(/[^\p{L}\p{N}]+/gu,' ').trim(); const scopeIdentity=value=>String(value).normalize('NFKC').trim().toLowerCase().replace(/\s+/g,' '); @@ -85,11 +85,15 @@ function preferNewerApplicable(rows, sourceOf) { if (!['help','docs','github','website'].includes(source)) return; const data=normalizeProvenance(row.provenance), scope=data.applicability; if (!['product','surface','version'].every(key=>scope?.[key])) return; - const topic=normalized(row.section || row.title); - if (!topic) return; + const title=normalized(row.title), section=normalized(row.section); + if (!title) return; + const relevance=relevanceOf?.(row); + if (!Array.isArray(relevance) || !relevance.length || !relevance.every(Number.isFinite)) return; const dateKind=data.updatedAt?'updatedAt':data.publishedAt?'publishedAt':null; if (!dateKind) return; - const group=JSON.stringify([source,topic,...['product','surface','version'].map(key=>scopeIdentity(scope[key])),dateKind]); + // Generic section names cannot establish article topic equivalence. Dates + // also cannot replace a stronger lexical match or multi-query support. + const group=JSON.stringify([source,title,section,...['product','surface','version'].map(key=>scopeIdentity(scope[key])),dateKind,relevance]); if (!groups.has(group)) groups.set(group,[]); groups.get(group).push({index,row,at:data[dateKind]}); }); diff --git a/test/sourceProvenance.test.js b/test/sourceProvenance.test.js index 518dfa9..daa1ed0 100644 --- a/test/sourceProvenance.test.js +++ b/test/sourceProvenance.test.js @@ -98,6 +98,34 @@ test('date preference cannot override source authority, different topics, versio } }); +test('generic shared headings cannot merge unrelated article topics or displace relevant evidence at the full cap', () => { + const [old,fresh]=competingRows(); + const relevant=Array.from({length:8},(_,index)=>({...old,title:`Offline capture guide ${index}`,section:'Overview', + url:`https://help.omi.me/en/articles/synthetic-offline-${index}`,rank:1-index/20, + body:'Offline capture keeps pending clips until upload completes.'})); + const unrelated={...fresh,title:'Appearance settings',section:'Overview',rank:0.001, + body:'Set a light or dark theme for the toolbar.'}; + const select=[ + (rows,limit)=>mergeRanked([rows],limit,{customerQuestion:'Offline capture'}), + (rows,limit)=>rankLocalChunks(['Offline capture'],rows,limit,{customerQuestion:'Offline capture'}), + ]; + for(const choose of select) { + assert.equal(choose([relevant[0],unrelated],1)[0].url,relevant[0].url); + const without=choose(relevant,8).map(row=>row.url); + assert.deepEqual(choose([...relevant,unrelated],8).map(row=>row.url),without); + } +}); + +test('a newer same-title document cannot override a stronger match or broader query corroboration', () => { + const [old,fresh]=competingRows(); + old.rank=10;fresh.rank=0.1; + assert.equal(mergeRanked([[old,fresh]],1)[0].url,old.url); + old.rank=1;fresh.rank=1; + assert.equal(mergeRanked([[old,fresh],[old]],1)[0].url,old.url); + old.body='Capture pause supports offline duration limits.'; + assert.equal(rankLocalChunks(['Capture pause offline duration'],[old,fresh],1)[0].url,old.url); +}); + test('unknown, equal, unreliable and incomparable dates or applicability do not manufacture precedence', () => { const variants=[ {},{...provenance,updatedAt:'2025-02-03T04:05:06.000Z'}, From c870a8b371f2d62209a8d9b535b0a8d6ad27eb5d Mon Sep 17 00:00:00 2001 From: Aryan Date: Mon, 26 Oct 2026 15:42:31 +0530 Subject: [PATCH 3/8] Record the verified synthetic notice release check --- ROADMAP.md | 6 +++--- docs/ARCHITECTURE.md | 4 ++-- docs/GITHUB_NOTICE_LIFECYCLE.md | 6 ++++-- docs/IMPLEMENTATION_PLAN.md | 7 ++++--- docs/MEMORY_PILOT_PREPARATION.md | 4 ++-- docs/RUNBOOK.md | 10 +++++----- docs/SOURCE_CONFLICTS.md | 2 +- docs/SUPPORT_MASTER_PLAN.md | 8 ++++---- 8 files changed, 25 insertions(+), 22 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 6d6fea2..9edfe9d 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,13 +1,13 @@ # Mira roadmap -**October26 current state:** #86 is operator-deployed as647b549/dba28f7d, explicitly confirmed by Aryan; fresh health/startup pass, one running instance, optional features and automatic deploy off. Notice smoke remains pending. #89's Mira repository guide is mergeda9c9508 with all checks/review; no runtime change after production. Draft #90/#83 adds publisher provenance, equivalent-topic/scope/relevance date ordering and shared conflict policy. The independent generic-heading displacement is reproduced/repaired, fourteen new regressions pass; final accuracy/re-review/CI gates remain. #62 stays open for narration/context loss. Main implementation64/100; delivery56/100;44 left. No paid run, agent deployment or memory enablement. +**October 26 current state:** #86 is operator-deployed as `647b549` / `dba28f7d`, explicitly confirmed by Aryan; fresh health/startup pass, one running instance, optional features and automatic deploy off. The authorized existing-synthetic reopen/close smoke passed with one notice per event and the issue closed again; no extra notice appeared at the follow-up read. This is bounded evidence, not a universal delivery guarantee. #89's Mira repository guide is merged as `a9c9508` with all checks/review; no runtime change after production. Draft #90/#83 adds publisher provenance, equivalent-topic/scope/relevance date ordering and shared conflict policy. The independent generic-heading displacement is reproduced/repaired, fourteen new regressions pass; final accuracy/re-review/CI gates remain. #62 stays open for narration/context loss. Main implementation 64/100; delivery 56/100; 44 left. No paid run, agent deployment or memory enablement. ## Current audited dashboard — October 26, 2026 -#88 merged884fb46, #87 merged928676b and #86 merged647b549 after their gates; none was deployed separately. Memory-notice wording approval is not publication/enablement. #86's approved30-day retention/replay/erasure implementation is awaiting release. No repeat policy question or paid run. Delivery score56/100 is unchanged; production remains c6f482d, optional controls/automatic deploy off at the fresh read. +#88 merged as `884fb46`, #87 merged as `928676b` and #86 merged as `647b549` after their gates. Aryan deployed `647b549` / `dba28f7d`; its health/startup and scoped synthetic notice checks pass. Memory-notice wording approval is not publication/enablement. No repeat policy question or paid run. Delivery score 56/100 is unchanged; optional controls/automatic deploy remain off. -The [master plan](docs/SUPPORT_MASTER_PLAN.md) is authoritative: audited main647b549,16/25 implemented/tested/reviewed milestone foundations (**64/100 main implementation coverage**), eight verified operations, **56/100 delivery completion and44 left**, not accuracy. Full A–E acceptance remains2/21. The [dated issue audit](docs/SUPPORT_ISSUE_AUDIT_2026-10-25.md) closed speculative summaries #52 not planned. Eleven issues remain unresolved; #62 still reproduces narration/context loss. No assignments or production settings changed. +The [master plan](docs/SUPPORT_MASTER_PLAN.md) is authoritative: audited main `a9c9508`, 16/25 implemented/tested/reviewed milestone foundations (**64/100 main implementation coverage**), eight verified operations, **56/100 delivery completion and 44 left**, not accuracy. Full A–E acceptance remains 2/21. The [dated issue audit](docs/SUPPORT_ISSUE_AUDIT_2026-10-25.md) closed speculative summaries #52 not planned. Eleven issues remain unresolved; #62 still reproduces narration/context loss. No assignments or production settings changed. Next work: #83's source provenance/conflict handling, then #65 multipart accuracy, using merged stage evidence; remaining C/D/E and #51/#53/#56 dependencies remain. Do not recreate closed PRs or treat unfinished scope as complete. Every older checkpoint below is historical and superseded where it conflicts with this dashboard. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 59c25c7..820971d 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1,6 +1,6 @@ # Mira architecture -**October26 current state:** Aryan confirmed his647b549/dba28f7d deployment; health/schema/Discord startup pass with one running instance and optional features/automatic deploy off. #86's notice smoke is still pending. Maina9c9508 adds only the reviewed Mira repository guide. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). No agent deployment, paid run or memory enablement. +**October 26 current state:** Aryan confirmed his `647b549` / `dba28f7d` deployment; health/schema/Discord startup pass with one running instance and optional features/automatic deploy off. #86's scoped notice smoke now passes: one notice for each authorized synthetic reopen/close event, with the issue closed again. Main `a9c9508` adds only the reviewed Mira repository guide. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). No agent deployment, paid run or memory enablement. **#83 draft boundary:** one sourceProvenance module carries reliable publisher dates and explicitly declared software applicability through Help Center ingestion, parent-page JSONB, in-memory chunks, stored search and evidence formatting. Stored fusion/local ranking reorder only equivalent explicit scope/topic/source slots; they delete no source or complementary fact. One shared answer/review policy handles unresolved applicability/conflicts without a new model request. Existing budgets/authority/privacy/handoff paths remain. [Design, limitations and acceptance](SOURCE_CONFLICTS.md). This code is not on main and generated-answer accuracy remains unverified. @@ -9,7 +9,7 @@ Audited main647b549 contains #59's reviewed voice, #28's durable private approval workflow, #84's shared public-intake privacy enforcement, #88's evaluation-only stage evidence and #86's notice lifecycle. Optional references-only memory/context and reviewed-fact foundations remain disabled. The [master plan](SUPPORT_MASTER_PLAN.md) separates main implementation coverage64/100 from delivery completion56/100 and full acceptance2/21; these are not accuracy percentages. -Duplicate GitHub notices remain a production weakness until #86 is released. Its merged implementation fences dispatch with PostgreSQL, rejects stale subject times after receipt expiry, serializes customer erasure/claims and retains one minimal30-day customer/time replay cutoff. Mandatory bounded cleanup reuses the tracked worker independently of optional flags. Ownerless legacy mappings cannot create unerasable receipts. Merge review/CI passed; broader #85 case/link/approval lifecycles and #51 outbox work remain. #52's speculative stored summaries are dropped. The revised AI-provider notice has wording approval only, not publication or enablement. All older checkpoints below are history where superseded. +#86 is deployed and its controlled existing-synthetic reopen/close smoke passed with one notice per event. This does not prove universal exactly-once delivery. Its implementation fences dispatch with PostgreSQL, rejects stale subject times after receipt expiry, serializes customer erasure/claims and retains one minimal 30-day customer/time replay cutoff. Mandatory bounded cleanup reuses the tracked worker independently of optional flags. Ownerless legacy mappings cannot create unerasable receipts. Merge review/CI passed; broader #85 case/link/approval lifecycles and #51 outbox work remain. #52's speculative stored summaries are dropped. The revised AI-provider notice has wording approval only, not publication or enablement. All older checkpoints below are history where superseded. ## Merged #88 — real-path evaluation stage evidence diff --git a/docs/GITHUB_NOTICE_LIFECYCLE.md b/docs/GITHUB_NOTICE_LIFECYCLE.md index 32a18e9..42d791a 100644 --- a/docs/GITHUB_NOTICE_LIFECYCLE.md +++ b/docs/GITHUB_NOTICE_LIFECYCLE.md @@ -1,6 +1,6 @@ # GitHub notice replay and receipt lifecycle — #86 -Merged October26 as647b549 and operator-deployed asdba28f7d at12:59 IST, explicitly confirmed by Aryan. Fresh health/schema/Discord startup checks pass, one running instance, optional features and automatic deploy off; the notice smoke remains pending. Local1202/no-model8, hosted Node20/24/real PostgreSQL and final independent85-test/signed HTTP/SQL/two-migration-probe review pass at62776f8. This is notice deduplication, not the full #51 delivery outbox or universal exactly-once delivery. +Merged October 26 as `647b549` and operator-deployed as `dba28f7d` at 12:59 IST, explicitly confirmed by Aryan. Health/schema/Discord startup checks pass, one running instance, optional features and automatic deploy off. The authorized notice smoke passed on that release: the existing synthetic issue #23602 was reopened at 15:34:57 IST, one reopening notice was verified while open, then it was closed not planned at 15:36:05 IST and one closing notice was verified. A later read still found one notice per event and the issue closed. Local 1,202/no-model 8, hosted Node 20/24/real PostgreSQL and final independent 85-test/signed HTTP/SQL/two-migration-probe review pass at `62776f8`. This is notice deduplication, not the full #51 delivery outbox or universal exactly-once delivery. ## Send authority and subject time @@ -30,4 +30,6 @@ The pre-lifecycle candidate was never released. An unexpected populated old deve New synthetic notifier tests observe no send for stale/missing timestamps, expiry followed by replay, retained erasure protection across adapter recreation, fresh independent delivery and ownerless legacy refusal. A reproducible run of the new lifecycle/worker tests on the integrated pre-change tree yields nine failures and eight passes, including actual sends for stale/missing subject times and ownerless legacy mappings. Missing new APIs are recorded separately from behavioral failures. Signed HTTP integration covers invalid/stale payloads without provider calls. Owner-command tests cover failure of each independent erasure group. SQL verification exercises real constraints/transactions, concurrent claims, committed-write acknowledgment loss, erasure/claim races, late confirmation, preserved other customers,205-row backlogs and independent progress, expired-cutoff cleanup and database-clock authority. Local PGlite serializes connections; hosted PostgreSQL is the required concurrent integration gate. -After merge, ship with the next approved release using the standard exact-commit/rollback/health gates. Smoke: one status change on an existing linked synthetic issue/thread must yield exactly one matching Discord notice. Do not create a new public BasedHardware/omi issue for this test, replay uncertain sends or enable memory. Aryan performs every Discord action. These checks do not prove every external send is delivered exactly once. +The existing linked synthetic issue was already closed, so Aryan explicitly approved the reopen/verify/close/verify round trip. The read-only observer was independently reviewed and passed eight offline scope/false-pass checks before execution. It pinned the exact synthetic thread and issue, required an open-phase checkpoint, correlated ordered GitHub events with bot notices, and required the final issue to be closed. Both normal events passed with one notice each; no new issue, manual Discord input, deployment, setting change, paid request or memory enablement occurred. + +This controlled smoke does not inject every replay or uncertain-send failure, test erasure in production, prove continuous health, or guarantee every external send is delivered exactly once. Preserve receipt/cutoff fences; do not clear them to force a replay. Aryan performs every Discord action. diff --git a/docs/IMPLEMENTATION_PLAN.md b/docs/IMPLEMENTATION_PLAN.md index 6916e91..0b72680 100644 --- a/docs/IMPLEMENTATION_PLAN.md +++ b/docs/IMPLEMENTATION_PLAN.md @@ -1,6 +1,6 @@ # Mira implementation checklist -**October26 current state:** Aryan deployed647b549 asdba28f7d; fresh health/schema/Discord startup pass, one running instance, optional features/automatic deploy off. #86 notice smoke remains pending. Maina9c9508 adds only the reviewed Mira repository guide. #83 source provenance/conflict handling is a separate draft; no paid run, public Omi test issue, agent deployment or memory enablement. +**October 26 current state:** Aryan deployed647b549 as `dba28f7d`; health/schema/Discord startup pass, one running instance, optional features/automatic deploy off. #86's authorized existing-synthetic reopen/close smoke passes with one notice per event and the issue closed again; this does not finish #51 or #85. Main `a9c9508` adds only the reviewed Mira repository guide. #83 source provenance/conflict handling is a separate draft; no paid run, new public Omi test issue, agent deployment or memory enablement. ## #83 source provenance and conflict handling — draft @@ -8,7 +8,8 @@ - [x] Carry bounded publisher dates and explicit product/surface/version scope through production persistence/search/formatting; unknown/invalid/ambiguous metadata remains unknown and an undated refresh clears stale provenance. - [x] Add source/article-title/section/explicit-scope/date ordering only for equivalent relevance/corroboration, plus one shared applicability/conflict policy in answer and both reviewer attempts. Preserve identifier punctuation and complementary safety details; the independent generic-heading displacement is reproduced and repaired. - [x] Fourteen original synthetic regressions pass, including full-cap topic separation, stronger-match/query-corroboration guards, policy transport and six simultaneous fetches with10-second deadlines for two-/three-part questions. No provider call or protected case. -- [ ] Complete final full/no-model/current-head hosted PostgreSQL CI and independent review; then obtain authorization before any necessary generated-answer checks. A policy reaching a model is not proof of compliance. Keep #83 open and draft until its actual accuracy gates pass. +- [x] Runtime `42619cf` passes full 1,216/no-model 8/isolated SQL, exact-head hosted Node 20/24/real PostgreSQL and independent 69-check code review plus all four original reproduction assertions. Later documentation-only heads still need their required CI/review; unchanged runtime evidence is reusable. +- [ ] Obtain authorization before the necessary generated-answer checks. A policy reaching a model is not proof of compliance. Keep #83 open and draft until its actual accuracy gates pass. ## Current audited execution — October 26, 2026 @@ -18,7 +19,7 @@ - [x] Audit12 open issues; close only speculative stored summaries #52 not planned. Preserve11 unresolved issues, existing assignments and closed-branch evidence. [Disposition](SUPPORT_ISSUE_AUDIT_2026-10-25.md). - [x] #86 lifecycle implemented locally:30-day bounded/non-starvable expiry, payload subject-time rejection, erasure of owned receipt rows with a minimal replay cutoff; red-before synthetic checks,1202/no-model8/isolated SQL pass. - [x] #86 hosted real PostgreSQL/Node20/24 CI, final independent85-test/signed HTTP/SQL/two-migration-probe review and merge647b549; merged-main CI passes. -- [ ] #86 later approved-release smoke on an existing linked synthetic issue/thread. No memory enablement or new public test issue. +- [x] #86 authorized existing-synthetic reopen/close smoke passes on `647b549` / `dba28f7d`: one notice per event, ordered open checkpoint then closure, and no extra notice at the follow-up read. Issue #23602 ends closed not planned. No memory enablement or new public test issue; [limits](GITHUB_NOTICE_LIFECYCLE.md). - [x] #88 merged884fb46 with1174/offline8/current CI/independent35 checks and unchanged reply bytes; #62 remains separate from deployment/customer resolution. - [x] Step5 preparation and revised AI-provider-disclosing notice wording approved. Publication, processor/backups and explicit enablement remain unchecked; no memory flag changed. - [ ] Then #83 general source conflicts and #65 accuracy; remaining C/D/E and #51/#53/#56 operational reliability stay required. No automatic paid evaluation, customer data use, issue assignment, merge or deployment. diff --git a/docs/MEMORY_PILOT_PREPARATION.md b/docs/MEMORY_PILOT_PREPARATION.md index ff1d1d4..e67150c 100644 --- a/docs/MEMORY_PILOT_PREPARATION.md +++ b/docs/MEMORY_PILOT_PREPARATION.md @@ -1,6 +1,6 @@ # References-only memory pilot — preparation, not enablement -Updated October26,2026 against the merged references-only implementation. The exact notice wording below is approved; publication, configuration change, pilot and paid runs are not. Aryan deployed #86 as647b549/dba28f7d after its code/CI/review gates; the notice smoke and applicable privacy/security/processor/backup gates remain. Memory stays off. +Updated October 26,2026 against the merged references-only implementation. The exact notice wording below is approved; publication, configuration change, pilot and paid runs are not. Aryan deployed #86 as `647b549` / `dba28f7d` after its code/CI/review gates; its scoped notice smoke now passes. Applicable privacy/security/processor/backup gates remain. Memory stays off. ## Approved customer notice — wording only, not published @@ -30,7 +30,7 @@ Within a process with disabled policy, new/queued captures recheck the switch, c ## Before enablement -- [ ] Accept the scoped duplicate-status notice smoke; #86 is deployed, health/startup verified, but notice delivery is not yet accepted. +- [x] #86 is deployed with health/startup verified; the authorized existing-synthetic reopen/close smoke passed with one notice per event and the issue closed again. This is bounded notice evidence, not a full outbox or memory-pilot pass. [Receipt and limits](GITHUB_NOTICE_LIFECYCLE.md). - [x] Exact revised notice wording approved by the October26 user-supplied reviewer decision, including AI-provider use. - [ ] Publish the approved notice in the test forum before capture, only under the later approved rollout. - [ ] Review processor/data use, applicable security/platform review, deletion and backups. Existing30-day support-memory approval stands. #86 has a separate30-day receipt lifecycle decision, not blanket approval for other operational metadata. diff --git a/docs/RUNBOOK.md b/docs/RUNBOOK.md index 0cf48c4..d6aa4c4 100644 --- a/docs/RUNBOOK.md +++ b/docs/RUNBOOK.md @@ -1,17 +1,17 @@ # Mira operations runbook -**October26 current state:** Aryan confirmed deploying647b549 asdba28f7d at12:59 IST; fresh health/schema/Discord startup pass, one running instance, optional features and automatic deploy off. #86's notice smoke is still pending. Maina9c9508 adds only reviewed Mira repository documentation; #83 is a separate unmerged source-conflict draft. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). No agent deployment, paid run, public Omi test issue or memory enablement. Mira is the product name; technical identifiers remain stable. +**October 26 current state:** Aryan confirmed deploying647b549 as `dba28f7d` at 12:59 IST; fresh health/schema/Discord startup pass, one running instance, optional features and automatic deploy off. #86's authorized existing-synthetic reopen/close smoke passes with one notice per event and the issue closed again. Main `a9c9508` adds only reviewed Mira repository documentation; #83 is a separate unmerged source-conflict draft. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). No agent deployment, paid run, public Omi test issue or memory enablement. Mira is the product name; technical identifiers remain stable. -Do not delete receipt/cutoff rows to force webhook replay. The candidate ignores stale payload subject times, holds uncertain outcomes and retains a minimal customer/time cutoff after owner erasure; cleanup is mandatory even with optional features off. Fixed notice-retention errors mean pending cleanup, not erased records. An unexpected populated pre-lifecycle schema fails closed for review. Use an existing linked synthetic issue/thread for the next approved-release smoke; no new public issue. +Do not delete receipt/cutoff rows to force webhook replay. The candidate ignores stale payload subject times, holds uncertain outcomes and retains a minimal customer/time cutoff after owner erasure; cleanup is mandatory even with optional features off. Fixed notice-retention errors mean pending cleanup, not erased records. An unexpected populated pre-lifecycle schema fails closed for review. The October 26 smoke used only the existing linked synthetic issue/thread; preserve that evidence rather than creating another public test issue. ## Current operation checkpoint — October 26, 2026 -Fresh read confirms647b549/dba28f7d is healthy/latest with one running instance, optional controls and automatic deploy off; Aryan explicitly confirms triggering it. #86's30-day receipt/replay/erasure code is deployed, but its notice smoke remains pending. Revised memory notice wording is approved, not posted or enabled. No new public Omi issue may be created for the smoke; use an existing linked synthetic case or reviewed alternative after the observer is ready. +Fresh read confirms `647b549` / `dba28f7d` is healthy/latest with one running instance, optional controls and automatic deploy off; Aryan explicitly confirms triggering it. #86's 30-day receipt/replay/erasure code is deployed. The authorized existing-synthetic reopen/close smoke passed with one notice per event and the issue closed again; no extra notice appeared at the follow-up read. This is bounded evidence, not a universal delivery guarantee. Revised memory notice wording is approved, not posted or enabled. No new public Omi issue may be created for the smoke; use an existing linked synthetic case or reviewed alternative after the observer is ready. -Use [the current master plan](SUPPORT_MASTER_PLAN.md), not historical deployment instructions below. Last verified production is exact `c6f482d` / `3d4cb5d8`, optional memory/context/fix-inbox and automatic deploy off. Bounded how-to/damage/order/private-preview checks passed. Operator-triggered synthetic publication #23602 was separately closed not planned with the approved test-only note; it is not a customer incident or resolution. +Use [the current master plan](SUPPORT_MASTER_PLAN.md), not historical deployment instructions below. Last verified production is exact `647b549` / `dba28f7d`, optional memory/context/fix-inbox and automatic deploy off. The earlier `c6f482d` / `3d4cb5d8` release is historical. Bounded how-to/damage/order/private-preview checks passed. Operator-triggered synthetic publication #23602 was separately closed not planned with the approved test-only note; it is not a customer incident or resolution. -Duplicate note/closure notices exposed the replay weakness fixed on main by #86. Never clear held receipts to force a replay or automatically resend uncertain work. Clean-release/pilot sign-off still needs the approved release and scoped notice smoke, without repeating unrelated passed smokes. No new Discord input or paid run is needed now. The revised notice has wording approval only; environment configuration reaches a process through the operator's approved replacement, not instantly in already-running processes. +Duplicate note/closure notices exposed the replay weakness fixed on main by #86. Never clear held receipts to force a replay or automatically resend uncertain work. The scoped notice gate is now verified on the operator-deployed release; privacy/processor/backup checks and explicit memory enablement remain separate. Do not repeat unrelated passed smokes. No new Discord input or paid run is needed now. The revised notice has wording approval only; environment configuration reaches a process through the operator's approved replacement, not instantly in already-running processes. ## Historical operation and comparison checkpoints diff --git a/docs/SOURCE_CONFLICTS.md b/docs/SOURCE_CONFLICTS.md index a3a4ddc..b04ae66 100644 --- a/docs/SOURCE_CONFLICTS.md +++ b/docs/SOURCE_CONFLICTS.md @@ -34,6 +34,6 @@ This narrow ordering is deliberately separate from resolving a claim. The existi Fourteen new synthetic tests cover ingestion/ambiguity, chunks, real formatted stored evidence, known-scope preference, authority/topic/surface/version exclusions, punctuation, absent/equal/unreliable/incomparable metadata, complementary safety facts, shared answer/normal+compact review policy delivery, and two-/three-part fetch guards. The independent review reproduced a generic-heading collision that displaced relevant evidence at the eight-slot cap. The repaired key includes article title/section and relevance equivalence; new guards cover that full-cap case, stronger matches and multi-query corroboration. Observed red-before records also distinguish four missing-provenance behaviors, two ordering behaviors, absent policy delivery and an identifier-normalization error. No protected inputs, customer messages or production writes are used. -The two-/three-part checks assert all six page requests start before any completes, the per-request timeout remains10 seconds, and existing eight-chunk/9000-character output bounds hold. The real persistence/search/formatter owners are exercised against the isolated SQL engine, including an undated refresh and idempotent schema initialization. Hosted real PostgreSQL and final independent review remain required. The evaluation harness receives provenance through the same Help Center/chunk owners; its separate in-memory/storage limitations remain in the [evaluation guide](EVALUATION.md). +The two-/three-part checks assert all six page requests start before any completes, the per-request timeout remains 10 seconds, and existing eight-chunk/9000-character output bounds hold. The real persistence/search/formatter owners are exercised against the isolated SQL engine, including an undated refresh and idempotent schema initialization. Runtime `42619cf` passes hosted Node 20/24/real PostgreSQL CI and independent scoped code review: 69 affected checks and all four original reproduction assertions. Later documentation-only heads retain their current CI/review requirement. The evaluation harness receives provenance through the same Help Center/chunk owners; its separate in-memory/storage limitations remain in the [evaluation guide](EVALUATION.md). Before readiness: complete current-head CI, independent scope/accuracy review and the required approved generated-answer checks. No paid comparison is authorized merely by this draft. Keep #83 open until its full acceptance is evidenced; #65 multipart accuracy and #62 narration/context loss remain separate unfinished work. No deployment, memory enablement or extra Discord smoke follows from these tests. diff --git a/docs/SUPPORT_MASTER_PLAN.md b/docs/SUPPORT_MASTER_PLAN.md index 0c5b329..b97c1cd 100644 --- a/docs/SUPPORT_MASTER_PLAN.md +++ b/docs/SUPPORT_MASTER_PLAN.md @@ -28,7 +28,7 @@ There is **no defensible current-main “accuracy out of 100”** from these tes | **Last verified production** | Exact647b549, deploymentdba28f7d, operator-triggered October26 at12:59 IST and explicitly confirmed by Aryan. Fresh read: healthy/one running instance, schema/Discord ready, zero startup failures; optional memory/context/fix-inbox and automatic deploy off. This is a dated receipt, not continuous health monitoring. | | **Passed limited release checks** | October25 phone-only how-to, damaged-item privacy, order-status privacy, and exact staff-authored sanitized private engineering preview. These are bounded scenarios, not full A–E acceptance. | | **Separate operator action** | Aryan clicked Publish after the preview stop point. Synthetic issue #23602 was created and, with his separate approval, closed not planned with a test-only note. Preserve history; no real customer incident, automatic publication or customer-resolution claim. | -| **Deployed, notice smoke pending** | [#86](https://github.com/BasedHardware/omi-vector-bot/pull/86), merge647b549: **Receipt lifecycle approved October26:**30 days, original payload-subject-age rejection and customer erasure. Full1202/no-model8, exact-head hosted Node20/24/real PostgreSQL and independent85-test/signed HTTP/SQL/two-migration-probe review passed. Aryan deployed it; health/startup pass, but the existing-linked-synthetic notice smoke is not yet accepted. [Lifecycle and limits](GITHUB_NOTICE_LIFECYCLE.md). No implicit memory enablement. | +| **Deployed, scoped notice smoke passed** | [#86](https://github.com/BasedHardware/omi-vector-bot/pull/86), merge `647b549`: **Receipt lifecycle approved October26:**30 days, original payload-subject-age rejection and customer erasure. Full 1,202/no-model 8, exact-head hosted Node 20/24/real PostgreSQL and independent 85-test/signed HTTP/SQL/two-migration-probe review passed. Aryan deployed it; health/startup pass. He explicitly approved a reopen/verify/close/verify round trip on existing synthetic issue #23602. One notice per event, ordered open checkpoint then closure, final issue closed not planned and no extra notice at the follow-up read. This does not prove every replay/external-send outcome. [Lifecycle and limits](GITHUB_NOTICE_LIFECYCLE.md). No implicit memory enablement. | | **Main-only documentation** | #89 mergeda9c9508 after review and green exact-head/merged-main CI: Mira naming, README/index, issue/PR guidance and current progress. No runtime change after production647b549. | | **Closed without merge** | #71, #75 and #82 failed their final accuracy/execution disposition; #29/#30/#68/#77/#78 were closed with remaining scope/evidence retained. Do not reopen or rerun them automatically. #65/#51/#56/#62 keep the unresolved needs. | @@ -47,10 +47,10 @@ The earlier PR backlog is cleared, not the full product backlog. #88 merged884fb ## Execution order — continue after this audit 1. **Record and review this main-only dashboard/issue audit.** Keep fixed scoring, main versus draft versus live boundaries and all A–E requirements. -2. **#86 deployed by Aryan after its merge gates passed.** The647b549/dba28f7d startup and health checks pass. Complete the scoped notice smoke using an existing linked synthetic issue/thread, never a new public Omi issue; no repeat deployment is needed. Broader #85 retention and #51 outbox remain unfinished. +2. **#86 deployed by Aryan after its merge gates passed.** The `647b549` / `dba28f7d` startup/health and authorized existing-synthetic notice smoke pass. Reopen 15:34:57 IST, verified one reopening notice while open, then close 15:36:05 IST and one closing notice; the follow-up read still finds one per event and the issue closed. No new public Omi issue or repeat deployment was needed. Broader #85 retention and #51 outbox remain unfinished. 3. **#62's evidence-only implementation is merged as #88 / `884fb46`**, not deployed separately: real generation → reviewer → safety/presentation → clipping/send path, text-free keyed per-turn fingerprints, no customer text/identifiers, no filter behavior change or second presentation implementation. Nine new synthetic tests include actual handler/harness parity, concurrency and disabled-path coverage; full1174/offline8, exact-head CI and independent35-check scoped review pass at `c1fe9d6`, with independently confirmed behavioral sensitivity. **Keep #62 open:** a fresh independent synthetic check on integrated main still loses symptom/earlier-attempt context in a semicolon-joined narration sentence. Earlier language calling both narration/redirect repairs complete was too broad; #67/#80 repaired redirects, not this general narration path. Preserve prerequisites/safety when designing that repair. No historical causation or customer-resolution claim. Broader E2 execution-validity work remains #56. No paid call. -4. **Step5 preparation is drafted in [the memory pilot checklist](MEMORY_PILOT_PREPARATION.md)** from the actual implementation: test forum only, references not copied messages, 30 days, exact forgetting scope, real switch/restart timing, two-post scenario, 48-hour acceptance and rollback. The exact revised provider-disclosing notice wording is approved, but not published; no pilot has begun. Enablement still needs #86, processor/backup/privacy checks and Aryan's explicit enable instruction. -5. **#83 then #65 accuracy work**: [source provenance and conflict draft](SOURCE_CONFLICTS.md) carries publisher dates/explicit applicability through ingestion, chunks, PostgreSQL and evidence. It adds conservative equivalent-topic/scope/relevance date ordering and one shared answer/review policy; omission is not contradiction and dates are not release proof. An independent generic-heading collision was reproduced and repaired with full-cap/relevance guards; fourteen new regressions pass, including unchanged fetch/timeout/evidence bounds. Final current-head CI, independent re-review and approved generated-answer quality gates precede readiness. Not on main, no general accuracy claim, no held-out tailoring or paid comparison without asking. +4. **Step5 preparation is drafted in [the memory pilot checklist](MEMORY_PILOT_PREPARATION.md)** from the actual implementation: test forum only, references not copied messages, 30 days, exact forgetting scope, real switch/restart timing, two-post scenario, 48-hour acceptance and rollback. The exact revised provider-disclosing notice wording is approved, but not published; no pilot has begun. The #86 notice gate now passes; processor/backup/privacy checks and Aryan's explicit enable instruction still precede enablement. +5. **#83 then #65 accuracy work**: [source provenance and conflict draft](SOURCE_CONFLICTS.md) carries publisher dates/explicit applicability through ingestion, chunks, PostgreSQL and evidence. It adds conservative equivalent-topic/scope/relevance date ordering and one shared answer/review policy; omission is not contradiction and dates are not release proof. An independent generic-heading collision was reproduced and repaired with full-cap/relevance guards; fourteen new regressions pass, including unchanged fetch/timeout/evidence bounds. Runtime `42619cf` passes full 1,216/no-model 8/isolated SQL, exact-head hosted Node 20/24/real PostgreSQL and independent 69-check code review plus all four original reproduction assertions. Documentation-only follow-up heads need their current CI/review; approved generated-answer quality remains the runtime readiness gate. Not on main, no general accuracy claim, no held-out tailoring or paid comparison without asking. 6. **Complete C then D/E through the same pipeline**: scoped memory pilot; minimized owner signals; private grouped review; real official-source/regression validator; authorization-controlled fact publication/revocation; offline nightly checks; honest weekly outcomes; end-to-end demonstration. #51/#53/#56 remain integrated reliability/operations dependencies, not a parallel rewrite. **Need Aryan now:** no repeat retention or notice-wording decision; both are supplied. Draft a one-line courtesy note for him about the closed synthetic issue, never send it on his behalf. No Discord test now and no paid rerun. Later, give one exact Discord input only after the relevant approved runtime/observer is ready. Aryan sends every message, command and button action. No memory flag until notice approval **and** an explicit enable instruction. From b9d7274a9769a28d25fa97cba41f8d34c49d0bdc Mon Sep 17 00:00:00 2001 From: Aryan Date: Mon, 26 Oct 2026 17:42:41 +0530 Subject: [PATCH 4/8] Record controlled answer comparison and accuracy hold --- ROADMAP.md | 8 +++++--- docs/ARCHITECTURE.md | 4 ++-- docs/RUNBOOK.md | 4 +++- docs/SOURCE_CONFLICTS.md | 20 +++++++++++++++++++- docs/SUPPORT_MASTER_PLAN.md | 2 +- 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 9edfe9d..a8aa47f 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,15 +1,17 @@ # Mira roadmap -**October 26 current state:** #86 is operator-deployed as `647b549` / `dba28f7d`, explicitly confirmed by Aryan; fresh health/startup pass, one running instance, optional features and automatic deploy off. The authorized existing-synthetic reopen/close smoke passed with one notice per event and the issue closed again; no extra notice appeared at the follow-up read. This is bounded evidence, not a universal delivery guarantee. #89's Mira repository guide is merged as `a9c9508` with all checks/review; no runtime change after production. Draft #90/#83 adds publisher provenance, equivalent-topic/scope/relevance date ordering and shared conflict policy. The independent generic-heading displacement is reproduced/repaired, fourteen new regressions pass; final accuracy/re-review/CI gates remain. #62 stays open for narration/context loss. Main implementation 64/100; delivery 56/100; 44 left. No paid run, agent deployment or memory enablement. +**October 26 current state:** #86 is operator-deployed as `647b549` / `dba28f7d`, explicitly confirmed by Aryan; fresh health/startup pass, one running instance, optional features and automatic deploy off. The authorized existing-synthetic reopen/close smoke passed with one notice per event and the issue closed again; no extra notice appeared at the follow-up read. This is bounded evidence, not a universal delivery guarantee. #89's Mira repository guide is merged as `a9c9508` with all checks/review; no runtime change after production. Draft #90/#83 adds publisher provenance, equivalent-topic/scope/relevance date ordering and shared conflict policy. The independent generic-heading displacement is reproduced/repaired, fourteen new regressions pass; final accuracy/re-review/CI gates remain. #62 stays open for narration/context loss. Main implementation 64/100; delivery 56/100; 44 left. One approved controlled run completed; quality remains HOLD. No further paid run, agent deployment or memory enablement. ## Current audited dashboard — October 26, 2026 -#88 merged as `884fb46`, #87 merged as `928676b` and #86 merged as `647b549` after their gates. Aryan deployed `647b549` / `dba28f7d`; its health/startup and scoped synthetic notice checks pass. Memory-notice wording approval is not publication/enablement. No repeat policy question or paid run. Delivery score 56/100 is unchanged; optional controls/automatic deploy remain off. +#88 merged as `884fb46`, #87 merged as `928676b` and #86 merged as `647b549` after their gates. Aryan deployed `647b549` / `dba28f7d`; its health/startup and scoped synthetic notice checks pass. Memory-notice wording approval is not publication/enablement. No repeat policy question or further paid run. Delivery score 56/100 is unchanged; optional controls/automatic deploy remain off. The [master plan](docs/SUPPORT_MASTER_PLAN.md) is authoritative: audited main `a9c9508`, 16/25 implemented/tested/reviewed milestone foundations (**64/100 main implementation coverage**), eight verified operations, **56/100 delivery completion and 44 left**, not accuracy. Full A–E acceptance remains 2/21. The [dated issue audit](docs/SUPPORT_ISSUE_AUDIT_2026-10-25.md) closed speculative summaries #52 not planned. Eleven issues remain unresolved; #62 still reproduces narration/context loss. No assignments or production settings changed. -Next work: #83's source provenance/conflict handling, then #65 multipart accuracy, using merged stage evidence; remaining C/D/E and #51/#53/#56 dependencies remain. Do not recreate closed PRs or treat unfinished scope as complete. Every older checkpoint below is historical and superseded where it conflicts with this dashboard. +**Latest #90 quality decision — HOLD:** Aryan's one approved controlled comparison completed 48 flows/96 requests, main `a9c9508` versus candidate `c870a8b`, with valid execution/power and unchanged source/configuration. Independent pre-unblinding grading found main 19/24 and candidate 21/24 contract passes, with three candidate material failures: no-loss reassurance, unsupported cloud/UI state and invented completed staff flagging. This is not a whole-product accuracy score or proof of patch causation. [Scope, evidence and repair gates](docs/SOURCE_CONFLICTS.md). Original sources/results are preserved; unused request ceiling authorizes no rerun. #90 remains draft; no merge, rollout or extra Discord test. + +Next work: general offline fact-scope/reviewer and #62 narration-context repairs, then #83/#65 quality gates using merged stage evidence; remaining C/D/E and #51/#53/#56 dependencies remain. Another provider run needs a fresh approval. Do not recreate closed PRs or treat unfinished scope as complete. Every older checkpoint below is historical and superseded where it conflicts with this dashboard. ## Current October25 — Step2 merged, deterministic privacy repair next diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 820971d..5837411 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1,8 +1,8 @@ # Mira architecture -**October 26 current state:** Aryan confirmed his `647b549` / `dba28f7d` deployment; health/schema/Discord startup pass with one running instance and optional features/automatic deploy off. #86's scoped notice smoke now passes: one notice for each authorized synthetic reopen/close event, with the issue closed again. Main `a9c9508` adds only the reviewed Mira repository guide. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). No agent deployment, paid run or memory enablement. +**October 26 current state:** Aryan confirmed his `647b549` / `dba28f7d` deployment; health/schema/Discord startup pass with one running instance and optional features/automatic deploy off. #86's scoped notice smoke now passes: one notice for each authorized synthetic reopen/close event, with the issue closed again. Main `a9c9508` adds only the reviewed Mira repository guide. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). No agent deployment or memory enablement. -**#83 draft boundary:** one sourceProvenance module carries reliable publisher dates and explicitly declared software applicability through Help Center ingestion, parent-page JSONB, in-memory chunks, stored search and evidence formatting. Stored fusion/local ranking reorder only equivalent explicit scope/topic/source slots; they delete no source or complementary fact. One shared answer/review policy handles unresolved applicability/conflicts without a new model request. Existing budgets/authority/privacy/handoff paths remain. [Design, limitations and acceptance](SOURCE_CONFLICTS.md). This code is not on main and generated-answer accuracy remains unverified. +**#83 draft boundary:** one sourceProvenance module carries reliable publisher dates and explicitly declared software applicability through Help Center ingestion, parent-page JSONB, in-memory chunks, stored search and evidence formatting. Stored fusion/local ranking reorder only equivalent explicit scope/topic/source slots; they delete no source or complementary fact. One shared answer/review policy handles unresolved applicability/conflicts without a new model request. Existing budgets/authority/privacy/handoff paths remain. [Design, limitations and acceptance](SOURCE_CONFLICTS.md). This code is not on main. The one approved controlled comparison completed, but independent generated-answer review is **HOLD**: three candidate material defects in fact scope and staff-notification claims. Code/CI passes do not override that result; offline general repair and independent review precede any newly approved comparison. ## Current integrated boundary — October 26, 2026 diff --git a/docs/RUNBOOK.md b/docs/RUNBOOK.md index d6aa4c4..b65d116 100644 --- a/docs/RUNBOOK.md +++ b/docs/RUNBOOK.md @@ -1,12 +1,14 @@ # Mira operations runbook -**October 26 current state:** Aryan confirmed deploying647b549 as `dba28f7d` at 12:59 IST; fresh health/schema/Discord startup pass, one running instance, optional features and automatic deploy off. #86's authorized existing-synthetic reopen/close smoke passes with one notice per event and the issue closed again. Main `a9c9508` adds only reviewed Mira repository documentation; #83 is a separate unmerged source-conflict draft. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). No agent deployment, paid run, public Omi test issue or memory enablement. Mira is the product name; technical identifiers remain stable. +**October 26 current state:** Aryan confirmed deploying647b549 as `dba28f7d` at 12:59 IST; fresh health/schema/Discord startup pass, one running instance, optional features and automatic deploy off. #86's authorized existing-synthetic reopen/close smoke passes with one notice per event and the issue closed again. Main `a9c9508` adds only reviewed Mira repository documentation; #83 is a separate unmerged source-conflict draft. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). No agent deployment, public Omi test issue or memory enablement. Mira is the product name; technical identifiers remain stable. Do not delete receipt/cutoff rows to force webhook replay. The candidate ignores stale payload subject times, holds uncertain outcomes and retains a minimal customer/time cutoff after owner erasure; cleanup is mandatory even with optional features off. Fixed notice-retention errors mean pending cleanup, not erased records. An unexpected populated pre-lifecycle schema fails closed for review. The October 26 smoke used only the existing linked synthetic issue/thread; preserve that evidence rather than creating another public test issue. ## Current operation checkpoint — October 26, 2026 +**#90 controlled comparison complete; quality HOLD.** One authorized 48-flow run used 96 requests of its 288 ceiling. Original main/candidate sources, configuration, power history and all stages are retained. Independent review found three material candidate defects despite 21/24 contract passes (main 19/24). [Exact scope and gates](SOURCE_CONFLICTS.md). No automatic retry/rerun uses the unused ceiling. Continue offline repairs; another paid run requires a new approval. No Discord input, merge, deployment or optional-feature enablement is authorized by this result. + Fresh read confirms `647b549` / `dba28f7d` is healthy/latest with one running instance, optional controls and automatic deploy off; Aryan explicitly confirms triggering it. #86's 30-day receipt/replay/erasure code is deployed. The authorized existing-synthetic reopen/close smoke passed with one notice per event and the issue closed again; no extra notice appeared at the follow-up read. This is bounded evidence, not a universal delivery guarantee. Revised memory notice wording is approved, not posted or enabled. No new public Omi issue may be created for the smoke; use an existing linked synthetic case or reviewed alternative after the observer is ready. Use [the current master plan](SUPPORT_MASTER_PLAN.md), not historical deployment instructions below. Last verified production is exact `647b549` / `dba28f7d`, optional memory/context/fix-inbox and automatic deploy off. The earlier `c6f482d` / `3d4cb5d8` release is historical. Bounded how-to/damage/order/private-preview checks passed. Operator-triggered synthetic publication #23602 was separately closed not planned with the approved test-only note; it is not a customer incident or resolution. diff --git a/docs/SOURCE_CONFLICTS.md b/docs/SOURCE_CONFLICTS.md index b04ae66..c3fa5ad 100644 --- a/docs/SOURCE_CONFLICTS.md +++ b/docs/SOURCE_CONFLICTS.md @@ -36,4 +36,22 @@ Fourteen new synthetic tests cover ingestion/ambiguity, chunks, real formatted s The two-/three-part checks assert all six page requests start before any completes, the per-request timeout remains 10 seconds, and existing eight-chunk/9000-character output bounds hold. The real persistence/search/formatter owners are exercised against the isolated SQL engine, including an undated refresh and idempotent schema initialization. Runtime `42619cf` passes hosted Node 20/24/real PostgreSQL CI and independent scoped code review: 69 affected checks and all four original reproduction assertions. Later documentation-only heads retain their current CI/review requirement. The evaluation harness receives provenance through the same Help Center/chunk owners; its separate in-memory/storage limitations remain in the [evaluation guide](EVALUATION.md). -Before readiness: complete current-head CI, independent scope/accuracy review and the required approved generated-answer checks. No paid comparison is authorized merely by this draft. Keep #83 open until its full acceptance is evidenced; #65 multipart accuracy and #62 narration/context loss remain separate unfinished work. No deployment, memory enablement or extra Discord smoke follows from these tests. +## October 26 controlled answer comparison — HOLD + +Aryan approved one run with a ceiling of 288 requests. It completed all 48 answer flows using **96 requests**: twelve original fictional scenarios, two repetitions per arm, main `a9c9508` versus candidate `c870a8b` (runtime `42619cf`). Both arms used the same provider configuration and fixtures; initial starts were simultaneous and paired scenario starts differed by at most 4 ms. Both workers exited normally, source hashes stayed fixed, and saved full-window power history covers the run without a sleep/wake event. The single-use approval is consumed; unused ceiling is not authorization for another run. + +Independent grades were frozen before the randomized arm mapping was opened. All 48 flows and every saved stage were read. Main passed 19/24 contracts with five material failures; candidate passed 21/24 with three material failures. These small, fictional-case counts are **not current-product accuracy percentages or proof of improvement/causation**. The reviewer withheld approval despite the higher candidate count. + +| Candidate material failure | Saved stage finding | Required repair | +| --- | --- | --- | +| Categorical no-loss reassurance | Generated and reviewed text turn general local-pending behavior into a guarantee that a capture is not lost. | Keep intended behavior separate from verified customer state; preserve uncertainty and protective guidance. | +| Unsupported cloud-conversation state | Generated and reviewed text infer a cloud/UI outcome not established by the supplied source. | Require evidence for the actual state/visibility claim, not a plausible inference from upload behavior. | +| Invented completed staff notification | The reviewer introduces completed staff flagging with no dispatch or receipt. It survives presentation. | Enforce the distinction between a requested handoff and application-confirmed delivery throughout review/presentation. | + +Main also has material unsupported privacy/data-state claims and missing next-step/person-workflow outputs. Existing saved stages identify defects; they do not establish that the provenance change caused them. Date/version/surface handling and the German context survived the candidate review; final restored custody warnings were credited. Intermediate warning removal was not mislabeled as final warning loss. + +The controlled path exercises real fixture ingestion/chunks/ranking/evidence, answer generation, draft safety, reviewer/second-look ownership, presentation and final custody-warning restoration. A supplied neutral understanding replaces planning. It excludes live documentation, the full index-handler's late redirect/delivery composition and gateway/staff dispatch. No customer or protected input was used. It is not a production or real-Omi-fact check. + +Private evidence retains the original manifest, both source snapshots, all stages and the pre-unblinding grades. Manifest SHA256: `3279438a6d1ccac0024ff440fa6039ebe2896da1d11aa9fad7b40fbb8bbcd402`; independent grades SHA256: `358796a2d8bc18bec5812f48eceb6a110ebd55dfb4d2b629bd8ce536ccf88183`. The original candidate archive verifies all 156 manifest file hashes. No generated case text or credentials are published here. + +**Readiness remains HOLD:** code/CI review passes are separate from the failed generated-answer gate. Continue general offline repairs and affected-flow tests, then independent review. Any further provider comparison needs a fresh reviewed plan and Aryan's explicit approval. Keep #90 draft and #83 open; #65 multipart accuracy and #62 narration/context loss remain unfinished. No merge, deployment, memory enablement or Discord test follows from this result. diff --git a/docs/SUPPORT_MASTER_PLAN.md b/docs/SUPPORT_MASTER_PLAN.md index b97c1cd..d45a56e 100644 --- a/docs/SUPPORT_MASTER_PLAN.md +++ b/docs/SUPPORT_MASTER_PLAN.md @@ -50,7 +50,7 @@ The earlier PR backlog is cleared, not the full product backlog. #88 merged884fb 2. **#86 deployed by Aryan after its merge gates passed.** The `647b549` / `dba28f7d` startup/health and authorized existing-synthetic notice smoke pass. Reopen 15:34:57 IST, verified one reopening notice while open, then close 15:36:05 IST and one closing notice; the follow-up read still finds one per event and the issue closed. No new public Omi issue or repeat deployment was needed. Broader #85 retention and #51 outbox remain unfinished. 3. **#62's evidence-only implementation is merged as #88 / `884fb46`**, not deployed separately: real generation → reviewer → safety/presentation → clipping/send path, text-free keyed per-turn fingerprints, no customer text/identifiers, no filter behavior change or second presentation implementation. Nine new synthetic tests include actual handler/harness parity, concurrency and disabled-path coverage; full1174/offline8, exact-head CI and independent35-check scoped review pass at `c1fe9d6`, with independently confirmed behavioral sensitivity. **Keep #62 open:** a fresh independent synthetic check on integrated main still loses symptom/earlier-attempt context in a semicolon-joined narration sentence. Earlier language calling both narration/redirect repairs complete was too broad; #67/#80 repaired redirects, not this general narration path. Preserve prerequisites/safety when designing that repair. No historical causation or customer-resolution claim. Broader E2 execution-validity work remains #56. No paid call. 4. **Step5 preparation is drafted in [the memory pilot checklist](MEMORY_PILOT_PREPARATION.md)** from the actual implementation: test forum only, references not copied messages, 30 days, exact forgetting scope, real switch/restart timing, two-post scenario, 48-hour acceptance and rollback. The exact revised provider-disclosing notice wording is approved, but not published; no pilot has begun. The #86 notice gate now passes; processor/backup/privacy checks and Aryan's explicit enable instruction still precede enablement. -5. **#83 then #65 accuracy work**: [source provenance and conflict draft](SOURCE_CONFLICTS.md) carries publisher dates/explicit applicability through ingestion, chunks, PostgreSQL and evidence. It adds conservative equivalent-topic/scope/relevance date ordering and one shared answer/review policy; omission is not contradiction and dates are not release proof. An independent generic-heading collision was reproduced and repaired with full-cap/relevance guards; fourteen new regressions pass, including unchanged fetch/timeout/evidence bounds. Runtime `42619cf` passes full 1,216/no-model 8/isolated SQL, exact-head hosted Node 20/24/real PostgreSQL and independent 69-check code review plus all four original reproduction assertions. Documentation-only follow-up heads need their current CI/review; approved generated-answer quality remains the runtime readiness gate. Not on main, no general accuracy claim, no held-out tailoring or paid comparison without asking. +5. **#83/#90 generated-answer gate is HOLD; continue general offline accuracy and #62 repairs before #65.** [Source provenance and conflict draft/results](SOURCE_CONFLICTS.md) carries publisher dates/explicit applicability through the existing pipeline. Runtime `42619cf` passed full 1,216/no-model 8/isolated SQL, hosted Node 20/24/real PostgreSQL and independent code review. The one explicitly approved controlled comparison completed 48 flows/96 requests against main `a9c9508`, candidate `c870a8b`, with fixed sources/configuration and valid power/execution evidence. Independent grading before unblinding found main 19/24 and candidate 21/24 contract passes, but three candidate material failures: no-loss reassurance, unsupported cloud/UI state and reviewer-invented completed staff notification. No accuracy approval, causal claim or score increase follows. Both original snapshots/results are preserved. Continue offline fact-scope and narration/review-boundary repairs with independent review; no further provider run without a fresh approval. Documentation-only heads still need their current CI/review. #90 stays draft; #83/#62/#65 stay open. 6. **Complete C then D/E through the same pipeline**: scoped memory pilot; minimized owner signals; private grouped review; real official-source/regression validator; authorization-controlled fact publication/revocation; offline nightly checks; honest weekly outcomes; end-to-end demonstration. #51/#53/#56 remain integrated reliability/operations dependencies, not a parallel rewrite. **Need Aryan now:** no repeat retention or notice-wording decision; both are supplied. Draft a one-line courtesy note for him about the closed synthetic issue, never send it on his behalf. No Discord test now and no paid rerun. Later, give one exact Discord input only after the relevant approved runtime/observer is ready. Aryan sends every message, command and button action. No memory flag until notice approval **and** an explicit enable instruction. From a000adfd9916ca782b7c44cdd35121a04e36a6a7 Mon Sep 17 00:00:00 2001 From: Aryan Date: Wed, 28 Oct 2026 20:25:05 +0530 Subject: [PATCH 5/8] Retain the explicit memory enablement gate in current plan --- docs/SUPPORT_MASTER_PLAN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/SUPPORT_MASTER_PLAN.md b/docs/SUPPORT_MASTER_PLAN.md index 2734e9e..e629e64 100644 --- a/docs/SUPPORT_MASTER_PLAN.md +++ b/docs/SUPPORT_MASTER_PLAN.md @@ -79,7 +79,7 @@ The earlier PR backlog is cleared, not the full product backlog. #88 merged884fb **Release timing:** #91 is deployed at exact `a461f86` / `c42efc65`; the release receipt is in the runbook. Next release requires at least24 hours since this actual deployment, completed #91 smokes and fresh live/rollback/off-state/source checks. Another operator deployment can move that window. #90 is not part of the already deployed image. Never use Restart for teardown. -**Need Aryan now:** the three #91 Discord smokes, sequentially when prompted: normal phone-only how-to, broken-device symptom plus completed attempts, and explicit request for a person. Aryan sends every message, command and button action. No new quota, enabled memory, customer data or automatic message is requested. Continue #90's final gates and #83 offline work while waiting. +**Need Aryan now:** the three #91 Discord smokes, sequentially when prompted: normal phone-only how-to, broken-device symptom plus completed attempts, and explicit request for a person. Aryan sends every message, command and button action. No new quota, enabled memory, customer data or automatic message is requested. No memory flag until notice approval **and** an explicit enable instruction. Continue #90's final gates and #83 offline work while waiting. ## Fixed milestone ledger From 31c2d7eaeb406197525cbe8ef3b7257e72840b97 Mon Sep 17 00:00:00 2001 From: Aryan Date: Wed, 28 Oct 2026 20:30:37 +0530 Subject: [PATCH 6/8] Record the failed applicability smoke and approved rollback --- ROADMAP.md | 2 +- docs/ANSWER_QUALITY_CONTRACT.md | 2 +- docs/ARCHITECTURE.md | 2 +- docs/RUNBOOK.md | 2 +- docs/SOURCE_CONFLICTS.md | 2 +- docs/SUPPORT_MASTER_PLAN.md | 16 ++++++++-------- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 0f95c44..ba31145 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,6 +1,6 @@ # Mira roadmap -**Current October28:** #91 merged `a461f86` and deployed as `c42efc65`; startup/health/schema/Discord login pass with one running instance and optional/automatic deployment controls off. Aryan's three release smokes remain pending; rollback is `914a38f0` / `a9c9508`. #90 integrates this main with both provenance policy and unchanged transient removal audit/reviewer/second-look boundaries. Full1,258/offline8 and independent240-check integration review pass; final-head review/CI precede its merge. Offline exact-response replay now rejects the old staff-flag claim on current main and #90. No new generated score or date-specific causality is claimed. #90 ships only in the subsequent approved release, at least24h after this rollout and after smokes. #83 continues offline for unresolved next steps and unsupported source-applicability inference. Scores64/100 implementation and56/100 delivery remain unchanged; memory stays disabled. +**Current October28:** #91 merged a461f86. Its exact rollout c42efc65 passed startup and the normal how-to smoke. The broken-device reply preserved earlier restarts and delivered the full case privately, but applied Limitless-specific guidance without identifying the hardware. Independent review classified that as failed source applicability; rollback to verifieda9c9508/914a38f0 was requested and the third smoke held. #90 integrates #91:1,258/offline8 and independent240-check review pass; final-head review/CI precede merge. This does not fix unknown source applicability or produce a new generated score. Hold further releases while #83 receives a general offline repair and required review; no paid run, memory enablement or customer-resolution claim. Scores64/100 implementation and56/100 delivery remain unchanged. **Earlier October26 checkpoint:** #86 merged647b549 after1202/no-model8, exact-head hosted Node20/24/real PostgreSQL, independent review and merged-main CI. [Lifecycle details](docs/GITHUB_NOTICE_LIFECYCLE.md). The old PR backlog is cleared; new work is Mira repository presentation and local #83 source provenance/conflict handling. #62 stays open for reproduced narration/context loss despite merged diagnostics. Production stays c6f482d; no paid run, public Omi test issue or memory enablement. Main implementation64/100; delivery56/100;44 left. Technical identifiers remain unchanged under the Mira product name. diff --git a/docs/ANSWER_QUALITY_CONTRACT.md b/docs/ANSWER_QUALITY_CONTRACT.md index 41da48d..362ee67 100644 --- a/docs/ANSWER_QUALITY_CONTRACT.md +++ b/docs/ANSWER_QUALITY_CONTRACT.md @@ -4,7 +4,7 @@ Updated October 26, 2026. This is an implementation contract, **not a claim that ## Priority and status -The [master plan](SUPPORT_MASTER_PLAN.md) takes precedence. The old PR queue is cleared; #71/#75/#82 closed unmerged with unresolved requirements retained. #91 context preservation is merged/deployed at a461f86 with release smokes pending. #90 provenance integrates that main and awaits final review/CI; the frozen staff-flagging defect is rejected by both integrated #90 and current main. Shared unresolved-next-step/applicability weaknesses remain #83; no new paid run is authorized by these implementation checks. Preserve the maximum of three open PRs. +The [master plan](SUPPORT_MASTER_PLAN.md) takes precedence. The old PR queue is cleared; #71/#75/#82 closed unmerged with unresolved requirements retained. #91 context preservation is merged at a461f86; its rollout failed source applicability and was rolled back. Context/delivery passed, but that does not waive the failed grounding check. #90 provenance integrates that main and awaits final review/CI; the frozen staff-flagging defect is rejected by both integrated #90 and current main. Shared unresolved-next-step/applicability weaknesses remain #83; no new paid run is authorized by these implementation checks. Preserve the maximum of three open PRs. | Order | Customer failure to prevent | Required regression / acceptance | State | | --- | --- | --- | --- | diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 10e30b4..618650b 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1,6 +1,6 @@ # Mira architecture -**Current October28:** #91 merged `a461f86` and deployed as `c42efc65`; startup/health/schema/Discord login pass with one running instance and optional/automatic deployment controls off. Aryan's three release smokes remain pending; rollback is `914a38f0` / `a9c9508`. #90 integrates this main with both provenance policy and unchanged transient removal audit/reviewer/second-look boundaries. Full1,258/offline8 and independent240-check integration review pass; final-head review/CI precede its merge. Offline exact-response replay now rejects the old staff-flag claim on current main and #90. No new generated score or date-specific causality is claimed. #90 ships only in the subsequent approved release, at least24h after this rollout and after smokes. #83 continues offline for unresolved next steps and unsupported source-applicability inference. Scores64/100 implementation and56/100 delivery remain unchanged; memory stays disabled. +**Current October28:** #91 merged a461f86. Its exact rollout c42efc65 passed startup and the normal how-to smoke. The broken-device reply preserved earlier restarts and delivered the full case privately, but applied Limitless-specific guidance without identifying the hardware. Independent review classified that as failed source applicability; rollback to verifieda9c9508/914a38f0 was requested and the third smoke held. #90 integrates #91:1,258/offline8 and independent240-check review pass; final-head review/CI precede merge. This does not fix unknown source applicability or produce a new generated score. Hold further releases while #83 receives a general offline repair and required review; no paid run, memory enablement or customer-resolution claim. Scores64/100 implementation and56/100 delivery remain unchanged. **Earlier October26 checkpoint:** #86 merged647b549 after1202/no-model8, exact-head hosted Node20/24/real PostgreSQL, final independent review and merged-main CI. Its30-day subject-time replay guard, customer erasure and non-starvable cleanup are on main, awaiting release. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). Production stays c6f482d; no paid run, public Omi test issue or memory enablement. The product name is Mira; technical identifiers are stable. Separate #83 source-provenance work is local and not an accuracy claim. diff --git a/docs/RUNBOOK.md b/docs/RUNBOOK.md index 2c46c95..7c85b40 100644 --- a/docs/RUNBOOK.md +++ b/docs/RUNBOOK.md @@ -1,6 +1,6 @@ # Mira operations runbook -**Current October28 operator receipt:** #91 merged as `a461f868ad097ec93512aeaf111d63f4e4c96997` and deployed as `c42efc65-0efb-4ca2-adca-f5f93627b37f`. Exact merged-main CI and preflight pass: current-live rollback `914a38f0` / `a9c9508`, available rollback,24h cadence,100s drain, optional controls off, no automatic triggers and matching repository. New deployment is SUCCESS/latest, one running instance; health/schema/Discord login pass with zero matched startup failures. Three Aryan-operated release smokes remain pending, not passed. Use the verified rollback on failure. #90 is integrated for review only and is not live; its release requires24 hours after this rollout and accepted #91 smokes. No environment/settings changes, provider rerun, memory enablement or agent Discord posts. [Master plan](SUPPORT_MASTER_PLAN.md) is authoritative. +**Current October28 operator receipt:** #91 mergeda461f868ad097ec93512aeaf111d63f4e4c96997 and was deployed asc42efc65-0efb-4ca2-adca-f5f93627b37f, created20:05:37IST. Exact merged-main CI, rollback availability/cadence/source/off-state preflight, startup/health/schema/login and one running instance passed. Normal phone-only how-to smoke passed. The second smoke preserved the symptom/earlier attempts and delivered one matching private staff card, but improperly applied Limitless-specific guidance to unidentified hardware. Independent review called this a grounding failure. Under Aryan's failure rule, deploymentRollback of verified914a38f0/a9c9508 returnedtrue. Verify resulting baseline identity/health; third smoke and further releases are held. #90 is not deployed. No environment/settings changes, paid rerun, memory enablement or agent Discord posts. [Master plan](SUPPORT_MASTER_PLAN.md) controls current status. Do not delete receipt/cutoff rows to force webhook replay. The candidate ignores stale payload subject times, holds uncertain outcomes and retains a minimal customer/time cutoff after owner erasure; cleanup is mandatory even with optional features off. Fixed notice-retention errors mean pending cleanup, not erased records. An unexpected populated pre-lifecycle schema fails closed for review. Use an existing linked synthetic issue/thread for the next approved-release smoke; no new public issue. diff --git a/docs/SOURCE_CONFLICTS.md b/docs/SOURCE_CONFLICTS.md index dcd7485..f0a85db 100644 --- a/docs/SOURCE_CONFLICTS.md +++ b/docs/SOURCE_CONFLICTS.md @@ -62,4 +62,4 @@ Main #91 (`a461f86`) is now integrated with a merge commit, retaining both sourc Fresh offline injection of the exact frozen unsafe reviewer response through both normal and compact paths confirms old main/frozen#90 accept it while current main/integrated#90 remove/audit the invented flag, invalidate approval and invoke the existing second look. Repeated unsafe reviews stay rejected/escalated. This establishes an inherited acceptance gap now blocked for this observed defect. It does not prove that prompt changes had no influence on stochastic wording; no provenance-specific cause or integrated generated accuracy rate is claimed. -The independent reviewer recommends merge after final-head review and Node20/24/real PostgreSQL CI. Aryan's conditional max96-request run is not activated; no paid run occurred. Keep the frozen21/24 versus19/24 and all original grades unchanged. #83 stays open for the remaining email-only/no-next-step and unsupported applicability problems, addressed offline next with general red-before tests. #65 remains unfinished. #90 releases separately at least24 hours after #91, after accepted #91 smokes and fresh release gates. Memory remains off. +The independent reviewer recommends merge after final-head review and Node20/24/real PostgreSQL CI. Aryan's conditional max96-request run is not activated; no paid run occurred. Keep the frozen21/24 versus19/24 and all original grades unchanged. #83 stays open for the remaining email-only/no-next-step and unsupported applicability problems, addressed offline next with general red-before tests. #65 remains unfinished. #90 release is held after #91 rollout failed source applicability and rollback was requested. Its provenance foundation does not establish customer hardware scope; #83 offline work and required review precede another rollout. Memory remains off. diff --git a/docs/SUPPORT_MASTER_PLAN.md b/docs/SUPPORT_MASTER_PLAN.md index e629e64..afaa62c 100644 --- a/docs/SUPPORT_MASTER_PLAN.md +++ b/docs/SUPPORT_MASTER_PLAN.md @@ -1,6 +1,6 @@ # Mira: master product plan -Updated October 28, 2026 (IST). #91 merged as `a461f868ad097ec93512aeaf111d63f4e4c96997` and is deployed as `c42efc65-0efb-4ca2-adca-f5f93627b37f`; the three Aryan-operated release smokes remain pending. Current GitHub main is `a461f868ad097ec93512aeaf111d63f4e4c96997`; the fixed milestone foundation audit remains recorded against `647b549bade498573e6fb2a16bf4544377884b1e`. The repository-guide update adds no completed milestone; evidence hooks alone do not complete an additional product requirement. Aryan sets product priorities; this is the single current product checklist. The product is Mira; technical repository/deployment/package identifiers remain unchanged. +Updated October 28, 2026 (IST). #91 merged as `a461f868ad097ec93512aeaf111d63f4e4c96997` and is deployed as `c42efc65-0efb-4ca2-adca-f5f93627b37f`; normal how-to smoke passed, but the broken-device smoke failed source applicability and rollback was requested; the third smoke is held. Current GitHub main is `a461f868ad097ec93512aeaf111d63f4e4c96997`; the fixed milestone foundation audit remains recorded against `647b549bade498573e6fb2a16bf4544377884b1e`. The repository-guide update adds no completed milestone; evidence hooks alone do not complete an additional product requirement. Aryan sets product priorities; this is the single current product checklist. The product is Mira; technical repository/deployment/package identifiers remain unchanged. ## Current score — 56 / 100 done, 44 / 100 left @@ -27,7 +27,7 @@ Require **no candidate-only material final-answer failure**, **no protected-hand | Draft | Evidence and disposition | Remaining work | | --- | --- | --- | -| [#91 — context preservation](https://github.com/BasedHardware/omi-vector-bot/pull/91), #62 | **Merged `a461f86`, deployed `c42efc65`.** Exact original reviewed runtime restored; 22/24 versus main 21/24, no candidate-only material final failure or tested required-person regression. Final independent review, 1,244 full/8 no-model and head/merged-main Node20/24/PostgreSQL CI pass. | Aryan's normal how-to, symptom/earlier-attempt and explicit-person smokes; roll back on failure. Wider #83 applicability/next-step weakness remains open. | +| [#91 — context preservation](https://github.com/BasedHardware/omi-vector-bot/pull/91), #62 | **Merged `a461f86`; attempted rollout `c42efc65` rolled back after smoke failure.** Exact original reviewed runtime restored; 22/24 versus main 21/24, no candidate-only material final failure or tested required-person regression. Final independent review, 1,244 full/8 no-model and head/merged-main Node20/24/PostgreSQL CI pass. | Normal how-to passed. Symptom/earlier-attempt preservation and private delivery passed, but the answer applied Limitless-only guidance to unidentified hardware. Independent review called the smoke failed; rollback to a9c9508 requested. Third smoke held; fix #83 applicability before another release. | | [#90 — source provenance](https://github.com/BasedHardware/omi-vector-bot/pull/90), #83 | Frozen 21/24 versus old main 19/24; mapping below complete. New main with #91 integrated via merge commit; preserve both source policy and first-filter audit. Full 1,258 and no-model 8 pass. Independent integration code review and 240 focused checks pass. | Final-commit review and current Node20/24/PostgreSQL CI, then authorized merge. No paid rerun: current main and integrated #90 both reject the observed candidate-only staff claim. Frozen counts are not a fresh integrated accuracy score. | ### #90 frozen final-answer failure mapping @@ -50,13 +50,13 @@ The withdrawn #91 follow-up remains a failed attempt: 23/24 versus main 21/24, w | --- | --- | | **On main** | Concise support voice/routing/retrieval/clipping; #48 confidence/source-fit foundation; #59 calm practical AI-labelled voice; #41 staff case/pickup lifecycle; #60 localized closure; #76 request limits and #70 known-unsent recovery; #67/#80 in-thread/redirect cleanup; #81 localized rejected-review copy; #28 durable private engineering approvals; #84 application-owned public-intake privacy. | | **On main, disabled** | #61 references-only memory and bounded context, #73 SQL/reader safety rehearsal, #74 owner-scoped correction-link forgetting, #49 reviewed-fact/revocation foundation. Merged code is not permission to use customer history or publish facts. | -| **Current production, smokes pending** | Exact `a461f86`, deployment `c42efc65`, October28. Health, schema initialization, Discord login and one running/latest instance pass; automatic deployments and optional memory/context/fix-inbox stay off. Rollback `914a38f0` / `a9c9508` verified before dispatch. This is startup verification; the three new release smokes are not yet passed. | +| **Release rolled back; verification pending** | #91 exact a461f86/c42efc65 passed startup but failed the broken-device source-applicability smoke. Confirmed rollback mutation targets verified baseline914a38f0/a9c9508. Normal how-to and context/private-delivery portions passed; do not call the release accepted. Third smoke held. Optional/automatic deployment controls remain off. | | **Passed limited release checks** | October25 phone-only how-to, damaged-item privacy, order-status privacy, and exact staff-authored sanitized private engineering preview. These are bounded scenarios, not full A–E acceptance. | | **Separate operator action** | Aryan clicked Publish after the preview stop point. Synthetic issue #23602 was created and, with his separate approval, closed not planned with a test-only note. Preserve history; no real customer incident, automatic publication or customer-resolution claim. | | **Deployed, scoped notice smoke passed** | [#86](https://github.com/BasedHardware/omi-vector-bot/pull/86), merge `647b549`: **Receipt lifecycle approved October26:**30 days, original payload-subject-age rejection and customer erasure. Full 1,202/no-model 8, exact-head hosted Node 20/24/real PostgreSQL and independent 85-test/signed HTTP/SQL/two-migration-probe review passed. Aryan deployed it; health/startup pass. He explicitly approved a reopen/verify/close/verify round trip on existing synthetic issue #23602. One notice per event, ordered open checkpoint then closure, final issue closed not planned and no extra notice at the follow-up read. This does not prove every replay/external-send outcome. [Lifecycle and limits](GITHUB_NOTICE_LIFECYCLE.md). No implicit memory enablement. | | **Closed without merge** | #71, #75 and #82 failed their final accuracy/execution disposition; #29/#30/#68/#77/#78 were closed with remaining scope/evidence retained. Do not reopen or rerun them automatically. #65/#51/#56/#62 keep the unresolved needs. | -The earlier PR backlog is cleared, not the full product backlog. #88 merged884fb46; #87 merged928676b; #86 merged647b549 after all required checks/review. Aryan's647b549/dba28f7d rollout and scoped #86 smoke are verified separately. #89's Mira repository guide is on maina9c9508. #91 context preservation is merged and deployed with smokes pending; #90 provenance is integrated and awaiting its final gates. Broader #83/#65 work remains. Stay within the standing maximum of three open PRs, including ready PRs; every new PR starts draft. No count-driven merge or scope loss. Runtime/notice wording approvals do not grant deployment, settings, assignment, paid reruns or memory enablement. +The earlier PR backlog is cleared, not the full product backlog. #88 merged884fb46; #87 merged928676b; #86 merged647b549 after all required checks/review. Aryan's647b549/dba28f7d rollout and scoped #86 smoke are verified separately. #89's Mira repository guide is on maina9c9508. #91 context preservation is merged; its rollout failed the source-applicability smoke and was rolled back; #90 provenance is integrated and awaiting its final gates. Broader #83/#65 work remains. Stay within the standing maximum of three open PRs, including ready PRs; every new PR starts draft. No count-driven merge or scope loss. Runtime/notice wording approvals do not grant deployment, settings, assignment, paid reruns or memory enablement. ## Issues — audited decisions, not count-driven closure @@ -70,16 +70,16 @@ The earlier PR backlog is cleared, not the full product backlog. #88 merged884fb ## Next steps — accuracy first, then controlled enablement -1. **Finish #91 release acceptance.** Merge and deployment are complete. Aryan sends the three test-forum inputs, one at a time; inspect each reply and matching staff receipt when required. Preserve rollback on any failure and do not claim production acceptance before the smokes. -2. **Finish #90 final gates and merge.** Integration, 1,258/8 checks and independent code/replay review pass; final head review/CI remain. Its next release is at least 24 hours after #91 and after #91 smoke acceptance, with fresh exact-SHA/rollback/off-state gates. Start #83 offline next: general unresolved-next-step and conflicting-source applicability boundaries with synthetic red-before tests, no paid run or assumed model self-certification. +1. **Finish #91 release acceptance.** Merge is complete; release is rejected and rollback requested. Verify baseline health/startup and fix the general applicability boundary under #83. Preserve the passing how-to and context/delivery evidence without presenting them as whole-release acceptance. Do not request the third smoke on the rejected image. +2. **Finish #90 final gates and merge.** Integration, 1,258/8 checks and independent code/replay review pass; final head review/CI remain. Further release is held after the failed #91 smoke. Complete #83 applicability work/review and fresh release timing/exact-SHA/rollback/off-state gates before shipping anything. Start #83 offline next: general unresolved-next-step and conflicting-source applicability boundaries with synthetic red-before tests, no paid run or assumed model self-certification. 3. **Return to multipart phone-only accuracy (#65, A2).** #71/#75/#82 remain closed unmerged; do not reopen or rerun them automatically. Preserve their evidence and unfinished requirements. General routing/retrieval/coverage changes belong in the same answer/review pipeline, with no claim that #62 context repair alone resolves multipart accuracy. 4. **Complete memory preparation before a separately approved pilot (C1–C4).** The [pilot checklist](MEMORY_PILOT_PREPARATION.md) is drafted: test forum only, references rather than copied messages, 30 days, owner erasure, switch/restart timing, two-post scenario, 48 clean hours and rollback. Revised provider-disclosing notice wording is approved but not published; #86's separately approved existing-issue notice smoke passed. Processor/backup/privacy checks, approved isolated runtime/release and Aryan's explicit enable instruction still precede any saving or use of history. No pilot has begun. 5. **Build reviewed improvements through the same pipeline (D1–D6, then E1–E3).** Minimized owner signals → safe grouping/private review → official-source and regression validation → authorized fact publication/revocation → offline nightly checks and visible failures → honest weekly outcome reporting → the full end-to-end demonstration. Existing disabled stores are foundations, not completed D requirements or permission to publish/train. 6. **Retain the reliability and operations dependencies.** #51 uncertain-send/outbox reconciliation, #53 staff queue/coverage, #56 capability/failure and invalid-generation diagnostics, and #85 retention/erasure remain open at their actual stages. Integrate each into the existing jobs, approvals, knowledge and delivery owners rather than adding disconnected workflows. Parked access/security work retains its scope and authorization boundary in the issue audit. -**Release timing:** #91 is deployed at exact `a461f86` / `c42efc65`; the release receipt is in the runbook. Next release requires at least24 hours since this actual deployment, completed #91 smokes and fresh live/rollback/off-state/source checks. Another operator deployment can move that window. #90 is not part of the already deployed image. Never use Restart for teardown. +**Release timing:** #91 rollout a461f86/c42efc65 failed the broken-device smoke: Limitless-specific guidance was presented without identifying the customer hardware. Rollback to a9c9508 was explicitly requested under the approved failure rule. Verify replacement identity/health and use its actual creation time for any24-hour interval. Hold further releases until the general source-applicability issue and required checks are resolved. #90 is not deployed. Never use Restart for teardown. -**Need Aryan now:** the three #91 Discord smokes, sequentially when prompted: normal phone-only how-to, broken-device symptom plus completed attempts, and explicit request for a person. Aryan sends every message, command and button action. No new quota, enabled memory, customer data or automatic message is requested. No memory flag until notice approval **and** an explicit enable instruction. Continue #90's final gates and #83 offline work while waiting. +**Need Aryan now:** no additional Discord input; the third smoke is held after the failed second smoke. Continue #90 final gates and #83 offline work. Aryan sends every message, command and button action. No new quota, enabled memory, customer data or automatic message is requested. No memory flag until notice approval **and** an explicit enable instruction. Continue #90's final gates and #83 offline work while waiting. ## Fixed milestone ledger From 9d07b1d7c8285ade5c6b274c190bd7d35a57e973 Mon Sep 17 00:00:00 2001 From: Aryan Date: Wed, 28 Oct 2026 20:33:07 +0530 Subject: [PATCH 7/8] Verify rollback baseline and preserve the applicability release hold --- ROADMAP.md | 2 +- docs/ARCHITECTURE.md | 2 +- docs/RUNBOOK.md | 2 +- docs/SUPPORT_MASTER_PLAN.md | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index ba31145..89a8ecf 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,6 +1,6 @@ # Mira roadmap -**Current October28:** #91 merged a461f86. Its exact rollout c42efc65 passed startup and the normal how-to smoke. The broken-device reply preserved earlier restarts and delivered the full case privately, but applied Limitless-specific guidance without identifying the hardware. Independent review classified that as failed source applicability; rollback to verifieda9c9508/914a38f0 was requested and the third smoke held. #90 integrates #91:1,258/offline8 and independent240-check review pass; final-head review/CI precede merge. This does not fix unknown source applicability or produce a new generated score. Hold further releases while #83 receives a general offline repair and required review; no paid run, memory enablement or customer-resolution claim. Scores64/100 implementation and56/100 delivery remain unchanged. +**Current October28:** #91 merged a461f86. Its exact rollout c42efc65 passed startup and the normal how-to smoke. The broken-device reply preserved earlier restarts and delivered the full case privately, but applied Limitless-specific guidance without identifying the hardware. Independent review classified that as failed source applicability; rollback toa9c9508/a6ef6b22 is verified healthy and the third smoke held. #90 integrates #91:1,258/offline8 and independent240-check review pass; final-head review/CI precede merge. This does not fix unknown source applicability or produce a new generated score. Hold further releases while #83 receives a general offline repair and required review; no paid run, memory enablement or customer-resolution claim. Scores64/100 implementation and56/100 delivery remain unchanged. **Earlier October26 checkpoint:** #86 merged647b549 after1202/no-model8, exact-head hosted Node20/24/real PostgreSQL, independent review and merged-main CI. [Lifecycle details](docs/GITHUB_NOTICE_LIFECYCLE.md). The old PR backlog is cleared; new work is Mira repository presentation and local #83 source provenance/conflict handling. #62 stays open for reproduced narration/context loss despite merged diagnostics. Production stays c6f482d; no paid run, public Omi test issue or memory enablement. Main implementation64/100; delivery56/100;44 left. Technical identifiers remain unchanged under the Mira product name. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 618650b..422e019 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1,6 +1,6 @@ # Mira architecture -**Current October28:** #91 merged a461f86. Its exact rollout c42efc65 passed startup and the normal how-to smoke. The broken-device reply preserved earlier restarts and delivered the full case privately, but applied Limitless-specific guidance without identifying the hardware. Independent review classified that as failed source applicability; rollback to verifieda9c9508/914a38f0 was requested and the third smoke held. #90 integrates #91:1,258/offline8 and independent240-check review pass; final-head review/CI precede merge. This does not fix unknown source applicability or produce a new generated score. Hold further releases while #83 receives a general offline repair and required review; no paid run, memory enablement or customer-resolution claim. Scores64/100 implementation and56/100 delivery remain unchanged. +**Current October28:** #91 merged a461f86. Its exact rollout c42efc65 passed startup and the normal how-to smoke. The broken-device reply preserved earlier restarts and delivered the full case privately, but applied Limitless-specific guidance without identifying the hardware. Independent review classified that as failed source applicability; rollback toa9c9508/a6ef6b22 is verified healthy and the third smoke held. #90 integrates #91:1,258/offline8 and independent240-check review pass; final-head review/CI precede merge. This does not fix unknown source applicability or produce a new generated score. Hold further releases while #83 receives a general offline repair and required review; no paid run, memory enablement or customer-resolution claim. Scores64/100 implementation and56/100 delivery remain unchanged. **Earlier October26 checkpoint:** #86 merged647b549 after1202/no-model8, exact-head hosted Node20/24/real PostgreSQL, final independent review and merged-main CI. Its30-day subject-time replay guard, customer erasure and non-starvable cleanup are on main, awaiting release. [Lifecycle details](GITHUB_NOTICE_LIFECYCLE.md). Production stays c6f482d; no paid run, public Omi test issue or memory enablement. The product name is Mira; technical identifiers are stable. Separate #83 source-provenance work is local and not an accuracy claim. diff --git a/docs/RUNBOOK.md b/docs/RUNBOOK.md index 7c85b40..7672798 100644 --- a/docs/RUNBOOK.md +++ b/docs/RUNBOOK.md @@ -1,6 +1,6 @@ # Mira operations runbook -**Current October28 operator receipt:** #91 mergeda461f868ad097ec93512aeaf111d63f4e4c96997 and was deployed asc42efc65-0efb-4ca2-adca-f5f93627b37f, created20:05:37IST. Exact merged-main CI, rollback availability/cadence/source/off-state preflight, startup/health/schema/login and one running instance passed. Normal phone-only how-to smoke passed. The second smoke preserved the symptom/earlier attempts and delivered one matching private staff card, but improperly applied Limitless-specific guidance to unidentified hardware. Independent review called this a grounding failure. Under Aryan's failure rule, deploymentRollback of verified914a38f0/a9c9508 returnedtrue. Verify resulting baseline identity/health; third smoke and further releases are held. #90 is not deployed. No environment/settings changes, paid rerun, memory enablement or agent Discord posts. [Master plan](SUPPORT_MASTER_PLAN.md) controls current status. +**Current October28 operator receipt:** #91 mergeda461f868ad097ec93512aeaf111d63f4e4c96997 and was deployed asc42efc65-0efb-4ca2-adca-f5f93627b37f, created20:05:37IST. Exact merged-main CI, rollback availability/cadence/source/off-state preflight, startup/health/schema/login and one running instance passed. Normal phone-only how-to smoke passed. The second smoke preserved the symptom/earlier attempts and delivered one matching private staff card, but improperly applied Limitless-specific guidance to unidentified hardware. Independent review called this a grounding failure. Under Aryan's failure rule, deploymentRollback of verified914a38f0/a9c9508 returnedtrue. Replacementa6ef6b22-26b3-4744-ab8d-e067311ff7da/a9c9508, createdOctober28 at20:27:42IST, is SUCCESS/latest/one running; health/schema/login pass with zero matched startup failures and optional/automatic deployment controls off. Earliest cadence-only window isOctober29 at20:27:42IST; applicability repair/review remains a separate release hold. Third smoke and further releases are held. #90 is not deployed. No environment/settings changes, paid rerun, memory enablement or agent Discord posts. [Master plan](SUPPORT_MASTER_PLAN.md) controls current status. Do not delete receipt/cutoff rows to force webhook replay. The candidate ignores stale payload subject times, holds uncertain outcomes and retains a minimal customer/time cutoff after owner erasure; cleanup is mandatory even with optional features off. Fixed notice-retention errors mean pending cleanup, not erased records. An unexpected populated pre-lifecycle schema fails closed for review. Use an existing linked synthetic issue/thread for the next approved-release smoke; no new public issue. diff --git a/docs/SUPPORT_MASTER_PLAN.md b/docs/SUPPORT_MASTER_PLAN.md index afaa62c..89b4052 100644 --- a/docs/SUPPORT_MASTER_PLAN.md +++ b/docs/SUPPORT_MASTER_PLAN.md @@ -1,6 +1,6 @@ # Mira: master product plan -Updated October 28, 2026 (IST). #91 merged as `a461f868ad097ec93512aeaf111d63f4e4c96997` and is deployed as `c42efc65-0efb-4ca2-adca-f5f93627b37f`; normal how-to smoke passed, but the broken-device smoke failed source applicability and rollback was requested; the third smoke is held. Current GitHub main is `a461f868ad097ec93512aeaf111d63f4e4c96997`; the fixed milestone foundation audit remains recorded against `647b549bade498573e6fb2a16bf4544377884b1e`. The repository-guide update adds no completed milestone; evidence hooks alone do not complete an additional product requirement. Aryan sets product priorities; this is the single current product checklist. The product is Mira; technical repository/deployment/package identifiers remain unchanged. +Updated October 28, 2026 (IST). #91 merged as `a461f868ad097ec93512aeaf111d63f4e4c96997` and is deployed as `c42efc65-0efb-4ca2-adca-f5f93627b37f`; normal how-to smoke passed, but the broken-device smoke failed source applicability and rollback to a9c9508/a6ef6b22 is verified healthy; the third smoke is held. Current GitHub main is `a461f868ad097ec93512aeaf111d63f4e4c96997`; the fixed milestone foundation audit remains recorded against `647b549bade498573e6fb2a16bf4544377884b1e`. The repository-guide update adds no completed milestone; evidence hooks alone do not complete an additional product requirement. Aryan sets product priorities; this is the single current product checklist. The product is Mira; technical repository/deployment/package identifiers remain unchanged. ## Current score — 56 / 100 done, 44 / 100 left @@ -27,7 +27,7 @@ Require **no candidate-only material final-answer failure**, **no protected-hand | Draft | Evidence and disposition | Remaining work | | --- | --- | --- | -| [#91 — context preservation](https://github.com/BasedHardware/omi-vector-bot/pull/91), #62 | **Merged `a461f86`; attempted rollout `c42efc65` rolled back after smoke failure.** Exact original reviewed runtime restored; 22/24 versus main 21/24, no candidate-only material final failure or tested required-person regression. Final independent review, 1,244 full/8 no-model and head/merged-main Node20/24/PostgreSQL CI pass. | Normal how-to passed. Symptom/earlier-attempt preservation and private delivery passed, but the answer applied Limitless-only guidance to unidentified hardware. Independent review called the smoke failed; rollback to a9c9508 requested. Third smoke held; fix #83 applicability before another release. | +| [#91 — context preservation](https://github.com/BasedHardware/omi-vector-bot/pull/91), #62 | **Merged `a461f86`; attempted rollout `c42efc65` rolled back after smoke failure.** Exact original reviewed runtime restored; 22/24 versus main 21/24, no candidate-only material final failure or tested required-person regression. Final independent review, 1,244 full/8 no-model and head/merged-main Node20/24/PostgreSQL CI pass. | Normal how-to passed. Symptom/earlier-attempt preservation and private delivery passed, but the answer applied Limitless-only guidance to unidentified hardware. Independent review called the smoke failed; rollback to a9c9508/a6ef6b22 verified healthy. Third smoke held; fix #83 applicability before another release. | | [#90 — source provenance](https://github.com/BasedHardware/omi-vector-bot/pull/90), #83 | Frozen 21/24 versus old main 19/24; mapping below complete. New main with #91 integrated via merge commit; preserve both source policy and first-filter audit. Full 1,258 and no-model 8 pass. Independent integration code review and 240 focused checks pass. | Final-commit review and current Node20/24/PostgreSQL CI, then authorized merge. No paid rerun: current main and integrated #90 both reject the observed candidate-only staff claim. Frozen counts are not a fresh integrated accuracy score. | ### #90 frozen final-answer failure mapping @@ -50,7 +50,7 @@ The withdrawn #91 follow-up remains a failed attempt: 23/24 versus main 21/24, w | --- | --- | | **On main** | Concise support voice/routing/retrieval/clipping; #48 confidence/source-fit foundation; #59 calm practical AI-labelled voice; #41 staff case/pickup lifecycle; #60 localized closure; #76 request limits and #70 known-unsent recovery; #67/#80 in-thread/redirect cleanup; #81 localized rejected-review copy; #28 durable private engineering approvals; #84 application-owned public-intake privacy. | | **On main, disabled** | #61 references-only memory and bounded context, #73 SQL/reader safety rehearsal, #74 owner-scoped correction-link forgetting, #49 reviewed-fact/revocation foundation. Merged code is not permission to use customer history or publish facts. | -| **Release rolled back; verification pending** | #91 exact a461f86/c42efc65 passed startup but failed the broken-device source-applicability smoke. Confirmed rollback mutation targets verified baseline914a38f0/a9c9508. Normal how-to and context/private-delivery portions passed; do not call the release accepted. Third smoke held. Optional/automatic deployment controls remain off. | +| **Release rolled back; baseline verified** | #91 exact a461f86/c42efc65 passed startup but failed the broken-device source-applicability smoke. Verified rollback replacementa6ef6b22 runs baselinea9c9508, healthy/latest/one running with schema/login ready. Normal how-to and context/private-delivery portions passed; do not call the release accepted. Third smoke held. Optional/automatic deployment controls remain off. | | **Passed limited release checks** | October25 phone-only how-to, damaged-item privacy, order-status privacy, and exact staff-authored sanitized private engineering preview. These are bounded scenarios, not full A–E acceptance. | | **Separate operator action** | Aryan clicked Publish after the preview stop point. Synthetic issue #23602 was created and, with his separate approval, closed not planned with a test-only note. Preserve history; no real customer incident, automatic publication or customer-resolution claim. | | **Deployed, scoped notice smoke passed** | [#86](https://github.com/BasedHardware/omi-vector-bot/pull/86), merge `647b549`: **Receipt lifecycle approved October26:**30 days, original payload-subject-age rejection and customer erasure. Full 1,202/no-model 8, exact-head hosted Node 20/24/real PostgreSQL and independent 85-test/signed HTTP/SQL/two-migration-probe review passed. Aryan deployed it; health/startup pass. He explicitly approved a reopen/verify/close/verify round trip on existing synthetic issue #23602. One notice per event, ordered open checkpoint then closure, final issue closed not planned and no extra notice at the follow-up read. This does not prove every replay/external-send outcome. [Lifecycle and limits](GITHUB_NOTICE_LIFECYCLE.md). No implicit memory enablement. | @@ -70,14 +70,14 @@ The earlier PR backlog is cleared, not the full product backlog. #88 merged884fb ## Next steps — accuracy first, then controlled enablement -1. **Finish #91 release acceptance.** Merge is complete; release is rejected and rollback requested. Verify baseline health/startup and fix the general applicability boundary under #83. Preserve the passing how-to and context/delivery evidence without presenting them as whole-release acceptance. Do not request the third smoke on the rejected image. +1. **Finish #91 release acceptance.** Merge is complete; release is rejected and rollback baseline health/startup is verified. and fix the general applicability boundary under #83. Preserve the passing how-to and context/delivery evidence without presenting them as whole-release acceptance. Do not request the third smoke on the rejected image. 2. **Finish #90 final gates and merge.** Integration, 1,258/8 checks and independent code/replay review pass; final head review/CI remain. Further release is held after the failed #91 smoke. Complete #83 applicability work/review and fresh release timing/exact-SHA/rollback/off-state gates before shipping anything. Start #83 offline next: general unresolved-next-step and conflicting-source applicability boundaries with synthetic red-before tests, no paid run or assumed model self-certification. 3. **Return to multipart phone-only accuracy (#65, A2).** #71/#75/#82 remain closed unmerged; do not reopen or rerun them automatically. Preserve their evidence and unfinished requirements. General routing/retrieval/coverage changes belong in the same answer/review pipeline, with no claim that #62 context repair alone resolves multipart accuracy. 4. **Complete memory preparation before a separately approved pilot (C1–C4).** The [pilot checklist](MEMORY_PILOT_PREPARATION.md) is drafted: test forum only, references rather than copied messages, 30 days, owner erasure, switch/restart timing, two-post scenario, 48 clean hours and rollback. Revised provider-disclosing notice wording is approved but not published; #86's separately approved existing-issue notice smoke passed. Processor/backup/privacy checks, approved isolated runtime/release and Aryan's explicit enable instruction still precede any saving or use of history. No pilot has begun. 5. **Build reviewed improvements through the same pipeline (D1–D6, then E1–E3).** Minimized owner signals → safe grouping/private review → official-source and regression validation → authorized fact publication/revocation → offline nightly checks and visible failures → honest weekly outcome reporting → the full end-to-end demonstration. Existing disabled stores are foundations, not completed D requirements or permission to publish/train. 6. **Retain the reliability and operations dependencies.** #51 uncertain-send/outbox reconciliation, #53 staff queue/coverage, #56 capability/failure and invalid-generation diagnostics, and #85 retention/erasure remain open at their actual stages. Integrate each into the existing jobs, approvals, knowledge and delivery owners rather than adding disconnected workflows. Parked access/security work retains its scope and authorization boundary in the issue audit. -**Release timing:** #91 rollout a461f86/c42efc65 failed the broken-device smoke: Limitless-specific guidance was presented without identifying the customer hardware. Rollback to a9c9508 was explicitly requested under the approved failure rule. Verify replacement identity/health and use its actual creation time for any24-hour interval. Hold further releases until the general source-applicability issue and required checks are resolved. #90 is not deployed. Never use Restart for teardown. +**Release timing:** #91 rollout a461f86/c42efc65 failed the broken-device smoke: Limitless-specific guidance was presented without identifying the customer hardware. Rollback to a9c9508 was explicitly requested under the approved failure rule. Replacementa6ef6b22/a9c9508 is verified healthy, createdOctober28 at20:27:42IST; earliest cadence-only window isOctober29 at20:27:42IST, not permission to deploy. Hold further releases until the general source-applicability issue and required checks are resolved. #90 is not deployed. Never use Restart for teardown. **Need Aryan now:** no additional Discord input; the third smoke is held after the failed second smoke. Continue #90 final gates and #83 offline work. Aryan sends every message, command and button action. No new quota, enabled memory, customer data or automatic message is requested. No memory flag until notice approval **and** an explicit enable instruction. Continue #90's final gates and #83 offline work while waiting. From ca59fe0086972907f59efc99b7baad4b51d1500f Mon Sep 17 00:00:00 2001 From: Aryan Date: Wed, 28 Oct 2026 20:38:24 +0530 Subject: [PATCH 8/8] Clarify rejected rollout state in the master plan --- docs/SUPPORT_MASTER_PLAN.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/SUPPORT_MASTER_PLAN.md b/docs/SUPPORT_MASTER_PLAN.md index 89b4052..fe0c3a5 100644 --- a/docs/SUPPORT_MASTER_PLAN.md +++ b/docs/SUPPORT_MASTER_PLAN.md @@ -1,6 +1,6 @@ # Mira: master product plan -Updated October 28, 2026 (IST). #91 merged as `a461f868ad097ec93512aeaf111d63f4e4c96997` and is deployed as `c42efc65-0efb-4ca2-adca-f5f93627b37f`; normal how-to smoke passed, but the broken-device smoke failed source applicability and rollback to a9c9508/a6ef6b22 is verified healthy; the third smoke is held. Current GitHub main is `a461f868ad097ec93512aeaf111d63f4e4c96997`; the fixed milestone foundation audit remains recorded against `647b549bade498573e6fb2a16bf4544377884b1e`. The repository-guide update adds no completed milestone; evidence hooks alone do not complete an additional product requirement. Aryan sets product priorities; this is the single current product checklist. The product is Mira; technical repository/deployment/package identifiers remain unchanged. +Updated October 28, 2026 (IST). #91 merged as `a461f868ad097ec93512aeaf111d63f4e4c96997` and was deployed as `c42efc65-0efb-4ca2-adca-f5f93627b37f`, then rolled back; normal how-to smoke passed, but the broken-device smoke failed source applicability and rollback to a9c9508/a6ef6b22 is verified healthy; the third smoke is held. Current GitHub main is `a461f868ad097ec93512aeaf111d63f4e4c96997`; the fixed milestone foundation audit remains recorded against `647b549bade498573e6fb2a16bf4544377884b1e`. The repository-guide update adds no completed milestone; evidence hooks alone do not complete an additional product requirement. Aryan sets product priorities; this is the single current product checklist. The product is Mira; technical repository/deployment/package identifiers remain unchanged. ## Current score — 56 / 100 done, 44 / 100 left @@ -70,7 +70,7 @@ The earlier PR backlog is cleared, not the full product backlog. #88 merged884fb ## Next steps — accuracy first, then controlled enablement -1. **Finish #91 release acceptance.** Merge is complete; release is rejected and rollback baseline health/startup is verified. and fix the general applicability boundary under #83. Preserve the passing how-to and context/delivery evidence without presenting them as whole-release acceptance. Do not request the third smoke on the rejected image. +1. **Finish #91 release acceptance.** Merge is complete; release is rejected and rollback baseline health/startup is verified. Fix the general applicability boundary under #83. Preserve the passing how-to and context/delivery evidence without presenting them as whole-release acceptance. Do not request the third smoke on the rejected image. 2. **Finish #90 final gates and merge.** Integration, 1,258/8 checks and independent code/replay review pass; final head review/CI remain. Further release is held after the failed #91 smoke. Complete #83 applicability work/review and fresh release timing/exact-SHA/rollback/off-state gates before shipping anything. Start #83 offline next: general unresolved-next-step and conflicting-source applicability boundaries with synthetic red-before tests, no paid run or assumed model self-certification. 3. **Return to multipart phone-only accuracy (#65, A2).** #71/#75/#82 remain closed unmerged; do not reopen or rerun them automatically. Preserve their evidence and unfinished requirements. General routing/retrieval/coverage changes belong in the same answer/review pipeline, with no claim that #62 context repair alone resolves multipart accuracy. 4. **Complete memory preparation before a separately approved pilot (C1–C4).** The [pilot checklist](MEMORY_PILOT_PREPARATION.md) is drafted: test forum only, references rather than copied messages, 30 days, owner erasure, switch/restart timing, two-post scenario, 48 clean hours and rollback. Revised provider-disclosing notice wording is approved but not published; #86's separately approved existing-issue notice smoke passed. Processor/backup/privacy checks, approved isolated runtime/release and Aryan's explicit enable instruction still precede any saving or use of history. No pilot has begun.