Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
149 commits
Select commit Hold shift + click to select a range
6f90f55
docs: WR Handshake gap analysis deliverables (findings report, gap ma…
Jul 24, 2026
c13c942
refactor(handshake): Phase 1 - hygiene and guards (full-claim identit…
Jul 24, 2026
53ac2ab
refactor(handshake): Phase 2 - canonical core (full-coverage signing,…
Jul 24, 2026
cdf45fd
Phase 3: profile registry with fail-closed dispatch, core store split…
Jul 24, 2026
0ed2443
refactor(handshake): Phase 4 - one formation pipeline (Connect-offer …
Jul 24, 2026
617ff66
refactor(handshake): Phase 5 - grants & evidence (grant objects, per-…
Jul 24, 2026
b9a4b83
chore: build045 stamp (phase 5 grants/evidence)
Jul 24, 2026
8c506d4
art50: WP1 core AiProvenance module and generation log
Aug 1, 2026
83847d0
art50: WP2 instrument generation points with AiProvenance
Aug 1, 2026
c425fd3
art50: WP3 propagate provenance on wire and HTTP envelopes
Aug 1, 2026
5fe3f9c
art50: WP4 outbound MIME headers and BEAP content_provenance
Aug 1, 2026
ff79481
art50: WP5 first-interaction AI disclosure component and mounts
Aug 1, 2026
d75e256
art50: WP6 draft origin tracking and send-time AI labelling
Aug 1, 2026
4c3bddc
art50: WP7 clipboard export and field-apply chain-of-custody
Aug 1, 2026
d66e275
art50: WP8 stop stripping AI self-disclosure boilerplate
Aug 1, 2026
15ac103
art50: WP9 verification tests for marking and disclosure contracts
Aug 1, 2026
7f34656
art50: WP3 attach provenance on chatWithContext IPC results
Aug 1, 2026
7c937fa
art50-fix: phase1 Layer B non-dismissible disclosure and editorial re…
Aug 1, 2026
507cc5b
art50-fix: phase2 once-at-generation provenance and IPC propagation
Aug 1, 2026
9ff18b9
art50-fix: phase3 carrier honesty for clipboard export and Zoho Layer A
Aug 1, 2026
b7e72f4
art50-fix: phase4 integration tests and createProvenance invariant grep
Aug 1, 2026
188c327
art50-fix: phase2 persist stream-analyze provenance into ai_analysis_…
Aug 1, 2026
7a9921c
phase 1: baseline code module + CPR + trust-signal hygiene; spec v1.4…
Aug 7, 2026
b848b27
phase 1 correction: retire wrcode_valid condition; fix zoho aiProvena…
Aug 7, 2026
3152f0f
merge main into wr-code-email-e2e-phase-1 for integration testing
cursoragent Aug 7, 2026
560d005
docs(spec): track Refactor Order Delta v1.1 (Annex XIV 5.5 + Annex XV…
cursoragent Aug 8, 2026
0690a93
docs: add Annex XVII - WR Entries and the Publisher Console v1.0 (7 A…
cursoragent Aug 8, 2026
e5d3b67
docs(spec): add A6 to Delta v1.1 - suspension triple ruled
cursoragent Aug 8, 2026
e404d32
docs(spec): replace Delta v1.1 Phase 4 status bullet with author text
cursoragent Aug 8, 2026
93289fd
merge origin/main into wr-code-email-e2e-phase-2
cursoragent Aug 8, 2026
06753a9
phase 2 (2A.1): provenance gates BEAP detection on the inline path
cursoragent Aug 8, 2026
8b2a18e
phase 2 (2A.2): close all three fail-open degradations on the inline …
cursoragent Aug 8, 2026
a181aae
phase 2 (2A.3): source-walking guard tests for the provenance gate
cursoragent Aug 8, 2026
a155e09
phase 2 (2B.1): shared rule-8 provenance alert + extension wiring
cursoragent Aug 8, 2026
e1e993c
chore(graphify): add code/ knowledge graph (AST-only, no PDFs/docs)
cursoragent Aug 8, 2026
3442b5b
fix(handshake): close three Host-AI / IPC authorization gaps
cursoragent Aug 8, 2026
a38e8cd
merge: integrate refactor/wr-code-email-e2e-phase-2 into consolidation
cursoragent Aug 8, 2026
dffec03
merge: integrate cursor/graphify-knowledge-graph-c56a (#7)
cursoragent Aug 8, 2026
2a24cdb
test: align #7 regression fixtures with Phase-2 same_principal gate
cursoragent Aug 8, 2026
1f13880
fix(ci): use pnpm in WebMCP Release Gate workflow
Jun 21, 2026
123adba
chore(graphify): stop committing generated graphify-out artifacts
cursoragent Aug 8, 2026
f42ba48
fix(deps): sync pnpm lockfile for extension @repo/shared-beap-ui
cursoragent Aug 8, 2026
d856175
chore: remove accidental vitest dump phase2-before-native.json
cursoragent Aug 8, 2026
743fd75
chore: ignore .cursor/ tooling artefacts
cursoragent Aug 8, 2026
0c8466a
phase 2 (2B Option 2): wire shared CPR alert; defer extension sync pl…
cursoragent Aug 8, 2026
5f5d06a
chore: keep the Cursor/Graphify integration visible in .gitignore
cursoragent Aug 8, 2026
8089bb4
phase 2 (2C): CPR as a declared, typed input to local scam analysis
cursoragent Aug 8, 2026
a310cb9
docs(phase 2): report — consolidation, 2A/2B/2C, and the do-not-regre…
cursoragent Aug 8, 2026
2c2e007
docs: diagnosis-only pass on the consolidation-inherited failures
cursoragent Aug 8, 2026
20794bf
docs(spec): WRC Registry API Contract v1.0 (author document drop)
cursoragent Aug 8, 2026
892bacf
test(harness): add validated_at / validation_reason to createHarnessDb
cursoragent Aug 8, 2026
a5ad04b
test: align clone-prepare fixtures with coordination-device-id role d…
cursoragent Aug 8, 2026
3299671
test(seal-gate): assert the contract these four cases actually have
cursoragent Aug 8, 2026
c5447a4
test(coordination): pin the retired-relay refusal and stop reading am…
cursoragent Aug 8, 2026
b46680a
docs: consolidation-inherited remediation acceptance
cursoragent Aug 8, 2026
4a3695b
docs: record author dispositions for the three carried-forward items
cursoragent Aug 8, 2026
58aa71c
phase 3 (3A/3B/3C/3D/3E/3F): WRC resolution client, contract-first
cursoragent Aug 8, 2026
ef87c6b
phase 3: exit-criteria tests — hardening, divergence matrix, r7 align…
cursoragent Aug 8, 2026
1c1cb3e
docs(phase 3): report — resolution infrastructure
cursoragent Aug 8, 2026
d8ac21b
phase 3 addendum (3G): contract v1.1 — delegation travels in the head
cursoragent Aug 9, 2026
de25492
docs(phase 3): 3G addendum + codified standing rules
cursoragent Aug 9, 2026
3a77709
pre-phase-4 (i): split the conflated inbox-read error code
cursoragent Aug 9, 2026
49022f0
pre-phase-4 (iii): move the anti-rollback epoch floor into the native DB
cursoragent Aug 9, 2026
74e6f70
pre-phase-4 (ii): seal-key-source policy findings — diagnosis only
cursoragent Aug 9, 2026
df3dcdf
test(wrc): the floor survives eviction because of where it lives now
cursoragent Aug 9, 2026
97cb52a
docs: pre-Phase-4 block acceptance report
cursoragent Aug 9, 2026
56dbf7c
docs: pin the pre-block tip hash in the report
cursoragent Aug 9, 2026
3af4af8
phase 4 (4A/4B): A6 status composition and the resolution-bearing offer
cursoragent Aug 9, 2026
485880c
phase 4: keep the staged-offer table to its one owning module
cursoragent Aug 9, 2026
0a7ca3a
docs(phase 4): report — entry lifecycle and offer schema
cursoragent Aug 9, 2026
6c758b8
fix(ii): verify inbox rows against the providers policy permits, not …
cursoragent Aug 11, 2026
ed3d3ed
docs: seal-key-source fix report + third isolation-risk observation
cursoragent Aug 11, 2026
cd282ea
docs: capture persistence — commit the identity sets, record legacy r…
cursoragent Aug 11, 2026
5636eb4
phase 5 (5A/5B/5C + delta): email→offer path, offer presentation, man…
cursoragent Aug 11, 2026
470bac5
phase 5: re-point two guards the phase's own changes invalidated
cursoragent Aug 11, 2026
f12c626
docs(phase 5): final report — surfaces, E2E acceptance, integration-p…
cursoragent Aug 11, 2026
21389e8
chore(build): build047 stamp for the final rig build
cursoragent Aug 11, 2026
44871b3
docs: pre-flight verification report — one blocking item
cursoragent Aug 11, 2026
183e147
fix: narrow BeapMessage.channelProvenance to the shared record type
cursoragent Aug 11, 2026
adcc99c
docs: pre-flight verdict corrected to RIG-READY; record typecheck bli…
cursoragent Aug 11, 2026
be14528
chore(build): build048 stamp for the final rig build
cursoragent Aug 11, 2026
1135937
docs: PSL implementation analysis v1 — partial, two inputs missing
cursoragent Aug 12, 2026
a356779
docs(psl): STOP on failed identity verification; record the 12 Aug ru…
cursoragent Aug 12, 2026
66dc5fe
chore(build): build007 stamp
cursoragent Aug 12, 2026
426963d
docs(wr-code): Annex XVI v1.93 state analysis; check core survives, f…
Aug 30, 2026
a62d485
docs(wr-code): record author ruling AR-1/AR-2; discharge the v1.93 in…
Aug 30, 2026
e28913a
feat(wr-code): Phase 0 - Appendix A conformance oracle; correct the q…
Aug 30, 2026
698a702
feat(wr-code): take custody of Annex XVI v1.95; rebase the check conf…
Aug 30, 2026
e1afb4a
fix(wr-code): Q11 closed upstream - Appendix A is now clean; raise Q1…
Aug 30, 2026
003a52b
Add WR Code reference grammar v2 core module (Annex XVI v1.95)
Aug 30, 2026
e4d3cf0
Replace old 6+5+1 Baseline Code API with grammar-v2 capture surface
Aug 30, 2026
d5e4db5
Add WR Code detection, manual-entry RPC, and grammar transcription guard
Aug 30, 2026
17aa6db
Move connect-offer WR-code staging to grammar v2 with fail-closed adm…
Aug 30, 2026
d16ce14
Add non-destructive legacy shim for pre-v2 WR-code offer rows
Aug 30, 2026
1085c13
Add grammar v1.95 implementation run report
Aug 30, 2026
d13e3a5
Add XVI.7.6 six-gate resolution pipeline with interim namespace anchor
Aug 30, 2026
23e1c69
Add XVI.8.1/8.3 entry lifecycle model as the Entry gate substrate
Aug 30, 2026
6472be6
Add XVI.8.4 one-time-use state with atomic claim compare-and-set
Aug 30, 2026
7c8cea0
Add Run 2 report: six gates, entry lifecycle, one-time-use
Aug 30, 2026
9f15b96
Add canonical WR Code entry designator per Annex XVI 1.95 5.10/5.11
Aug 30, 2026
cfcffc5
Expand ordered-pair and combination designation through Gate 3
Aug 30, 2026
7b8b79e
Prove S* parent binding and cross-parent collision end to end
Aug 30, 2026
db90b84
Pin non-destructive designator persistence in the native use-state table
Aug 30, 2026
4832178
Add Run 3 entry-designation report
Aug 30, 2026
cb6fa79
Document Run 4 normative trust and admission model from Annex XVI 1.95
Aug 30, 2026
487eecd
Replace Gate-2 interim anchor with the Annex XVI 6.4/6.5 Namespace Di…
Aug 30, 2026
6f1965f
Implement SE session and expiry lifecycle per Annex XVI 5.7
Aug 30, 2026
2b23f44
Add Device Pass and Registered Counterpart Device behind Gate 4 per A…
Aug 30, 2026
c1a71fe
Wire pairing slots into the canonical entry and device model per Anne…
Aug 30, 2026
19ab570
Implement Gate 5 relay release chain with signed claims and delegatio…
Aug 31, 2026
43eb1fb
Implement Gate 6 capsule admission chain with sealed nonce verificati…
Aug 31, 2026
6c80858
Add full-chain conformance matrix and Run 4 report
Aug 31, 2026
5e8a178
Run 5 Slice 0: baseline capture and runtime/persistence inventory
Aug 31, 2026
1380019
Run 5 Slice 1: production composition root - runtime-owned identity, …
Aug 31, 2026
6488fe4
Run 5 Slice 2: WRC security DB with durable directory generation floo…
Aug 31, 2026
d4966a3
Run 5 Slice 3: durable device registry - generation-gated DB store, a…
Aug 31, 2026
d223bea
Run 5 Slices 4+5: durable relay replay ledger and Gate-6 request-id i…
Aug 31, 2026
1fe0517
Run 5 Slices 6-8: production-composition proofs - relay, device trust…
Aug 31, 2026
3840f4e
Run 5 Slice 9: explicit acceptance boundary - wrc.acceptReference tok…
Aug 31, 2026
db387d1
Run 5 Slice 10: fail-closed persistence proofs; close the security-DB…
Aug 31, 2026
d575ebc
Run 5 Slice 11: restart/crash/concurrency matrix suite over the nativ…
Aug 31, 2026
047ca7d
Run 5 Slice 12: production full-path suite (all 7 classes via the RPC…
Aug 31, 2026
f9ec23f
Run 5 Slice 13: bounded lazy security-DB maintenance (schema v4 index…
Aug 31, 2026
8f0a564
Run 5 report: production runtime wiring, durable security state, rest…
Aug 31, 2026
296123b
wip(art50): de-duplicate AiInteractionDisclosure mounts (host tree, 2…
Sep 25, 2026
1702378
wip(rebrand): Rebrand Wave 1, WR Desk to Optirando (host tree, 2026-0…
Sep 25, 2026
c67d14c
wip(rebrand): originDeleteFlow confirm copy WRDesk to Optirando (sour…
Sep 25, 2026
306ea18
docs(analysis): resync 2026-09 - ground truth, drift, resume plan
Sep 25, 2026
46afac1
docs(analysis): resync 2026-09 addendum - reclassification, decision …
Sep 25, 2026
9469d15
test: add test:prepare to build the workspace packages tests fork or …
Sep 25, 2026
28d6f4f
Merge wip/host-2026-08-12-art50-rebrand-w1: Art. 50 disclosure de-dup…
Sep 25, 2026
0e180b8
fix(wr-code): no ingest-time scan of loose e-mail references (Annex X…
Sep 25, 2026
19572ec
fix(types): close the ingestion-core typecheck blind spot; fix two ma…
Sep 25, 2026
0e6b497
test(wr-code): close the Runs 3-5 acceptance-review guard gaps (S2a)
Sep 25, 2026
6f484b2
feat(wr-code): route wrc.* through the product dispatchers behind the…
Sep 25, 2026
54ea118
docs(analysis): iteration 01 report and after-capture
Sep 25, 2026
1f844e0
docs(spec): WRC registry contract delta v2.0 draft for Author ratific…
Sep 26, 2026
6285f39
fix(wr-code): bind P entries to their local block; prove every relied…
Sep 26, 2026
dd236fb
docs: ratify WRC contract delta v2.0 (Q20-Q27 = A); iteration 02 repo…
Sep 26, 2026
ca181c4
feat(wr-code): built-in test registry for wrc-test builds; release tr…
Sep 26, 2026
47ebee8
docs(analysis): iteration 03 report and after-capture (WR Code test r…
Sep 26, 2026
93cb50f
feat(wr-code): WR Code panel in the mail view (S2b UI, first increment)
Sep 26, 2026
1b80bfc
docs(analysis): iteration 04 report, after-capture and screenshots (S…
Sep 26, 2026
e1014a4
fix(handshake): desktop accept of staged connect offers, pinned to th…
Sep 26, 2026
f1274ad
docs(analysis): iteration 05 report, after-capture and screenshots (H…
Sep 26, 2026
3927cfa
feat(wr-code): responsible domain in the offer (S5); operator rollove…
Sep 26, 2026
4eaecaa
docs(analysis): iteration 06 report, after-capture and screenshots (S…
Sep 26, 2026
a9e6791
chore(build): build009 stamp (extension outDir, Windows output dir)
Sep 26, 2026
ad03c74
docs(analysis): iteration 06 — Q9 is answered, not open
Sep 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
21 changes: 21 additions & 0 deletions .cursor/rules/graphify.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
description: graphify knowledge graph context
alwaysApply: true
---

This project can build a Graphify knowledge graph under `graphify-out/` (generated locally; not committed). Scope/exclusions: `.graphifyignore` and `code/.graphifyignore`.

**When exploring architecture, prefer Graphify if a local graph exists:**
- `graphify query "<question>"` — scoped subgraph for codebase or architecture questions
- `graphify path "<A>" "<B>"` — dependency path between two symbols
- `graphify explain "<concept>"` — nodes related to a concept

If `graphify-out/graph.json` is missing, regenerate with AST-only Graphify against `code/` (respect `.graphifyignore`; do not ingest PDFs), then query. Treat Graphify edges as hints — always source-verify before concluding.

Only use Read/Grep/Glob directly when:
1. Graphify has already oriented you and you need specific lines
2. Graphify is unavailable and regeneration is not practical

- If `graphify-out/wiki/index.md` exists, navigate it instead of reading raw files
- Read `graphify-out/GRAPH_REPORT.md` only for broad architecture review when query/path/explain are insufficient
- After substantial code changes, run `graphify update .` locally to refresh the graph (AST-only)
82 changes: 48 additions & 34 deletions .github/workflows/webmcp-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,79 +20,93 @@ jobs:
webmcp-release-gate:
name: "WebMCP Gate (build + unit tests)"
runs-on: ubuntu-latest
defaults:
run:
working-directory: code
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
node-version: 20
cache: npm
version: 10.28.2

- name: Install root dependencies
run: npm ci
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
cache-dependency-path: code/pnpm-lock.yaml

- name: Install extension dependencies
run: npm ci
working-directory: code/apps/extension-chromium
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build extension
run: npm run build
working-directory: code/apps/extension-chromium
run: pnpm --filter @optimandoai/extension-chromium run build

- name: Run WebMCP unit + sender-gate tests
run: npm run test:webmcp:ci
working-directory: code
run: pnpm run test:webmcp:ci

quarantine-monitor:
name: "Quarantine (pre-existing failures, non-blocking)"
runs-on: ubuntu-latest
continue-on-error: true
defaults:
run:
working-directory: code
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
node-version: 20
cache: npm
version: 10.28.2

- name: Install root dependencies
run: npm ci
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
cache-dependency-path: code/pnpm-lock.yaml

- name: Install extension dependencies
run: npm ci
working-directory: code/apps/extension-chromium
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Run quarantined tests (informational)
run: npm run test:quarantine || true
working-directory: code
run: pnpm run test:quarantine || true

webmcp-e2e-smoke:
name: "WebMCP E2E Smoke (opt-in)"
runs-on: ubuntu-latest
if: ${{ github.event_name == 'workflow_dispatch' && inputs.run_e2e == true }}
defaults:
run:
working-directory: code
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
node-version: 20
cache: npm
version: 10.28.2

- name: Install root dependencies
run: npm ci
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
cache-dependency-path: code/pnpm-lock.yaml

- name: Install extension dependencies
run: npm ci
working-directory: code/apps/extension-chromium
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Install Playwright browsers
run: npx playwright install --with-deps chromium
run: pnpm exec playwright install --with-deps chromium
working-directory: code/apps/extension-chromium

- name: Build extension
run: npm run build
working-directory: code/apps/extension-chromium
run: pnpm --filter @optimandoai/extension-chromium run build

- name: Run WebMCP E2E smoke
run: npm run test:e2e:webmcp
run: pnpm run test:e2e:webmcp
working-directory: code/apps/extension-chromium
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,18 @@ code/packages/ingestion-core/src/*.js

# Chromium extension Vite outDir (versioned per release, e.g. build55647)
code/apps/extension-chromium/build*/

# graphify generated outputs + caches (regenerate with `graphify` / graphifyy)
# Keep hand-authored: .graphifyignore, code/.graphifyignore, .cursor/rules/graphify.mdc
graphify-out/
code/graphify-out/

# Cursor tooling artefacts (agent state, dumps). The Graphify↔Cursor
# integration is hand-authored and must stay visible: the always-on rule in
# .cursor/rules/ and, when used, .cursor/mcp.json.
.cursor/*
!.cursor/rules/
!.cursor/mcp.json

# Accidental vitest JSON dumps (not source)
code/phase2-before-native.json
34 changes: 34 additions & 0 deletions .graphifyignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Initial graphify pass: codebase AST only.
# PDFs and documentation are excluded; add selectively later with /graphify --update.
*.pdf
**/*.pdf
*.md
**/*.md
*.mdx
**/*.mdx
*.txt
**/*.txt
*.html
**/*.html
*.rst
**/*.rst
*.qmd
**/*.qmd
*.yaml
**/*.yaml
*.yml
**/*.yml
*.png
**/*.png
*.jpg
**/*.jpg
*.jpeg
**/*.jpeg
*.webp
**/*.webp
*.gif
**/*.gif
*.svg
**/*.svg
**/THIRD_PARTY_LICENSES/**
**/docs/**
4 changes: 4 additions & 0 deletions code/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -338,3 +338,7 @@ apps/extension-chromium/build179/
apps/extension-chromium/build180/
apps/extension-chromium/build181/
apps/extension-chromium/build182/

# Accidental vitest JSON dumps (not source)
phase2-before-native.json
*-before-native.json
34 changes: 34 additions & 0 deletions code/.graphifyignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Initial graphify pass: codebase AST only.
# PDFs and documentation are excluded; add selectively later with /graphify --update.
*.pdf
**/*.pdf
*.md
**/*.md
*.mdx
**/*.mdx
*.txt
**/*.txt
*.html
**/*.html
*.rst
**/*.rst
*.qmd
**/*.qmd
*.yaml
**/*.yaml
*.yml
**/*.yml
*.png
**/*.png
*.jpg
**/*.jpg
*.jpeg
**/*.jpeg
*.webp
**/*.webp
*.gif
**/*.gif
*.svg
**/*.svg
**/THIRD_PARTY_LICENSES/**
**/docs/**
16 changes: 13 additions & 3 deletions code/apps/electron-vite-project/electron-builder.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,18 @@ const appDir = __dirname

/**
* Parsed by scripts/kill-wr-desk.cjs — must contain a line matching:
* return 'C:\\build-output\\build044'
* return 'C:\\build-output\\build009'
*/
function windowsOutputDirMarker() {
return 'C:\\build-output\\build044'
return 'C:\\build-output\\build009'
}

/**
* `pnpm run build:wrc-test` packages into its own `…-wrc-test` folder, so an
* existing release build is kept. The Windows build scripts apply the same suffix.
*/
const WRC_TEST_OUTPUT_SUFFIX = process.env.WRDESK_WRC_BUILD_FLAVOR === 'wrc-test' ? '-wrc-test' : ''

const workspaceRoot = path.resolve(appDir, '../..')

function findFile(candidates) {
Expand Down Expand Up @@ -61,12 +67,16 @@ module.exports = {
/** Avoid winCodeSign tool download/extract (fails on Windows without symlink privilege for darwin symlinks in the archive). */
forceCodeSigning: false,
directories: {
output: process.platform === 'win32' ? windowsOutputDirMarker() : path.join(appDir, 'dist', 'release'),
output:
process.platform === 'win32'
? windowsOutputDirMarker() + WRC_TEST_OUTPUT_SUFFIX
: path.join(appDir, 'dist', `release${WRC_TEST_OUTPUT_SUFFIX}`),
buildResources: 'build',
},
files: [
'dist/**/*',
'!dist/release/**',
'!dist/release-wrc-test/**',
'dist-electron/**/*',
'package.json',
'node_modules/**/*',
Expand Down
8 changes: 4 additions & 4 deletions code/apps/electron-vite-project/electron/WRExpert.default.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# WRExpert.md — WR Desk Inbox AI Behaviour
# WRExpert.md — Optirando Inbox AI Behaviour
# This is your personal AI expert. Edit this file to teach the AI how to
# handle your specific inbox. Changes take effect on the next Auto-Sort run.
# Lines starting with # are comments and are ignored by the AI.
Expand Down Expand Up @@ -36,21 +36,21 @@ Move here if:
- Meeting notes, summaries, reports for future reference
- Any email explicitly marked by the user as "keep"

### urgent (WR Desk Urgent tab + mirrored to server **Urgent** folder on sync, urgency >= 7)
### urgent (Optirando Urgent tab + mirrored to server **Urgent** folder on sync, urgency >= 7)
Move here if ANY of these apply:
- Invoice or payment overdue or due within 3 days
- Legal deadline within 7 days
- Contract termination or dispute
- Security alert requiring immediate action
- Direct request from a known important contact requiring same-day response

### action_required (WR Desk Important flow + mirrored to **Pending Review** on sync, urgency 4–6)
### action_required (Optirando Important flow + mirrored to **Pending Review** on sync, urgency 4–6)
Move here if:
- Requires a response within the next 7 days
- Requires a decision or manual step (not just reading)
- Contains a question directed at you that is not automated

### normal (WR Desk Normal / All until archived; mirrored to **Archive** on sync when classified)
### normal (Optirando Normal / All until archived; mirrored to **Archive** on sync when classified)
Move here if:
- Requires attention but no urgency
- Does not fit the above categories
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,12 @@ describe('buildHandshakeAcceptSafeOpts (preload handshake:accept)', () => {
const s = buildHandshakeAcceptSafeOpts({ device_role: 'host' })
expect(s).toEqual({ device_role: 'host' })
})

it('T10_forwards_expected_preview_hash_only_as_a_64_char_lowercase_hex_digest', () => {
const hash = 'ab'.repeat(32)
expect(buildHandshakeAcceptSafeOpts({ expected_preview_hash: ` ${hash} ` })).toEqual({ expected_preview_hash: hash })
for (const bad of ['AB'.repeat(32), 'ab'.repeat(31), `${hash}00`, 'not-a-hash', 42, { hash }]) {
expect(buildHandshakeAcceptSafeOpts({ expected_preview_hash: bad })).toEqual({})
}
})
})
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/**
* Pure builder for `handshake:accept` IPC options — shared with preload tests.
* Forwards an explicit allowlist only (no pass-through of arbitrary objects).
* Internal vs normal and X25519 requirements are decided in main using persisted
* `record.handshake_type` — this module does not use `device_role` as proof of internal.
* Internal vs normal and X25519 requirements are decided in main using the persisted
* `record.same_principal` flag — this module does not use `device_role` as proof of internal.
*/

const MAX_B64 = 8192
Expand Down Expand Up @@ -95,5 +95,9 @@ export function buildHandshakeAcceptSafeOpts(contextOpts: unknown): Record<strin
out.local_pairing_code_typed = opts.local_pairing_code_typed.trim()
}

if (typeof opts.expected_preview_hash === 'string' && /^[0-9a-f]{64}$/.test(opts.expected_preview_hash.trim())) {
out.expected_preview_hash = opts.expected_preview_hash.trim()
}

return out
}
Loading
Loading