Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
# 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.
**Latest October26 direction:** #91 is narrowed to original reviewed16ff136/generated3ad91ff. Its22/24 versus main21/24, shared final next-step failures and unchanged required-person controls meet the corrected relative comparison gate. The later policy/selection expansion and its candidate-only final factual error are withdrawn and preserved. Source parity, all96 saved request hashes/stages,1,244 full and8 no-model checks pass without quota. Final restored-diff review/current-head CI precede the authorized merge commit. Then integrate#90: frozen mapping finds shared custody/cloud families but candidate-only staff flagging, rejected by#91 in offline replay. No date-order cause is established; the conditional96-request grant is inactive. Livea9c9508/914a38f0 is operator-confirmed fromOctober26 18:52IST; earliest next releaseOctober27 18:52:34IST, with fresh rollback/off-state checks. Scores64/100 implementation and56/100 delivery remain unchanged; no new memory capability or customer resolution is claimed.

**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.

## Current audited dashboard — October 26, 2026

## Earlier 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.

Expand Down
52 changes: 52 additions & 0 deletions answerFilterAudit.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Current-result-only context for the existing reviewer. Never serialize this
// text into agent JSON, history, stage evidence, logs or a durable store.
const audits = new WeakMap();
const MAX_REMOVED_UNITS = 12;
const MAX_REMOVED_CHARS = 6000;
const normalize = text => String(text || '').replace(/\s+/g, ' ').trim().toLowerCase();

function mergeRemovalAudits(...inputs) {
const removed = [];
const seen = new Set();
let chars = 0;
let truncated = false;
for (const input of inputs) {
truncated ||= input?.truncated === true;
for (const value of Array.isArray(input?.removed) ? input.removed : []) {
if (typeof value !== 'string') continue;
const unit = value.trim();
const key = normalize(unit);
if (!key || seen.has(key)) continue;
seen.add(key);
if (removed.length >= MAX_REMOVED_UNITS || chars + unit.length > MAX_REMOVED_CHARS) {
truncated = true;
continue; // Never cut a condition or warning into a misleading fragment.
}
removed.push(unit);
chars += unit.length;
}
}
return { removed, truncated };
}

function removedAnswerUnits(before, after) {
const normalizedAfter = normalize(after);
return mergeRemovalAudits({ removed: String(before || '').trim()
.split(/(?<=[.!?])\s+|\n+/)
.map(unit => unit.trim()).filter(Boolean)
.filter(unit => !normalizedAfter.includes(normalize(unit))) });
}

function rememberRemovalAudit(result, audit) {
if (result && typeof result === 'object') audits.set(result, mergeRemovalAudits(audit));
return result;
}

function getRemovalAudit(result) {
return mergeRemovalAudits(result && typeof result === 'object' ? audits.get(result) : undefined);
}

module.exports = {
MAX_REMOVED_UNITS, MAX_REMOVED_CHARS,
mergeRemovalAudits, removedAnswerUnits, rememberRemovalAudit, getRemovalAudit,
};
13 changes: 4 additions & 9 deletions answerPipeline.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const { stripHowtoBleed, stripShopBleed, stripUnsupportedClaims } = require('./h
const { SOURCE_LABEL_NAME, SOURCE_LABEL_SEPARATOR } = require('./supportSteps');
const { publicReplyPrivacy } = require('./publicReplyPrivacy');
const { recordStage } = require('./answerStageEvidence');
const { mergeRemovalAudits, removedAnswerUnits } = require('./answerFilterAudit');

const EMPTY_ANSWER_FALLBACK = 'I could not verify a safe answer here. A person needs to check this.';
const UNSYNCED_DATA_WARNING = 'Recordings may still be unsynced. Do not reinstall the app, log out, or clear Pending/All storage until a person checks; those actions could erase local recordings.';
Expand All @@ -19,7 +20,7 @@ function ensureNonEmptyAnswer(answer) {

// Filter the draft, and separately show the reviewer the original sentences
// removed by those filters. Only the reviewer may restore supported details.
function prepareDraftForReviewWithAudit(answer, lane, question) {
function prepareDraftForReviewWithAudit(answer, lane, question, { earlierAudit } = {}) {
recordStage('draft_input', answer);
const original = String(answer || '').trim();
const draft = stripFalseCertainty(
Expand All @@ -29,15 +30,9 @@ function prepareDraftForReviewWithAudit(answer, lane, question) {
question
)
);
const normalizedDraft = draft.replace(/\s+/g, ' ').toLowerCase();
const removed = original
.split(/(?<=[.!?])\s+|\n+/)
.map((sentence) => sentence.trim())
.filter(Boolean)
.filter((sentence) => !normalizedDraft.includes(sentence.replace(/\s+/g, ' ').toLowerCase()))
.slice(0, 12);
const audit = mergeRemovalAudits(earlierAudit, removedAnswerUnits(original, draft));
recordStage('draft_safety', draft);
return { draft, removed };
return { draft, removed: audit.removed, auditTruncated: audit.truncated };
}

function prepareDraftForReview(answer, lane, question) {
Expand Down
Loading