Lex Origin Readiness

generated — UTC

Lex Origin MVP — Weekly delta

Week ending: 24 October 2026 Report lineage: incremental delta on top of CLIENT_READINESS_REPORT_2026-10-05.md. Mirrored into the live planning doc Lexorigin platform — 3-month projection (section 9) so both stay in sync. Author: Arjun Kumar (Contractor)

This file lists what shipped (code-complete locally; some branches not yet merged) during the week of 18–24 October 2026, mapped to Annexure A features where it moves the readiness verdict, and to platform-UX capabilities that aren't contract-named but matter for pilot-readiness.

Honest caveat up front: everything listed below sits in local branches as of 24 Oct 2026. None of this is live on the deployed platform until the uncommitted work in lexai-client-fe, authservice, and prism-service is pushed and the readiness engine is re-run. Flagged where it matters.


1. Scope-coverage delta vs. 5 Oct 2026 report

Features that advanced status

Annexure A feature 5-Oct status 24-Oct status What changed this week
api-supreme-high-court — SC + High Court APIs (case updates, judgments) needs_work (controller present, no live data flow) Materially advanced (still needs_work pending merge + manual eval) New prism-service/app/services/ecourts/ client + parser integrated with eCourts partner API. CNR lookup endpoint /lookup/by-cnr fans out to India Kanoon + eCourts in parallel, merges results. Backed by new tables prism_cnr_searches, prism_cnr_payload_cache, prism_order_pdf_cache (Alembic migrations 012-014). Verified live against DLCT020279742026 (Gorkha Security Services vs Sarita) and DLHC010296942026.
case-management-infrastructure needs_work (controller + model, no end-to-end flow) Materially advanced New per-case detail page at /workspace/dashboard/cases/detail?id=<uuid> with status strip, parties & representation grid, acts & sections, hearings timeline merging eCourts hearings + India Kanoon published docs + interim/judgment orders. Signed order PDFs stream through our server with a forever-cache (immutable artifacts).
library-core — unified legal library needs_work Materially advanced Judgment library now reachable from search history (clicking an IK match deep-links to /workspace/dashboard/cases/[ikId]); CNR tracker's "Published documents" rail populates from the same India Kanoon source.
api-gst — GST Portal (notifications, filings) needs_work (sandbox controller only) Materially advanced New authservice/src/clients/gst/ module: Whitebooks client (whitebooks.client.ts), orchestrator service, REST controller with 4 endpoints (status, otp-request, otp-verify, sync-notices), rate-limited and auth-gated. OTP → authtoken flow verified end-to-end against live Whitebooks production (txn + session token returned, IP-pinned, 30-day session). /notices/noticelist endpoint-name blocked on Whitebooks support (Abhiram) — ~1 week ETA.
client-management Partial Hardened New GST-portal fields on Client schema: gst_portal_username, gst_api_access_enabled_on, gst_api_session_token, gst_api_session_expires_at, gst_api_pending_txn, gst_api_session_ip. UI surfaced on Settings → Tax & Registration tab. Pair-with-client flow lets a CNR tracker case be linked to an existing workspace client.

Hardening work (improves zero-critical-bugs Annexure C metric)

Issue File Impact
PracticeTypeGuard throwing misleading "A workspace is required" 403 for every authenticated workspace owner's call behind any @RequirePracticeType route authservice/src/common/guards/practice-type.guard.ts 20+ controllers unblocked — cases, payroll, timesheet, audit, compliance-calendar, mis, ca-dashboard, ca-billing, bank-recon, accounting, coa, salary-structure, employee-exit, attendance-leaves, tally, zoho-books, sandbox, certifications. One-line fix (if (!user) return true) but systemic impact.
Contracts page row click → /alias/undefined/dashboard/contracts/<id> → middleware bounces to /workspace?undefined= → looks like a logout lexai-client-fe/src/app/alias/[workspace-alias]/dashboard/contracts/page.tsx Fixed by using useUserType().basePath for route-aware navigation; works on both owner + alias trees.
MattersList crashing with "Objects are not valid as a React child {isUnknown, name, address}" on the first visible case lexai-client-fe/src/components/dashboard/MattersList.tsx Added partyLabel() helper; both legacy string-shaped parties and current object-shaped parties render safely.
ClientSearchAutocomplete silently showing "No clients found" everywhere — misreading the wrapped response shape (response.data.data.data vs response.data.clients) lexai-client-fe/src/components/ClientSearchAutocomplete.tsx Defensive parse trying 4 known shapes; same pattern applied to noticeIntakeService.searchClients and noticeIntakeService.listForWorkspace.
/api/v1/notices?workspaceId=... returning 400 "property workspaceId should not exist" lexai-client-fe/src/services/noticeIntakeService.ts DTO uses forbidNonWhitelisted: true; dropped workspaceId from query (resolved from JWT instead).

New platform capabilities not in Annexure A but critical for pilots

Capability Where
Dedicated per-CNR case detail page with status + parties + timeline + order PDF viewer (inline + download) lexai-client-fe/src/app/workspace/dashboard/cases/detail/page.tsx
In-app PDF viewer for signed court orders (served from local forever-cache after first fetch — no eCourts credit after that) Backend: prism-service/app/api/v1/endpoints/cases.py (new /lookup/order-copy/{cnr}/{file} proxy). Frontend: iframe render in detail modal + download button.
Search history table unifying CNR lookups + judgment views, chronologically sorted, with filter chips lexai-client-fe/src/components/dashboard/SearchHistoryTable.tsx
Pair-with-client — link a CNR tracker case to any workspace client via autocomplete Frontend: new PairWithClientDialog in detail page. Backend: linked_client_id on prism_cnr_searches + /link-client PATCH endpoint (migration 014).
Notices page restructure — tabbed layout (All notices / Settings) replacing a 15-widget stacked wall. Primary list is now visible on page load; AI drawer moved to dedicated detail route /notices/[notice_id]. lexai-client-fe/src/app/workspace/dashboard/notices/page.tsx + [notice_id]/page.tsx
AI chat UI for notice drafting — ChatGPT-style message bubbles + quick-action chips + right-rail upgrade CTA, replacing the form-stuffed AIWorkspacePanel card lexai-client-fe/src/components/notices/NoticeAiChat.tsx
Workspace-wide "Pick a client → fetch GST notices" CTA + roll-up table showing every client with GST portal credentials configured, per-client session state, Fetch/Open actions lexai-client-fe/src/components/notices/WorkspaceNoticesRollup.tsx
New top-level sidebar entry "Notices" (both owner + alias trees) + Permission context + Role config entry DashboardSidebar.tsx, PermissionContext.tsx, RoleConfigurationContext.tsx
Session IP pinning for Whitebooks GST sessions (Whitebooks binds a session to its originating egress IP; mismatch = NOTC_001 Unauthorized). New WhitebooksClient.getEgressIp() resolves via ipify (overridable via WHITEBOOKS_SOURCE_IP env), persisted to client.gst_api_session_ip so verify + sync + refresh all reuse the same IP. authservice/src/clients/gst/whitebooks.client.ts, clients-gst.service.ts

Still blocked / outstanding external deps

Item Status Owner
Whitebooks GST noticelist correct endpoint for Section 46 return-defaulter notices Awaiting support reply (Abhiram) External (~1 week ETA)
Microsoft SECRET_VALUE rotation (compromised: previously committed to CLAUDE.md plaintext) Deferred to pre-launch Partner decision
Admin FE sessionStorage residual XSS risk (Gap 27) Deferred to pre-launch Partner decision

2. Acceptance-metric (Annexure C) impact

None of the 12 Annexure C metrics flipped this week. All remain ❌ Unmet. Specific movement:


3. What to do before next readiness run

Before the readiness engine's next automated re-run (npm run readiness from readiness/), these need to happen so the delta above shows up correctly in the next scheduled latest.md:

  1. Commit + push the uncommitted work in lexai-client-fe, authservice, prism-service (currently all on local branches).
  2. Edit readiness/manual-verdicts.yaml to flip api-supreme-high-court, case-management-infrastructure, library-core, api-gst from needs_work → needs_work with sharper evidence (not pass — the engine's rule is that output quality must be manually walked in UI first, which still needs a human reviewer sign-off).
  3. Re-run npm run readiness to regenerate readiness/reports/latest.md.
  4. If the pass/fail count changes, update CLIENT_README.md section 1 bullets.

Keep this file + the project planning doc in Claude Docs in sync. If one changes, update the other in the same session so partner + contractor are always reading the same version of reality.